code-coordinator 0.5.493__tar.gz → 0.5.495__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 (897) hide show
  1. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.github/workflows/test.yml +17 -0
  2. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/code_coordinator.egg-info/PKG-INFO +1 -1
  4. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/code_coordinator.egg-info/scm_version.json +2 -2
  5. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/board_schema.py +11 -0
  6. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/board_wire.py +57 -0
  7. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/drive_queue.py +290 -50
  8. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/db.py +21 -1
  9. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/drive_queue.py +35 -1
  10. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/drive_state.py +8 -1
  11. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/github_ops.py +8 -1
  12. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/merge_queue.py +14 -6
  13. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/state.py +11 -3
  14. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_board_wire.py +169 -0
  15. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_drive_queue.py +156 -0
  16. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_db.py +4 -1
  17. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive_queue.py +93 -2
  18. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_github_ops.py +12 -0
  19. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_state.py +63 -0
  20. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.claude/commands/board.md +0 -0
  21. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.claude/commands/complete-session.md +0 -0
  22. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.claude/commands/coordinator.md +0 -0
  23. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.githooks/_lib.sh +0 -0
  24. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.githooks/post-checkout +0 -0
  25. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.githooks/post-commit +0 -0
  26. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.githooks/post-merge +0 -0
  27. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  28. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.github/coord-ci-acceptance.yml +0 -0
  29. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.github/workflows/auto-release.yml +0 -0
  30. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.github/workflows/publish.yml +0 -0
  31. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/.gitignore +0 -0
  32. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/CLAUDE.md +0 -0
  33. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/GOAL.md +0 -0
  34. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/LICENSE +0 -0
  35. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/MANIFEST.in +0 -0
  36. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/README.md +0 -0
  37. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/code_coordinator.egg-info/SOURCES.txt +0 -0
  38. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/code_coordinator.egg-info/dependency_links.txt +0 -0
  39. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/code_coordinator.egg-info/entry_points.txt +0 -0
  40. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/code_coordinator.egg-info/requires.txt +0 -0
  41. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/code_coordinator.egg-info/scm_file_list.json +0 -0
  42. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/agent.py +0 -0
  48. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/agent_app.py +0 -0
  49. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/agent_update.py +0 -0
  50. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/agents/opencode/.gitignore +0 -0
  51. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/agents/opencode/agents/work.md +0 -0
  52. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/agents/opencode/routing.jsonc +0 -0
  53. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/approved_work.py +0 -0
  54. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/audit.py +0 -0
  55. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/auto_loop.py +0 -0
  56. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/backup.py +0 -0
  57. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/block_log.py +0 -0
  58. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/board_service.py +0 -0
  59. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/brain.py +0 -0
  60. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/branch_model.py +0 -0
  61. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/bug_intake.py +0 -0
  62. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/cargo_cache.py +0 -0
  63. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/ci_fix.py +0 -0
  64. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/ci_github.py +0 -0
  65. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/ci_gitlab.py +0 -0
  66. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/ci_store.py +0 -0
  67. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/claim.py +0 -0
  68. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/claude_setup_token.py +0 -0
  69. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/cli.py +0 -0
  70. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/client.py +0 -0
  71. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/codegen.py +0 -0
  72. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/__init__.py +0 -0
  73. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/_common.py +0 -0
  74. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/acceptance.py +0 -0
  75. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/agent_ops.py +0 -0
  76. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/audit.py +0 -0
  77. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/backup.py +0 -0
  78. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/chat.py +0 -0
  79. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/codegen.py +0 -0
  80. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/dispatch.py +0 -0
  81. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/dispatch_workers.py +0 -0
  82. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/dr.py +0 -0
  83. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/drive.py +0 -0
  84. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/gate_a.py +0 -0
  85. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/gates.py +0 -0
  86. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/issues.py +0 -0
  87. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/lifecycle.py +0 -0
  88. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/machine.py +0 -0
  89. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/merge.py +0 -0
  90. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/milestone.py +0 -0
  91. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/plan_followup.py +0 -0
  92. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/plans.py +0 -0
  93. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/portal.py +0 -0
  94. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/pr.py +0 -0
  95. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/release.py +0 -0
  96. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/repo.py +0 -0
  97. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/report.py +0 -0
  98. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/review.py +0 -0
  99. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/scorecard.py +0 -0
  100. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/sessions.py +0 -0
  101. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/setup.py +0 -0
  102. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/status.py +0 -0
  103. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/store_migrate.py +0 -0
  104. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/terminal.py +0 -0
  105. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/test_gate.py +0 -0
  106. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/commands/tui.py +0 -0
  107. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/comments.py +0 -0
  108. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/config.py +0 -0
  109. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/config_reload.py +0 -0
  110. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/confirm_test.py +0 -0
  111. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/conflict_fix.py +0 -0
  112. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dao.py +0 -0
  113. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dashboard/__init__.py +0 -0
  114. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dashboard/fixture.py +0 -0
  115. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dashboard/index.html +0 -0
  116. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dashboard/server.py +0 -0
  117. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dashboard/terminal.py +0 -0
  118. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dead_end.py +0 -0
  119. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/decomposition_chat.py +0 -0
  120. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/README.md +0 -0
  121. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-agent.service +0 -0
  122. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-backup.service +0 -0
  123. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-backup.timer +0 -0
  124. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-db-backup.service +0 -0
  125. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-db-backup.sh +0 -0
  126. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-db-backup.timer +0 -0
  127. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-dr-verify.service +0 -0
  128. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-dr-verify.timer +0 -0
  129. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-drive-queue.service +0 -0
  130. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-drive-queue.timer +0 -0
  131. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-failure-notify.service +0 -0
  132. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-fleet-watchdog.service +0 -0
  133. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  134. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-notify.service +0 -0
  135. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-notify.timer +0 -0
  136. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-release-propagate.service +0 -0
  137. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-release-propagate.timer +0 -0
  138. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-release-window.service +0 -0
  139. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-release-window.timer +0 -0
  140. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-serve.service +0 -0
  141. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-web-dist-build.service +0 -0
  142. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-web-dist-build.timer +0 -0
  143. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy/coord-web.service +0 -0
  144. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy_manifest.py +0 -0
  145. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deploy_units.py +0 -0
  146. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deprecation_telemetry.py +0 -0
  147. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/deps.py +0 -0
  148. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/diagnose.py +0 -0
  149. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dispatch.py +0 -0
  150. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dispatch_liveness.py +0 -0
  151. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dist_name.py +0 -0
  152. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dr_promote.py +0 -0
  153. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/dr_verify.py +0 -0
  154. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/drive.py +0 -0
  155. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/events.py +0 -0
  156. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/failure_class.py +0 -0
  157. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/failure_classifier.py +0 -0
  158. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/filelock.py +0 -0
  159. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/fleet_config_health.py +0 -0
  160. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/forge_availability.py +0 -0
  161. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/freshness.py +0 -0
  162. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/gate_a.py +0 -0
  163. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/gate_b.py +0 -0
  164. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/gate_snapshot.py +0 -0
  165. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/gates.py +0 -0
  166. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/gen_board_fixture.py +0 -0
  167. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/github_throttle.py +0 -0
  168. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/goal.py +0 -0
  169. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/graph_health.py +0 -0
  170. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/__init__.py +0 -0
  171. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/aggregate.py +0 -0
  172. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/__init__.py +0 -0
  173. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/_ci_pin.py +0 -0
  174. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/agent_install.py +0 -0
  175. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/cargo_targets.py +0 -0
  176. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/claude_binary.py +0 -0
  177. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/config_drift.py +0 -0
  178. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  179. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/coord_web_ci_pin.py +0 -0
  180. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/deploy_lane_facts.py +0 -0
  181. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/disk.py +0 -0
  182. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/fleet_board.py +0 -0
  183. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  184. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/fleet_phantom.py +0 -0
  185. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/fleet_unit_drift.py +0 -0
  186. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/graph.py +0 -0
  187. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/graphify_cli.py +0 -0
  188. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/index_lock.py +0 -0
  189. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/issues_sync_staleness.py +0 -0
  190. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/plan_usage.py +0 -0
  191. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/pr_churn.py +0 -0
  192. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/release_cordon.py +0 -0
  193. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/repo_state.py +0 -0
  194. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/spawned_coord.py +0 -0
  195. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/stalled_pipeline.py +0 -0
  196. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/timer_active.py +0 -0
  197. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/toolchain.py +0 -0
  198. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/unit_drift.py +0 -0
  199. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/unit_enablement.py +0 -0
  200. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/wedged_drive_queue.py +0 -0
  201. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/checks/worktrees.py +0 -0
  202. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/cli.py +0 -0
  203. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/context.py +0 -0
  204. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/fleet_snapshot.py +0 -0
  205. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/models.py +0 -0
  206. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/pypi.py +0 -0
  207. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/registry.py +0 -0
  208. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/render.py +0 -0
  209. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/health/units.py +0 -0
  210. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/hooks.py +0 -0
  211. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/housekeeping.py +0 -0
  212. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/interactive.py +0 -0
  213. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/invariant_alarms.py +0 -0
  214. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/issue_store.py +0 -0
  215. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/issues_sync_status.py +0 -0
  216. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/liveness_auditor.py +0 -0
  217. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/machine_fault.py +0 -0
  218. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/machine_metrics.py +0 -0
  219. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/machine_onboard.py +0 -0
  220. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/machine_pause.py +0 -0
  221. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/machine_stats.py +0 -0
  222. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/milestone_chat.py +0 -0
  223. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/milestone_dispatch.py +0 -0
  224. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/milestone_gate.py +0 -0
  225. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/milestone_order.py +0 -0
  226. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/mock_author.py +0 -0
  227. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/models.py +0 -0
  228. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/network.py +0 -0
  229. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/new_issue_chat.py +0 -0
  230. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/__init__.py +0 -0
  231. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/baseline.py +0 -0
  232. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/cli.py +0 -0
  233. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/collect.py +0 -0
  234. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/digest.py +0 -0
  235. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/models.py +0 -0
  236. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/predicate.py +0 -0
  237. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/service.py +0 -0
  238. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/store.py +0 -0
  239. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notifier/transport.py +0 -0
  240. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/notify.py +0 -0
  241. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/openapi.py +0 -0
  242. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/overlap_fence.py +0 -0
  243. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/overlap_predict.py +0 -0
  244. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/parentage.py +0 -0
  245. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/parentage_github.py +0 -0
  246. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/pipeline.py +0 -0
  247. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/plan_parser.py +0 -0
  248. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/plans.py +0 -0
  249. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/platform_paths.py +0 -0
  250. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/portal_bridge.py +0 -0
  251. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/portal_store.py +0 -0
  252. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/portal_sync.py +0 -0
  253. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/pr_body_lint.py +0 -0
  254. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/prereqs.py +0 -0
  255. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/progress.py +0 -0
  256. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/providers/__init__.py +0 -0
  257. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/providers/base.py +0 -0
  258. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/providers/claude.py +0 -0
  259. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/providers/claude_pty.py +0 -0
  260. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/providers/opencode.py +0 -0
  261. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/queue_diagnose.py +0 -0
  262. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/reconcile.py +0 -0
  263. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/reconcile_tick.py +0 -0
  264. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/refine_chat.py +0 -0
  265. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/release_cordon.py +0 -0
  266. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/release_propagate.py +0 -0
  267. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/release_verify.py +0 -0
  268. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/release_window.py +0 -0
  269. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/repo_dormancy.py +0 -0
  270. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/repo_edit.py +0 -0
  271. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/repo_onboard.py +0 -0
  272. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/reports.py +0 -0
  273. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/rest_schema.py +0 -0
  274. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/revalidate.py +0 -0
  275. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/review.py +0 -0
  276. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/scorecard.py +0 -0
  277. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/self_health.py +0 -0
  278. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/serve_app.py +0 -0
  279. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  280. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  281. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  282. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  283. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  284. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/portal-followup/SKILL.md +0 -0
  285. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/release-now/SKILL.md +0 -0
  286. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  287. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  288. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/skills/update-issue/SKILL.md +0 -0
  289. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/smoke.py +0 -0
  290. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/spend_ceiling.py +0 -0
  291. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/split_work.py +0 -0
  292. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/sql.py +0 -0
  293. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/stage_projection.py +0 -0
  294. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/store_migrate.py +0 -0
  295. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/store_parity.py +0 -0
  296. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/templates/deploy-cloudflare.node.yml +0 -0
  297. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/test_author.py +0 -0
  298. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/test_chat.py +0 -0
  299. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/test_orchestrator.py +0 -0
  300. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/test_report.py +0 -0
  301. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/tui_release.py +0 -0
  302. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/uat_checks.py +0 -0
  303. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/usage.py +0 -0
  304. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/usage_limits.py +0 -0
  305. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/usage_rollup.py +0 -0
  306. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coord/worker_events.py +0 -0
  307. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/coordinator.example.yml +0 -0
  308. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-agent.service +0 -0
  309. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-backup.service +0 -0
  310. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-backup.timer +0 -0
  311. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-db-backup.service +0 -0
  312. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-db-backup.sh +0 -0
  313. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-db-backup.timer +0 -0
  314. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-dr-verify.service +0 -0
  315. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-dr-verify.timer +0 -0
  316. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-drive-queue.service +0 -0
  317. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-drive-queue.timer +0 -0
  318. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-failure-notify.service +0 -0
  319. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-failure-notify.sh +0 -0
  320. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-fleet-watchdog.service +0 -0
  321. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-fleet-watchdog.timer +0 -0
  322. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-notify.service +0 -0
  323. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-notify.timer +0 -0
  324. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-release-propagate.service +0 -0
  325. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-release-propagate.timer +0 -0
  326. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-release-window.service +0 -0
  327. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-release-window.timer +0 -0
  328. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-serve.service +0 -0
  329. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-web-dist-build.service +0 -0
  330. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-web-dist-build.sh +0 -0
  331. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-web-dist-build.timer +0 -0
  332. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-web-rollback.sh +0 -0
  333. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/coord-web.service +0 -0
  334. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/deploy/node-shim.sh +0 -0
  335. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/ADR_COORD_TUI_CI.md +0 -0
  336. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  337. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/ADR_COORD_WEB_CI.md +0 -0
  338. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/ADR_COORD_WEB_DIST.md +0 -0
  339. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  340. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/AGENT_OPERATIONS.md +0 -0
  341. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/ARCHITECTURE.md +0 -0
  342. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/ARCH_SECURITY_GATES.md +0 -0
  343. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/COCKPIT.md +0 -0
  344. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/CONTROL_CENTER.md +0 -0
  345. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/COST_DISCIPLINE.md +0 -0
  346. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/CROSS_PLATFORM.md +0 -0
  347. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/CUSTOMER_FACING_APPS.md +0 -0
  348. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/CUSTOMER_PORTAL.md +0 -0
  349. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/DATA_STORE_SELECTION.md +0 -0
  350. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/DISASTER_RECOVERY.md +0 -0
  351. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/DRIVE_QUEUE.md +0 -0
  352. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/EPHEMERAL_WORKERS.md +0 -0
  353. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/FORGE_MIGRATION.md +0 -0
  354. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/GRAPHIFY_SETUP.md +0 -0
  355. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/ISSUE_GUIDANCE.md +0 -0
  356. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/MAC_MINI.md +0 -0
  357. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  358. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/NOTIFIER.md +0 -0
  359. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/OPENCODE_VERIFICATION.md +0 -0
  360. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/OPERATING_GOTCHAS.md +0 -0
  361. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/OPERATOR_GUIDES.md +0 -0
  362. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/ORACLE_LOOP.md +0 -0
  363. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/PHONE_WEBAPP.md +0 -0
  364. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/PIPELINE_V2.md +0 -0
  365. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/PLATFORM_EVOLUTION.md +0 -0
  366. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/SECOND_BACKEND.md +0 -0
  367. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/STORE_SERVICE.md +0 -0
  368. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  369. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/WEB_CONTROL_CENTER.md +0 -0
  370. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/WSL_WINDOWS_WORKER.md +0 -0
  371. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/mocks/web/README.md +0 -0
  372. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/mocks/web/_tokens.css +0 -0
  373. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/mocks/web/issue-detail.html +0 -0
  374. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/mocks/web/pipeline-narrow.html +0 -0
  375. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/docs/mocks/web/pipeline-wide.html +0 -0
  376. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/graphify-out/.gitignore +0 -0
  377. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/install-agent.sh +0 -0
  378. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/pyproject.toml +0 -0
  379. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/audit_review_verdict_overrides.py +0 -0
  380. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  381. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/build-worker-image.sh +0 -0
  382. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/coordinator-machine.py +0 -0
  383. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/dr-down.sh +0 -0
  384. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/dr-up.sh +0 -0
  385. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/epic-down.sh +0 -0
  386. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/epic-up.sh +0 -0
  387. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/preflight.sh +0 -0
  388. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/provision-server.sh +0 -0
  389. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/provision-worker.sh +0 -0
  390. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  391. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  392. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/throwaway-vm.sh +0 -0
  393. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/azure-workers/verify-github-token.sh +0 -0
  394. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/check_gh_argv_containment.py +0 -0
  395. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/codegen.py +0 -0
  396. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/coord-test-runner.sh +0 -0
  397. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  398. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  399. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  400. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  401. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/coord-venv-rollback.sh +0 -0
  402. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/drive-batch.sh +0 -0
  403. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/extract-coord-tui.sh +0 -0
  404. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/fleet_watchdog.py +0 -0
  405. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/gen_board_fixture.py +0 -0
  406. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/gen_mock_index.py +0 -0
  407. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/lib/provision-core.sh +0 -0
  408. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/next_release_tag.py +0 -0
  409. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/provision-machine.sh +0 -0
  410. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/run_tests_in_populated_home.sh +0 -0
  411. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/run_tests_without_gh.sh +0 -0
  412. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/setup-macmini.sh +0 -0
  413. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/smoke_437_interactive.py +0 -0
  414. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/verify-provision-noble.sh +0 -0
  415. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/verify_878_review_capture.py +0 -0
  416. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/verify_release_published.py +0 -0
  417. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/scripts/verify_release_wheel.py +0 -0
  418. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/setup.cfg +0 -0
  419. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/SMOKE_SET.md +0 -0
  420. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/__init__.py +0 -0
  421. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-37/conftest.py +0 -0
  422. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-37/contract.md +0 -0
  423. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-37/manifest.yml +0 -0
  424. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  425. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  426. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-51/contract.md +0 -0
  427. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  428. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  429. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-51/manifest.yml +0 -0
  430. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  431. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-51/tsconfig.json +0 -0
  432. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  433. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/backends.py +0 -0
  434. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/conftest.py +0 -0
  435. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/board-pipeline-basic.json +0 -0
  436. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  437. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  438. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  439. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  440. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/playwright/all_pass.json +0 -0
  441. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  442. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/playwright/mixed_fail.json +0 -0
  443. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  444. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  445. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/playwright/skip.json +0 -0
  446. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/playwright/truncated.json +0 -0
  447. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  448. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  449. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  450. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  451. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  452. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  453. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  454. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  455. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_acceptance.py +0 -0
  456. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_acceptance_drivers.py +0 -0
  457. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent.py +0 -0
  458. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_api_error.py +0 -0
  459. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_app.py +0 -0
  460. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_branch_base.py +0 -0
  461. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_branch_capture.py +0 -0
  462. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_config_free_1712.py +0 -0
  463. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_deploy_units_endpoint.py +0 -0
  464. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_dirty_worktree.py +0 -0
  465. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  466. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_graph_self_heal.py +0 -0
  467. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_health_h3.py +0 -0
  468. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_idle_restart.py +0 -0
  469. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_push_failure.py +0 -0
  470. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_reap.py +0 -0
  471. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_repos_and_pull.py +0 -0
  472. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_restart_services_endpoint.py +0 -0
  473. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_skills_self_heal.py +0 -0
  474. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_startup_diagnostics.py +0 -0
  475. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_update.py +0 -0
  476. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_update_bluegreen.py +0 -0
  477. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_usage_limit.py +0 -0
  478. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_agent_zero_commit.py +0 -0
  479. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_ambient_home_isolation.py +0 -0
  480. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_approve_capability_reroute_3241.py +0 -0
  481. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_approve_dependency_busy_2804.py +0 -0
  482. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_approve_reject_plan.py +0 -0
  483. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_approve_usage_gate.py +0 -0
  484. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_approved_work_2532.py +0 -0
  485. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_approved_work_2996.py +0 -0
  486. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_assignment_already_recorded_daemon.py +0 -0
  487. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_audit_log.py +0 -0
  488. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_audit_outcome.py +0 -0
  489. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_audit_query.py +0 -0
  490. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_auto_loop.py +0 -0
  491. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_auto_release_publish_2035.py +0 -0
  492. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_backend_selection.py +0 -0
  493. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_backup.py +0 -0
  494. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_base_checkout_restore.py +0 -0
  495. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_block_log.py +0 -0
  496. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_board_cap_762.py +0 -0
  497. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_board_fixture.py +0 -0
  498. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_board_read_path.py +0 -0
  499. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_board_schema.py +0 -0
  500. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_board_service.py +0 -0
  501. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_board_state.py +0 -0
  502. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_brain.py +0 -0
  503. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_branch_model.py +0 -0
  504. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_bug_intake.py +0 -0
  505. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_build_worker_image_env_update.py +0 -0
  506. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cargo_cache.py +0 -0
  507. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_check_gh_argv_containment.py +0 -0
  508. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_ci_acceptance_gate_1950.py +0 -0
  509. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_ci_fix.py +0 -0
  510. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_ci_github.py +0 -0
  511. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_ci_gitlab.py +0 -0
  512. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_ci_parity_2091.py +0 -0
  513. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_ci_store.py +0 -0
  514. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_claim.py +0 -0
  515. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_claude_md_budget.py +0 -0
  516. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_claude_setup_token.py +0 -0
  517. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_acceptance.py +0 -0
  518. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_assign.py +0 -0
  519. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  520. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_assign_interactive_remote.py +0 -0
  521. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_assign_provider.py +0 -0
  522. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  523. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_audit.py +0 -0
  524. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_chat_continue.py +0 -0
  525. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_codegen.py +0 -0
  526. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_decide.py +0 -0
  527. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_diagnose_capability_rules.py +0 -0
  528. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_diagnose_config_provenance.py +0 -0
  529. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_diagnose_forge_availability.py +0 -0
  530. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_diagnose_graph.py +0 -0
  531. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_diagnose_self.py +0 -0
  532. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_diagnose_test_coverage.py +0 -0
  533. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_doctor.py +0 -0
  534. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_doctor_config_free_1801.py +0 -0
  535. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  536. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  537. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_drive.py +0 -0
  538. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_escalate.py +0 -0
  539. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_fix_headless_review.py +0 -0
  540. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_gate_a.py +0 -0
  541. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_install_drift.py +0 -0
  542. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_install_skills.py +0 -0
  543. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_issue_comment.py +0 -0
  544. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_issue_create_label.py +0 -0
  545. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_issue_reopen.py +0 -0
  546. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_issue_view_list.py +0 -0
  547. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_merge.py +0 -0
  548. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_milestone_assign.py +0 -0
  549. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_milestone_capture.py +0 -0
  550. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_milestone_chat_add_child.py +0 -0
  551. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_milestone_dispatch.py +0 -0
  552. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_milestone_gate_b.py +0 -0
  553. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_milestone_gate_c.py +0 -0
  554. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_milestone_order.py +0 -0
  555. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  556. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_milestone_ship.py +0 -0
  557. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_network.py +0 -0
  558. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_new_issue_chat.py +0 -0
  559. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_plans.py +0 -0
  560. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_portal.py +0 -0
  561. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_pr.py +0 -0
  562. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_pull_artifact.py +0 -0
  563. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_queue.py +0 -0
  564. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_reattach_sessions.py +0 -0
  565. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_refine_board.py +0 -0
  566. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_release_preflight.py +0 -0
  567. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_release_propagate.py +0 -0
  568. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_release_window.py +0 -0
  569. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_repo_2220.py +0 -0
  570. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  571. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_scorecard.py +0 -0
  572. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_serve_store_backend_3084.py +0 -0
  573. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_set_review_findings.py +0 -0
  574. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_advisory_terminal.py +0 -0
  575. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_contested_tag.py +0 -0
  576. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_invariant_alarms.py +0 -0
  577. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_machine_fault.py +0 -0
  578. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_merge_queue.py +0 -0
  579. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_provider.py +0 -0
  580. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_retried_3340.py +0 -0
  581. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_review_finalizing.py +0 -0
  582. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_test_failed_tag.py +0 -0
  583. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_status_usage_limit.py +0 -0
  584. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_sync_comments_873.py +0 -0
  585. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_test_plan.py +0 -0
  586. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_track.py +0 -0
  587. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_tui_update.py +0 -0
  588. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cli_wait.py +0 -0
  589. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_client.py +0 -0
  590. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_client_base_install.py +0 -0
  591. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_client_config_cache_atomic_3052.py +0 -0
  592. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_client_resource_migration_1946.py +0 -0
  593. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_commands_common.py +0 -0
  594. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_comments.py +0 -0
  595. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_completion_summary.py +0 -0
  596. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_config.py +0 -0
  597. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_config_acceptance.py +0 -0
  598. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_config_audit.py +0 -0
  599. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_config_drift_check.py +0 -0
  600. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_config_pricing.py +0 -0
  601. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  602. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_config_usage_gate.py +0 -0
  603. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_confirm_test.py +0 -0
  604. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_conflict_fix.py +0 -0
  605. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_conflict_fix_semantic.py +0 -0
  606. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  607. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coord_test.py +0 -0
  608. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  609. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coord_test_runner_baseline.py +0 -0
  610. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coord_test_runner_populated_home.py +0 -0
  611. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coord_test_runner_routing.py +0 -0
  612. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coord_test_runner_toolchain.py +0 -0
  613. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coord_uat.py +0 -0
  614. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coord_web_sse_restart_live.py +0 -0
  615. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_coordinator_machine.py +0 -0
  616. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_cross_platform_imports.py +0 -0
  617. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dao.py +0 -0
  618. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dashboard.py +0 -0
  619. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dashboard_api.py +0 -0
  620. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dashboard_fixture.py +0 -0
  621. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dashboard_server.py +0 -0
  622. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dashboard_terminal.py +0 -0
  623. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dashboard_terminal_live.py +0 -0
  624. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dead_end.py +0 -0
  625. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_decomposition_chat.py +0 -0
  626. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_coord_db_backup.py +0 -0
  627. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_coord_web_dist.py +0 -0
  628. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_coord_web_rollback.py +0 -0
  629. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_db_backup_unit.py +0 -0
  630. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_drive_queue_unit.py +0 -0
  631. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_failure_notify_unit.py +0 -0
  632. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_manifest.py +0 -0
  633. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_notify_unit.py +0 -0
  634. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_units_lane.py +0 -0
  635. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deploy_web_unit.py +0 -0
  636. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deprecation_telemetry.py +0 -0
  637. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_deps.py +0 -0
  638. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_diagnose.py +0 -0
  639. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dispatch.py +0 -0
  640. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dispatch_liveness.py +0 -0
  641. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dispatch_target_validation.py +0 -0
  642. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dispatch_workers.py +0 -0
  643. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dist_name.py +0 -0
  644. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_done_housekeeping.py +0 -0
  645. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dr_azure_scripts.py +0 -0
  646. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dr_promote.py +0 -0
  647. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_dr_verify.py +0 -0
  648. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive.py +0 -0
  649. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive_machine_fault.py +0 -0
  650. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive_queue_blocked_rendering.py +0 -0
  651. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive_queue_launch_argv.py +0 -0
  652. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  653. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive_queue_roll_pending.py +0 -0
  654. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  655. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive_state.py +0 -0
  656. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_drive_tmux.py +0 -0
  657. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_epic_up_capability_detection.py +0 -0
  658. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  659. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_epic_up_image_provenance.py +0 -0
  660. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_errors.py +0 -0
  661. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_events.py +0 -0
  662. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_failure_class.py +0 -0
  663. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_failure_classifier.py +0 -0
  664. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_filelock.py +0 -0
  665. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  666. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_fix_escalation_classifier.py +0 -0
  667. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_fix_of_force_override.py +0 -0
  668. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_fleet_config_health.py +0 -0
  669. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_fleet_health_probes.py +0 -0
  670. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_fleet_health_snapshot.py +0 -0
  671. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_fleet_watchdog.py +0 -0
  672. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_forge_availability.py +0 -0
  673. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_freshness.py +0 -0
  674. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_gate_a.py +0 -0
  675. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_gate_b.py +0 -0
  676. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_gate_snapshot_staleness.py +0 -0
  677. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_gates.py +0 -0
  678. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  679. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_gen_mock_index.py +0 -0
  680. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_generated_rust_fixture.py +0 -0
  681. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_generated_rust_requests.py +0 -0
  682. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_generated_types_fixture.py +0 -0
  683. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_github_throttle.py +0 -0
  684. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_goal.py +0 -0
  685. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_graph_health.py +0 -0
  686. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_graph_selfheal_absent_2237.py +0 -0
  687. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_handoff.py +0 -0
  688. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_checks.py +0 -0
  689. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_cli.py +0 -0
  690. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_cli_graph.py +0 -0
  691. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_config.py +0 -0
  692. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_context.py +0 -0
  693. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_coord_tui_ci_pin.py +0 -0
  694. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_coord_web_ci_pin.py +0 -0
  695. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_deploy_lane_facts.py +0 -0
  696. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_fix.py +0 -0
  697. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_incident_regression.py +0 -0
  698. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_issues_sync_staleness.py +0 -0
  699. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_pr_churn.py +0 -0
  700. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_pypi.py +0 -0
  701. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_registry.py +0 -0
  702. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_release_cordon_probe.py +0 -0
  703. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_timer_active.py +0 -0
  704. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_toolchain.py +0 -0
  705. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_unit_drift.py +0 -0
  706. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_unit_enablement.py +0 -0
  707. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_health_wedged_drive_queue.py +0 -0
  708. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_hooks.py +0 -0
  709. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_housekeeping.py +0 -0
  710. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_human_attended_437.py +0 -0
  711. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_init.py +0 -0
  712. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_install_agent_venv_2911.py +0 -0
  713. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_integration.py +0 -0
  714. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_interactive_briefing_echo.py +0 -0
  715. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_interactive_pane_log_2541.py +0 -0
  716. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_interactive_prefill_state.py +0 -0
  717. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_interactive_session_relaunch.py +0 -0
  718. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_interactive_test_verdict_backstop.py +0 -0
  719. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_interactive_token_attribution.py +0 -0
  720. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_interactive_worktree.py +0 -0
  721. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_invariant_alarms.py +0 -0
  722. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_issue_store_seam.py +0 -0
  723. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_issues_sync_status.py +0 -0
  724. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_liveness_auditor.py +0 -0
  725. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_liveness_notify.py +0 -0
  726. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_lock_contention_ratchet.py +0 -0
  727. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_machine_fault.py +0 -0
  728. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_machine_metrics.py +0 -0
  729. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_machine_onboard.py +0 -0
  730. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_machine_pause.py +0 -0
  731. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_machine_stats.py +0 -0
  732. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_merge_queue.py +0 -0
  733. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_merge_verify.py +0 -0
  734. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_milestone_chat.py +0 -0
  735. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_milestone_dispatch.py +0 -0
  736. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_milestone_gate.py +0 -0
  737. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_milestone_order.py +0 -0
  738. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_milestone_seam.py +0 -0
  739. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_mock_author.py +0 -0
  740. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_model_tiering.py +0 -0
  741. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_models.py +0 -0
  742. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_models_config_labels.py +0 -0
  743. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_needs_attention.py +0 -0
  744. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_network.py +0 -0
  745. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_new_issue_chat.py +0 -0
  746. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_next_release_tag.py +0 -0
  747. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_node_shim.py +0 -0
  748. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notifier_baseline.py +0 -0
  749. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notifier_cli.py +0 -0
  750. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notifier_collect.py +0 -0
  751. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notifier_config.py +0 -0
  752. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notifier_drive_seam.py +0 -0
  753. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notifier_isolation.py +0 -0
  754. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notifier_predicate.py +0 -0
  755. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notifier_quiet_hours.py +0 -0
  756. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notifier_service.py +0 -0
  757. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notify.py +0 -0
  758. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_notify_drain.py +0 -0
  759. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_openapi.py +0 -0
  760. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_operational_defaults.py +0 -0
  761. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_overlap_fence.py +0 -0
  762. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_overlap_predict.py +0 -0
  763. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_packaged_deploy_units.py +0 -0
  764. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_parentage.py +0 -0
  765. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_paste_landed.py +0 -0
  766. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  767. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_pipeline.py +0 -0
  768. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_plan_followup_approve_plan_command.py +0 -0
  769. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_plan_followup_pr_command.py +0 -0
  770. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_plan_followup_review_command.py +0 -0
  771. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_plan_only.py +0 -0
  772. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_plan_parser.py +0 -0
  773. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_platform_paths.py +0 -0
  774. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_portal_bridge.py +0 -0
  775. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_portal_config.py +0 -0
  776. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_portal_store.py +0 -0
  777. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_portal_sync.py +0 -0
  778. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_pr_body_lint.py +0 -0
  779. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_prereqs.py +0 -0
  780. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_production_db_guard.py +0 -0
  781. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_progress.py +0 -0
  782. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_provider_seam.py +0 -0
  783. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_providers.py +0 -0
  784. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_providers_config_labels.py +0 -0
  785. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_providers_pty.py +0 -0
  786. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_provision_core.py +0 -0
  787. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_provision_machine.py +0 -0
  788. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_py_rust_mirror_inventory.py +0 -0
  789. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_quiet_hours.py +0 -0
  790. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_quiet_hours_store_2146.py +0 -0
  791. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reap_merged_sessions.py +0 -0
  792. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reap_stale_interactive_tick.py +0 -0
  793. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reconcile.py +0 -0
  794. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reconcile_branch.py +0 -0
  795. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reconcile_completions.py +0 -0
  796. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  797. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reconcile_merges.py +0 -0
  798. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reconcile_no_agent_record.py +0 -0
  799. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reconcile_tick.py +0 -0
  800. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reconcile_usage_limit_done.py +0 -0
  801. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_refine_chat.py +0 -0
  802. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_cordon_2101.py +0 -0
  803. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  804. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_cordon_deadlock_2240.py +0 -0
  805. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  806. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_cordon_stuck_2490.py +0 -0
  807. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_propagate.py +0 -0
  808. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_propagate_threshold.py +0 -0
  809. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_roll_between_legs_2854.py +0 -0
  810. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_roll_window_handoff.py +0 -0
  811. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_unified_1242.py +0 -0
  812. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_verify.py +0 -0
  813. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_release_window.py +0 -0
  814. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_remote_auto_prune.py +0 -0
  815. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_remote_interactive_reaper.py +0 -0
  816. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_repo_add.py +0 -0
  817. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_repo_dormancy.py +0 -0
  818. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_repo_edit_2220.py +0 -0
  819. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_repo_graph_fleet_2237.py +0 -0
  820. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_repo_onboard_2220.py +0 -0
  821. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_report_result_push.py +0 -0
  822. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_reports.py +0 -0
  823. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_retry.py +0 -0
  824. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_retry_advisory_1606.py +0 -0
  825. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_retry_escalation_classify_3360.py +0 -0
  826. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_retry_type_1636.py +0 -0
  827. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_revalidate.py +0 -0
  828. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_review.py +0 -0
  829. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_review_end_review_without_verdict.py +0 -0
  830. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_review_parse_failure_diagnostic.py +0 -0
  831. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_review_reaffirm.py +0 -0
  832. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_review_state.py +0 -0
  833. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_review_verdict_backstop.py +0 -0
  834. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_review_verdict_override_audit.py +0 -0
  835. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_review_verdict_relay.py +0 -0
  836. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_review_zero_commits.py +0 -0
  837. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_scoped_review_wiring.py +0 -0
  838. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_scorecard.py +0 -0
  839. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_self_health.py +0 -0
  840. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_serve.py +0 -0
  841. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_serve_app.py +0 -0
  842. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_serve_app_board_trim.py +0 -0
  843. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_serve_rest_routes.py +0 -0
  844. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_session.py +0 -0
  845. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_slice_issue_attribution.py +0 -0
  846. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_smoke.py +0 -0
  847. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  848. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_smoke_live_checkout_restore.py +0 -0
  849. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_smoke_workflow.py +0 -0
  850. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_spend_ceiling.py +0 -0
  851. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_spend_ceiling_coordinator.py +0 -0
  852. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_split.py +0 -0
  853. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_split_work.py +0 -0
  854. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_sql_dialect.py +0 -0
  855. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_sqlite_connect_ratchet.py +0 -0
  856. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_stage_projection.py +0 -0
  857. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_stale_busy_reviewer_697.py +0 -0
  858. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_stalled_pipeline.py +0 -0
  859. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_state_review_findings_daemon.py +0 -0
  860. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_status_fleet_footer.py +0 -0
  861. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_stop_1567.py +0 -0
  862. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_store_contract.py +0 -0
  863. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_store_migrate.py +0 -0
  864. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_stuck.py +0 -0
  865. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  866. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_terminal_command.py +0 -0
  867. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_test_author.py +0 -0
  868. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_test_chat.py +0 -0
  869. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_test_orchestrator.py +0 -0
  870. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_test_report.py +0 -0
  871. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_test_verdict_parsing.py +0 -0
  872. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_test_verdict_transcript_floor.py +0 -0
  873. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_text_io_encoding_audit.py +0 -0
  874. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_thin_client_board_audit.py +0 -0
  875. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_thin_client_config_load_1080.py +0 -0
  876. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_thin_client_daemon_routing_906.py +0 -0
  877. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_throwaway_vm.py +0 -0
  878. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_tmux_host.py +0 -0
  879. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_tmux_session.py +0 -0
  880. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_transcript_floor.py +0 -0
  881. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_uat_checks.py +0 -0
  882. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_usage.py +0 -0
  883. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_usage_limits.py +0 -0
  884. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_usage_rollup.py +0 -0
  885. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_venv_live_install_2121.py +0 -0
  886. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_version_single_source.py +0 -0
  887. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_watch.py +0 -0
  888. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  889. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_worker_env_venv_isolation.py +0 -0
  890. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_worker_events.py +0 -0
  891. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_worker_image_pin_sync.py +0 -0
  892. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_worker_safety.py +0 -0
  893. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_worker_test_scoping.py +0 -0
  894. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_worktree.py +0 -0
  895. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  896. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/test_write_parity.py +0 -0
  897. {code_coordinator-0.5.493 → code_coordinator-0.5.495}/tests/write_parity.py +0 -0
