code-coordinator 0.5.524__tar.gz → 0.5.526__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (910) hide show
  1. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/ci_fix.py +85 -1
  5. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/ci_github.py +97 -17
  6. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/drive_queue.py +212 -41
  7. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/drive_queue.py +112 -8
  8. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_ci_fix.py +179 -0
  9. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_drive_queue.py +138 -4
  10. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_queue.py +149 -0
  11. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.claude/commands/board.md +0 -0
  12. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.claude/commands/complete-session.md +0 -0
  13. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.claude/commands/coordinator.md +0 -0
  14. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.githooks/_lib.sh +0 -0
  15. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.githooks/post-checkout +0 -0
  16. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.githooks/post-commit +0 -0
  17. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.githooks/post-merge +0 -0
  18. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.github/coord-ci-acceptance.yml +0 -0
  20. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.github/workflows/auto-release.yml +0 -0
  21. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.github/workflows/test.yml +0 -0
  23. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/.gitignore +0 -0
  24. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/CLAUDE.md +0 -0
  25. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/GOAL.md +0 -0
  26. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/LICENSE +0 -0
  27. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/MANIFEST.in +0 -0
  28. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/README.md +0 -0
  29. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/code_coordinator.egg-info/SOURCES.txt +0 -0
  30. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/code_coordinator.egg-info/dependency_links.txt +0 -0
  31. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/code_coordinator.egg-info/entry_points.txt +0 -0
  32. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/code_coordinator.egg-info/requires.txt +0 -0
  33. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/code_coordinator.egg-info/scm_file_list.json +0 -0
  34. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/agent_update.py +0 -0
  42. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/approved_work.py +0 -0
  46. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/backup.py +0 -0
  49. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/block_log.py +0 -0
  50. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/board_schema.py +0 -0
  51. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/cargo_cache.py +0 -0
  57. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/ci_gitlab.py +0 -0
  58. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/ci_store.py +0 -0
  59. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/claim.py +0 -0
  60. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/claude_setup_token.py +0 -0
  61. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/client.py +0 -0
  63. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/codegen.py +0 -0
  64. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/backup.py +0 -0
  70. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/ci.py +0 -0
  72. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/codegen.py +0 -0
  73. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/dispatch.py +0 -0
  74. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/dispatch_workers.py +0 -0
  75. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/dr.py +0 -0
  76. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/drive.py +0 -0
  77. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/gate_a.py +0 -0
  78. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/gates.py +0 -0
  79. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/issues.py +0 -0
  80. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/lifecycle.py +0 -0
  81. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/machine.py +0 -0
  82. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/merge.py +0 -0
  83. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/milestone.py +0 -0
  84. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/portal.py +0 -0
  87. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/pr.py +0 -0
  88. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/release.py +0 -0
  89. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/repo.py +0 -0
  90. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/report.py +0 -0
  91. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/review.py +0 -0
  92. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/scorecard.py +0 -0
  93. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/sessions.py +0 -0
  94. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/setup.py +0 -0
  95. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/status.py +0 -0
  96. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/store_migrate.py +0 -0
  97. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/terminal.py +0 -0
  98. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/test_gate.py +0 -0
  99. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/commands/tui.py +0 -0
  100. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/comments.py +0 -0
  101. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/config.py +0 -0
  102. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/config_reload.py +0 -0
  103. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/confirm_test.py +0 -0
  104. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/conflict_fix.py +0 -0
  105. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dao.py +0 -0
  106. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dashboard/__init__.py +0 -0
  107. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dashboard/fixture.py +0 -0
  108. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dashboard/index.html +0 -0
  109. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dashboard/server.py +0 -0
  110. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dashboard/terminal.py +0 -0
  111. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/db.py +0 -0
  112. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dead_end.py +0 -0
  113. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/decomposition_chat.py +0 -0
  114. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/README.md +0 -0
  115. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-agent.service +0 -0
  116. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-backup.service +0 -0
  117. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-backup.timer +0 -0
  118. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-db-backup.service +0 -0
  119. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-db-backup.sh +0 -0
  120. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-db-backup.timer +0 -0
  121. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-dr-verify.service +0 -0
  122. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-dr-verify.timer +0 -0
  123. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-drive-queue.service +0 -0
  124. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-drive-queue.timer +0 -0
  125. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-failure-notify.service +0 -0
  126. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-fleet-watchdog.service +0 -0
  127. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  128. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-notify.service +0 -0
  129. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-notify.timer +0 -0
  130. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-release-propagate.service +0 -0
  131. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-release-propagate.timer +0 -0
  132. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-release-window.service +0 -0
  133. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-release-window.timer +0 -0
  134. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-serve.service +0 -0
  135. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-web-dist-build.service +0 -0
  136. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-web-dist-build.timer +0 -0
  137. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy/coord-web.service +0 -0
  138. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy_manifest.py +0 -0
  139. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deploy_units.py +0 -0
  140. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deprecation_telemetry.py +0 -0
  141. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/deps.py +0 -0
  142. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/diagnose.py +0 -0
  143. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dispatch.py +0 -0
  144. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dispatch_liveness.py +0 -0
  145. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dist_name.py +0 -0
  146. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dr_promote.py +0 -0
  147. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/dr_verify.py +0 -0
  148. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/drive.py +0 -0
  149. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/drive_sessions_snapshot.py +0 -0
  150. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/drive_state.py +0 -0
  151. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/events.py +0 -0
  152. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/failure_class.py +0 -0
  153. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/failure_classifier.py +0 -0
  154. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/filelock.py +0 -0
  155. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/fleet_config_health.py +0 -0
  156. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/forge_availability.py +0 -0
  157. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/freshness.py +0 -0
  158. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/gate_a.py +0 -0
  159. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/gate_b.py +0 -0
  160. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/gate_snapshot.py +0 -0
  161. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/gates.py +0 -0
  162. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/gen_board_fixture.py +0 -0
  163. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/github_ops.py +0 -0
  164. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/github_throttle.py +0 -0
  165. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/goal.py +0 -0
  166. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/graph_health.py +0 -0
  167. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/__init__.py +0 -0
  168. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/aggregate.py +0 -0
  169. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/__init__.py +0 -0
  170. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/_ci_pin.py +0 -0
  171. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/agent_install.py +0 -0
  172. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/cargo_targets.py +0 -0
  173. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/claude_binary.py +0 -0
  174. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/config_drift.py +0 -0
  175. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  176. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/coord_web_ci_pin.py +0 -0
  177. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/deploy_lane_facts.py +0 -0
  178. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/disk.py +0 -0
  179. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/fleet_board.py +0 -0
  180. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  181. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/fleet_phantom.py +0 -0
  182. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/fleet_unit_drift.py +0 -0
  183. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/graph.py +0 -0
  184. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/graphify_cli.py +0 -0
  185. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/index_lock.py +0 -0
  186. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/issues_sync_staleness.py +0 -0
  187. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/local_machine_identity.py +0 -0
  188. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/plan_usage.py +0 -0
  189. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/pr_churn.py +0 -0
  190. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/release_cordon.py +0 -0
  191. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/repo_state.py +0 -0
  192. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/spawned_coord.py +0 -0
  193. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/stalled_pipeline.py +0 -0
  194. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/timer_active.py +0 -0
  195. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/toolchain.py +0 -0
  196. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/unit_drift.py +0 -0
  197. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/unit_enablement.py +0 -0
  198. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/wedged_drive_queue.py +0 -0
  199. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/checks/worktrees.py +0 -0
  200. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/cli.py +0 -0
  201. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/context.py +0 -0
  202. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/fleet_snapshot.py +0 -0
  203. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/models.py +0 -0
  204. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/pypi.py +0 -0
  205. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/registry.py +0 -0
  206. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/render.py +0 -0
  207. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/health/units.py +0 -0
  208. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/hooks.py +0 -0
  209. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/housekeeping.py +0 -0
  210. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/interactive.py +0 -0
  211. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/invariant_alarms.py +0 -0
  212. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/issue_store.py +0 -0
  213. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/issues_sync_status.py +0 -0
  214. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/liveness_auditor.py +0 -0
  215. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/machine_fault.py +0 -0
  216. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/machine_metrics.py +0 -0
  217. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/machine_onboard.py +0 -0
  218. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/machine_pause.py +0 -0
  219. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/machine_stats.py +0 -0
  220. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/merge_queue.py +0 -0
  221. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/milestone_chat.py +0 -0
  222. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/milestone_dispatch.py +0 -0
  223. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/milestone_gate.py +0 -0
  224. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/milestone_order.py +0 -0
  225. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/mock_author.py +0 -0
  226. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/models.py +0 -0
  227. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/network.py +0 -0
  228. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/new_issue_chat.py +0 -0
  229. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/__init__.py +0 -0
  230. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/baseline.py +0 -0
  231. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/cli.py +0 -0
  232. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/collect.py +0 -0
  233. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/digest.py +0 -0
  234. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/models.py +0 -0
  235. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/predicate.py +0 -0
  236. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/service.py +0 -0
  237. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/store.py +0 -0
  238. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notifier/transport.py +0 -0
  239. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/notify.py +0 -0
  240. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/openapi.py +0 -0
  241. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/overlap_fence.py +0 -0
  242. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/overlap_predict.py +0 -0
  243. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/parentage.py +0 -0
  244. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/parentage_github.py +0 -0
  245. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/pipeline.py +0 -0
  246. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/plan_parser.py +0 -0
  247. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/plans.py +0 -0
  248. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/platform_paths.py +0 -0
  249. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/portal_bridge.py +0 -0
  250. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/portal_store.py +0 -0
  251. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/portal_sync.py +0 -0
  252. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/pr_body_lint.py +0 -0
  253. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/prereqs.py +0 -0
  254. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/progress.py +0 -0
  255. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/providers/__init__.py +0 -0
  256. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/providers/base.py +0 -0
  257. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/providers/claude.py +0 -0
  258. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/providers/claude_pty.py +0 -0
  259. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/providers/opencode.py +0 -0
  260. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/queue_diagnose.py +0 -0
  261. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/reconcile.py +0 -0
  262. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/reconcile_tick.py +0 -0
  263. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/refine_chat.py +0 -0
  264. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/release_cordon.py +0 -0
  265. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/release_propagate.py +0 -0
  266. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/release_verify.py +0 -0
  267. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/release_window.py +0 -0
  268. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/repo_dormancy.py +0 -0
  269. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/repo_edit.py +0 -0
  270. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/repo_onboard.py +0 -0
  271. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/reports.py +0 -0
  272. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/rest_schema.py +0 -0
  273. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/restart_cmd.py +0 -0
  274. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/revalidate.py +0 -0
  275. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/review.py +0 -0
  276. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/scorecard.py +0 -0
  277. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/self_health.py +0 -0
  278. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/serve_app.py +0 -0
  279. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  280. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  281. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  282. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  283. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  284. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/portal-followup/SKILL.md +0 -0
  285. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/release-now/SKILL.md +0 -0
  286. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  287. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  288. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/skills/update-issue/SKILL.md +0 -0
  289. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/smoke.py +0 -0
  290. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/spend_ceiling.py +0 -0
  291. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/split_work.py +0 -0
  292. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/sql.py +0 -0
  293. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/stage_projection.py +0 -0
  294. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/state.py +0 -0
  295. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/store_migrate.py +0 -0
  296. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/store_parity.py +0 -0
  297. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/templates/deploy-cloudflare.node.yml +0 -0
  298. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/test_author.py +0 -0
  299. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/test_chat.py +0 -0
  300. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/test_orchestrator.py +0 -0
  301. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/test_report.py +0 -0
  302. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/tui_release.py +0 -0
  303. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/uat_checks.py +0 -0
  304. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/usage.py +0 -0
  305. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/usage_limits.py +0 -0
  306. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/usage_rollup.py +0 -0
  307. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coord/worker_events.py +0 -0
  308. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/coordinator.example.yml +0 -0
  309. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-agent.service +0 -0
  310. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-backup.service +0 -0
  311. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-backup.timer +0 -0
  312. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-db-backup.service +0 -0
  313. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-db-backup.sh +0 -0
  314. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-db-backup.timer +0 -0
  315. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-dr-verify.service +0 -0
  316. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-dr-verify.timer +0 -0
  317. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-drive-queue.service +0 -0
  318. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-drive-queue.timer +0 -0
  319. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-failure-notify.service +0 -0
  320. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-failure-notify.sh +0 -0
  321. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-fleet-watchdog.service +0 -0
  322. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-fleet-watchdog.timer +0 -0
  323. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-notify.service +0 -0
  324. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-notify.timer +0 -0
  325. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-release-propagate.service +0 -0
  326. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-release-propagate.timer +0 -0
  327. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-release-window.service +0 -0
  328. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-release-window.timer +0 -0
  329. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-serve.service +0 -0
  330. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-web-dist-build.service +0 -0
  331. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-web-dist-build.sh +0 -0
  332. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-web-dist-build.timer +0 -0
  333. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-web-rollback.sh +0 -0
  334. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/coord-web.service +0 -0
  335. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/deploy/node-shim.sh +0 -0
  336. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/ADR_COORD_TUI_CI.md +0 -0
  337. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  338. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/ADR_COORD_WEB_CI.md +0 -0
  339. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/ADR_COORD_WEB_DIST.md +0 -0
  340. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  341. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/AGENT_OPERATIONS.md +0 -0
  342. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/ARCHITECTURE.md +0 -0
  343. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/ARCH_SECURITY_GATES.md +0 -0
  344. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/COCKPIT.md +0 -0
  345. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/CONTROL_CENTER.md +0 -0
  346. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/COST_DISCIPLINE.md +0 -0
  347. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/CROSS_PLATFORM.md +0 -0
  348. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/CUSTOMER_FACING_APPS.md +0 -0
  349. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/CUSTOMER_PORTAL.md +0 -0
  350. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/DATA_STORE_SELECTION.md +0 -0
  351. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/DISASTER_RECOVERY.md +0 -0
  352. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/DRIVE_QUEUE.md +0 -0
  353. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/EPHEMERAL_WORKERS.md +0 -0
  354. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/FORGE_MIGRATION.md +0 -0
  355. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/GRAPHIFY_SETUP.md +0 -0
  356. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/ISSUE_GUIDANCE.md +0 -0
  357. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/MAC_MINI.md +0 -0
  358. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  359. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/NOTIFIER.md +0 -0
  360. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/OPENCODE_VERIFICATION.md +0 -0
  361. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/OPERATING_GOTCHAS.md +0 -0
  362. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/OPERATOR_GUIDES.md +0 -0
  363. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/ORACLE_LOOP.md +0 -0
  364. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/PHONE_WEBAPP.md +0 -0
  365. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/PIPELINE_V2.md +0 -0
  366. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/PLATFORM_EVOLUTION.md +0 -0
  367. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/SECOND_BACKEND.md +0 -0
  368. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/STORE_SERVICE.md +0 -0
  369. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  370. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/WEB_CONTROL_CENTER.md +0 -0
  371. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/WSL_WINDOWS_WORKER.md +0 -0
  372. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/mocks/web/README.md +0 -0
  373. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/mocks/web/_tokens.css +0 -0
  374. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/mocks/web/issue-detail.html +0 -0
  375. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/mocks/web/pipeline-narrow.html +0 -0
  376. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/docs/mocks/web/pipeline-wide.html +0 -0
  377. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/graphify-out/.gitignore +0 -0
  378. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/install-agent.sh +0 -0
  379. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/pyproject.toml +0 -0
  380. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/audit_review_verdict_overrides.py +0 -0
  381. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  382. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/build-worker-image.sh +0 -0
  383. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/coordinator-machine.py +0 -0
  384. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/dr-down.sh +0 -0
  385. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/dr-up.sh +0 -0
  386. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/epic-down.sh +0 -0
  387. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/epic-up.sh +0 -0
  388. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/preflight.sh +0 -0
  389. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/provision-server.sh +0 -0
  390. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/provision-worker.sh +0 -0
  391. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  392. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  393. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/throwaway-vm.sh +0 -0
  394. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/azure-workers/verify-github-token.sh +0 -0
  395. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/check_gh_argv_containment.py +0 -0
  396. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/codegen.py +0 -0
  397. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/coord-test-runner.sh +0 -0
  398. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  399. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  400. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  401. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  402. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/coord-venv-rollback.sh +0 -0
  403. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/drive-batch.sh +0 -0
  404. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/extract-coord-tui.sh +0 -0
  405. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/fleet_watchdog.py +0 -0
  406. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/gen_board_fixture.py +0 -0
  407. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/gen_mock_index.py +0 -0
  408. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/lib/provision-core.sh +0 -0
  409. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/next_release_tag.py +0 -0
  410. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/provision-machine.sh +0 -0
  411. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/run_tests_in_populated_home.sh +0 -0
  412. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/run_tests_without_gh.sh +0 -0
  413. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/setup-macmini.sh +0 -0
  414. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/smoke_437_interactive.py +0 -0
  415. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/verify-provision-noble.sh +0 -0
  416. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/verify_878_review_capture.py +0 -0
  417. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/verify_release_published.py +0 -0
  418. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/scripts/verify_release_wheel.py +0 -0
  419. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/setup.cfg +0 -0
  420. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/SMOKE_SET.md +0 -0
  421. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/__init__.py +0 -0
  422. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-37/conftest.py +0 -0
  423. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-37/contract.md +0 -0
  424. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-37/manifest.yml +0 -0
  425. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  426. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  427. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-51/contract.md +0 -0
  428. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  429. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  430. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-51/manifest.yml +0 -0
  431. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  432. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-51/tsconfig.json +0 -0
  433. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  434. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/backends.py +0 -0
  435. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/conftest.py +0 -0
  436. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/board-pipeline-basic.json +0 -0
  437. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  438. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  439. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  440. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  441. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/playwright/all_pass.json +0 -0
  442. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  443. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/playwright/mixed_fail.json +0 -0
  444. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  445. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  446. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/playwright/skip.json +0 -0
  447. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/playwright/truncated.json +0 -0
  448. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  449. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  450. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  451. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  452. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  453. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  454. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  455. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  456. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_acceptance.py +0 -0
  457. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_acceptance_drivers.py +0 -0
  458. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent.py +0 -0
  459. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_api_error.py +0 -0
  460. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_app.py +0 -0
  461. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_branch_base.py +0 -0
  462. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_branch_capture.py +0 -0
  463. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_config_free_1712.py +0 -0
  464. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_deploy_units_endpoint.py +0 -0
  465. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_dirty_worktree.py +0 -0
  466. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  467. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_graph_self_heal.py +0 -0
  468. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_health_h3.py +0 -0
  469. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_idle_restart.py +0 -0
  470. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_push_failure.py +0 -0
  471. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_reap.py +0 -0
  472. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_repos_and_pull.py +0 -0
  473. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_restart_services_endpoint.py +0 -0
  474. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_skills_self_heal.py +0 -0
  475. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_startup_diagnostics.py +0 -0
  476. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_update.py +0 -0
  477. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_update_bluegreen.py +0 -0
  478. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_usage_limit.py +0 -0
  479. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_agent_zero_commit.py +0 -0
  480. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_ambient_home_isolation.py +0 -0
  481. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_approve_capability_reroute_3241.py +0 -0
  482. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_approve_dependency_busy_2804.py +0 -0
  483. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_approve_reject_plan.py +0 -0
  484. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_approve_usage_gate.py +0 -0
  485. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_approved_work_2532.py +0 -0
  486. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_approved_work_2996.py +0 -0
  487. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_assignment_already_recorded_daemon.py +0 -0
  488. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_audit_log.py +0 -0
  489. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_audit_outcome.py +0 -0
  490. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_audit_query.py +0 -0
  491. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_auto_loop.py +0 -0
  492. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_auto_release_publish_2035.py +0 -0
  493. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_backend_selection.py +0 -0
  494. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_backup.py +0 -0
  495. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_base_checkout_restore.py +0 -0
  496. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_block_log.py +0 -0
  497. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_board_cap_762.py +0 -0
  498. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_board_fixture.py +0 -0
  499. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_board_read_path.py +0 -0
  500. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_board_schema.py +0 -0
  501. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_board_service.py +0 -0
  502. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_board_state.py +0 -0
  503. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_board_wire.py +0 -0
  504. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_brain.py +0 -0
  505. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_branch_model.py +0 -0
  506. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_bug_intake.py +0 -0
  507. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_build_worker_image_env_update.py +0 -0
  508. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cargo_cache.py +0 -0
  509. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_check_gh_argv_containment.py +0 -0
  510. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_ci_acceptance_gate_1950.py +0 -0
  511. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_ci_github.py +0 -0
  512. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_ci_gitlab.py +0 -0
  513. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_ci_parity_2091.py +0 -0
  514. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_ci_store.py +0 -0
  515. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_claim.py +0 -0
  516. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_claude_md_budget.py +0 -0
  517. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_claude_setup_token.py +0 -0
  518. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_acceptance.py +0 -0
  519. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_assign.py +0 -0
  520. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  521. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_assign_interactive_remote.py +0 -0
  522. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_assign_provider.py +0 -0
  523. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  524. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_audit.py +0 -0
  525. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_chat_continue.py +0 -0
  526. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_ci.py +0 -0
  527. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_codegen.py +0 -0
  528. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_decide.py +0 -0
  529. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_diagnose_capability_rules.py +0 -0
  530. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_diagnose_config_provenance.py +0 -0
  531. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_diagnose_forge_availability.py +0 -0
  532. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_diagnose_graph.py +0 -0
  533. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_diagnose_self.py +0 -0
  534. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_diagnose_test_coverage.py +0 -0
  535. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_doctor.py +0 -0
  536. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_doctor_config_free_1801.py +0 -0
  537. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  538. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  539. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_drive.py +0 -0
  540. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_escalate.py +0 -0
  541. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_fix_headless_review.py +0 -0
  542. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_gate_a.py +0 -0
  543. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_install_drift.py +0 -0
  544. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_install_skills.py +0 -0
  545. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_issue_comment.py +0 -0
  546. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_issue_create_label.py +0 -0
  547. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_issue_reopen.py +0 -0
  548. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_issue_view_list.py +0 -0
  549. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_issues.py +0 -0
  550. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_merge.py +0 -0
  551. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_milestone_assign.py +0 -0
  552. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_milestone_capture.py +0 -0
  553. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_milestone_chat_add_child.py +0 -0
  554. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_milestone_dispatch.py +0 -0
  555. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_milestone_gate_b.py +0 -0
  556. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_milestone_gate_c.py +0 -0
  557. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_milestone_order.py +0 -0
  558. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  559. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_milestone_ship.py +0 -0
  560. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_network.py +0 -0
  561. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_new_issue_chat.py +0 -0
  562. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_plans.py +0 -0
  563. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_portal.py +0 -0
  564. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_pr.py +0 -0
  565. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_pull_artifact.py +0 -0
  566. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_queue.py +0 -0
  567. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_reattach_sessions.py +0 -0
  568. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_refine_board.py +0 -0
  569. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_release_preflight.py +0 -0
  570. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_release_propagate.py +0 -0
  571. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_release_window.py +0 -0
  572. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_repo_2220.py +0 -0
  573. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  574. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_scorecard.py +0 -0
  575. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_serve_store_backend_3084.py +0 -0
  576. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_set_review_findings.py +0 -0
  577. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_advisory_terminal.py +0 -0
  578. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_contested_tag.py +0 -0
  579. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_invariant_alarms.py +0 -0
  580. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_machine_fault.py +0 -0
  581. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_merge_queue.py +0 -0
  582. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_provider.py +0 -0
  583. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_retried_3340.py +0 -0
  584. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_review_finalizing.py +0 -0
  585. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_supervisor_3366.py +0 -0
  586. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_test_failed_tag.py +0 -0
  587. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_status_usage_limit.py +0 -0
  588. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_sync_comments_873.py +0 -0
  589. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_test_plan.py +0 -0
  590. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_track.py +0 -0
  591. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_tui_update.py +0 -0
  592. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cli_wait.py +0 -0
  593. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_client.py +0 -0
  594. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_client_base_install.py +0 -0
  595. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_client_config_cache_atomic_3052.py +0 -0
  596. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_client_resource_migration_1946.py +0 -0
  597. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_commands_common.py +0 -0
  598. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_comments.py +0 -0
  599. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_completion_summary.py +0 -0
  600. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_config.py +0 -0
  601. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_config_acceptance.py +0 -0
  602. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_config_audit.py +0 -0
  603. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_config_drift_check.py +0 -0
  604. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_config_effective.py +0 -0
  605. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_config_pricing.py +0 -0
  606. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  607. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_config_usage_gate.py +0 -0
  608. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_confirm_test.py +0 -0
  609. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_conflict_fix.py +0 -0
  610. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_conflict_fix_semantic.py +0 -0
  611. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  612. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coord_test.py +0 -0
  613. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  614. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coord_test_runner_baseline.py +0 -0
  615. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coord_test_runner_populated_home.py +0 -0
  616. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coord_test_runner_routing.py +0 -0
  617. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coord_test_runner_toolchain.py +0 -0
  618. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coord_uat.py +0 -0
  619. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coord_web_sse_restart_live.py +0 -0
  620. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_coordinator_machine.py +0 -0
  621. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_cross_platform_imports.py +0 -0
  622. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dao.py +0 -0
  623. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dashboard.py +0 -0
  624. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dashboard_api.py +0 -0
  625. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dashboard_fixture.py +0 -0
  626. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dashboard_server.py +0 -0
  627. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dashboard_terminal.py +0 -0
  628. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dashboard_terminal_live.py +0 -0
  629. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_db.py +0 -0
  630. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dead_end.py +0 -0
  631. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_decomposition_chat.py +0 -0
  632. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_coord_db_backup.py +0 -0
  633. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_coord_web_dist.py +0 -0
  634. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_coord_web_rollback.py +0 -0
  635. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_db_backup_unit.py +0 -0
  636. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_drive_queue_unit.py +0 -0
  637. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_failure_notify_unit.py +0 -0
  638. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_manifest.py +0 -0
  639. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_notify_unit.py +0 -0
  640. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_units_lane.py +0 -0
  641. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deploy_web_unit.py +0 -0
  642. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deprecation_telemetry.py +0 -0
  643. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_deps.py +0 -0
  644. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_diagnose.py +0 -0
  645. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dispatch.py +0 -0
  646. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dispatch_liveness.py +0 -0
  647. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dispatch_target_validation.py +0 -0
  648. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dispatch_workers.py +0 -0
  649. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dist_name.py +0 -0
  650. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_done_housekeeping.py +0 -0
  651. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dr_azure_scripts.py +0 -0
  652. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dr_promote.py +0 -0
  653. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_dr_verify.py +0 -0
  654. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive.py +0 -0
  655. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_machine_fault.py +0 -0
  656. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_queue_blocked_rendering.py +0 -0
  657. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_queue_launch_argv.py +0 -0
  658. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_queue_max_parallel_config.py +0 -0
  659. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  660. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_queue_roll_pending.py +0 -0
  661. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  662. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_sessions_snapshot.py +0 -0
  663. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_state.py +0 -0
  664. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_drive_tmux.py +0 -0
  665. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_epic_up_capability_detection.py +0 -0
  666. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  667. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_epic_up_image_provenance.py +0 -0
  668. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_errors.py +0 -0
  669. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_events.py +0 -0
  670. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_failure_class.py +0 -0
  671. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_failure_classifier.py +0 -0
  672. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_filelock.py +0 -0
  673. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  674. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_fix_escalation_classifier.py +0 -0
  675. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_fix_of_force_override.py +0 -0
  676. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_fleet_config_health.py +0 -0
  677. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_fleet_health_probes.py +0 -0
  678. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_fleet_health_snapshot.py +0 -0
  679. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_fleet_watchdog.py +0 -0
  680. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_forge_availability.py +0 -0
  681. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_freshness.py +0 -0
  682. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_gate_a.py +0 -0
  683. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_gate_b.py +0 -0
  684. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_gate_snapshot_staleness.py +0 -0
  685. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_gates.py +0 -0
  686. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  687. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_gen_mock_index.py +0 -0
  688. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_generated_rust_fixture.py +0 -0
  689. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_generated_rust_requests.py +0 -0
  690. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_generated_types_fixture.py +0 -0
  691. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_github_ops.py +0 -0
  692. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_github_throttle.py +0 -0
  693. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_goal.py +0 -0
  694. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_graph_health.py +0 -0
  695. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_graph_selfheal_absent_2237.py +0 -0
  696. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_handoff.py +0 -0
  697. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_checks.py +0 -0
  698. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_cli.py +0 -0
  699. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_cli_graph.py +0 -0
  700. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_config.py +0 -0
  701. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_context.py +0 -0
  702. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_coord_tui_ci_pin.py +0 -0
  703. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_coord_web_ci_pin.py +0 -0
  704. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_deploy_lane_facts.py +0 -0
  705. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_fix.py +0 -0
  706. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_incident_regression.py +0 -0
  707. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_issues_sync_staleness.py +0 -0
  708. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_pr_churn.py +0 -0
  709. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_pypi.py +0 -0
  710. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_registry.py +0 -0
  711. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_release_cordon_probe.py +0 -0
  712. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_timer_active.py +0 -0
  713. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_toolchain.py +0 -0
  714. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_unit_drift.py +0 -0
  715. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_unit_enablement.py +0 -0
  716. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_health_wedged_drive_queue.py +0 -0
  717. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_hooks.py +0 -0
  718. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_housekeeping.py +0 -0
  719. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_human_attended_437.py +0 -0
  720. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_init.py +0 -0
  721. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_install_agent_venv_2911.py +0 -0
  722. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_integration.py +0 -0
  723. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_interactive.py +0 -0
  724. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_interactive_briefing_echo.py +0 -0
  725. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_interactive_pane_log_2541.py +0 -0
  726. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_interactive_prefill_state.py +0 -0
  727. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_interactive_session_relaunch.py +0 -0
  728. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_interactive_test_verdict_backstop.py +0 -0
  729. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_interactive_token_attribution.py +0 -0
  730. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_interactive_worktree.py +0 -0
  731. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_invariant_alarms.py +0 -0
  732. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_issue_store_seam.py +0 -0
  733. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_issues_sync_status.py +0 -0
  734. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_liveness_auditor.py +0 -0
  735. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_liveness_notify.py +0 -0
  736. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_lock_contention_ratchet.py +0 -0
  737. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_machine_fault.py +0 -0
  738. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_machine_metrics.py +0 -0
  739. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_machine_onboard.py +0 -0
  740. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_machine_pause.py +0 -0
  741. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_machine_stats.py +0 -0
  742. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_merge_queue.py +0 -0
  743. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_merge_verify.py +0 -0
  744. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_milestone_chat.py +0 -0
  745. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_milestone_dispatch.py +0 -0
  746. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_milestone_gate.py +0 -0
  747. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_milestone_order.py +0 -0
  748. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_milestone_seam.py +0 -0
  749. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_mock_author.py +0 -0
  750. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_model_tiering.py +0 -0
  751. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_models.py +0 -0
  752. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_models_config_labels.py +0 -0
  753. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_needs_attention.py +0 -0
  754. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_network.py +0 -0
  755. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_new_issue_chat.py +0 -0
  756. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_next_release_tag.py +0 -0
  757. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_node_shim.py +0 -0
  758. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notifier_baseline.py +0 -0
  759. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notifier_cli.py +0 -0
  760. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notifier_collect.py +0 -0
  761. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notifier_config.py +0 -0
  762. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notifier_drive_seam.py +0 -0
  763. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notifier_isolation.py +0 -0
  764. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notifier_predicate.py +0 -0
  765. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notifier_quiet_hours.py +0 -0
  766. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notifier_service.py +0 -0
  767. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notify.py +0 -0
  768. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_notify_drain.py +0 -0
  769. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_openapi.py +0 -0
  770. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_operational_defaults.py +0 -0
  771. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_overlap_fence.py +0 -0
  772. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_overlap_predict.py +0 -0
  773. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_packaged_deploy_units.py +0 -0
  774. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_parentage.py +0 -0
  775. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_paste_landed.py +0 -0
  776. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  777. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_pipeline.py +0 -0
  778. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_plan_followup_approve_plan_command.py +0 -0
  779. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_plan_followup_pr_command.py +0 -0
  780. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_plan_followup_review_command.py +0 -0
  781. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_plan_only.py +0 -0
  782. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_plan_parser.py +0 -0
  783. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_platform_paths.py +0 -0
  784. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_portal_bridge.py +0 -0
  785. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_portal_config.py +0 -0
  786. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_portal_store.py +0 -0
  787. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_portal_sync.py +0 -0
  788. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_pr_body_lint.py +0 -0
  789. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_prereqs.py +0 -0
  790. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_production_db_guard.py +0 -0
  791. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_progress.py +0 -0
  792. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_provider_seam.py +0 -0
  793. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_providers.py +0 -0
  794. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_providers_config_labels.py +0 -0
  795. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_providers_pty.py +0 -0
  796. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_provision_core.py +0 -0
  797. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_provision_machine.py +0 -0
  798. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_py_rust_mirror_inventory.py +0 -0
  799. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_quiet_hours.py +0 -0
  800. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_quiet_hours_store_2146.py +0 -0
  801. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reap_merged_sessions.py +0 -0
  802. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reap_stale_interactive_tick.py +0 -0
  803. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reconcile.py +0 -0
  804. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reconcile_branch.py +0 -0
  805. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reconcile_completions.py +0 -0
  806. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  807. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reconcile_merges.py +0 -0
  808. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reconcile_no_agent_record.py +0 -0
  809. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reconcile_tick.py +0 -0
  810. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reconcile_usage_limit_done.py +0 -0
  811. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_refine_chat.py +0 -0
  812. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_cordon_2101.py +0 -0
  813. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  814. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_cordon_deadlock_2240.py +0 -0
  815. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  816. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_cordon_stuck_2490.py +0 -0
  817. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_propagate.py +0 -0
  818. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_propagate_threshold.py +0 -0
  819. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_roll_between_legs_2854.py +0 -0
  820. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_roll_window_handoff.py +0 -0
  821. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_unified_1242.py +0 -0
  822. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_verify.py +0 -0
  823. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_release_window.py +0 -0
  824. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_remote_auto_prune.py +0 -0
  825. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_remote_interactive_reaper.py +0 -0
  826. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_repo_add.py +0 -0
  827. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_repo_dormancy.py +0 -0
  828. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_repo_edit_2220.py +0 -0
  829. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_repo_graph_fleet_2237.py +0 -0
  830. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_repo_max_parallel_3423.py +0 -0
  831. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_repo_onboard_2220.py +0 -0
  832. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_report_result_push.py +0 -0
  833. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_reports.py +0 -0
  834. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_restart_cmd.py +0 -0
  835. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_retry.py +0 -0
  836. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_retry_advisory_1606.py +0 -0
  837. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_retry_escalation_classify_3360.py +0 -0
  838. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_retry_type_1636.py +0 -0
  839. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_revalidate.py +0 -0
  840. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_review.py +0 -0
  841. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_review_end_review_without_verdict.py +0 -0
  842. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_review_parse_failure_diagnostic.py +0 -0
  843. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_review_reaffirm.py +0 -0
  844. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_review_state.py +0 -0
  845. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_review_verdict_backstop.py +0 -0
  846. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_review_verdict_override_audit.py +0 -0
  847. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_review_verdict_relay.py +0 -0
  848. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_review_zero_commits.py +0 -0
  849. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_scoped_review_wiring.py +0 -0
  850. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_scorecard.py +0 -0
  851. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_self_health.py +0 -0
  852. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_serve.py +0 -0
  853. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_serve_app.py +0 -0
  854. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_serve_app_board_trim.py +0 -0
  855. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_serve_rest_routes.py +0 -0
  856. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_session.py +0 -0
  857. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_slice_issue_attribution.py +0 -0
  858. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_smoke.py +0 -0
  859. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  860. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_smoke_live_checkout_restore.py +0 -0
  861. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_smoke_workflow.py +0 -0
  862. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_spend_ceiling.py +0 -0
  863. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_spend_ceiling_coordinator.py +0 -0
  864. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_split.py +0 -0
  865. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_split_work.py +0 -0
  866. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_sql_dialect.py +0 -0
  867. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_sqlite_connect_ratchet.py +0 -0
  868. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_stage_projection.py +0 -0
  869. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_stale_busy_reviewer_697.py +0 -0
  870. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_stalled_pipeline.py +0 -0
  871. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_state.py +0 -0
  872. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_state_review_findings_daemon.py +0 -0
  873. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_status_fleet_footer.py +0 -0
  874. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_stop_1567.py +0 -0
  875. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_store_contract.py +0 -0
  876. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_store_migrate.py +0 -0
  877. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_stuck.py +0 -0
  878. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  879. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_terminal_command.py +0 -0
  880. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_test_author.py +0 -0
  881. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_test_chat.py +0 -0
  882. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_test_orchestrator.py +0 -0
  883. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_test_report.py +0 -0
  884. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_test_verdict_parsing.py +0 -0
  885. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_test_verdict_transcript_floor.py +0 -0
  886. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_text_io_encoding_audit.py +0 -0
  887. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_thin_client_board_audit.py +0 -0
  888. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_thin_client_config_load_1080.py +0 -0
  889. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_thin_client_daemon_routing_906.py +0 -0
  890. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_throwaway_vm.py +0 -0
  891. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_tmux_host.py +0 -0
  892. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_tmux_session.py +0 -0
  893. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_transcript_floor.py +0 -0
  894. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_uat_checks.py +0 -0
  895. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_usage.py +0 -0
  896. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_usage_limits.py +0 -0
  897. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_usage_rollup.py +0 -0
  898. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_venv_live_install_2121.py +0 -0
  899. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_version_single_source.py +0 -0
  900. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_watch.py +0 -0
  901. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  902. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_worker_env_venv_isolation.py +0 -0
  903. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_worker_events.py +0 -0
  904. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_worker_image_pin_sync.py +0 -0
  905. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_worker_safety.py +0 -0
  906. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_worker_test_scoping.py +0 -0
  907. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_worktree.py +0 -0
  908. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  909. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/tests/test_write_parity.py +0 -0
  910. {code_coordinator-0.5.524 → code_coordinator-0.5.526}/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.524
