code-coordinator 0.5.520__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 (911) hide show
  1. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. code_coordinator-0.5.522/code_coordinator.egg-info/scm_version.json +8 -0
  4. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/drive_queue.py +62 -5
  5. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dr_verify.py +20 -6
  6. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/drive_queue.py +85 -5
  7. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notify.py +69 -2
  8. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dr_verify.py +71 -0
  9. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_queue.py +120 -1
  10. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_sqlite_connect_ratchet.py +10 -1
  11. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_stalled_pipeline.py +132 -0
  12. code_coordinator-0.5.520/code_coordinator.egg-info/scm_version.json +0 -8
  13. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/.gitignore +0 -0
  26. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/GOAL.md +0 -0
  28. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/LICENSE +0 -0
  29. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/README.md +0 -0
  31. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/code_coordinator.egg-info/SOURCES.txt +0 -0
  32. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/code_coordinator.egg-info/dependency_links.txt +0 -0
  33. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/code_coordinator.egg-info/entry_points.txt +0 -0
  34. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/code_coordinator.egg-info/requires.txt +0 -0
  35. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/code_coordinator.egg-info/scm_file_list.json +0 -0
  36. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/approved_work.py +0 -0
  48. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/backup.py +0 -0
  51. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/block_log.py +0 -0
  52. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/board_schema.py +0 -0
  53. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/ci_fix.py +0 -0
  60. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/ci_gitlab.py +0 -0
  62. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/ci_store.py +0 -0
  63. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/claude_setup_token.py +0 -0
  65. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/cli.py +0 -0
  66. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/client.py +0 -0
  67. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/codegen.py +0 -0
  68. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/_common.py +0 -0
  70. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/acceptance.py +0 -0
  71. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/agent_ops.py +0 -0
  72. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/audit.py +0 -0
  73. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/backup.py +0 -0
  74. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/chat.py +0 -0
  75. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/ci.py +0 -0
  76. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/codegen.py +0 -0
  77. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/dispatch.py +0 -0
  78. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/dispatch_workers.py +0 -0
  79. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/dr.py +0 -0
  80. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/drive.py +0 -0
  81. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/gate_a.py +0 -0
  82. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/gates.py +0 -0
  83. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/issues.py +0 -0
  84. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/lifecycle.py +0 -0
  85. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/machine.py +0 -0
  86. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/merge.py +0 -0
  87. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/milestone.py +0 -0
  88. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/plan_followup.py +0 -0
  89. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/plans.py +0 -0
  90. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/portal.py +0 -0
  91. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/pr.py +0 -0
  92. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/release.py +0 -0
  93. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/repo.py +0 -0
  94. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/report.py +0 -0
  95. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/review.py +0 -0
  96. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/scorecard.py +0 -0
  97. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/sessions.py +0 -0
  98. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/setup.py +0 -0
  99. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/status.py +0 -0
  100. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/store_migrate.py +0 -0
  101. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/terminal.py +0 -0
  102. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/test_gate.py +0 -0
  103. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/commands/tui.py +0 -0
  104. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/comments.py +0 -0
  105. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/config.py +0 -0
  106. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/config_reload.py +0 -0
  107. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/confirm_test.py +0 -0
  108. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/conflict_fix.py +0 -0
  109. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dao.py +0 -0
  110. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dashboard/__init__.py +0 -0
  111. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dashboard/fixture.py +0 -0
  112. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dashboard/index.html +0 -0
  113. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dashboard/server.py +0 -0
  114. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dashboard/terminal.py +0 -0
  115. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/db.py +0 -0
  116. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dead_end.py +0 -0
  117. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/decomposition_chat.py +0 -0
  118. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/README.md +0 -0
  119. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-agent.service +0 -0
  120. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-backup.service +0 -0
  121. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-backup.timer +0 -0
  122. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-db-backup.service +0 -0
  123. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-db-backup.sh +0 -0
  124. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-db-backup.timer +0 -0
  125. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-dr-verify.service +0 -0
  126. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-dr-verify.timer +0 -0
  127. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-drive-queue.service +0 -0
  128. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-drive-queue.timer +0 -0
  129. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-failure-notify.service +0 -0
  130. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-fleet-watchdog.service +0 -0
  131. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  132. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-notify.service +0 -0
  133. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-notify.timer +0 -0
  134. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-release-propagate.service +0 -0
  135. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-release-propagate.timer +0 -0
  136. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-release-window.service +0 -0
  137. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-release-window.timer +0 -0
  138. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-serve.service +0 -0
  139. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-web-dist-build.service +0 -0
  140. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-web-dist-build.timer +0 -0
  141. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy/coord-web.service +0 -0
  142. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy_manifest.py +0 -0
  143. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deploy_units.py +0 -0
  144. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deprecation_telemetry.py +0 -0
  145. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/deps.py +0 -0
  146. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/diagnose.py +0 -0
  147. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dispatch.py +0 -0
  148. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dispatch_liveness.py +0 -0
  149. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dist_name.py +0 -0
  150. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/dr_promote.py +0 -0
  151. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/drive.py +0 -0
  152. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/drive_sessions_snapshot.py +0 -0
  153. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/drive_state.py +0 -0
  154. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/events.py +0 -0
  155. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/failure_class.py +0 -0
  156. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/failure_classifier.py +0 -0
  157. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/filelock.py +0 -0
  158. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/fleet_config_health.py +0 -0
  159. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/forge_availability.py +0 -0
  160. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/freshness.py +0 -0
  161. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/gate_a.py +0 -0
  162. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/gate_b.py +0 -0
  163. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/gate_snapshot.py +0 -0
  164. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/gates.py +0 -0
  165. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/gen_board_fixture.py +0 -0
  166. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/github_ops.py +0 -0
  167. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/github_throttle.py +0 -0
  168. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/goal.py +0 -0
  169. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/graph_health.py +0 -0
  170. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/__init__.py +0 -0
  171. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/aggregate.py +0 -0
  172. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/__init__.py +0 -0
  173. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/_ci_pin.py +0 -0
  174. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/agent_install.py +0 -0
  175. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/cargo_targets.py +0 -0
  176. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/claude_binary.py +0 -0
  177. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/config_drift.py +0 -0
  178. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  179. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/coord_web_ci_pin.py +0 -0
  180. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/deploy_lane_facts.py +0 -0
  181. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/disk.py +0 -0
  182. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/fleet_board.py +0 -0
  183. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  184. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/fleet_phantom.py +0 -0
  185. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/fleet_unit_drift.py +0 -0
  186. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/graph.py +0 -0
  187. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/graphify_cli.py +0 -0
  188. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/index_lock.py +0 -0
  189. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/issues_sync_staleness.py +0 -0
  190. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/local_machine_identity.py +0 -0
  191. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/plan_usage.py +0 -0
  192. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/pr_churn.py +0 -0
  193. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/release_cordon.py +0 -0
  194. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/repo_state.py +0 -0
  195. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/spawned_coord.py +0 -0
  196. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/stalled_pipeline.py +0 -0
  197. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/timer_active.py +0 -0
  198. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/toolchain.py +0 -0
  199. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/unit_drift.py +0 -0
  200. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/unit_enablement.py +0 -0
  201. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/wedged_drive_queue.py +0 -0
  202. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/checks/worktrees.py +0 -0
  203. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/cli.py +0 -0
  204. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/context.py +0 -0
  205. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/fleet_snapshot.py +0 -0
  206. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/models.py +0 -0
  207. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/pypi.py +0 -0
  208. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/registry.py +0 -0
  209. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/render.py +0 -0
  210. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/health/units.py +0 -0
  211. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/hooks.py +0 -0
  212. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/housekeeping.py +0 -0
  213. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/interactive.py +0 -0
  214. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/invariant_alarms.py +0 -0
  215. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/issue_store.py +0 -0
  216. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/issues_sync_status.py +0 -0
  217. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/liveness_auditor.py +0 -0
  218. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/machine_fault.py +0 -0
  219. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/machine_metrics.py +0 -0
  220. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/machine_onboard.py +0 -0
  221. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/machine_pause.py +0 -0
  222. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/machine_stats.py +0 -0
  223. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/merge_queue.py +0 -0
  224. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/milestone_chat.py +0 -0
  225. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/milestone_dispatch.py +0 -0
  226. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/milestone_gate.py +0 -0
  227. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/milestone_order.py +0 -0
  228. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/mock_author.py +0 -0
  229. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/models.py +0 -0
  230. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/network.py +0 -0
  231. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/new_issue_chat.py +0 -0
  232. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/__init__.py +0 -0
  233. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/baseline.py +0 -0
  234. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/cli.py +0 -0
  235. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/collect.py +0 -0
  236. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/digest.py +0 -0
  237. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/models.py +0 -0
  238. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/predicate.py +0 -0
  239. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/service.py +0 -0
  240. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/store.py +0 -0
  241. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/notifier/transport.py +0 -0
  242. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/openapi.py +0 -0
  243. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/overlap_fence.py +0 -0
  244. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/overlap_predict.py +0 -0
  245. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/parentage.py +0 -0
  246. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/parentage_github.py +0 -0
  247. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/pipeline.py +0 -0
  248. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/plan_parser.py +0 -0
  249. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/plans.py +0 -0
  250. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/platform_paths.py +0 -0
  251. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/portal_bridge.py +0 -0
  252. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/portal_store.py +0 -0
  253. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/portal_sync.py +0 -0
  254. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/pr_body_lint.py +0 -0
  255. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/prereqs.py +0 -0
  256. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/progress.py +0 -0
  257. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/providers/__init__.py +0 -0
  258. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/providers/base.py +0 -0
  259. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/providers/claude.py +0 -0
  260. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/providers/claude_pty.py +0 -0
  261. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/providers/opencode.py +0 -0
  262. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/queue_diagnose.py +0 -0
  263. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/reconcile.py +0 -0
  264. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/reconcile_tick.py +0 -0
  265. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/refine_chat.py +0 -0
  266. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/release_cordon.py +0 -0
  267. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/release_propagate.py +0 -0
  268. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/release_verify.py +0 -0
  269. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/release_window.py +0 -0
  270. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/repo_dormancy.py +0 -0
  271. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/repo_edit.py +0 -0
  272. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/repo_onboard.py +0 -0
  273. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/reports.py +0 -0
  274. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/rest_schema.py +0 -0
  275. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/restart_cmd.py +0 -0
  276. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/revalidate.py +0 -0
  277. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/review.py +0 -0
  278. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/scorecard.py +0 -0
  279. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/self_health.py +0 -0
  280. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/serve_app.py +0 -0
  281. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  282. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  283. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  284. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  285. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  286. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/portal-followup/SKILL.md +0 -0
  287. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/release-now/SKILL.md +0 -0
  288. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  289. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  290. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/skills/update-issue/SKILL.md +0 -0
  291. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/smoke.py +0 -0
  292. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/spend_ceiling.py +0 -0
  293. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/split_work.py +0 -0
  294. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/sql.py +0 -0
  295. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/stage_projection.py +0 -0
  296. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/state.py +0 -0
  297. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/store_migrate.py +0 -0
  298. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/store_parity.py +0 -0
  299. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/templates/deploy-cloudflare.node.yml +0 -0
  300. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/test_author.py +0 -0
  301. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/test_chat.py +0 -0
  302. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/test_orchestrator.py +0 -0
  303. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/test_report.py +0 -0
  304. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/tui_release.py +0 -0
  305. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/uat_checks.py +0 -0
  306. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/usage.py +0 -0
  307. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/usage_limits.py +0 -0
  308. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/usage_rollup.py +0 -0
  309. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coord/worker_events.py +0 -0
  310. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/coordinator.example.yml +0 -0
  311. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-agent.service +0 -0
  312. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-backup.service +0 -0
  313. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-backup.timer +0 -0
  314. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-db-backup.service +0 -0
  315. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-db-backup.sh +0 -0
  316. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-db-backup.timer +0 -0
  317. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-dr-verify.service +0 -0
  318. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-dr-verify.timer +0 -0
  319. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-drive-queue.service +0 -0
  320. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-drive-queue.timer +0 -0
  321. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-failure-notify.service +0 -0
  322. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-failure-notify.sh +0 -0
  323. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-fleet-watchdog.service +0 -0
  324. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-fleet-watchdog.timer +0 -0
  325. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-notify.service +0 -0
  326. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-notify.timer +0 -0
  327. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-release-propagate.service +0 -0
  328. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-release-propagate.timer +0 -0
  329. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-release-window.service +0 -0
  330. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-release-window.timer +0 -0
  331. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-serve.service +0 -0
  332. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-web-dist-build.service +0 -0
  333. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-web-dist-build.sh +0 -0
  334. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-web-dist-build.timer +0 -0
  335. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-web-rollback.sh +0 -0
  336. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/coord-web.service +0 -0
  337. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/deploy/node-shim.sh +0 -0
  338. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/ADR_COORD_TUI_CI.md +0 -0
  339. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  340. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/ADR_COORD_WEB_CI.md +0 -0
  341. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/ADR_COORD_WEB_DIST.md +0 -0
  342. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  343. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/AGENT_OPERATIONS.md +0 -0
  344. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/ARCHITECTURE.md +0 -0
  345. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/ARCH_SECURITY_GATES.md +0 -0
  346. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/COCKPIT.md +0 -0
  347. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/CONTROL_CENTER.md +0 -0
  348. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/COST_DISCIPLINE.md +0 -0
  349. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/CROSS_PLATFORM.md +0 -0
  350. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/CUSTOMER_FACING_APPS.md +0 -0
  351. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/CUSTOMER_PORTAL.md +0 -0
  352. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/DATA_STORE_SELECTION.md +0 -0
  353. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/DISASTER_RECOVERY.md +0 -0
  354. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/DRIVE_QUEUE.md +0 -0
  355. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/EPHEMERAL_WORKERS.md +0 -0
  356. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/FORGE_MIGRATION.md +0 -0
  357. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/GRAPHIFY_SETUP.md +0 -0
  358. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/ISSUE_GUIDANCE.md +0 -0
  359. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/MAC_MINI.md +0 -0
  360. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  361. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/NOTIFIER.md +0 -0
  362. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/OPENCODE_VERIFICATION.md +0 -0
  363. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/OPERATING_GOTCHAS.md +0 -0
  364. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/OPERATOR_GUIDES.md +0 -0
  365. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/ORACLE_LOOP.md +0 -0
  366. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/PHONE_WEBAPP.md +0 -0
  367. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/PIPELINE_V2.md +0 -0
  368. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/PLATFORM_EVOLUTION.md +0 -0
  369. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/SECOND_BACKEND.md +0 -0
  370. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/STORE_SERVICE.md +0 -0
  371. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  372. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/WEB_CONTROL_CENTER.md +0 -0
  373. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/WSL_WINDOWS_WORKER.md +0 -0
  374. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/mocks/web/README.md +0 -0
  375. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/mocks/web/_tokens.css +0 -0
  376. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/mocks/web/issue-detail.html +0 -0
  377. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/mocks/web/pipeline-narrow.html +0 -0
  378. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/docs/mocks/web/pipeline-wide.html +0 -0
  379. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/graphify-out/.gitignore +0 -0
  380. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/install-agent.sh +0 -0
  381. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/pyproject.toml +0 -0
  382. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/audit_review_verdict_overrides.py +0 -0
  383. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  384. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/build-worker-image.sh +0 -0
  385. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/coordinator-machine.py +0 -0
  386. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/dr-down.sh +0 -0
  387. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/dr-up.sh +0 -0
  388. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/epic-down.sh +0 -0
  389. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/epic-up.sh +0 -0
  390. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/preflight.sh +0 -0
  391. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/provision-server.sh +0 -0
  392. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/provision-worker.sh +0 -0
  393. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  394. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  395. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/throwaway-vm.sh +0 -0
  396. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/azure-workers/verify-github-token.sh +0 -0
  397. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/check_gh_argv_containment.py +0 -0
  398. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/codegen.py +0 -0
  399. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/coord-test-runner.sh +0 -0
  400. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  401. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  402. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  403. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  404. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/coord-venv-rollback.sh +0 -0
  405. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/drive-batch.sh +0 -0
  406. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/extract-coord-tui.sh +0 -0
  407. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/fleet_watchdog.py +0 -0
  408. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/gen_board_fixture.py +0 -0
  409. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/gen_mock_index.py +0 -0
  410. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/lib/provision-core.sh +0 -0
  411. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/next_release_tag.py +0 -0
  412. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/provision-machine.sh +0 -0
  413. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/run_tests_in_populated_home.sh +0 -0
  414. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/run_tests_without_gh.sh +0 -0
  415. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/setup-macmini.sh +0 -0
  416. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/smoke_437_interactive.py +0 -0
  417. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/verify-provision-noble.sh +0 -0
  418. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/verify_878_review_capture.py +0 -0
  419. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/verify_release_published.py +0 -0
  420. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/scripts/verify_release_wheel.py +0 -0
  421. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/setup.cfg +0 -0
  422. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/SMOKE_SET.md +0 -0
  423. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/__init__.py +0 -0
  424. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-37/conftest.py +0 -0
  425. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-37/contract.md +0 -0
  426. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-37/manifest.yml +0 -0
  427. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  428. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  429. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-51/contract.md +0 -0
  430. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  431. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  432. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-51/manifest.yml +0 -0
  433. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  434. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-51/tsconfig.json +0 -0
  435. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  436. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/backends.py +0 -0
  437. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/conftest.py +0 -0
  438. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/board-pipeline-basic.json +0 -0
  439. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  440. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  441. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  442. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  443. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/playwright/all_pass.json +0 -0
  444. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  445. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/playwright/mixed_fail.json +0 -0
  446. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  447. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  448. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/playwright/skip.json +0 -0
  449. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/playwright/truncated.json +0 -0
  450. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  451. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  452. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  453. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  454. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  455. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  456. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  457. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  458. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_acceptance.py +0 -0
  459. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_acceptance_drivers.py +0 -0
  460. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent.py +0 -0
  461. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_api_error.py +0 -0
  462. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_app.py +0 -0
  463. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_branch_base.py +0 -0
  464. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_branch_capture.py +0 -0
  465. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_config_free_1712.py +0 -0
  466. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_deploy_units_endpoint.py +0 -0
  467. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_dirty_worktree.py +0 -0
  468. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  469. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_graph_self_heal.py +0 -0
  470. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_health_h3.py +0 -0
  471. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_idle_restart.py +0 -0
  472. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_push_failure.py +0 -0
  473. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_reap.py +0 -0
  474. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_repos_and_pull.py +0 -0
  475. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_restart_services_endpoint.py +0 -0
  476. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_skills_self_heal.py +0 -0
  477. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_startup_diagnostics.py +0 -0
  478. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_update.py +0 -0
  479. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_update_bluegreen.py +0 -0
  480. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_usage_limit.py +0 -0
  481. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_agent_zero_commit.py +0 -0
  482. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_ambient_home_isolation.py +0 -0
  483. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_approve_capability_reroute_3241.py +0 -0
  484. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_approve_dependency_busy_2804.py +0 -0
  485. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_approve_reject_plan.py +0 -0
  486. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_approve_usage_gate.py +0 -0
  487. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_approved_work_2532.py +0 -0
  488. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_approved_work_2996.py +0 -0
  489. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_assignment_already_recorded_daemon.py +0 -0
  490. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_audit_log.py +0 -0
  491. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_audit_outcome.py +0 -0
  492. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_audit_query.py +0 -0
  493. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_auto_loop.py +0 -0
  494. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_auto_release_publish_2035.py +0 -0
  495. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_backend_selection.py +0 -0
  496. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_backup.py +0 -0
  497. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_base_checkout_restore.py +0 -0
  498. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_block_log.py +0 -0
  499. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_board_cap_762.py +0 -0
  500. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_board_fixture.py +0 -0
  501. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_board_read_path.py +0 -0
  502. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_board_schema.py +0 -0
  503. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_board_service.py +0 -0
  504. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_board_state.py +0 -0
  505. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_board_wire.py +0 -0
  506. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_brain.py +0 -0
  507. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_branch_model.py +0 -0
  508. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_bug_intake.py +0 -0
  509. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_build_worker_image_env_update.py +0 -0
  510. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cargo_cache.py +0 -0
  511. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_check_gh_argv_containment.py +0 -0
  512. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_ci_acceptance_gate_1950.py +0 -0
  513. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_ci_fix.py +0 -0
  514. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_ci_github.py +0 -0
  515. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_ci_gitlab.py +0 -0
  516. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_ci_parity_2091.py +0 -0
  517. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_ci_store.py +0 -0
  518. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_claim.py +0 -0
  519. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_claude_md_budget.py +0 -0
  520. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_claude_setup_token.py +0 -0
  521. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_acceptance.py +0 -0
  522. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_assign.py +0 -0
  523. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  524. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_assign_interactive_remote.py +0 -0
  525. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_assign_provider.py +0 -0
  526. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  527. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_audit.py +0 -0
  528. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_chat_continue.py +0 -0
  529. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_ci.py +0 -0
  530. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_codegen.py +0 -0
  531. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_decide.py +0 -0
  532. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_diagnose_capability_rules.py +0 -0
  533. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_diagnose_config_provenance.py +0 -0
  534. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_diagnose_forge_availability.py +0 -0
  535. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_diagnose_graph.py +0 -0
  536. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_diagnose_self.py +0 -0
  537. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_diagnose_test_coverage.py +0 -0
  538. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_doctor.py +0 -0
  539. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_doctor_config_free_1801.py +0 -0
  540. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  541. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  542. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_drive.py +0 -0
  543. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_drive_queue.py +0 -0
  544. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_escalate.py +0 -0
  545. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_fix_headless_review.py +0 -0
  546. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_gate_a.py +0 -0
  547. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_install_drift.py +0 -0
  548. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_install_skills.py +0 -0
  549. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_issue_comment.py +0 -0
  550. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_issue_create_label.py +0 -0
  551. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_issue_reopen.py +0 -0
  552. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_issue_view_list.py +0 -0
  553. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_issues.py +0 -0
  554. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_merge.py +0 -0
  555. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_milestone_assign.py +0 -0
  556. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_milestone_capture.py +0 -0
  557. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_milestone_chat_add_child.py +0 -0
  558. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_milestone_dispatch.py +0 -0
  559. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_milestone_gate_b.py +0 -0
  560. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_milestone_gate_c.py +0 -0
  561. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_milestone_order.py +0 -0
  562. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  563. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_milestone_ship.py +0 -0
  564. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_network.py +0 -0
  565. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_new_issue_chat.py +0 -0
  566. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_plans.py +0 -0
  567. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_portal.py +0 -0
  568. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_pr.py +0 -0
  569. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_pull_artifact.py +0 -0
  570. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_queue.py +0 -0
  571. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_reattach_sessions.py +0 -0
  572. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_refine_board.py +0 -0
  573. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_release_preflight.py +0 -0
  574. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_release_propagate.py +0 -0
  575. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_release_window.py +0 -0
  576. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_repo_2220.py +0 -0
  577. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  578. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_scorecard.py +0 -0
  579. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_serve_store_backend_3084.py +0 -0
  580. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_set_review_findings.py +0 -0
  581. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_advisory_terminal.py +0 -0
  582. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_contested_tag.py +0 -0
  583. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_invariant_alarms.py +0 -0
  584. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_machine_fault.py +0 -0
  585. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_merge_queue.py +0 -0
  586. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_provider.py +0 -0
  587. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_retried_3340.py +0 -0
  588. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_review_finalizing.py +0 -0
  589. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_supervisor_3366.py +0 -0
  590. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_test_failed_tag.py +0 -0
  591. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_status_usage_limit.py +0 -0
  592. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_sync_comments_873.py +0 -0
  593. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_test_plan.py +0 -0
  594. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_track.py +0 -0
  595. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_tui_update.py +0 -0
  596. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cli_wait.py +0 -0
  597. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_client.py +0 -0
  598. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_client_base_install.py +0 -0
  599. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_client_config_cache_atomic_3052.py +0 -0
  600. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_client_resource_migration_1946.py +0 -0
  601. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_commands_common.py +0 -0
  602. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_comments.py +0 -0
  603. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_completion_summary.py +0 -0
  604. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_config.py +0 -0
  605. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_config_acceptance.py +0 -0
  606. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_config_audit.py +0 -0
  607. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_config_drift_check.py +0 -0
  608. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_config_effective.py +0 -0
  609. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_config_pricing.py +0 -0
  610. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  611. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_config_usage_gate.py +0 -0
  612. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_confirm_test.py +0 -0
  613. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_conflict_fix.py +0 -0
  614. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_conflict_fix_semantic.py +0 -0
  615. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  616. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coord_test.py +0 -0
  617. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  618. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coord_test_runner_baseline.py +0 -0
  619. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coord_test_runner_populated_home.py +0 -0
  620. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coord_test_runner_routing.py +0 -0
  621. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coord_test_runner_toolchain.py +0 -0
  622. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coord_uat.py +0 -0
  623. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coord_web_sse_restart_live.py +0 -0
  624. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_coordinator_machine.py +0 -0
  625. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_cross_platform_imports.py +0 -0
  626. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dao.py +0 -0
  627. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dashboard.py +0 -0
  628. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dashboard_api.py +0 -0
  629. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dashboard_fixture.py +0 -0
  630. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dashboard_server.py +0 -0
  631. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dashboard_terminal.py +0 -0
  632. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dashboard_terminal_live.py +0 -0
  633. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_db.py +0 -0
  634. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dead_end.py +0 -0
  635. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_decomposition_chat.py +0 -0
  636. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_coord_db_backup.py +0 -0
  637. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_coord_web_dist.py +0 -0
  638. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_coord_web_rollback.py +0 -0
  639. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_db_backup_unit.py +0 -0
  640. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_drive_queue_unit.py +0 -0
  641. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_failure_notify_unit.py +0 -0
  642. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_manifest.py +0 -0
  643. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_notify_unit.py +0 -0
  644. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_units_lane.py +0 -0
  645. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deploy_web_unit.py +0 -0
  646. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deprecation_telemetry.py +0 -0
  647. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_deps.py +0 -0
  648. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_diagnose.py +0 -0
  649. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dispatch.py +0 -0
  650. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dispatch_liveness.py +0 -0
  651. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dispatch_target_validation.py +0 -0
  652. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dispatch_workers.py +0 -0
  653. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dist_name.py +0 -0
  654. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_done_housekeeping.py +0 -0
  655. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dr_azure_scripts.py +0 -0
  656. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_dr_promote.py +0 -0
  657. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive.py +0 -0
  658. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_machine_fault.py +0 -0
  659. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_queue_blocked_rendering.py +0 -0
  660. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_queue_launch_argv.py +0 -0
  661. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_queue_max_parallel_config.py +0 -0
  662. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  663. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_queue_roll_pending.py +0 -0
  664. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  665. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_sessions_snapshot.py +0 -0
  666. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_state.py +0 -0
  667. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_drive_tmux.py +0 -0
  668. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_epic_up_capability_detection.py +0 -0
  669. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  670. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_epic_up_image_provenance.py +0 -0
  671. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_errors.py +0 -0
  672. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_events.py +0 -0
  673. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_failure_class.py +0 -0
  674. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_failure_classifier.py +0 -0
  675. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_filelock.py +0 -0
  676. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  677. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_fix_escalation_classifier.py +0 -0
  678. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_fix_of_force_override.py +0 -0
  679. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_fleet_config_health.py +0 -0
  680. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_fleet_health_probes.py +0 -0
  681. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_fleet_health_snapshot.py +0 -0
  682. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_fleet_watchdog.py +0 -0
  683. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_forge_availability.py +0 -0
  684. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_freshness.py +0 -0
  685. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_gate_a.py +0 -0
  686. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_gate_b.py +0 -0
  687. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_gate_snapshot_staleness.py +0 -0
  688. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_gates.py +0 -0
  689. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  690. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_gen_mock_index.py +0 -0
  691. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_generated_rust_fixture.py +0 -0
  692. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_generated_rust_requests.py +0 -0
  693. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_generated_types_fixture.py +0 -0
  694. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_github_ops.py +0 -0
  695. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_github_throttle.py +0 -0
  696. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_goal.py +0 -0
  697. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_graph_health.py +0 -0
  698. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_graph_selfheal_absent_2237.py +0 -0
  699. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_handoff.py +0 -0
  700. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_checks.py +0 -0
  701. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_cli.py +0 -0
  702. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_cli_graph.py +0 -0
  703. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_config.py +0 -0
  704. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_context.py +0 -0
  705. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_coord_tui_ci_pin.py +0 -0
  706. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_coord_web_ci_pin.py +0 -0
  707. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_deploy_lane_facts.py +0 -0
  708. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_fix.py +0 -0
  709. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_incident_regression.py +0 -0
  710. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_issues_sync_staleness.py +0 -0
  711. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_pr_churn.py +0 -0
  712. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_pypi.py +0 -0
  713. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_registry.py +0 -0
  714. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_release_cordon_probe.py +0 -0
  715. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_timer_active.py +0 -0
  716. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_toolchain.py +0 -0
  717. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_unit_drift.py +0 -0
  718. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_unit_enablement.py +0 -0
  719. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_health_wedged_drive_queue.py +0 -0
  720. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_hooks.py +0 -0
  721. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_housekeeping.py +0 -0
  722. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_human_attended_437.py +0 -0
  723. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_init.py +0 -0
  724. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_install_agent_venv_2911.py +0 -0
  725. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_integration.py +0 -0
  726. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_interactive.py +0 -0
  727. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_interactive_briefing_echo.py +0 -0
  728. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_interactive_pane_log_2541.py +0 -0
  729. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_interactive_prefill_state.py +0 -0
  730. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_interactive_session_relaunch.py +0 -0
  731. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_interactive_test_verdict_backstop.py +0 -0
  732. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_interactive_token_attribution.py +0 -0
  733. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_interactive_worktree.py +0 -0
  734. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_invariant_alarms.py +0 -0
  735. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_issue_store_seam.py +0 -0
  736. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_issues_sync_status.py +0 -0
  737. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_liveness_auditor.py +0 -0
  738. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_liveness_notify.py +0 -0
  739. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_lock_contention_ratchet.py +0 -0
  740. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_machine_fault.py +0 -0
  741. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_machine_metrics.py +0 -0
  742. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_machine_onboard.py +0 -0
  743. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_machine_pause.py +0 -0
  744. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_machine_stats.py +0 -0
  745. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_merge_queue.py +0 -0
  746. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_merge_verify.py +0 -0
  747. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_milestone_chat.py +0 -0
  748. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_milestone_dispatch.py +0 -0
  749. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_milestone_gate.py +0 -0
  750. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_milestone_order.py +0 -0
  751. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_milestone_seam.py +0 -0
  752. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_mock_author.py +0 -0
  753. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_model_tiering.py +0 -0
  754. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_models.py +0 -0
  755. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_models_config_labels.py +0 -0
  756. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_needs_attention.py +0 -0
  757. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_network.py +0 -0
  758. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_new_issue_chat.py +0 -0
  759. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_next_release_tag.py +0 -0
  760. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_node_shim.py +0 -0
  761. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notifier_baseline.py +0 -0
  762. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notifier_cli.py +0 -0
  763. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notifier_collect.py +0 -0
  764. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notifier_config.py +0 -0
  765. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notifier_drive_seam.py +0 -0
  766. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notifier_isolation.py +0 -0
  767. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notifier_predicate.py +0 -0
  768. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notifier_quiet_hours.py +0 -0
  769. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notifier_service.py +0 -0
  770. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notify.py +0 -0
  771. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_notify_drain.py +0 -0
  772. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_openapi.py +0 -0
  773. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_operational_defaults.py +0 -0
  774. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_overlap_fence.py +0 -0
  775. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_overlap_predict.py +0 -0
  776. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_packaged_deploy_units.py +0 -0
  777. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_parentage.py +0 -0
  778. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_paste_landed.py +0 -0
  779. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  780. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_pipeline.py +0 -0
  781. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_plan_followup_approve_plan_command.py +0 -0
  782. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_plan_followup_pr_command.py +0 -0
  783. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_plan_followup_review_command.py +0 -0
  784. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_plan_only.py +0 -0
  785. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_plan_parser.py +0 -0
  786. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_platform_paths.py +0 -0
  787. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_portal_bridge.py +0 -0
  788. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_portal_config.py +0 -0
  789. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_portal_store.py +0 -0
  790. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_portal_sync.py +0 -0
  791. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_pr_body_lint.py +0 -0
  792. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_prereqs.py +0 -0
  793. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_production_db_guard.py +0 -0
  794. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_progress.py +0 -0
  795. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_provider_seam.py +0 -0
  796. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_providers.py +0 -0
  797. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_providers_config_labels.py +0 -0
  798. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_providers_pty.py +0 -0
  799. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_provision_core.py +0 -0
  800. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_provision_machine.py +0 -0
  801. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_py_rust_mirror_inventory.py +0 -0
  802. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_quiet_hours.py +0 -0
  803. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_quiet_hours_store_2146.py +0 -0
  804. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reap_merged_sessions.py +0 -0
  805. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reap_stale_interactive_tick.py +0 -0
  806. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reconcile.py +0 -0
  807. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reconcile_branch.py +0 -0
  808. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reconcile_completions.py +0 -0
  809. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  810. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reconcile_merges.py +0 -0
  811. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reconcile_no_agent_record.py +0 -0
  812. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reconcile_tick.py +0 -0
  813. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reconcile_usage_limit_done.py +0 -0
  814. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_refine_chat.py +0 -0
  815. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_cordon_2101.py +0 -0
  816. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  817. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_cordon_deadlock_2240.py +0 -0
  818. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  819. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_cordon_stuck_2490.py +0 -0
  820. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_propagate.py +0 -0
  821. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_propagate_threshold.py +0 -0
  822. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_roll_between_legs_2854.py +0 -0
  823. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_roll_window_handoff.py +0 -0
  824. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_unified_1242.py +0 -0
  825. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_verify.py +0 -0
  826. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_release_window.py +0 -0
  827. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_remote_auto_prune.py +0 -0
  828. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_remote_interactive_reaper.py +0 -0
  829. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_repo_add.py +0 -0
  830. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_repo_dormancy.py +0 -0
  831. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_repo_edit_2220.py +0 -0
  832. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_repo_graph_fleet_2237.py +0 -0
  833. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_repo_max_parallel_3423.py +0 -0
  834. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_repo_onboard_2220.py +0 -0
  835. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_report_result_push.py +0 -0
  836. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_reports.py +0 -0
  837. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_restart_cmd.py +0 -0
  838. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_retry.py +0 -0
  839. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_retry_advisory_1606.py +0 -0
  840. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_retry_escalation_classify_3360.py +0 -0
  841. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_retry_type_1636.py +0 -0
  842. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_revalidate.py +0 -0
  843. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_review.py +0 -0
  844. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_review_end_review_without_verdict.py +0 -0
  845. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_review_parse_failure_diagnostic.py +0 -0
  846. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_review_reaffirm.py +0 -0
  847. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_review_state.py +0 -0
  848. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_review_verdict_backstop.py +0 -0
  849. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_review_verdict_override_audit.py +0 -0
  850. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_review_verdict_relay.py +0 -0
  851. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_review_zero_commits.py +0 -0
  852. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_scoped_review_wiring.py +0 -0
  853. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_scorecard.py +0 -0
  854. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_self_health.py +0 -0
  855. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_serve.py +0 -0
  856. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_serve_app.py +0 -0
  857. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_serve_app_board_trim.py +0 -0
  858. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_serve_rest_routes.py +0 -0
  859. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_session.py +0 -0
  860. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_slice_issue_attribution.py +0 -0
  861. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_smoke.py +0 -0
  862. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  863. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_smoke_live_checkout_restore.py +0 -0
  864. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_smoke_workflow.py +0 -0
  865. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_spend_ceiling.py +0 -0
  866. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_spend_ceiling_coordinator.py +0 -0
  867. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_split.py +0 -0
  868. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_split_work.py +0 -0
  869. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_sql_dialect.py +0 -0
  870. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_stage_projection.py +0 -0
  871. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_stale_busy_reviewer_697.py +0 -0
  872. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_state.py +0 -0
  873. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_state_review_findings_daemon.py +0 -0
  874. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_status_fleet_footer.py +0 -0
  875. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_stop_1567.py +0 -0
  876. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_store_contract.py +0 -0
  877. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_store_migrate.py +0 -0
  878. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_stuck.py +0 -0
  879. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  880. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_terminal_command.py +0 -0
  881. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_test_author.py +0 -0
  882. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_test_chat.py +0 -0
  883. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_test_orchestrator.py +0 -0
  884. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_test_report.py +0 -0
  885. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_test_verdict_parsing.py +0 -0
  886. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_test_verdict_transcript_floor.py +0 -0
  887. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_text_io_encoding_audit.py +0 -0
  888. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_thin_client_board_audit.py +0 -0
  889. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_thin_client_config_load_1080.py +0 -0
  890. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_thin_client_daemon_routing_906.py +0 -0
  891. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_throwaway_vm.py +0 -0
  892. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_tmux_host.py +0 -0
  893. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_tmux_session.py +0 -0
  894. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_transcript_floor.py +0 -0
  895. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_uat_checks.py +0 -0
  896. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_usage.py +0 -0
  897. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_usage_limits.py +0 -0
  898. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_usage_rollup.py +0 -0
  899. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_venv_live_install_2121.py +0 -0
  900. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_version_single_source.py +0 -0
  901. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_watch.py +0 -0
  902. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  903. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_worker_env_venv_isolation.py +0 -0
  904. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_worker_events.py +0 -0
  905. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_worker_image_pin_sync.py +0 -0
  906. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_worker_safety.py +0 -0
  907. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_worker_test_scoping.py +0 -0
  908. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_worktree.py +0 -0
  909. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  910. {code_coordinator-0.5.520 → code_coordinator-0.5.522}/tests/test_write_parity.py +0 -0
  911. {code_coordinator-0.5.520 → 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.520
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.520
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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.522",
3
+ "distance": 0,
4
+ "node": "g3d51cf0a782a606306c6175a5b2271d2d93ea2d4",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-27"
8
+ }
@@ -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
 