@@ -5,6 +5,8 @@ on:
5
5
  branches: [main]
6
6
  pull_request:
7
7
  branches: [main]
8
+ # #3392: the `postgres` job below is opt-in and runs ONLY from here.
9
+ workflow_dispatch:
8
10
 
9
11
  jobs:
10
12
  test:
@@ -371,6 +373,21 @@ jobs:
371
373
  # what every other job's `pip install -e ".[dev]"` pulls in.
372
374
  postgres:
373
375
  runs-on: ubuntu-latest
376
+ # #3392, 2026-09-18: taken out of automatic CI by operator decision -- the
377
+ # Postgres migration is not current work, and until it is this job is pure
378
+ # noise. It gates nothing (`continue-on-error: true` below, and it is not a
379
+ # required check in branch protection), emits ~3700
380
+ # ProductionDatabaseGuardError that dominate every `--log-failed` read of
381
+ # this workflow, and costs 65-70 min of runner time per push to main. It
382
+ # misdirected #3378 item 1, #3380 and #3385 -- all three were scoped as
383
+ # "make main green" against a job that cannot redden main.
384
+ #
385
+ # RESTORE by deleting this one `if:` line when the migration becomes active
386
+ # work. Everything below is unchanged and still correct. Sequence then is:
387
+ # remove the `if:`, work the failure list down, THEN remove
388
+ # `continue-on-error` -- that last step is what turns this into a real gate
389
+ # and it is the deliberate END of that work, not the start.
390
+ if: github.event_name == 'workflow_dispatch'
374
391
  continue-on-error: true