3
+ Version: 0.5.526
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.524
3
+ Version: 0.5.526
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.524",
2
+ "tag": "0.5.526",
3
3
  "distance": 0,
4
- "node": "g0e924a9e07fea9e3ea943a45cd49b370575ca40c",
4
+ "node": "g693a401ada00646a0a947757928045708b6bde77",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-27"
@@ -37,6 +37,7 @@ import logging
37
37
 
38
38
  import httpx
39
39
 
40
+ from coord import github_ops
40
41
  from coord.ci_store import CIFailureDetail
41
42
  from coord.config import Config
42
43
  from coord.merge_queue import QueuedMerge, _chain_work_ids
@@ -144,12 +145,87 @@ def _format_ci_failure_detail(detail: CIFailureDetail) -> list[str]:
144
145
  return lines
145
146
 
146
147
 
148
+ # #3456: cap on the issue body threaded into a ci-fix briefing. Large
149
+ # enough that a typical issue description plus an operator's follow-up
150
+ # diagnosis both fit without truncation in the common case — only a
151
+ # genuinely long body (or a long back-and-forth of appended notes) hits
152
+ # the cap at all.
153
+ ISSUE_BODY_MAX_CHARS = 6000
154
+
155
+
156
+ def _bound_issue_body(body: str) -> tuple[str, bool]:
157
+ """Truncate *body* to the last :data:`ISSUE_BODY_MAX_CHARS` characters
158
+ when it exceeds that cap (#3456).
159
+
160
+ Keeps the TAIL, not the head: an operator's diagnosis on a CI-fix
161
+ streak is written INTO the issue body after the failure is understood
162
+ — i.e. appended below the original description (see the issue's own
163
+ evidence: "After the root cause was written into the issue body,
164
+ requeueing would have routed the next attempt through the same ci-fix
165
+ path"). Keeping the tail is what makes sure that operator-added
166
+ content survives a cut; the cost is that the original description
167
+ (often already echoed by the issue title anyway) is what gets dropped
168
+ for a body long enough to need cutting at all.
169
+
170
+ Returns ``(text, truncated)`` — mirrors
171
+ :func:`coord.ci_github._bound_log_excerpt`'s contract: *truncated* is
172
+ ``True`` iff the cut actually removed content, so the caller can make
173
+ the cut visible in the briefing text rather than silently handing over
174
+ a partial body.
175
+ """
176
+ if len(body) <= ISSUE_BODY_MAX_CHARS:
177
+ return body, False
178
+ return body[-ISSUE_BODY_MAX_CHARS:], True
179
+
180
+
181
+ def _format_issue_body(issue_body: str) -> list[str]:
182
+ """Render *issue_body* into briefing lines (#3456) — see
183
+ :func:`_bound_issue_body` for the truncation contract.
184
+ """
185
+ body, truncated = _bound_issue_body(issue_body)
186
+ lines: list[str] = ["## Issue body", ""]
187
+ if truncated:
188
+ lines.append(
189
+ f"(truncated to the last {ISSUE_BODY_MAX_CHARS} characters — "
190
+ "operator notes are typically appended below the original "
191
+ "description, so keeping the tail keeps those over the part "
192
+ "already echoed by the issue title)"
193
+ )
194
+ lines.append("")
195
+ lines.append(body)
196
+ lines.append("")
197
+ return lines
198
+
199
+
200
+ def _fetch_issue_body(entry: QueuedMerge) -> str:
201
+ """Best-effort fetch of *entry*'s issue body for the ci-fix briefing
202
+ (#3456) — the same body a Work-stage dispatch already auto-includes
203
+ (``coord.commands.dispatch``'s auto-briefing, ``coord.commands.
204
+ dispatch_workers``' smoke briefing) but a ci-fix dispatch never did:
205
+ any diagnosis an operator records on the issue (e.g. after reading the
206
+ real CI logs by hand) was invisible to the worker most likely to need
207
+ it, since workers can't run ``gh`` themselves to read it any other way.
208
+
209
+ Fails soft to ``""`` on any read failure (``gh`` missing, rate-limited,
210
+ a network blip, a malformed response) — same posture as
211
+ :func:`coord.ci_github.build_ci_failure_detail`: this is enrichment,
212
+ never a dispatch precondition, and a body fetch failure must never
213
+ block or delay the actual fix dispatch.
214
+ """
215
+ try:
216
+ issue_data = github_ops.get_issue(entry.repo_github, entry.issue_number)
217
+ except Exception: # noqa: BLE001 — best-effort, see docstring
218
+ return ""
219
+ return str(issue_data.get("body") or "")
220
+
221
+
147
222
  def build_ci_fix_briefing(
148
223
  *,
149
224
  entry: QueuedMerge,
150
225
  checks_summary: str,
151
226
  attempt: int,
152
227
  detail: CIFailureDetail | None = None,
228
+ issue_body: str | None = None,
153
229
  ) -> str:
154
230
  """Assemble the CI-fix worker's briefing. Pure function — testable.
155
231
 
@@ -159,6 +235,11 @@ def build_ci_fix_briefing(
159
235
  empty of anything beyond the check name (see :func:`_detail_has_content`),
160
236
  the briefing is byte-identical to before #3114, still carrying
161
237
  ``checks_summary``.
238
+
239
+ *issue_body* (#3456) is the issue's current body, fetched by
240
+ :func:`_fetch_issue_body` at dispatch time — optional and additive,
241
+ same shape as *detail*: ``None`` or blank leaves the briefing
242
+ byte-identical to before #3456.
162
243
  """
163
244
  lines: list[str] = [
164
245
  f"# CI failure fix: {entry.repo_github} branch `{entry.branch}`",
@@ -172,6 +253,8 @@ def build_ci_fix_briefing(
172
253
  f" {checks_summary}",
173
254
  "",
174
255
  ]
256
+ if issue_body is not None and issue_body.strip():
257
+ lines.extend(_format_issue_body(issue_body))
175
258
  if detail is not None and _detail_has_content(detail):
176
259
  lines.extend(_format_ci_failure_detail(detail))
177
260
  lines += [
@@ -353,9 +436,10 @@ def dispatch_ci_fix(
353
436
  return None
354
437
 
355
438
  summary = checks_summary or entry.error or "CI checks failed"
439
+ issue_body = _fetch_issue_body(entry)
356
440
  briefing = build_ci_fix_briefing(
357
441
  entry=entry, checks_summary=summary, attempt=entry.ci_fix_dispatches + 1,
358
- detail=detail,
442
+ detail=detail, issue_body=issue_body,
359
443
  )
360
444
 
361
445
  from coord.auto_loop import _dispatch_fix # noqa: PLC0415
@@ -120,19 +120,50 @@ _RUST_ERROR_RE = re.compile(r"\berror(\[E\d+\])?:")
120
120
  _RUST_LOCATION_RE = re.compile(r"-->")
121
121
  _RUST_WARNING_RE = re.compile(r"\bwarning:")
122
122
 
123
+ # #3456: GitHub Actions appends this EXACT line to every failing step's log,
124
+ # regardless of what actually failed — it is the annotation `_ERROR_
125
+ # ANNOTATION_RE` would otherwise happily match as tier-1 signal, and on a
126
+ # job whose real failure produces no OTHER `##[error]` line (e.g. a `cargo
127
+ # test` failure — rustc's own test-harness panic output carries no `##[
128
+ # error]` prefix at all), this generic wrapper line was the ONLY thing
129
+ # selected: "exit code 1", not the failing test. Excluded from the
130
+ # `annotation` tier entirely so the more specific `rust_test_failure` tier
131
+ # below (or, failing that, `no_diagnostics_matched`) wins instead.
132
+ _EXIT_CODE_ANNOTATION_RE = re.compile(r"##\[error\]Process completed with exit code \d+\.?\s*$")
133
+
134
+ # #3456: a rust test-harness failure never carries a `##[error]` prefix, so
135
+ # none of it was reachable by any tier before this — the harness prints a
136
+ # per-test `---- <test path> stdout ----` header immediately followed by the
137
+ # `panicked at ...` message, then (once every test has run) a `failures:`
138
+ # roll-up naming every failing test, then a final `test result: FAILED. ...`
139
+ # summary line. All four are treated as one priority tier: whichever of
140
+ # them shows up is unambiguously more useful than the generic exit-code
141
+ # annotation above.
142
+ _RUST_TEST_STDOUT_HEADER_RE = re.compile(r"^-+\s.*\sstdout\s-+\s*$")
143
+ _RUST_PANICKED_RE = re.compile(r"panicked at")
144
+ _RUST_TEST_RESULT_RE = re.compile(r"\btest result: FAILED\b")
145
+ _RUST_FAILURES_HEADER_RE = re.compile(r"^failures:\s*$")
146
+
123
147
  # How many lines past a matched rust-diagnostic line to look for its `-->`
124
148
  # location before giving up — rustc always emits it on the very next
125
149
  # non-blank line; a small window tolerates the odd blank line without
126
150
  # accidentally stealing a `-->` that belongs to a LATER diagnostic.
127
151
  _RUST_LOCATION_LOOKAHEAD = 4
128
152
 
153
+ # How many lines past a `---- <test> stdout ----` header to sweep into the
154
+ # same unit — enough to capture the `thread '...' panicked at ...:LINE:COL:`
155
+ # line plus a short assertion message, without running so far that a SECOND
156
+ # test's header (or unrelated harness noise) gets swept in too.
157
+ _RUST_TEST_FAILURE_LOOKAHEAD = 6
158
+
129
159
 
130
160
  def _select_diagnostic_units(lines: list[str]) -> tuple[
131
- list[list[str]], list[list[str]], list[list[str]]
161
+ list[list[str]], list[list[str]], list[list[str]], list[list[str]]
132
162
  ]:
133
- """Classify *lines* into (annotation, rust_diagnostic, warning) unit
134
- lists, each unit a small list of original line strings kept atomic so
135
- budget truncation never splits an `error:`/`-->` pair apart (#3245).
163
+ """Classify *lines* into (annotation, rust_test_failure, rust_diagnostic,
164
+ warning) unit lists, each unit a small list of original line strings
165
+ kept atomic so budget truncation never splits an `error:`/`-->` pair —
166
+ or a rust test panic header/message pair — apart (#3245, #3456).
136
167
 
137
168
  Each source line is claimed by at most one bucket, checked in priority
138
169
  order, so a line matching a higher-priority pattern is never
@@ -142,10 +173,47 @@ def _select_diagnostic_units(lines: list[str]) -> tuple[
142
173
 
143
174
  annotation: list[list[str]] = []
144
175
  for i, line in enumerate(lines):
176
+ # #3456: the generic "step failed" wrapper line is deliberately
177
+ # never claimed here (see `_EXIT_CODE_ANNOTATION_RE`'s comment) —
178
+ # left unclaimed (not even added to `claimed`) since nothing else
179
+ # matches it anyway.
180
+ if _EXIT_CODE_ANNOTATION_RE.search(line):
181
+ continue
145
182
  if _ERROR_ANNOTATION_RE.search(line):
146
183
  annotation.append([line])
147
184
  claimed.add(i)
148
185
 
186
+ # #3456: rust test-harness failures — a stdout header sweeps in the
187
+ # panic message that follows it; a bare `panicked at`/`test result:
188
+ # FAILED`/`failures:` line (no preceding header, e.g. a `cargo run`
189
+ # panic outside the test harness) stands alone as its own unit.
190
+ rust_test_failure: list[list[str]] = []
191
+ for i, line in enumerate(lines):
192
+ if i in claimed:
193
+ continue
194
+ if _RUST_TEST_STDOUT_HEADER_RE.match(line.strip()):
195
+ claimed.add(i)
196
+ unit = [line]
197
+ end = min(i + 1 + _RUST_TEST_FAILURE_LOOKAHEAD, len(lines))
198
+ for j in range(i + 1, end):
199
+ if j in claimed:
200
+ break
201
+ candidate = lines[j]
202
+ if not candidate.strip() or _RUST_TEST_STDOUT_HEADER_RE.match(candidate.strip()):
203
+ # Blank line or the next test's header — stop before
204
+ # sweeping in unrelated content.
205
+ break
206
+ unit.append(candidate)
207
+ claimed.add(j)
208
+ rust_test_failure.append(unit)
209
+ elif (
210
+ _RUST_PANICKED_RE.search(line)
211
+ or _RUST_TEST_RESULT_RE.search(line)
212
+ or _RUST_FAILURES_HEADER_RE.match(line.strip())
213
+ ):
214
+ claimed.add(i)
215
+ rust_test_failure.append([line])
216
+
149
217
  rust_diag: list[list[str]] = []
150
218
  for i, line in enumerate(lines):
151
219
  if i in claimed or not _RUST_ERROR_RE.search(line):
@@ -173,7 +241,7 @@ def _select_diagnostic_units(lines: list[str]) -> tuple[
173
241
  claimed.add(i)
174
242
  warning.append([line])
175
243
 
176
- return annotation, rust_diag, warning
244
+ return annotation, rust_test_failure, rust_diag, warning
177
245
 
178
246
 
179
247
  def _extract_relevant_log_lines(text: str) -> tuple[str, bool, bool]:
@@ -189,30 +257,42 @@ def _extract_relevant_log_lines(text: str) -> tuple[str, bool, bool]:
189
257
  Extraction is by relevance, in priority order, matching the issue's fix
190
258
  shape:
191
259
 
192
- 1. ``##[error]`` GitHub Actions annotation lines
193
- 2. Rust diagnostics — ``error[E....]:``/``error:`` paired with the
194
- ``-->`` file:line that follows
195
- 3. ``warning:`` lines, only if budget remains after 1-2
260
+ 1. ``##[error]`` GitHub Actions annotation lines — EXCEPT the generic
261
+ ``Process completed with exit code N.`` wrapper GitHub Actions
262
+ appends to every failing step regardless of cause (#3456): it
263
+ carries zero diagnostic value, and on a job whose real failure
264
+ never emits any OTHER ``##[error]`` line (a rust test panic, say),
265
+ it used to be the ONLY thing this function ever surfaced.
266
+ 2. Rust test-harness failures (#3456) — a ``---- <test> stdout ----``
267
+ header (with the ``panicked at ...`` message that follows it), a
268
+ bare ``panicked at`` line, a ``failures:`` roll-up, or the final
269
+ ``test result: FAILED`` summary line
270
+ 3. Rust compiler diagnostics — ``error[E....]:``/``error:`` paired with
271
+ the ``-->`` file:line that follows
272
+ 4. ``warning:`` lines, only if budget remains after 1-3
196
273
 
197
274
  Everything else — including the runner's own echo of a script step's
198
- source and post-job cleanup — is never a candidate, because it can
199
- only ever match one of these patterns by (extremely unlikely)
200
- coincidence.
275
+ source and post-job cleanup, and the excluded exit-code wrapper line —
276
+ is never a candidate, because it can only ever match one of these
277
+ patterns by (extremely unlikely) coincidence.
201
278
 
202
279
  Returns ``(excerpt, truncated, matched)``:
203
280
 
204
281
  - *matched* is ``False`` when nothing in any tier matched anywhere in
205
282
  *text* — the caller renders an explicit "no diagnostics" note rather
206
- than a misleadingly-empty excerpt.
283
+ than a misleadingly-empty excerpt. Note this can now be ``False`` for
284
+ a log whose ONLY `##[error]` line was the excluded exit-code wrapper —
285
+ correctly so, since that line alone told the caller nothing a
286
+ "no diagnostics matched" note doesn't already convey just as well.
207
287
  - *truncated* is ``True`` when the matched units together exceed
208
288
  :data:`CI_FIX_LOG_MAX_LINES`/:data:`CI_FIX_LOG_MAX_BYTES` and lower-
209
- priority units (warnings first, then any tier-1/2 overflow) had to be
210
- dropped to fit — same "make the cut visible" contract as
289
+ priority units (warnings first, then any earlier-tier overflow) had
290
+ to be dropped to fit — same "make the cut visible" contract as
211
291
  :func:`_bound_log_excerpt`.
212
292
  """
213
293
  lines = text.splitlines()
214
- annotation, rust_diag, warning = _select_diagnostic_units(lines)
215
- units = annotation + rust_diag + warning
294
+ annotation, rust_test_failure, rust_diag, warning = _select_diagnostic_units(lines)
295
+ units = annotation + rust_test_failure + rust_diag + warning
216
296
  if not units:
217
297
  return "", False, False
218
298
 
@@ -4815,13 +4815,122 @@ def _index_merge_queue_by_key(rows: list, board: Any) -> dict[str, Any]:
4815
4815
  return indexed
4816
4816
 
4817
4817
 
4818
+ def _resolve_winning_work_row_for_blocked_entry(
4819
+ board: Any, repo_name: str, issue_number: int
4820
+ ) -> Any | None:
4821
+ """The same-branch "winner" (:func:`coord.merge_queue.
4822
+ group_branch_candidates`) among *board*'s completed work for
4823
+ ``(repo_name, issue_number)`` — resolved the same way :func:`coord.gates.
4824
+ build_gate_report`/:func:`_index_merge_queue_by_key` resolve an
4825
+ acceptance-slice's epic-keyed row (#3012): a match on the row's own
4826
+ ``issue_number`` OR its :func:`~coord.models.effective_issue_number`.
4827
+
4828
+ ``None`` when *board* carries no matching :data:`~coord.models.
4829
+ WORK_LIKE_TYPES` ``done`` row at all — the caller's signal that there is
4830
+ genuinely nothing here to evaluate (#3460).
4831
+ """
4832
+ from coord.models import WORK_LIKE_TYPES, effective_issue_number # noqa: PLC0415
4833
+
4834
+ from coord import merge_queue as _mq # noqa: PLC0415
4835
+
4836
+ completed = list(getattr(board, "completed", None) or [])
4837
+ matches = [
4838
+ a for a in completed
4839
+ if getattr(a, "repo_name", None) == repo_name
4840
+ and getattr(a, "type", None) in WORK_LIKE_TYPES
4841
+ and getattr(a, "status", None) == "done"
4842
+ and (
4843
+ getattr(a, "issue_number", None) == issue_number
4844
+ or effective_issue_number(a) == issue_number
4845
+ )
4846
+ ]
4847
+ if not matches:
4848
+ return None
4849
+ groups = _mq.group_branch_candidates(matches)
4850
+ if not groups:
4851
+ return None
4852
+ # #3460: matches are already scoped to one (repo, issue) pair, so every
4853
+ # group here is on the SAME branch in the overwhelming common case; the
4854
+ # rare "the issue's work moved branches across relaunches" shape just
4855
+ # picks the first (oldest-seen) branch group's own winner rather than
4856
+ # inventing a cross-branch tie-break this sweep has no stake in.
4857
+ winner, _superseded = groups[0]
4858
+ return winner
4859
+
4860
+
4861
+ def _evaluate_blocked_entry_without_a_queue_row(
4862
+ e: Any, board: Any, cfg: Any, gh_ops: Any
4863
+ ) -> tuple[bool, str] | None:
4864
+ """#3460's no-queue-row fallback: when neither the queue nor the #2806
4865
+ self-heal produced a row for *e*, this is the difference between an
4866
+ honest "unreadable" (there is truly nothing to read) and the false one
4867
+ the #3460 incident reported — a gate that was, in fact, genuinely still
4868
+ shut (quadraui#1081: review request-changes outstanding, Test failed,
4869
+ fix rounds exhausted, and — because ``enqueue_approved_work``'s own
4870
+ self-heal drops any row that fails the review/smoke gates,
4871
+ ``coord/merge_queue.py:4973`` — NO queue row will EVER exist for it).
4872
+
4873
+ Resolves the branch's winning work row directly
4874
+ (:func:`_resolve_winning_work_row_for_blocked_entry`) and evaluates it
4875
+ with the exact gates :func:`coord.merge_queue.enqueue_approved_work`
4876
+ itself checks — :func:`coord.merge_queue.live_gate_entry` (the #2085
4877
+ live-anchored synthetic entry) + :func:`coord.merge_queue.
4878
+ merge_gate_failures` (the reason-carrying twin of ``passes_merge_gates``,
4879
+ #946) — so this can never disagree with what ``enqueue_approved_work``
4880
+ itself would have concluded.
4881
+
4882
+ Returns ``(True, reason)`` — CONFIRMED still shut, *reason* naming every
4883
+ failing gate — when :func:`merge_gate_failures` finds any. Returns
4884
+ ``(False, reason)`` when it finds none: the winning row clears every
4885
+ gate this sweep can check without a PR (CI is per-PR only, #1150), which
4886
+ mirrors exactly what would make ``enqueue_approved_work`` enqueue it —
4887
+ confirmed CLEAR, not "unreadable" (there is nothing left unresolved).
4888
+ Returns ``None`` — genuinely nothing to report — only when there is no
4889
+ winning work row at all (:func:`_resolve_winning_work_row_for_blocked_entry`
4890
+ returns ``None``) or this evaluation itself raises; the caller falls
4891
+ back to its own "no merge-queue row" unreadable note for either.
4892
+ """
4893
+ from coord import merge_queue as _mq # noqa: PLC0415
4894
+
4895
+ winner = _resolve_winning_work_row_for_blocked_entry(board, e.repo, e.issue)
4896
+ if winner is None:
4897
+ return None
4898
+ repo_cfg = cfg.repo(e.repo)
4899
+ if repo_cfg is None:
4900
+ return None
4901
+ from coord.branch_model import resolve_base_branch_for_issue_number # noqa: PLC0415
4902
+
4903
+ target_branch = resolve_base_branch_for_issue_number(
4904
+ repo_cfg, repo_cfg.github, getattr(winner, "issue_number", 0)
4905
+ )
4906
+ gate_entry = _mq.live_gate_entry(winner, repo_cfg.github, target_branch, gh_ops)
4907
+ failures = _mq.merge_gate_failures(gate_entry, cfg, board, gh_ops=gh_ops)
4908
+ if failures:
4909
+ return True, _mq.describe_merge_gate_failures(failures)
4910
+ return (
4911
+ False,
4912
+ "the branch's winning work row clears review/smoke/uat with no "
4913
+ "merge-queue row yet to check CI against (#3460)",
4914
+ )
4915
+
4916
+
4818
4917
  def _fetch_live_blocked_gate(
4819
4918
  entries: list, config_path: Path | None
4820
- ) -> tuple[dict[str, bool], dict[str, str]]:
4821
- """``({entry_key: still_blocked}, {entry_key: unreadable_reason})`` for
4822
- every RE-EVALUABLE ``blocked`` entry (#2230) — the counterpart of
4823
- :func:`_fetch_live_ci_gate` above: same mechanism, same bound, a
4824
- different queue state.
4919
+ ) -> tuple[dict[str, bool], dict[str, str], dict[str, str]]:
4920
+ """``({entry_key: still_blocked}, {entry_key: gate_reason},
4921
+ {entry_key: unreadable_reason})`` for every RE-EVALUABLE ``blocked``
4922
+ entry (#2230) — the counterpart of :func:`_fetch_live_ci_gate` above:
4923
+ same mechanism, same bound, a different queue state.
4924
+
4925
+ THE SECOND DICT (#3460) is *live_ci_gate*/*live_ci_gate_reason*'s own
4926
+ split, mirrored here: whatever reason text produced the first dict's
4927
+ bool — from a direct :func:`coord.merge_queue.entry_gate_status` read
4928
+ when a queue row exists, or from :func:`
4929
+ _evaluate_blocked_entry_without_a_queue_row` when none does — so a
4930
+ CONFIRMED still-shut reading is never reported gate-reason-less the way
4931
+ the #3460 incident's "unconfirmed probe failure" text was. Present for
4932
+ every key also present in the first dict (whichever way it reads);
4933
+ absent otherwise, exactly like its CI-gate sibling.
4825
4934
 
4826
4935
  THE GAP THIS CLOSES. `blocked` used to be terminal: once
4827
4936
  `_reconcile_running` exhausted an entry's attempts, nothing ever asked
@@ -4872,32 +4981,49 @@ def _fetch_live_blocked_gate(
4872
4981
  every such target is looked up again against the refreshed queue before
4873
4982
  this function concedes it has nothing.
4874
4983
 
4875
- #2806 VISIBILITY. `_fetch_live_ci_gate`'s sibling docstring, and this
4876
- one before #2806, both describe "a key ABSENT" as if it were one thing —
4877
- it is actually at least four (no queue row even after the self-heal
4878
- above, no PR number yet, `entry_gate_status` raising, or the whole
4879
- fetch failing closed before any entry is even tried) and NONE of them
4880
- used to be logged anywhere, so a run of them looked, from the tick's own
4881
- output, identical to the gate genuinely still being shut. Every one is
4882
- now (a) logged here, so `journalctl` names the actual cause instead of
4883
- silence, and (b) surfaced in the second returned dict, keyed by entry,
4884
- with a short human-readable reason — :func:`coord.drive_queue.
4885
- _reconcile_blocked_unreadable` turns a present key there into a
4886
- distinct, operator-visible "could not read this gate" outcome instead
4887
- of folding it into "still shut" the way an absent key from the FIRST
4888
- dict alone always has and still does (see that function's docstring for
4889
- why the two must never render identically).
4984
+ #2806/#3460 VISIBILITY. `_fetch_live_ci_gate`'s sibling docstring, and
4985
+ this one before #2806, both described "a key ABSENT" as if it were one
4986
+ thing — it is actually several (no work row at all behind a missing
4987
+ queue row, that row's own evaluation raising, a queue row whose CI
4988
+ can't be confirmed without a PR, `entry_gate_status` raising, or the
4989
+ whole fetch failing closed before any entry is even tried) and NONE of
4990
+ them used to be logged anywhere, so a run of them looked, from the
4991
+ tick's own output, identical to the gate genuinely still being shut.
4992
+ Every one is now (a) logged here, so `journalctl` names the actual
4993
+ cause instead of silence, and (b) surfaced in the THIRD returned dict,
4994
+ keyed by entry, with a short human-readable reason — :func:`coord.
4995
+ drive_queue._reconcile_blocked_unreadable` turns a present key there
4996
+ into a distinct, operator-visible "could not read this gate" outcome
4997
+ instead of folding it into "still shut" the way an absent key from the
4998
+ FIRST dict alone always has and still does (see that function's
4999
+ docstring for why the two must never render identically).
5000
+
5001
+ #3460's fix is entirely about SHRINKING this third dict's population in
5002
+ favour of the first two: the #3460 incident (quadraui#1081) was exactly
5003
+ a confirmed-still-shut gate — review request-changes outstanding, Test
5004
+ failed — reported as "unreadable" purely because ``enqueue_approved_
5005
+ work``'s #2806 self-heal above can never produce a queue row for a work
5006
+ row that fails the review/smoke gates (that self-heal enqueues ONLY
5007
+ gate-clear work — `coord/merge_queue.py:4973`), and a queue row without
5008
+ a PR number used to be conceded unreadable outright even though every
5009
+ gate but CI is answerable without one. Both shapes now get a direct
5010
+ evaluation first (:func:`_evaluate_blocked_entry_without_a_queue_row`
5011
+ for the former; a direct :func:`coord.merge_queue.entry_gate_status`
5012
+ call for the latter, since that function only *skips* its CI/epic-
5013
+ keyword checks without a PR — #1150 — it doesn't refuse to run without
5014
+ one) — "unreadable" is now reserved for when that evaluation itself
5015
+ finds genuinely nothing, or raises.
4890
5016
 
4891
5017
  Same fail-open-per-entry, fail-closed-overall contract as
4892
5018
  `_fetch_live_ci_gate` otherwise: a key ABSENT from the FIRST dict (no
4893
- queue row, no PR yet, a `ci_store` that failed to build, any exception)
4894
- leaves that entry to `plan_tick`'s cheap board-only fallback
4895
- (`IssueFacts.merge_gate_status`, populated for free on a thin client's
4896
- live `/board`) — which on the daemon-host tick (the only host this
4897
- actually runs on, `docs/DRIVE_QUEUE.md` §2) has no `merge_plan` section
4898
- to read at all, so an absent key there means "no evidence, stays
4899
- blocked, but distinctly reported as unreadable when the second dict
4900
- says why" (`_reconcile_blocked` never guesses at a gate reading).
5019
+ work row behind a missing queue row, a `ci_store` that failed to build,
5020
+ any exception) leaves that entry to `plan_tick`'s cheap board-only
5021
+ fallback (`IssueFacts.merge_gate_status`, populated for free on a thin
5022
+ client's live `/board`) — which on the daemon-host tick (the only host
5023
+ this actually runs on, `docs/DRIVE_QUEUE.md` §2) has no `merge_plan`
5024
+ section to read at all, so an absent key there means "no evidence,
5025
+ stays blocked, but distinctly reported as unreadable when the third
5026
+ dict says why" (`_reconcile_blocked` never guesses at a gate reading).
4901
5027
  """
4902
5028
  targets = [
4903
5029
  e for e in entries
@@ -4905,12 +5031,12 @@ def _fetch_live_blocked_gate(
4905
5031
  and not is_permanent_block_reason(getattr(e, "last_reason", "") or "")
4906
5032
  ]
4907
5033
  if not targets:
4908
- return {}, {}
5034
+ return {}, {}, {}
4909
5035
 
4910
5036
  from coord.board_service import resolve as resolve_board_service # noqa: PLC0415
4911
5037
 
4912
5038
  if resolve_board_service() is not None:
4913
- return {}, {}
5039
+ return {}, {}, {}
4914
5040
 
4915
5041
  try:
4916
5042
  from coord import github_ops as _gh_ops # noqa: PLC0415
@@ -4932,7 +5058,7 @@ def _fetch_live_blocked_gate(
4932
5058
  "back to the board-only reading, unreadable: %r",
4933
5059
  len(targets), "y" if len(targets) == 1 else "ies", exc,
4934
5060
  )
4935
- return {}, {}
5061
+ return {}, {}, {}
4936
5062
 
4937
5063
  # #2806 self-heal: mirror `coord merge --only`'s #1845 fix — a target
4938
5064
  # with no queue row yet may simply not have been enqueued by
@@ -4950,10 +5076,38 @@ def _fetch_live_blocked_gate(
4950
5076
  )
4951
5077
 
4952
5078
  overrides: dict[str, bool] = {}
5079
+ reasons: dict[str, str] = {}
4953
5080
  unreadable: dict[str, str] = {}
4954
5081
  for e in targets:
4955
5082
  q = queue_by_key.get(e.key)
4956
5083
  if q is None:
5084
+ # #3460: the self-heal above never produces a row for a work row
5085
+ # that fails the review/smoke gates (`enqueue_approved_work`
5086
+ # only enqueues gate-clear work) — exactly the shape this sweep
5087
+ # most needs to confirm. Evaluate the branch's winning work row
5088
+ # directly before conceding "unreadable".
5089
+ resolved = None
5090
+ if not is_pre_dispatch_block_reason(getattr(e, "last_reason", "") or ""):
5091
+ try:
5092
+ resolved = _evaluate_blocked_entry_without_a_queue_row(
5093
+ e, board, cfg, _gh_ops
5094
+ )
5095
+ except Exception as exc: # noqa: BLE001 — falls to "unreadable" below
5096
+ log.warning(
5097
+ "blocked-gate sweep (#3460): %s — evaluating the "
5098
+ "winning work row directly raised: %r", e.key, exc,
5099
+ )
5100
+ resolved = None
5101
+ if resolved is not None:
5102
+ shut, reason = resolved
5103
+ overrides[e.key] = shut
5104
+ reasons[e.key] = reason
5105
+ log.info(
5106
+ "blocked-gate sweep (#3460): %s — no merge-queue row, "
5107
+ "but its winning work row evaluates directly: %s",
5108
+ e.key, reason,
5109
+ )
5110
+ continue
4957
5111
  reason = "no merge-queue row for this entry, even after the self-heal enqueue attempt"
4958
5112
  # #2589/#2635: a genuinely pre-dispatch cause (no branch/PR was
4959
5113
  # EVER created) will never have a merge-queue row, forever — that
@@ -4971,20 +5125,36 @@ def _fetch_live_blocked_gate(
4971
5125
  unreadable[e.key] = reason
4972
5126
  log.warning("blocked-gate sweep (#2806): %s — %s", e.key, reason)
4973
5127
  continue
4974
- if not q.pr_number:
4975
- reason = "merge-queue row has no PR number yet"
4976
- unreadable[e.key] = reason
4977
- log.warning("blocked-gate sweep (#2806): %s — %s", e.key, reason)
4978
- continue
4979
5128
  try:
4980
- status, _reason = _mq.entry_gate_status(q, board, cfg, ci_store, _gh_ops)
5129
+ status, gate_reason = _mq.entry_gate_status(q, board, cfg, ci_store, _gh_ops)
4981
5130
  except Exception as exc: # noqa: BLE001 — leave this one entry to the fallback
4982
5131
  reason = f"entry_gate_status raised: {exc!r}"
4983
5132
  unreadable[e.key] = reason
4984
5133
  log.warning("blocked-gate sweep (#2806): %s — %s", e.key, reason)
4985
5134
  continue
4986
- overrides[e.key] = status != _mq.PLAN_READY
4987
- return overrides, unreadable
5135
+ if status == _mq.PLAN_BLOCKED:
5136
+ # #3460: confirmed still shut regardless of whether *q* carries
5137
+ # a PR yet — `entry_gate_status` only *skips* its CI/epic-
5138
+ # keyword checks without one (#1150: CI is checked per-PR), it
5139
+ # never refuses to evaluate the review/smoke/uat gates that
5140
+ # already produced this BLOCKED verdict.
5141
+ overrides[e.key] = True
5142
+ if gate_reason:
5143
+ reasons[e.key] = gate_reason
5144
+ continue
5145
+ # status == PLAN_READY. Confirmed clear only when a PR exists to
5146
+ # confirm CI against — without one, "ready" only means "every gate
5147
+ # this call could check without a PR is clear", which is NOT the
5148
+ # same claim `_blocked_gate_reading`'s `False` makes to the resume
5149
+ # path (#1150 applies to `enqueue_approved_work`'s own enqueue
5150
+ # decision, not to promising a live merge would succeed).
5151
+ if not q.pr_number:
5152
+ reason = "merge-queue row has no PR number yet (CI unverifiable without a PR)"
5153
+ unreadable[e.key] = reason
5154
+ log.warning("blocked-gate sweep (#2806): %s — %s", e.key, reason)
5155
+ continue
5156
+ overrides[e.key] = False
5157
+ return overrides, reasons, unreadable
4988
5158
 
4989
5159
 
4990
5160
  def _fetch_live_prereq_terminal(
@@ -6556,8 +6726,8 @@ def drive_queue_tick(
6556
6726
  # entries — see `_fetch_live_blocked_gate`'s docstring for the gap
6557
6727
  # this closes (quadraui#309 sat `blocked` ~11h on a merge that was
6558
6728
  # landable for most of that window, and nothing ever looked again).
6559
- live_blocked_gate, live_blocked_unreadable = _fetch_live_blocked_gate(
6560
- entries, config_path
6729
+ live_blocked_gate, live_blocked_gate_reason, live_blocked_unreadable = (
6730
+ _fetch_live_blocked_gate(entries, config_path)
6561
6731
  )
6562
6732
 
6563
6733
  # #2350: for every entry the two live re-checks above just found
@@ -6618,6 +6788,7 @@ def drive_queue_tick(
6618
6788
  live_ci_gate=live_ci_gate,
6619
6789
  live_ci_gate_reason=live_ci_gate_reason,
6620
6790
  live_blocked_gate=live_blocked_gate,
6791
+ live_blocked_gate_reason=live_blocked_gate_reason,
6621
6792
  live_blocked_unreadable=live_blocked_unreadable,
6622
6793
  editable_drift=editable_drift,
6623
6794
  merge_only_ready=merge_only_ready,