@@ -714,13 +714,26 @@ def live_board_assignment_count(live_db_path: Path) -> int:
714
714
  count, which is always larger once a board has any history (#762's
715
715
  retention cap). There is no need to *boot* a second daemon to answer this:
716
716
  the live daemon (if one is even running) is not what is being tested here
717
- — only "what would `/board` report for this file" is needed, and that is
718
- exactly :meth:`coord.dao.SqliteStore.board_projection`, the same function
719
- `coord/serve_app.py`'s `/board` route calls. Calling it directly, read-only,
720
- against the live file is the "one question, one answer" version of asking
721
- a second daemon to boot just to answer a question the daemon already
722
- knows how to answer without booting.
717
+ — only "what would `/board` report for this file" is needed.
718
+
719
+ That answer is **not** simply :meth:`coord.dao.SqliteStore.board_projection`
720
+ — #762's retention window is only the first of two filters the route
721
+ applies. ``coord/serve_app.py``'s `/board` route also runs the projection
722
+ through :func:`coord.board_wire.bound_board_payload`, which caps terminal
723
+ assignments to :data:`coord.board_wire.MAX_TERMINAL_ASSIGNMENTS` (#1791) on
724
+ top of the retention window — a *second*, tighter cut a board with any
725
+ real history will always hit before the 14-day window ever does (#3451).
726
+ Skipping that second cut here made this function's own docstring claim —
727
+ "the same function `/board` route calls" — false: it counted a raw,
728
+ unbounded-by-cardinality projection while the restored side (a real
729
+ daemon's `/board`) counted the capped one, so parity failed on every real
730
+ fleet board regardless of whether the restore was actually fine.
731
+ :func:`coord.board_wire.bound_board_payload` mutates ``payload`` in place,
732
+ so applying it here before counting is the "one question, one answer"
733
+ version of asking a second daemon to boot just to answer a question the
734
+ daemon already knows how to answer without booting.
723
735
  """
736
+ from coord.board_wire import bound_board_payload # noqa: PLC0415
724
737
  from coord.dao import SqliteStore # noqa: PLC0415
725
738
 
726
739
  try:
@@ -730,6 +743,7 @@ def live_board_assignment_count(live_db_path: Path) -> int:
730
743
  f"parity check failed: could not read the live board's /board "
731
744
  f"count from {live_db_path}: {exc}"
732
745
  ) from None
746
+ bound_board_payload(payload)
733
747
  rows = payload.get("assignments")
734
748
  if not isinstance(rows, list):
735
749
  raise DRVerifyError(
@@ -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
  ):
@@ -576,6 +576,77 @@ def test_parity_failure_names_both_board_comparands_not_a_table_count(lane):
576
576
  assert "/board (live)" in message
577
577
 
578
578
 
579
+ def _seed_recent_terminal_assignments(path: Path, *, count: int) -> None:
580
+ """*count* RECENT terminal rows — inside #762's retention window, but
581
+ when *count* exceeds `coord.board_wire.MAX_TERMINAL_ASSIGNMENTS`, past
582
+ #1791's tighter cardinality cap the `/board` route applies on top of
583
+ retention. This is the #3451 shape: a store where the 14-day window keeps
584
+ everything, yet `/board` still trims — the case
585
+ `live_board_assignment_count` silently skipped before this fix.
586
+ """
587
+ conn = sqlite3.connect(str(path))
588
+ conn.row_factory = sqlite3.Row
589
+ try:
590
+ _ensure_schema(conn)
591
+ now = time.time()
592
+ conn.executemany(
593
+ "INSERT INTO assignments (assignment_id, machine_name, repo_name, "
594
+ "repo_github, issue_number, issue_title, status, type, "
595
+ "dispatched_at, finished_at) VALUES (?,?,?,?,?,?,?,?,?,?)",
596
+ [
597
+ (
598
+ f"recent-term-{i}",
599
+ "precision",
600
+ "claude-coordinator",
601
+ "JDonaghy/claude-coordinator",
602
+ 500_000 + i,
603
+ f"recent issue {i}",
604
+ "done",
605
+ "work",
606
+ now - i,
607
+ now - i,
608
+ )
609
+ for i in range(count)
610
+ ],
611
+ )
612
+ conn.commit()
613
+ finally:
614
+ conn.close()
615
+
616
+
617
+ def test_live_board_assignment_count_matches_the_real_board_route_past_the_cap(
618
+ tmp_path, valid_config_path, coord_db,
619
+ ):
620
+ """#3451: the live side must count exactly what a real `/board` route
621
+ would serve for the same file — including #1791's `MAX_TERMINAL_ASSIGNMENTS`
622
+ cardinality cap, not just #762's retention window (#3135's fix stopped
623
+ short of it). Pins the two paths together with the real route, not a
624
+ reimplementation of it, so a future cap cannot drift between them again.
625
+ """
626
+ pytest.importorskip("uvicorn")
627
+ from starlette.testclient import TestClient # noqa: PLC0415
628
+
629
+ from coord.board_wire import MAX_TERMINAL_ASSIGNMENTS # noqa: PLC0415
630
+ from coord.config import load as load_config # noqa: PLC0415
631
+ from coord.dao import SqliteStore # noqa: PLC0415
632
+ from coord.serve_app import build_app # noqa: PLC0415
633
+
634
+ db_path = tmp_path / "live-shaped.db"
635
+ _seed_recent_terminal_assignments(db_path, count=MAX_TERMINAL_ASSIGNMENTS + 150)
636
+
637
+ app = build_app(SqliteStore(db_path), load_config(valid_config_path))
638
+ with TestClient(app) as client:
639
+ resp = client.get("/board")
640
+ assert resp.status_code == 200
641
+ route_served = resp.json()["assignments"]
642
+
643
+ # Sanity: the seed really is past the cap — otherwise this test cannot
644
+ # tell the #3451 fix apart from the bug it regression-tests.
645
+ assert len(route_served) < MAX_TERMINAL_ASSIGNMENTS + 150
646
+
647
+ assert dr_verify.live_board_assignment_count(db_path) == len(route_served)
648
+
649
+
579
650
  # ==========================================================================
580
651
  # Acceptance: the scratch copy is removed on EVERY exit path
581
652
  # ==========================================================================
@@ -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
@@ -220,7 +220,7 @@ SQLITE_CONNECT_ALLOWLIST: dict[str, Classification] = {
220
220
  "it.",
221
221
  ),
222
222
  "test_dr_verify.py": Classification(
223
- 4, (BUCKET_A,),
223
+ 5, (BUCKET_A,),
224
224
  "#3119's DR-verify lane — the restore half of test_backup.py directly "
225
225
  "above, and filed A for the same reason. All four sites build or "
226
226
  "mutate a real on-disk SQLite *file* that is then snapshotted, "
@@ -239,6 +239,15 @@ SQLITE_CONNECT_ALLOWLIST: dict[str, Classification] = {
239
239
  "restore it. (The zero-assignments parity case reuses "
240
240
  "hollow_out_assignments() rather than opening its own connection, so "
241
241
  "#3135 added one site, not two.) "
242
+ "+1 for #3451's _seed_recent_terminal_assignments(), which bulk-"
243
+ "inserts RECENT terminal rows past #1791's MAX_TERMINAL_ASSIGNMENTS "
244
+ "cardinality cap into a real on-disk file so the live side can be "
245
+ "pinned against a genuine /board TestClient response — the case "
246
+ "live_board_assignment_count silently skipped before this fix, "
247
+ "because #3135's retention window alone was not enough to trigger "
248
+ "the cap. Same file, same reason: it has to be an on-disk file "
249
+ "because the very next thing the test does is open it through both "
250
+ "SqliteStore(by path) and dr_verify.live_board_assignment_count(). "
242
251
  "The autouse coord_db fixture cannot serve any of them — there "
243
252
  "is no file to restic — and scratch_database() is out for the usual "
244
253
  "backend-following reason: under COORD_TEST_BACKEND=postgres these "