375
392
  services:
376
393
  postgres:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.493
3
+ Version: 0.5.495
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.493
3
+ Version: 0.5.495
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.493",
2
+ "tag": "0.5.495",
3
3
  "distance": 0,
4
- "node": "g21581c4b4d4c5107d3a7da2aefbfdfbd93aeee1e",
4
+ "node": "ga0310959c08fddb13badabe2d065897c8a64bc04",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-18"
@@ -245,6 +245,17 @@ class BoardIssue:
245
245
  synced_at: float | None = None
246
246
  milestone_number: int | None = None
247
247
  milestone_title: str | None = None
248
+ # #3384: GitHub's own `stateReason` — `"reopened"` when a human explicitly
249
+ # reopened this issue via `gh issue reopen`, `""` for an issue that has
250
+ # never been closed. See `coord.drive_queue.IssueFacts.reopened`.
251
+ #
252
+ # ABSENT, not `""`, on the wire when it is the empty default: it would
253
+ # otherwise cost ~20 bytes on every issue row of every poll to say nothing
254
+ # (`coord.board_wire._drop_default_state_reason`, which is also why it is
255
+ # not in this DTO's `required` list — it has a default). Read it as
256
+ # `row.get("state_reason") or ""`; the Rust side gets `#[serde(default)]`
257
+ # from `coord.codegen`.
258
+ state_reason: str = ""
248
259
 
249
260
 
250
261
  @dataclasses.dataclass(kw_only=True)
@@ -65,6 +65,19 @@ Rust call site of ``OpenIssue.body`` / ``PipelineIssue.body`` first. So the
65
65
  body now leaves the collection wire for open issues too, and
66
66
  :func:`bound_issue_row` keeps only the machine-parsed *residue* a client
67
67
  cannot re-fetch in time — see :data:`ALLOWED_GLOB_MARKER`.
68
+
69
+ **#3384: a defaulted flag costs its bytes on EVERY row.** The reopen witness
70
+ ``issues.state_reason`` carries a value on the handful of rows GitHub
71
+ actually set one on, and the empty default on every other issue on the
72
+ board — and an empty-but-present key is ~20 bytes of wire per row per poll,
73
+ which on the #1791 guard's 3000-row seed is ~57 KB and pushed the payload
74
+ straight through :data:`BOARD_PAYLOAD_BYTE_BUDGET`. So the default is
75
+ dropped from the wire entirely (:func:`_drop_default_state_reason`) and the
76
+ key is present only when it says something. This is the same additive-only
77
+ convention the ``<field>_truncated`` flags already follow, and it is the
78
+ rule to apply to the NEXT defaulted field somebody adds to
79
+ ``coord/board_schema.py``: an always-present default is a per-row tax on a
80
+ payload that is polled every few seconds and whose ETag never matches.
68
81
  """
69
82
 
70
83
  from __future__ import annotations
@@ -253,9 +266,52 @@ def _machine_readable_residue(body: str) -> str:
253
266
  )
254
267
 
255
268
 
269
+ def _drop_default_state_reason(row: dict) -> None:
270
+ """#3384: drop ``state_reason`` from the wire when it is the empty default.
271
+
272
+ ``issues.state_reason`` is GitHub's own ``stateReason``: ``"reopened"``
273
+ on an issue a human explicitly reopened, and ``''`` on every issue that
274
+ has never been closed — i.e. on essentially the whole board. Shipping
275
+ the empty default costs ~20 bytes on EVERY issue row of EVERY poll (~57 KB
276
+ on the #1791 guard's 3000-row seed, enough on its own to breach
277
+ :data:`BOARD_PAYLOAD_BYTE_BUDGET`) to tell a client something it already
278
+ assumes.
279
+
280
+ Safe because absent and empty are the SAME answer to every consumer, by
281
+ construction rather than by luck:
282
+
283
+ * ``coord.drive_queue.build_board_view`` reads it as
284
+ ``str(row.get("state_reason") or "").lower() == "reopened"`` — the one
285
+ question anything asks of this field — so a missing key and an empty
286
+ one both yield ``IssueFacts.reopened is False``. That is also what
287
+ keeps this wire cut from splitting the answer in two: the daemon-host
288
+ local path (``coord.drive_state._local_issue_rows``, which never runs
289
+ through this module) still carries ``''``, and both paths land on the
290
+ identical fact.
291
+ * The Rust ``OpenIssue.state_reason`` is generated with
292
+ ``#[serde(default)]`` (``coord.codegen._rust_auto_field``), so an
293
+ absent key deserializes to ``String::new()``.
294
+ * ``state_reason`` is not in ``BoardIssue``'s ``required`` list in
295
+ ``/openapi.json`` (it has a dataclass default), so omitting it stays
296
+ inside the published contract.
297
+
298
+ A NON-empty value is always kept — this drops the default, it does not
299
+ filter for ``"reopened"`` specifically, so a value GitHub starts sending
300
+ that we do not yet interpret still reaches clients intact.
301
+ """
302
+ if not row.get("state_reason"):
303
+ row.pop("state_reason", None)
304
+
305
+
256
306
  def bound_issue_row(row: dict) -> None:
257
307
  """Apply the wire policy to one ``/board`` issue row (mutates).
258
308
 
309
+ **The empty ``state_reason`` default is dropped from every issue row**
310
+ (#3384), tracking issues included — see
311
+ :func:`_drop_default_state_reason`. Deliberately above the epic
312
+ early-return below, so the wire shape of that field does not depend on
313
+ which kind of issue a row happens to be.
314
+
259
315
  **Tracking (epic) issues are exempt from the body cap.** The TUI's
260
316
  Milestone DAG parses ``## Work order`` out of the tracking issue's body
261
317
  *client-side* (`milestone_dag.rs::milestones_with_work_orders` — it does
@@ -282,6 +338,7 @@ def bound_issue_row(row: dict) -> None:
282
338
  exactly as for a closed issue, which is what arms that hydration
283
339
  (``pipeline.rs::issue_body_fetch_target``).
284
340
  """
341
+ _drop_default_state_reason(row)
285
342
  if _is_tracking_issue(row):
286
343
  return
287
344
  if _is_closed_issue(row):
@@ -124,6 +124,7 @@ from coord.overlap_predict import (
124
124
 
125
125
  if TYPE_CHECKING: # pragma: no cover — typing only
126
126
  from coord.config import Config
127
+ from coord.merge_queue import QueuedMerge
127
128
 
128
129
  log = logging.getLogger(__name__)
129
130
 
@@ -2814,13 +2815,21 @@ def _local_issue_rows() -> list[dict]:
2814
2815
 
2815
2816
  Fail-soft: an unreadable/absent table degrades to ``[]``, which puts the
2816
2817
  daemon host back on the assignment-only signals rather than aborting.
2818
+
2819
+ #3384: ``state_reason`` selected alongside ``state`` — this IS the
2820
+ ``coord drive-queue tick`` daemon-host path, so without it
2821
+ ``coord.drive_queue.IssueFacts.reopened`` would never populate on the
2822
+ one host that actually ticks the queue, and a reopened issue's stale
2823
+ ``merged`` witness would keep short-circuiting entries straight to
2824
+ ``done`` there regardless of the fix in ``build_board_view``.
2817
2825
  """
2818
2826
  from coord import sql # noqa: PLC0415
2819
2827
  from coord.db import get_connection # noqa: PLC0415
2820
2828
 
2821
2829
  try:
2822
2830
  rows = sql.execute(
2823
- get_connection(), "SELECT repo_name, number, state FROM issues"
2831
+ get_connection(),
2832
+ "SELECT repo_name, number, state, state_reason FROM issues",
2824
2833
  ).fetchall()
2825
2834
  except Exception: # noqa: BLE001 — see the fail-soft note above
2826
2835
  return []
@@ -4740,14 +4749,51 @@ def _run_merge_only_candidates(plan: TickPlan, config_path: Path | None) -> None
4740
4749
  click.echo(f"merge-only: {reason}")
4741
4750
 
4742
4751
 
4752
+ # #3396: the `stage` this call site's escalations are recorded under —
4753
+ # mirrors `ROLL_PENDING_ALERT_STAGE`/`SELF_CORDON_ALERT_STAGE` above, but
4754
+ # keyed per-entry (the entry's own `(repo_name, issue_number)`) rather than a
4755
+ # single fleet-wide slot, since more than one branch can be `checks_stale` at
4756
+ # once. `_run_auto_revalidate_checks_stale`'s cleanup pass reads this same
4757
+ # constant back to find which open escalations are its own to dismiss.
4758
+ CHECKS_STALE_ALERT_STAGE = "checks_stale"
4759
+
4760
+
4761
+ def _record_checks_stale_escalation(entry: "QueuedMerge", *, reason: str) -> None:
4762
+ """Write (or refresh) the durable, human-visible escalation for *entry*
4763
+ (#3396 item 2) — ``coord escalate list``/``coord escalate run`` and the
4764
+ TUI already surface this table for every other "needs a human" condition
4765
+ in this file; a `checks_stale` block that this tick cannot move forward
4766
+ on its own now reaches it too, instead of only ever reprinting the same
4767
+ diagnosis to the journal every ~3 minutes forever.
4768
+
4769
+ Best-effort: a write failure here must not take down the rest of the
4770
+ tick — the caller already echoed the reason to stdout, which is the
4771
+ floor this falls back to.
4772
+ """
4773
+ try:
4774
+ from coord.state import record_drive_escalation # noqa: PLC0415
4775
+
4776
+ record_drive_escalation(
4777
+ entry.repo_name,
4778
+ entry.issue_number,
4779
+ stage=CHECKS_STALE_ALERT_STAGE,
4780
+ reason=reason,
4781
+ gate_readings=f"error={entry.error}" if entry.error else "gate: READY",
4782
+ proposed_command=(
4783
+ f"coord merge --only {entry.repo_name}#{entry.issue_number}"
4784
+ ),
4785
+ assignment_id=entry.assignment_id,
4786
+ )
4787
+ except Exception as exc: # noqa: BLE001 — the stdout line is the floor
4788
+ click.echo(f" (could not record the checks_stale escalation: {exc})")
4789
+
4790
+
4743
4791
  def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
4744
- """#2535: best-effort surfacing of merge-queue entries blocked SOLELY on
4792
+ """#2535: unattended remedy for merge-queue entries blocked SOLELY on
4745
4793
  stale CI checks against an already-approved review — closing the gap
4746
4794
  where nothing periodic ever looks at such an entry on an operator's
4747
- behalf, so it just sits until someone notices ``--dry-run``'s
4748
- ``checks_stale`` line by hand (the trigger: #2530's Gate-A PR #2534 sat
4749
- blocked 2026-08-21 on nothing but 210 unrelated merges having landed
4750
- since its CI last ran).
4795
+ behalf (the trigger: #2530's Gate-A PR #2534 sat blocked 2026-08-21 on
4796
+ nothing but 210 unrelated merges having landed since its CI last ran).
4751
4797
 
4752
4798
  #3266: this used to auto-fire a ``gh run rerun`` (``CiStore.
4753
4799
  rerun_for_pr``) for exactly this shape, up to ``MAX_CI_STALE_RERUNS`` —
@@ -4756,46 +4802,89 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
4756
4802
  there too: a ``gh run rerun`` replays the SAME event payload against
4757
4803
  the SAME base the stale checks already used, so it can never see a
4758
4804
  base that has since moved — which is the ONLY thing a staleness
4759
- reading means. Every tick that found a candidate here was spending a
4760
- full CI cycle (this repo's median: ~62 minutes) on a guaranteed no-op,
4761
- twice, before the shared ``ci_stale_reruns`` budget parked the entry
4762
- anyway (claude-coordinator#2972). Per this repo's "one question, one
4763
- answer" rule, this tick and ``process()`` must agree on the same
4764
- question ("should we auto-rerun CI for a checks_stale block?") — they
4765
- now both answer "no, park and point at a rebase" identically, rather
4766
- than this call site silently keeping the old answer #2197 already gave
4767
- up on live. See ``MAX_CI_STALE_RERUNS``'s comment in
4805
+ reading means. See ``MAX_CI_STALE_RERUNS``'s comment in
4768
4806
  ``coord/merge_queue.py`` and ``ci_stale_reason``'s docstring for the
4769
- full reasoning and the actual remedy (rebase onto the target branch,
4770
- then ``git push --force-with-lease`` — the only thing that produces a
4771
- check against the CURRENT base).
4807
+ full reasoning. The actual remedy is a rebase onto the target branch
4808
+ followed by ``git push --force-with-lease`` — the only thing that
4809
+ produces a check against the CURRENT base.
4810
+
4811
+ #3396: from #2535 through #3266 this call site only ever *reported*
4812
+ that remedy — it never performed it, so a `checks_stale` entry whose
4813
+ owning `coord drive` session had already exhausted its merge attempts
4814
+ and exited had NOTHING left watching it: this tick re-diagnosed the
4815
+ same block every ~3 minutes, forever, and the stale-rebase worker
4816
+ that exists for exactly this shape (:func:`coord.conflict_fix.
4817
+ dispatch_conflict_fix` with ``stale_rebase=True``, #3349) was never
4818
+ dispatched. #3349 already wired that worker into
4819
+ ``coord.notify``'s stalled-pipeline sweep (``merge_gate_checks_stale``),
4820
+ but that sweep only runs when ``coord notify`` is invoked and
4821
+ ``pipeline.auto_dispatch_stalled`` is on — it is not this tick, which
4822
+ runs unconditionally every few minutes on the daemon host. Per this
4823
+ repo's "one question, one answer" rule this call site now reuses the
4824
+ IDENTICAL dispatcher rather than re-deriving the decision: a
4825
+ content-preserving rebase gets force-pushed and the merge queue picks
4826
+ it up on its own next attempt, with no operator action, exactly like
4827
+ the #1090 reference case in the issue. A rebase that turns out to
4828
+ conflict (or change content) still refuses and escalates — the
4829
+ worker's own narrow briefing (:func:`coord.conflict_fix.
4830
+ build_stale_rebase_briefing`) enforces that, not this call site.
4831
+
4832
+ Escalation (#3396 item 2): a candidate this function cannot move
4833
+ forward — a conflict-fix already tried and failed against this SAME
4834
+ error (:func:`coord.conflict_fix.has_prior_conflict_fix`), or dispatch
4835
+ itself declined (no capable/reachable machine, no ``repo_path``) — is
4836
+ recorded via :func:`coord.state.record_drive_escalation` under the
4837
+ entry's OWN ``(repo, issue)``, the same durable, human-visible table
4838
+ ``coord escalate list``/``coord escalate run`` already serve for every
4839
+ other "needs a human" condition in this file (see
4840
+ ``ROLL_PENDING_ALERT_REPO``/``SELF_CORDON_ALERT_REPO`` above for the
4841
+ established one-slot-per-condition pattern; this one is naturally
4842
+ keyed per-entry instead, since more than one branch can be
4843
+ ``checks_stale`` at once). Before #3396 a block that "needs a human"
4844
+ only ever reached this function's own stdout/journal line, printed
4845
+ again unchanged every tick — never a place an operator or the TUI
4846
+ would actually see it (the issue's own complaint: `coord drive-queue
4847
+ status` reporting ``alert: (none)`` throughout). A candidate that
4848
+ clears on its own (the rebase lands, or the base stops moving) is no
4849
+ longer in the next tick's *candidates* list, so its escalation (if any)
4850
+ is dismissed below — the table only ever holds genuinely-live blocks.
4772
4851
 
4773
4852
  Deliberately narrow — this is NOT ``merge.auto_drain`` reopened (that
4774
4853
  flag stays ``False`` by design; see ``docs/DRIVE_QUEUE.md`` and the
4775
4854
  2026-06-07 incident it guards against). This step never merges
4776
- anything, never mutates the queue, and never touches an entry blocked
4777
- on review, a real CI failure, or a conflict — it only *reports* the
4778
- exact shape :func:`coord.merge_queue.ci_revalidation_candidates` scopes
4855
+ anything and never mutates the merge-queue row itself — it only ever
4856
+ dispatches the SAME bounded, self-refusing worker
4857
+ :func:`coord.conflict_fix.dispatch_conflict_fix` already provides
4858
+ for the identical shape reached from a live drive/stalled-pipeline
4859
+ sweep, gated by the SAME one-per-entry retry cap
4860
+ (:func:`coord.conflict_fix.has_prior_conflict_fix`) — so a second
4861
+ tick finding the same still-stale entry while a rebase attempt is
4862
+ already running/pending does nothing, and one that already failed
4863
+ escalates instead of retrying. It never touches an entry blocked on
4864
+ review, a real CI failure, or a conflict — only the exact shape
4865
+ :func:`coord.merge_queue.ci_revalidation_candidates` scopes
4779
4866
  ``--revalidate``'s (equally no-op) CI arm to (#1851/#1925): ``PENDING``,
4780
4867
  review approved, smoke fresh, CI checks green but predating the current
4781
4868
  base.
4782
4869
 
4783
4870
  ``MAX_CI_STALE_RERUNS``/``ci_stale_reruns`` are read nowhere in this
4784
- function any more — nothing here increments or checks that budget, so a
4785
- row already carrying a nonzero count from before this fix is left
4786
- exactly as ``process()`` leaves it (converges to 0 on the next
4787
- genuinely-fresh reading, never incremented further by this call site).
4788
-
4789
- Cost-visible (#1632's posture) in the opposite direction from before:
4790
- there is no external spend to report any more, only a
4791
- :func:`coord.audit.record_audit` (operational tier) row per candidate
4792
- per tick, so an operator watching the trail still sees the block
4793
- without this function ever burning a CI cycle trying (and failing) to
4794
- clear it.
4795
-
4796
- Deliberately NOT behind a new config flag — this is strictly a
4797
- supplementary read with no external action, so there is nothing new to
4798
- gate.
4871
+ function — nothing here increments or checks that budget, so a row
4872
+ already carrying a nonzero count from before #3266 is left exactly as
4873
+ ``process()`` leaves it (converges to 0 on the next genuinely-fresh
4874
+ reading, never incremented further by this call site).
4875
+
4876
+ Cost-visible (#1632's posture): dispatching a worker is real, visible
4877
+ spend — a :func:`coord.audit.record_audit` (business tier) row marks
4878
+ it, distinct from the operational-tier rows for a declined/escalated
4879
+ candidate, so an operator watching the audit trail can tell "this tick
4880
+ spent a session" from "this tick only reported a block" at a glance.
4881
+
4882
+ Deliberately NOT behind a new config flag — the worker it dispatches
4883
+ already carries its own bounded, self-refusing briefing and one-shot
4884
+ retry cap; there is nothing further to gate that
4885
+ ``pipeline.auto_dispatch_stalled`` (the flag guarding ``coord
4886
+ notify``'s unrelated, broader stalled-pipeline sweep) doesn't already
4887
+ cover for that other call site.
4799
4888
 
4800
4889
  Best-effort like every other optional step in this tick (conflict
4801
4890
  reconciliation in ``_auto_drain_tick``, the merge-only fast path above):
@@ -4803,6 +4892,24 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
4803
4892
  on a thin client — this daemon-host tick is the only place it ever
4804
4893
  runs, same guard :func:`_fetch_live_ci_gate`/
4805
4894
  :func:`_run_merge_only_candidates` use.
4895
+
4896
+ Known race, widened by this change (#3396 review): this tick is a new,
4897
+ independent, ALWAYS-ON caller of ``dispatch_conflict_fix(...,
4898
+ stale_rebase=True)`` (``deploy/coord-drive-queue.service``/``.timer``),
4899
+ alongside ``coord notify``'s stalled-pipeline sweep (a separate systemd
4900
+ timer, see ``docs/AGENT_OPERATIONS.md``) and a live drive's own merge
4901
+ attempt — three independent callers for the identical shape now. The
4902
+ shared guard (``has_prior_conflict_fix``/``_has_active_conflict_fix``)
4903
+ is a plain board-snapshot read with no cross-process lock between them:
4904
+ if two of these fire within the same window for the same gate-READY
4905
+ ``checks_stale`` entry, both can independently observe "no prior fix in
4906
+ flight" and dispatch a duplicate stale-rebase worker. Wasted spend, not
4907
+ data loss — the second worker's push is a no-op or is itself refused —
4908
+ but this is the first caller to fire unconditionally on a fixed timer
4909
+ rather than behind a live drive or an opt-in flag, which widens the
4910
+ window. A real fix needs a cross-process claim (e.g. a DB-level lock
4911
+ keyed on the entry) rather than a snapshot read; tracked as a follow-up,
4912
+ not fixed here.
4806
4913
  """
4807
4914
  from coord.board_service import resolve as resolve_board_service # noqa: PLC0415
4808
4915
 
@@ -4815,10 +4922,32 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
4815
4922
  from coord.audit import record_audit # noqa: PLC0415
4816
4923
  from coord.ci_store import build_ci_store # noqa: PLC0415
4817
4924
  from coord.commands._common import _load_config # noqa: PLC0415
4818
- from coord.state import load_board as _load_board # noqa: PLC0415
4925
+ from coord.conflict_fix import ( # noqa: PLC0415
4926
+ _has_active_conflict_fix,
4927
+ describe_conflict_fix_decline,
4928
+ dispatch_conflict_fix,
4929
+ has_prior_conflict_fix,
4930
+ )
4931
+ from coord.network import fetch_status # noqa: PLC0415
4932
+ from coord.state import ( # noqa: PLC0415
4933
+ dismiss_drive_escalation,
4934
+ list_drive_escalations,
4935
+ load_board as _load_board,
4936
+ )
4819
4937
 
4820
4938
  cfg = _load_config(config_path)
4821
- board = _load_board()
4939
+ # #3396: `load_board()` can legitimately return `None` (no board data
4940
+ # at all yet). `ci_revalidation_candidates` already tolerates that
4941
+ # (its gate reads never dereference a `None` board when the gate they
4942
+ # guard isn't required), but `has_prior_conflict_fix`/
4943
+ # `dispatch_conflict_fix` below unconditionally walk
4944
+ # `board.active`/`board.completed` — an empty board is the correct
4945
+ # "no prior assignments exist" reading for both, and keeps the two
4946
+ # calls sharing the exact same object rather than one seeing `None`
4947
+ # and the other a stand-in.
4948
+ from coord.models import Board # noqa: PLC0415
4949
+
4950
+ board = _load_board() or Board()
4822
4951
  ci_store = build_ci_store(
4823
4952
  cfg.ci_store.type, host=cfg.ci_store.host, token_env=cfg.ci_store.token_env,
4824
4953
  )
@@ -4829,34 +4958,145 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
4829
4958
  except Exception: # noqa: BLE001 — best-effort, see docstring
4830
4959
  return
4831
4960
 
4961
+ # #3396 review: the cleanup pass below treats an escalation's absence
4962
+ # from *candidates* as "confirmed cleared" — that's only a safe reading
4963
+ # once we know `candidates` came from a REAL read, not from a
4964
+ # `ci_store` that was `None`/unavailable (which `ci_revalidation_
4965
+ # candidates` also answers with `[]`, indistinguishable by return value
4966
+ # alone from "genuinely nothing is stale"). The `ci_store.is_available`
4967
+ # check above, and the broader `except Exception: return` around this
4968
+ # whole block, both already `return` BEFORE this point on exactly that
4969
+ # ambiguous case — so reaching here at all already means the read was
4970
+ # real. Do not restructure this so cleanup can be reached without a
4971
+ # confirmed-available `ci_store` and a `ci_revalidation_candidates` call
4972
+ # that returned normally; that reintroduces the "unconfirmed success"
4973
+ # bug this comment describes (epic #2096: dismissing an escalation is
4974
+ # asserting "resolved" — only do it from an observation, not an
4975
+ # inability to look).
4976
+ #
4977
+ # #3396: drop any prior checks_stale escalation for an entry that is no
4978
+ # longer a candidate this tick — either it landed, or the base stopped
4979
+ # moving. Runs even when *candidates* is empty (that's the fully-healed
4980
+ # case). Best-effort: a read/write hiccup here must not stop the actual
4981
+ # dispatch loop below from running.
4982
+ try:
4983
+ live_keys = {(c.repo_name, c.issue_number) for c in candidates}
4984
+ for esc in list_drive_escalations():
4985
+ if esc.get("stage") != CHECKS_STALE_ALERT_STAGE:
4986
+ continue
4987
+ key = (esc.get("repo_name"), esc.get("issue_number"))
4988
+ if key not in live_keys:
4989
+ dismiss_drive_escalation(esc["repo_name"], esc["issue_number"])
4990
+ except Exception: # noqa: BLE001 — best-effort, see docstring
4991
+ pass
4992
+
4832
4993
  if not candidates:
4833
4994
  return
4834
4995
 
4835
4996
  for entry in candidates:
4836
4997
  label = f"{entry.repo_name} #{entry.issue_number} ({entry.branch})"
4837
- # #3266: no `gh run rerun` fires here any more — a same-base replay
4838
- # cannot clear a staleness reading, so this is visibility only, not
4839
- # a remedy attempt. See the docstring above and
4840
- # `coord.merge_queue.ci_stale_reason` for why.
4841
- click.echo(
4842
- f"auto-revalidate: {label} is checks_stale — a CI re-run cannot "
4843
- "clear it (same base); needs a rebase onto the target branch "
4844
- "and `git push --force-with-lease`, or a human running `coord "
4845
- "merge --only` after one"
4998
+
4999
+ if has_prior_conflict_fix(board, entry.assignment_id, current_error=entry.error):
5000
+ if _has_active_conflict_fix(board, entry.assignment_id):
5001
+ # A stale-rebase attempt is already running/pending for this
5002
+ # entry (dispatched by this same tick earlier, a live drive,
5003
+ # or the `coord notify` sweep) — nothing to do, and nothing
5004
+ # to escalate: it will resolve, or fail and escalate, on its
5005
+ # own.
5006
+ click.echo(
5007
+ f"auto-revalidate: {label} is checks_stale — a "
5008
+ "stale-rebase conflict-fix is already in flight for it"
5009
+ )
5010
+ continue
5011
+ # A prior stale-rebase (or ordinary conflict-fix) attempt for
5012
+ # this SAME error already failed — the retry cap is spent, and
5013
+ # re-diagnosing it every tick forever is exactly the #3396 bug.
5014
+ # Escalate once into the durable table instead of only echoing.
5015
+ reason = (
5016
+ f"{label} is checks_stale and a prior conflict-fix attempt "
5017
+ "already failed against this same block — a CI re-run "
5018
+ "cannot clear it (same base) and the automatic rebase "
5019
+ "already gave up; needs a human"
5020
+ )
5021
+ click.echo(f"auto-revalidate: {reason}")
5022
+ record_audit(
5023
+ tier="operational", category="merge",
5024
+ event_type="merge_checks_stale_human_required",
5025
+ actor="drive-queue-tick",
5026
+ summary=reason,
5027
+ repo=entry.repo_name, issue=entry.issue_number,
5028
+ assignment_id=entry.assignment_id,
5029
+ details={"pr_number": entry.pr_number, "error": entry.error},
5030
+ )
5031
+ _record_checks_stale_escalation(entry, reason=reason)
5032
+ continue
5033
+
5034
+ pick_out: list = []
5035
+ fix = dispatch_conflict_fix(
5036
+ entry, board, cfg, stale_rebase=True,
5037
+ status_fetcher=fetch_status, machine_pick_out=pick_out,
5038
+ )
5039
+ if fix is not None:
5040
+ click.echo(
5041
+ f"auto-revalidate: {label} is checks_stale — dispatched a "
5042
+ f"stale-rebase conflict-fix ({fix.assignment_id}) to "
5043
+ f"{fix.machine_name} (#3396: no live drive needed)"
5044
+ )
5045
+ record_audit(
5046
+ tier="business", category="merge",
5047
+ event_type="merge_checks_stale_auto_rebase_dispatched",
5048
+ actor="drive-queue-tick",
5049
+ summary=(
5050
+ f"stale-rebase conflict-fix dispatched: {label} → "
5051
+ f"{fix.machine_name}"
5052
+ ),
5053
+ repo=entry.repo_name, issue=entry.issue_number,
5054
+ assignment_id=fix.assignment_id,
5055
+ details={
5056
+ "pr_number": entry.pr_number,
5057
+ "merge_entry_id": entry.assignment_id,
5058
+ },
5059
+ )
5060
+ # #3396 review: an earlier tick may have already written a
5061
+ # `checks_stale` escalation for this SAME entry (dispatch
5062
+ # declined that time — no machine, no repo_path) before a later
5063
+ # tick found dispatch available and actually fired the worker.
5064
+ # Without this, `coord escalate list`/the TUI keep showing
5065
+ # "needs a human" for an entry that in fact now has a
5066
+ # stale-rebase worker actively running against it, until it
5067
+ # eventually drops out of `candidates` entirely. Best-effort —
5068
+ # a dismissal failure here must not undo the dispatch above.
5069
+ try:
5070
+ dismiss_drive_escalation(entry.repo_name, entry.issue_number)
5071
+ except Exception: # noqa: BLE001 — best-effort, see docstring
5072
+ pass
5073
+ continue
5074
+
5075
+ # Dispatch declined before ever starting a rebase — no capable or
5076
+ # reachable machine, no `repo_path` configured, or a flapping agent
5077
+ # (#3353). Still `checks_stale`, still gate-ready, and still nobody
5078
+ # is going to clear it on its own — surface it the same durable way
5079
+ # a genuine retry-cap exhaustion does, rather than a print-only line
5080
+ # nothing but the journal ever sees.
5081
+ decline_reason = describe_conflict_fix_decline(pick_out)
5082
+ reason = (
5083
+ f"{label} is checks_stale with a content-preserving rebase "
5084
+ f"expected to clear it, but dispatch declined: {decline_reason}"
4846
5085
  )
5086
+ click.echo(f"auto-revalidate: {reason}")
4847
5087
  record_audit(
4848
5088
  tier="operational", category="merge",
4849
5089
  event_type="merge_checks_stale_parked",
4850
5090
  actor="drive-queue-tick",
4851
5091
  summary=(
4852
5092
  f"checks_stale: {label} needs a rebase, not a CI re-run "
4853
- "(#3266) — a same-base `gh run rerun` can never clear "
4854
- "staleness"
5093
+ f"(#3266); auto-dispatch declined: {decline_reason} (#3396)"
4855
5094
  ),
4856
5095
  repo=entry.repo_name, issue=entry.issue_number,
4857
5096
  assignment_id=entry.assignment_id,
4858
- details={"pr_number": entry.pr_number},
5097
+ details={"pr_number": entry.pr_number, "decline_reason": decline_reason},
4859
5098
  )
5099
+ _record_checks_stale_escalation(entry, reason=reason)
4860
5100
 
4861
5101
 
4862
5102
  def _run_resume_probe(entry: QueueEntry) -> ProbeResult:
@@ -1049,7 +1049,16 @@ def retry_on_locked(
1049
1049
  # ("confirmed"/"unconfirmed"/"refuted"/"baseline_red") for a `test_state`
1050
1050
  # write, alongside `coord.state._record_test_verdict_local`. See
1051
1051
  # coord.models.Assignment.test_confirmation.
1052
- _DB_SCHEMA_VERSION = 18
1052
+ #
1053
+ # #3384: bumped 18 -> 19 for the new `issues.state_reason` column appended
1054
+ # to `_migrate_add_columns` below — carries GitHub's own `stateReason`
1055
+ # (`"reopened"` when a human explicitly reopened a closed issue) so
1056
+ # `coord.drive_queue.IssueFacts.reopened`/`.landed` can tell "this issue was
1057
+ # reopened for incomplete work" apart from "this issue never closed in the
1058
+ # first place" (a quadraui-style merge into a non-default branch) — both
1059
+ # read identically as `merged=True, issue_state="open"` otherwise. See
1060
+ # `coord.drive_queue.IssueFacts.landed`'s docstring.
1061
+ _DB_SCHEMA_VERSION = 19
1053
1062
 
1054
1063
 
1055
1064
  def _read_schema_version(conn: sqlite3.Connection) -> int:
@@ -2490,6 +2499,17 @@ _MIGRATE_ADD_COLUMNS: list[str] = [
2490
2499
  # See coord.models.Assignment.test_confirmation and
2491
2500
  # coord.confirm_test.TEST_CONFIRMATION_VALUES for the exhaustive set.
2492
2501
  "ALTER TABLE assignments ADD COLUMN test_confirmation TEXT",
2502
+ # #3384: GitHub's own `stateReason` for this issue — `''`/NULL for every
2503
+ # row predating this migration and for an issue that has never closed,
2504
+ # `"reopened"` (lowercased on write — see
2505
+ # `coord.state._upsert_open_issues_local`) when a human explicitly
2506
+ # reopened a previously-closed issue via `gh issue reopen`. This is the
2507
+ # ONLY witness that lets `coord.drive_queue.IssueFacts.landed` tell a
2508
+ # genuine reopen (the work is NOT done, no matter what an earlier PR
2509
+ # merge recorded) apart from a quadraui-style repo whose merged PRs never
2510
+ # auto-close the linked issue at all — both look identical as
2511
+ # `merged=True, issue_state="open"` without it.
2512
+ "ALTER TABLE issues ADD COLUMN state_reason TEXT NOT NULL DEFAULT ''",
2493
2513
  ]
2494
2514
 
2495
2515