code-coordinator 0.5.310__tar.gz → 0.5.312__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 (819) hide show
  1. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. code_coordinator-0.5.312/code_coordinator.egg-info/scm_version.json +8 -0
  4. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/lifecycle.py +13 -1
  5. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/confirm_test.py +131 -3
  6. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/drive_queue.py +100 -31
  7. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/wedged_drive_queue.py +37 -15
  8. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/housekeeping.py +26 -5
  9. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/serve_app.py +7 -2
  10. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_cap_762.py +27 -0
  11. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_drive_queue.py +43 -0
  12. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_confirm_test.py +153 -6
  13. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue.py +97 -0
  14. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_wedged_drive_queue.py +49 -0
  15. code_coordinator-0.5.310/code_coordinator.egg-info/scm_version.json +0 -8
  16. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.claude/commands/board.md +0 -0
  17. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.claude/commands/complete-session.md +0 -0
  18. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.claude/commands/coordinator.md +0 -0
  19. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.githooks/_lib.sh +0 -0
  20. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.githooks/post-checkout +0 -0
  21. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.githooks/post-commit +0 -0
  22. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.githooks/post-merge +0 -0
  23. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/coord-ci-acceptance.yml +0 -0
  25. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/workflows/auto-release.yml +0 -0
  26. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/workflows/publish.yml +0 -0
  27. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.github/workflows/test.yml +0 -0
  28. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/.gitignore +0 -0
  29. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/CLAUDE.md +0 -0
  30. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/GOAL.md +0 -0
  31. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/LICENSE +0 -0
  32. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/MANIFEST.in +0 -0
  33. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/README.md +0 -0
  34. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/SOURCES.txt +0 -0
  35. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/dependency_links.txt +0 -0
  36. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/entry_points.txt +0 -0
  37. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/requires.txt +0 -0
  38. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/scm_file_list.json +0 -0
  39. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/code_coordinator.egg-info/top_level.txt +0 -0
  40. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/__init__.py +0 -0
  41. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/_board_mapping.py +0 -0
  42. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/acceptance.py +0 -0
  43. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/acceptance_drivers.py +0 -0
  44. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agent.py +0 -0
  45. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agent_app.py +0 -0
  46. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agent_update.py +0 -0
  47. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agents/opencode/.gitignore +0 -0
  48. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agents/opencode/agents/work.md +0 -0
  49. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/agents/opencode/routing.jsonc +0 -0
  50. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/approved_work.py +0 -0
  51. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/audit.py +0 -0
  52. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/auto_loop.py +0 -0
  53. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/block_log.py +0 -0
  54. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/board_schema.py +0 -0
  55. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/board_service.py +0 -0
  56. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/board_wire.py +0 -0
  57. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/brain.py +0 -0
  58. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/branch_model.py +0 -0
  59. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/bug_intake.py +0 -0
  60. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/cargo_cache.py +0 -0
  61. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/ci_fix.py +0 -0
  62. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/ci_github.py +0 -0
  63. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/ci_gitlab.py +0 -0
  64. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/ci_store.py +0 -0
  65. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/claim.py +0 -0
  66. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/cli.py +0 -0
  67. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/client.py +0 -0
  68. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/_common.py +0 -0
  70. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/acceptance.py +0 -0
  71. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/agent_ops.py +0 -0
  72. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/audit.py +0 -0
  73. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/dispatch.py +0 -0
  75. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/dispatch_workers.py +0 -0
  76. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/drive.py +0 -0
  77. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/drive_queue.py +0 -0
  78. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/gate_a.py +0 -0
  79. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/gates.py +0 -0
  80. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/issues.py +0 -0
  81. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/machine.py +0 -0
  82. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/merge.py +0 -0
  83. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/milestone.py +0 -0
  84. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/portal.py +0 -0
  87. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/pr.py +0 -0
  88. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/release.py +0 -0
  89. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/repo.py +0 -0
  90. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/report.py +0 -0
  91. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/review.py +0 -0
  92. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/scorecard.py +0 -0
  93. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/sessions.py +0 -0
  94. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/setup.py +0 -0
  95. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/status.py +0 -0
  96. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/store_migrate.py +0 -0
  97. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/terminal.py +0 -0
  98. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/test_gate.py +0 -0
  99. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/commands/tui.py +0 -0
  100. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/comments.py +0 -0
  101. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/config.py +0 -0
  102. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/config_reload.py +0 -0
  103. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/conflict_fix.py +0 -0
  104. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dao.py +0 -0
  105. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/__init__.py +0 -0
  106. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/fixture.py +0 -0
  107. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/index.html +0 -0
  108. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/server.py +0 -0
  109. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dashboard/terminal.py +0 -0
  110. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/db.py +0 -0
  111. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dead_end.py +0 -0
  112. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/decomposition_chat.py +0 -0
  113. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/README.md +0 -0
  114. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-agent.service +0 -0
  115. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-db-backup.service +0 -0
  116. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-db-backup.sh +0 -0
  117. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-db-backup.timer +0 -0
  118. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-drive-queue.service +0 -0
  119. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-drive-queue.timer +0 -0
  120. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-failure-notify.service +0 -0
  121. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-fleet-watchdog.service +0 -0
  122. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  123. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-notify.service +0 -0
  124. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-notify.timer +0 -0
  125. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-release-propagate.service +0 -0
  126. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-release-propagate.timer +0 -0
  127. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-release-window.service +0 -0
  128. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-release-window.timer +0 -0
  129. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-serve.service +0 -0
  130. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-web-dist-build.service +0 -0
  131. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-web-dist-build.timer +0 -0
  132. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy/coord-web.service +0 -0
  133. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy_manifest.py +0 -0
  134. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deploy_units.py +0 -0
  135. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deprecation_telemetry.py +0 -0
  136. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/deps.py +0 -0
  137. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/diagnose.py +0 -0
  138. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dispatch.py +0 -0
  139. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/dist_name.py +0 -0
  140. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/drive.py +0 -0
  141. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/drive_state.py +0 -0
  142. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/events.py +0 -0
  143. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/failure_class.py +0 -0
  144. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/filelock.py +0 -0
  145. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/fleet_config_health.py +0 -0
  146. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/forge_availability.py +0 -0
  147. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/freshness.py +0 -0
  148. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/gate_a.py +0 -0
  149. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/gate_b.py +0 -0
  150. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/gate_snapshot.py +0 -0
  151. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/gates.py +0 -0
  152. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/github_ops.py +0 -0
  153. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/github_throttle.py +0 -0
  154. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/goal.py +0 -0
  155. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/graph_health.py +0 -0
  156. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/__init__.py +0 -0
  157. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/aggregate.py +0 -0
  158. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/__init__.py +0 -0
  159. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/_ci_pin.py +0 -0
  160. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/agent_install.py +0 -0
  161. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/cargo_targets.py +0 -0
  162. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/claude_binary.py +0 -0
  163. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  164. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/coord_web_ci_pin.py +0 -0
  165. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/deploy_lane_facts.py +0 -0
  166. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/disk.py +0 -0
  167. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/fleet_board.py +0 -0
  168. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  169. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/fleet_phantom.py +0 -0
  170. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/fleet_unit_drift.py +0 -0
  171. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/graph.py +0 -0
  172. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/graphify_cli.py +0 -0
  173. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/index_lock.py +0 -0
  174. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/issues_sync_staleness.py +0 -0
  175. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/plan_usage.py +0 -0
  176. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/release_cordon.py +0 -0
  177. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/repo_state.py +0 -0
  178. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/spawned_coord.py +0 -0
  179. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/stalled_pipeline.py +0 -0
  180. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/timer_active.py +0 -0
  181. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/toolchain.py +0 -0
  182. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/unit_drift.py +0 -0
  183. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/unit_enablement.py +0 -0
  184. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/checks/worktrees.py +0 -0
  185. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/cli.py +0 -0
  186. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/context.py +0 -0
  187. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/fleet_snapshot.py +0 -0
  188. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/models.py +0 -0
  189. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/pypi.py +0 -0
  190. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/registry.py +0 -0
  191. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/render.py +0 -0
  192. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/health/units.py +0 -0
  193. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/hooks.py +0 -0
  194. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/interactive.py +0 -0
  195. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/issue_store.py +0 -0
  196. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/issues_sync_status.py +0 -0
  197. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/liveness_auditor.py +0 -0
  198. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/machine_onboard.py +0 -0
  199. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/machine_pause.py +0 -0
  200. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/merge_queue.py +0 -0
  201. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/milestone_chat.py +0 -0
  202. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/milestone_dispatch.py +0 -0
  203. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/milestone_gate.py +0 -0
  204. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/milestone_order.py +0 -0
  205. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/mock_author.py +0 -0
  206. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/models.py +0 -0
  207. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/network.py +0 -0
  208. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/new_issue_chat.py +0 -0
  209. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/__init__.py +0 -0
  210. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/baseline.py +0 -0
  211. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/cli.py +0 -0
  212. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/collect.py +0 -0
  213. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/digest.py +0 -0
  214. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/models.py +0 -0
  215. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/predicate.py +0 -0
  216. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/service.py +0 -0
  217. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/store.py +0 -0
  218. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notifier/transport.py +0 -0
  219. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/notify.py +0 -0
  220. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/openapi.py +0 -0
  221. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/overlap_fence.py +0 -0
  222. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/overlap_predict.py +0 -0
  223. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/parentage.py +0 -0
  224. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/parentage_github.py +0 -0
  225. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/pipeline.py +0 -0
  226. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/plan_parser.py +0 -0
  227. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/plans.py +0 -0
  228. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/platform_paths.py +0 -0
  229. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/portal_bridge.py +0 -0
  230. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/portal_store.py +0 -0
  231. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/portal_sync.py +0 -0
  232. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/pr_body_lint.py +0 -0
  233. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/prereqs.py +0 -0
  234. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/progress.py +0 -0
  235. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/__init__.py +0 -0
  236. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/base.py +0 -0
  237. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/claude.py +0 -0
  238. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/claude_pty.py +0 -0
  239. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/providers/opencode.py +0 -0
  240. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/queue_diagnose.py +0 -0
  241. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/reconcile.py +0 -0
  242. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/reconcile_tick.py +0 -0
  243. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/refine_chat.py +0 -0
  244. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/release_cordon.py +0 -0
  245. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/release_propagate.py +0 -0
  246. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/release_verify.py +0 -0
  247. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/release_window.py +0 -0
  248. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/repo_edit.py +0 -0
  249. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/repo_onboard.py +0 -0
  250. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/reports.py +0 -0
  251. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/rest_schema.py +0 -0
  252. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/revalidate.py +0 -0
  253. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/review.py +0 -0
  254. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/scorecard.py +0 -0
  255. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/self_health.py +0 -0
  256. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  257. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  258. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  259. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  261. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/portal-followup/SKILL.md +0 -0
  262. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/release-now/SKILL.md +0 -0
  263. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  264. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  265. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/skills/update-issue/SKILL.md +0 -0
  266. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/smoke.py +0 -0
  267. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/spend_ceiling.py +0 -0
  268. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/split_work.py +0 -0
  269. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/sql.py +0 -0
  270. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/stage_projection.py +0 -0
  271. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/state.py +0 -0
  272. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/store_migrate.py +0 -0
  273. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/test_author.py +0 -0
  274. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/test_chat.py +0 -0
  275. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/test_orchestrator.py +0 -0
  276. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/test_report.py +0 -0
  277. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/tui_release.py +0 -0
  278. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/usage.py +0 -0
  279. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/usage_limits.py +0 -0
  280. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/usage_rollup.py +0 -0
  281. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coord/worker_events.py +0 -0
  282. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/coordinator.example.yml +0 -0
  283. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-agent.service +0 -0
  284. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-db-backup.service +0 -0
  285. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-db-backup.sh +0 -0
  286. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-db-backup.timer +0 -0
  287. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-drive-queue.service +0 -0
  288. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-drive-queue.timer +0 -0
  289. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-failure-notify.service +0 -0
  290. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-failure-notify.sh +0 -0
  291. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-fleet-watchdog.service +0 -0
  292. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-fleet-watchdog.timer +0 -0
  293. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-notify.service +0 -0
  294. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-notify.timer +0 -0
  295. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-release-propagate.service +0 -0
  296. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-release-propagate.timer +0 -0
  297. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-release-window.service +0 -0
  298. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-release-window.timer +0 -0
  299. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-serve.service +0 -0
  300. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web-dist-build.service +0 -0
  301. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web-dist-build.sh +0 -0
  302. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web-dist-build.timer +0 -0
  303. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web-rollback.sh +0 -0
  304. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/coord-web.service +0 -0
  305. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/deploy/node-shim.sh +0 -0
  306. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_COORD_TUI_CI.md +0 -0
  307. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  308. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_COORD_WEB_CI.md +0 -0
  309. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_COORD_WEB_DIST.md +0 -0
  310. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  311. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/AGENT_OPERATIONS.md +0 -0
  312. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ARCHITECTURE.md +0 -0
  313. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ARCH_SECURITY_GATES.md +0 -0
  314. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/COCKPIT.md +0 -0
  315. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/CONTROL_CENTER.md +0 -0
  316. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/COST_DISCIPLINE.md +0 -0
  317. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/CROSS_PLATFORM.md +0 -0
  318. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/CUSTOMER_FACING_APPS.md +0 -0
  319. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/CUSTOMER_PORTAL.md +0 -0
  320. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/DRIVE_QUEUE.md +0 -0
  321. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/EPHEMERAL_WORKERS.md +0 -0
  322. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/FORGE_MIGRATION.md +0 -0
  323. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/GRAPHIFY_SETUP.md +0 -0
  324. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ISSUE_GUIDANCE.md +0 -0
  325. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/MAC_MINI.md +0 -0
  326. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  327. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/NOTIFIER.md +0 -0
  328. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/OPENCODE_VERIFICATION.md +0 -0
  329. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/OPERATING_GOTCHAS.md +0 -0
  330. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/OPERATOR_GUIDES.md +0 -0
  331. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/ORACLE_LOOP.md +0 -0
  332. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/PHONE_WEBAPP.md +0 -0
  333. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/PIPELINE_V2.md +0 -0
  334. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/PLATFORM_EVOLUTION.md +0 -0
  335. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/SECOND_BACKEND.md +0 -0
  336. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/STORE_SERVICE.md +0 -0
  337. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  338. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/WEB_CONTROL_CENTER.md +0 -0
  339. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/WSL_WINDOWS_WORKER.md +0 -0
  340. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/README.md +0 -0
  341. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/_tokens.css +0 -0
  342. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/issue-detail.html +0 -0
  343. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/pipeline-narrow.html +0 -0
  344. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/docs/mocks/web/pipeline-wide.html +0 -0
  345. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/graphify-out/.gitignore +0 -0
  346. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/install-agent.sh +0 -0
  347. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/pyproject.toml +0 -0
  348. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/audit_review_verdict_overrides.py +0 -0
  349. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  350. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/build-worker-image.sh +0 -0
  351. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/coordinator-machine.py +0 -0
  352. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/epic-down.sh +0 -0
  353. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/epic-up.sh +0 -0
  354. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/preflight.sh +0 -0
  355. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/provision-worker.sh +0 -0
  356. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  357. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  358. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/azure-workers/verify-github-token.sh +0 -0
  359. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/check_gh_argv_containment.py +0 -0
  360. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/codegen.py +0 -0
  361. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-test-runner.sh +0 -0
  362. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  363. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  364. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  365. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  366. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/coord-venv-rollback.sh +0 -0
  367. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/drive-batch.sh +0 -0
  368. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/extract-coord-tui.sh +0 -0
  369. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/fleet_watchdog.py +0 -0
  370. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/gen_board_fixture.py +0 -0
  371. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/gen_mock_index.py +0 -0
  372. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/next_release_tag.py +0 -0
  373. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/run_tests_in_populated_home.sh +0 -0
  374. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/run_tests_without_gh.sh +0 -0
  375. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/smoke_437_interactive.py +0 -0
  376. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/verify_878_review_capture.py +0 -0
  377. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/verify_release_published.py +0 -0
  378. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/scripts/verify_release_wheel.py +0 -0
  379. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/setup.cfg +0 -0
  380. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/SMOKE_SET.md +0 -0
  381. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/__init__.py +0 -0
  382. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/conftest.py +0 -0
  383. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/contract.md +0 -0
  384. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/manifest.yml +0 -0
  385. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  386. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  387. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/contract.md +0 -0
  388. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  389. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  390. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/manifest.yml +0 -0
  391. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  392. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-51/tsconfig.json +0 -0
  393. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  394. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/backends.py +0 -0
  395. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/conftest.py +0 -0
  396. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/board-pipeline-basic.json +0 -0
  397. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  398. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  399. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  400. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  401. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/all_pass.json +0 -0
  402. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  403. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/mixed_fail.json +0 -0
  404. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  405. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  406. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/skip.json +0 -0
  407. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/playwright/truncated.json +0 -0
  408. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  409. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  410. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  411. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  412. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  413. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  414. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  415. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  416. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_acceptance.py +0 -0
  417. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_acceptance_drivers.py +0 -0
  418. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent.py +0 -0
  419. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_api_error.py +0 -0
  420. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_app.py +0 -0
  421. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_branch_base.py +0 -0
  422. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_branch_capture.py +0 -0
  423. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_config_free_1712.py +0 -0
  424. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_deploy_units_endpoint.py +0 -0
  425. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_dirty_worktree.py +0 -0
  426. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  427. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_graph_self_heal.py +0 -0
  428. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_health_h3.py +0 -0
  429. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_idle_restart.py +0 -0
  430. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_push_failure.py +0 -0
  431. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_reap.py +0 -0
  432. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_repos_and_pull.py +0 -0
  433. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_restart_services_endpoint.py +0 -0
  434. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_skills_self_heal.py +0 -0
  435. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_startup_diagnostics.py +0 -0
  436. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_update.py +0 -0
  437. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_update_bluegreen.py +0 -0
  438. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_usage_limit.py +0 -0
  439. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_agent_zero_commit.py +0 -0
  440. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ambient_home_isolation.py +0 -0
  441. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_approve_dependency_busy_2804.py +0 -0
  442. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_approve_reject_plan.py +0 -0
  443. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_approve_usage_gate.py +0 -0
  444. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_approved_work_2532.py +0 -0
  445. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_assignment_already_recorded_daemon.py +0 -0
  446. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_audit_log.py +0 -0
  447. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_audit_outcome.py +0 -0
  448. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_audit_query.py +0 -0
  449. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_auto_loop.py +0 -0
  450. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_auto_release_publish_2035.py +0 -0
  451. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_backend_selection.py +0 -0
  452. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_base_checkout_restore.py +0 -0
  453. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_block_log.py +0 -0
  454. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_fixture.py +0 -0
  455. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_read_path.py +0 -0
  456. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_schema.py +0 -0
  457. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_service.py +0 -0
  458. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_state.py +0 -0
  459. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_board_wire.py +0 -0
  460. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_brain.py +0 -0
  461. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_branch_model.py +0 -0
  462. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_bug_intake.py +0 -0
  463. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_build_worker_image_env_update.py +0 -0
  464. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cargo_cache.py +0 -0
  465. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_check_gh_argv_containment.py +0 -0
  466. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_acceptance_gate_1950.py +0 -0
  467. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_fix.py +0 -0
  468. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_gitlab.py +0 -0
  469. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_parity_2091.py +0 -0
  470. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_ci_store.py +0 -0
  471. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_claim.py +0 -0
  472. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_claude_md_budget.py +0 -0
  473. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_acceptance.py +0 -0
  474. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign.py +0 -0
  475. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  476. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign_interactive_remote.py +0 -0
  477. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign_provider.py +0 -0
  478. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  479. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_audit.py +0 -0
  480. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_chat_continue.py +0 -0
  481. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_decide.py +0 -0
  482. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_capability_rules.py +0 -0
  483. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_config_provenance.py +0 -0
  484. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_forge_availability.py +0 -0
  485. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_graph.py +0 -0
  486. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_self.py +0 -0
  487. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_diagnose_test_coverage.py +0 -0
  488. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_doctor.py +0 -0
  489. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_doctor_config_free_1801.py +0 -0
  490. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  491. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_drive.py +0 -0
  492. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_escalate.py +0 -0
  493. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_fix_headless_review.py +0 -0
  494. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_gate_a.py +0 -0
  495. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_install_drift.py +0 -0
  496. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_install_skills.py +0 -0
  497. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_issue_comment.py +0 -0
  498. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_issue_create_label.py +0 -0
  499. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_issue_reopen.py +0 -0
  500. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_issue_view_list.py +0 -0
  501. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_merge.py +0 -0
  502. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_assign.py +0 -0
  503. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_capture.py +0 -0
  504. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_chat_add_child.py +0 -0
  505. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_dispatch.py +0 -0
  506. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_gate_b.py +0 -0
  507. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_gate_c.py +0 -0
  508. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_order.py +0 -0
  509. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  510. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_milestone_ship.py +0 -0
  511. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_network.py +0 -0
  512. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_new_issue_chat.py +0 -0
  513. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_plans.py +0 -0
  514. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_portal.py +0 -0
  515. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_pr.py +0 -0
  516. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_pull_artifact.py +0 -0
  517. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_queue.py +0 -0
  518. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_reattach_sessions.py +0 -0
  519. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_refine_board.py +0 -0
  520. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_release_preflight.py +0 -0
  521. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_release_propagate.py +0 -0
  522. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_release_window.py +0 -0
  523. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_repo_2220.py +0 -0
  524. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  525. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_scorecard.py +0 -0
  526. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_set_review_findings.py +0 -0
  527. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_advisory_terminal.py +0 -0
  528. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_contested_tag.py +0 -0
  529. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_merge_queue.py +0 -0
  530. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_provider.py +0 -0
  531. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_review_finalizing.py +0 -0
  532. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_test_failed_tag.py +0 -0
  533. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_status_usage_limit.py +0 -0
  534. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_sync_comments_873.py +0 -0
  535. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_test_plan.py +0 -0
  536. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_track.py +0 -0
  537. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_tui_update.py +0 -0
  538. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cli_wait.py +0 -0
  539. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_client_base_install.py +0 -0
  540. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_client_resource_migration_1946.py +0 -0
  541. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_commands_common.py +0 -0
  542. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_comments.py +0 -0
  543. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_completion_summary.py +0 -0
  544. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config.py +0 -0
  545. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_acceptance.py +0 -0
  546. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_audit.py +0 -0
  547. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_pricing.py +0 -0
  548. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  549. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_config_usage_gate.py +0 -0
  550. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_conflict_fix.py +0 -0
  551. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_conflict_fix_semantic.py +0 -0
  552. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  553. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test.py +0 -0
  554. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  555. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_baseline.py +0 -0
  556. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_populated_home.py +0 -0
  557. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_routing.py +0 -0
  558. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_test_runner_toolchain.py +0 -0
  559. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_uat.py +0 -0
  560. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coord_web_sse_restart_live.py +0 -0
  561. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_coordinator_machine.py +0 -0
  562. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_cross_platform_imports.py +0 -0
  563. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dao.py +0 -0
  564. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dashboard.py +0 -0
  565. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dashboard_fixture.py +0 -0
  566. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dashboard_terminal.py +0 -0
  567. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dashboard_terminal_live.py +0 -0
  568. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_db.py +0 -0
  569. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dead_end.py +0 -0
  570. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_decomposition_chat.py +0 -0
  571. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_coord_db_backup.py +0 -0
  572. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_coord_web_dist.py +0 -0
  573. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_coord_web_rollback.py +0 -0
  574. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_drive_queue_unit.py +0 -0
  575. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_failure_notify_unit.py +0 -0
  576. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_manifest.py +0 -0
  577. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_notify_unit.py +0 -0
  578. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_units_lane.py +0 -0
  579. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deploy_web_unit.py +0 -0
  580. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deprecation_telemetry.py +0 -0
  581. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_deps.py +0 -0
  582. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_diagnose.py +0 -0
  583. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dispatch.py +0 -0
  584. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dispatch_target_validation.py +0 -0
  585. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_dist_name.py +0 -0
  586. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_done_housekeeping.py +0 -0
  587. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive.py +0 -0
  588. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_blocked_rendering.py +0 -0
  589. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_launch_argv.py +0 -0
  590. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  591. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_roll_pending.py +0 -0
  592. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  593. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_state.py +0 -0
  594. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_drive_tmux.py +0 -0
  595. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_epic_up_capability_detection.py +0 -0
  596. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  597. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_epic_up_image_provenance.py +0 -0
  598. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_errors.py +0 -0
  599. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_events.py +0 -0
  600. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_failure_class.py +0 -0
  601. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_filelock.py +0 -0
  602. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  603. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fix_of_force_override.py +0 -0
  604. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fleet_config_health.py +0 -0
  605. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fleet_health_probes.py +0 -0
  606. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fleet_health_snapshot.py +0 -0
  607. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_fleet_watchdog.py +0 -0
  608. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_forge_availability.py +0 -0
  609. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_freshness.py +0 -0
  610. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gate_a.py +0 -0
  611. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gate_b.py +0 -0
  612. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gate_snapshot_staleness.py +0 -0
  613. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gates.py +0 -0
  614. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  615. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_gen_mock_index.py +0 -0
  616. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_generated_rust_fixture.py +0 -0
  617. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_generated_rust_requests.py +0 -0
  618. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_generated_types_fixture.py +0 -0
  619. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_github_ops.py +0 -0
  620. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_github_throttle.py +0 -0
  621. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_goal.py +0 -0
  622. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_graph_health.py +0 -0
  623. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_graph_selfheal_absent_2237.py +0 -0
  624. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_handoff.py +0 -0
  625. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_checks.py +0 -0
  626. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_cli.py +0 -0
  627. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_cli_graph.py +0 -0
  628. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_config.py +0 -0
  629. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_context.py +0 -0
  630. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_coord_tui_ci_pin.py +0 -0
  631. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_coord_web_ci_pin.py +0 -0
  632. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_deploy_lane_facts.py +0 -0
  633. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_fix.py +0 -0
  634. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_incident_regression.py +0 -0
  635. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_issues_sync_staleness.py +0 -0
  636. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_pypi.py +0 -0
  637. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_registry.py +0 -0
  638. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_release_cordon_probe.py +0 -0
  639. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_timer_active.py +0 -0
  640. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_toolchain.py +0 -0
  641. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_unit_drift.py +0 -0
  642. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_health_unit_enablement.py +0 -0
  643. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_hooks.py +0 -0
  644. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_human_attended_437.py +0 -0
  645. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_init.py +0 -0
  646. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_install_agent_venv_2911.py +0 -0
  647. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_integration.py +0 -0
  648. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_briefing_echo.py +0 -0
  649. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_pane_log_2541.py +0 -0
  650. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_prefill_state.py +0 -0
  651. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_session_relaunch.py +0 -0
  652. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_test_verdict_backstop.py +0 -0
  653. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_token_attribution.py +0 -0
  654. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_interactive_worktree.py +0 -0
  655. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_issue_store_seam.py +0 -0
  656. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_issues_sync_status.py +0 -0
  657. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_liveness_auditor.py +0 -0
  658. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_liveness_notify.py +0 -0
  659. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_lock_contention_ratchet.py +0 -0
  660. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_machine_onboard.py +0 -0
  661. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_machine_pause.py +0 -0
  662. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_merge_queue.py +0 -0
  663. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_merge_verify.py +0 -0
  664. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_chat.py +0 -0
  665. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_dispatch.py +0 -0
  666. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_gate.py +0 -0
  667. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_order.py +0 -0
  668. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_milestone_seam.py +0 -0
  669. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_mock_author.py +0 -0
  670. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_model_tiering.py +0 -0
  671. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_models.py +0 -0
  672. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_models_config_labels.py +0 -0
  673. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_needs_attention.py +0 -0
  674. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_network.py +0 -0
  675. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_new_issue_chat.py +0 -0
  676. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_next_release_tag.py +0 -0
  677. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_node_shim.py +0 -0
  678. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_baseline.py +0 -0
  679. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_cli.py +0 -0
  680. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_collect.py +0 -0
  681. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_config.py +0 -0
  682. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_drive_seam.py +0 -0
  683. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_isolation.py +0 -0
  684. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_predicate.py +0 -0
  685. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_quiet_hours.py +0 -0
  686. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notifier_service.py +0 -0
  687. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notify.py +0 -0
  688. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_notify_drain.py +0 -0
  689. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_openapi.py +0 -0
  690. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_operational_defaults.py +0 -0
  691. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_overlap_fence.py +0 -0
  692. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_overlap_predict.py +0 -0
  693. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_packaged_deploy_units.py +0 -0
  694. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_parentage.py +0 -0
  695. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_paste_landed.py +0 -0
  696. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  697. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_pipeline.py +0 -0
  698. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_followup_approve_plan_command.py +0 -0
  699. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_followup_pr_command.py +0 -0
  700. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_followup_review_command.py +0 -0
  701. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_only.py +0 -0
  702. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_plan_parser.py +0 -0
  703. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_platform_paths.py +0 -0
  704. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_portal_bridge.py +0 -0
  705. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_portal_config.py +0 -0
  706. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_portal_store.py +0 -0
  707. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_portal_sync.py +0 -0
  708. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_pr_body_lint.py +0 -0
  709. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_prereqs.py +0 -0
  710. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_production_db_guard.py +0 -0
  711. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_progress.py +0 -0
  712. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_provider_seam.py +0 -0
  713. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_providers.py +0 -0
  714. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_providers_config_labels.py +0 -0
  715. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_providers_pty.py +0 -0
  716. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_py_rust_mirror_inventory.py +0 -0
  717. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_quiet_hours.py +0 -0
  718. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_quiet_hours_store_2146.py +0 -0
  719. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reap_merged_sessions.py +0 -0
  720. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reap_stale_interactive_tick.py +0 -0
  721. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile.py +0 -0
  722. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_branch.py +0 -0
  723. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_completions.py +0 -0
  724. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  725. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_merges.py +0 -0
  726. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_no_agent_record.py +0 -0
  727. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_tick.py +0 -0
  728. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reconcile_usage_limit_done.py +0 -0
  729. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_refine_chat.py +0 -0
  730. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_cordon_2101.py +0 -0
  731. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  732. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_cordon_deadlock_2240.py +0 -0
  733. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_cordon_stuck_2490.py +0 -0
  734. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_propagate.py +0 -0
  735. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_propagate_threshold.py +0 -0
  736. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_roll_between_legs_2854.py +0 -0
  737. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_roll_window_handoff.py +0 -0
  738. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_unified_1242.py +0 -0
  739. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_verify.py +0 -0
  740. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_release_window.py +0 -0
  741. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_remote_auto_prune.py +0 -0
  742. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_remote_interactive_reaper.py +0 -0
  743. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_repo_add.py +0 -0
  744. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_repo_edit_2220.py +0 -0
  745. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_repo_graph_fleet_2237.py +0 -0
  746. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_repo_onboard_2220.py +0 -0
  747. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_report_result_push.py +0 -0
  748. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_reports.py +0 -0
  749. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_retry.py +0 -0
  750. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_retry_advisory_1606.py +0 -0
  751. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_retry_type_1636.py +0 -0
  752. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_revalidate.py +0 -0
  753. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review.py +0 -0
  754. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_end_review_without_verdict.py +0 -0
  755. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_parse_failure_diagnostic.py +0 -0
  756. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_reaffirm.py +0 -0
  757. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_state.py +0 -0
  758. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_verdict_backstop.py +0 -0
  759. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_verdict_override_audit.py +0 -0
  760. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_verdict_relay.py +0 -0
  761. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_review_zero_commits.py +0 -0
  762. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_scoped_review_wiring.py +0 -0
  763. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_scorecard.py +0 -0
  764. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_self_health.py +0 -0
  765. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_serve.py +0 -0
  766. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_serve_app_board_trim.py +0 -0
  767. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_serve_rest_routes.py +0 -0
  768. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_session.py +0 -0
  769. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_slice_issue_attribution.py +0 -0
  770. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_smoke.py +0 -0
  771. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_smoke_live_checkout_restore.py +0 -0
  772. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_smoke_workflow.py +0 -0
  773. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_spend_ceiling.py +0 -0
  774. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_spend_ceiling_coordinator.py +0 -0
  775. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_split.py +0 -0
  776. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_split_work.py +0 -0
  777. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_sql_dialect.py +0 -0
  778. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_sqlite_connect_ratchet.py +0 -0
  779. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stage_projection.py +0 -0
  780. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stale_busy_reviewer_697.py +0 -0
  781. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stalled_pipeline.py +0 -0
  782. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_state.py +0 -0
  783. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_state_review_findings_daemon.py +0 -0
  784. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_status_fleet_footer.py +0 -0
  785. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stop_1567.py +0 -0
  786. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_store_contract.py +0 -0
  787. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_store_migrate.py +0 -0
  788. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stuck.py +0 -0
  789. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  790. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_terminal_command.py +0 -0
  791. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_author.py +0 -0
  792. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_chat.py +0 -0
  793. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_orchestrator.py +0 -0
  794. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_report.py +0 -0
  795. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_verdict_parsing.py +0 -0
  796. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_test_verdict_transcript_floor.py +0 -0
  797. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_text_io_encoding_audit.py +0 -0
  798. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_thin_client_board_audit.py +0 -0
  799. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_thin_client_config_load_1080.py +0 -0
  800. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_thin_client_daemon_routing_906.py +0 -0
  801. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_tmux_host.py +0 -0
  802. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_tmux_session.py +0 -0
  803. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_transcript_floor.py +0 -0
  804. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_usage.py +0 -0
  805. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_usage_limits.py +0 -0
  806. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_usage_rollup.py +0 -0
  807. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_venv_live_install_2121.py +0 -0
  808. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_version_single_source.py +0 -0
  809. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_watch.py +0 -0
  810. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  811. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_env_venv_isolation.py +0 -0
  812. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_events.py +0 -0
  813. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_image_pin_sync.py +0 -0
  814. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_safety.py +0 -0
  815. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worker_test_scoping.py +0 -0
  816. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worktree.py +0 -0
  817. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  818. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/test_write_parity.py +0 -0
  819. {code_coordinator-0.5.310 → code_coordinator-0.5.312}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.310
3
+ Version: 0.5.312
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.310
3
+ Version: 0.5.312
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.312",
3
+ "distance": 0,
4
+ "node": "g809179d4ae62704f319b523abbe2d69427d5a406",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-31"
8
+ }
@@ -24,7 +24,13 @@ def _print_housekeeping_result(resp: dict) -> None:
24
24
  archived_a = resp.get("archived_assignments", 0)
25
25
  archived_n = resp.get("archived_notifications", 0)
26
26
  days = resp.get("retention_days")
27
- if not archived_a and not archived_n:
27
+ # #2974: the confirm-worktree sweep runs on its own age window,
28
+ # independent of `retention_days` above, and must be reported even when
29
+ # there was nothing terminal to archive — that used to be the ONLY thing
30
+ # this sweep did, so a run that only reclaimed leaked worktrees must not
31
+ # print "nothing to archive" and hide it.
32
+ removed_wt = resp.get("removed_confirm_worktrees", 0)
33
+ if not archived_a and not archived_n and not removed_wt:
28
34
  click.echo(
29
35
  f"housekeeping: nothing to archive (no terminal rows older than {days}d)."
30
36
  )
@@ -35,6 +41,12 @@ def _print_housekeeping_result(resp: dict) -> None:
35
41
  f"housekeeping: {verb} {archived_a} assignment(s) + "
36
42
  f"{archived_n} notification(s) (terminal, older than {days}d).{suffix}"
37
43
  )
44
+ if removed_wt:
45
+ wt_verb = "would remove" if dry else "removed"
46
+ click.echo(
47
+ f"housekeeping: {wt_verb} {removed_wt} stale confirm-worktree(s) "
48
+ "(#2974)."
49
+ )
38
50
 
39
51
 
40
52
  @click.command(
@@ -104,6 +104,7 @@ existed.
104
104
  from __future__ import annotations
105
105
 
106
106
  import os
107
+ import shutil
107
108
  import subprocess
108
109
  import threading
109
110
  import time
@@ -484,6 +485,106 @@ def confirm_lock_path(repo_name: str, branch: str) -> Path:
484
485
  return COORD_DIR / "confirm-worktrees" / f"{safe}.lock"
485
486
 
486
487
 
488
+ #: #2974: default age (hours) a directory under ``confirm-worktrees/`` may sit
489
+ #: unremoved before :func:`sweep_stale_confirm_worktrees` reclaims it outright.
490
+ #: Every entry under that root is throwaway by construction (#561) and
491
+ #: `confirm_branch`'s own `finally` now removes its worktree on every exit —
492
+ #: so anything still here this long survived something worse than an ordinary
493
+ #: failure (a hard kill of the whole process, `coord-agent`/`coord-serve`
494
+ #: restarting mid-run before #2974's `finally` fix ever ran, a full disk
495
+ #: mid-cleanup). Generous relative to :data:`CONFIRM_DEFAULT_TIMEOUT_SECONDS`
496
+ #: (20 min) so this never races a confirmation that is still legitimately
497
+ #: in flight.
498
+ #:
499
+ #: Footgun to remember if either ceiling ever moves: the margin here is
500
+ #: relative, not enforced. `sweep_stale_confirm_worktrees` doesn't know
501
+ #: whether a given `confirm-worktrees/<repo>-<branch>` entry has a
502
+ #: `confirm_branch` call still running against it — it reclaims purely on
503
+ #: directory mtime. If `CONFIRM_DEFAULT_TIMEOUT_SECONDS` (or a future
504
+ #: per-repo override of it) is ever raised to within a few hours of this
505
+ #: constant, a still-in-flight confirmation's worktree (and its `.lock`
506
+ #: file) could be `rmtree`'d out from under it by this sweep. Keep this
507
+ #: comfortably above whatever the longest configured confirmation timeout
508
+ #: is, not just the current default.
509
+ STALE_WORKTREE_MAX_AGE_HOURS = 6.0
510
+
511
+
512
+ def sweep_stale_confirm_worktrees(
513
+ *,
514
+ max_age_hours: float = STALE_WORKTREE_MAX_AGE_HOURS,
515
+ dry_run: bool = False,
516
+ now: float | None = None,
517
+ ) -> dict:
518
+ """Reclaim ``confirm-worktrees/`` entries older than *max_age_hours* (#2974).
519
+
520
+ Belt-and-suspenders over the `finally`-based cleanup in
521
+ :func:`confirm_branch`: that fix stops the leak going forward, but does
522
+ nothing about the hundreds of directories (189G measured on one host,
523
+ #2974) a build that never reaches this fix — or any future bug in the
524
+ cleanup path itself — can still leave behind. This sweep is the backstop
525
+ that ages them out regardless of cause.
526
+
527
+ Deliberately filesystem-only: it reclaims disk with a plain
528
+ ``shutil.rmtree`` keyed on directory mtime, and does **not** attempt a
529
+ ``git worktree prune`` in the originating repo's checkout (that would
530
+ need to map each ``<repo>-<branch>`` directory name back to a configured
531
+ repo, which is ambiguous when a repo or branch name itself contains a
532
+ ``-``). The admin metadata that leaves behind in the base checkout's
533
+ ``.git/worktrees/`` is a few KB per entry — negligible next to the build
534
+ trees this reclaims — and self-heals the next time :func:`confirm_branch`
535
+ or :func:`coord.revalidate.revalidate` runs `git worktree prune` for that
536
+ repo anyway.
537
+
538
+ Called from :func:`coord.housekeeping.sweep`'s existing low-cadence
539
+ daemon tick and ``coord housekeeping``, so it needs no new wiring or
540
+ schedule of its own. Returns
541
+ ``{"removed": [names], "dry_run": bool, "max_age_hours": float}`` —
542
+ ``removed`` lists what was (or, for ``dry_run``, would be) deleted.
543
+ Silently a no-op if the directory does not exist yet.
544
+ """
545
+ from coord.state import COORD_DIR # noqa: PLC0415
546
+
547
+ root = COORD_DIR / "confirm-worktrees"
548
+ result: dict = {
549
+ "removed": [],
550
+ "dry_run": dry_run,
551
+ "max_age_hours": max_age_hours,
552
+ }
553
+ if not root.exists():
554
+ return result
555
+
556
+ cutoff = (now if now is not None else time.time()) - max_age_hours * 3600.0
557
+ try:
558
+ entries = sorted(root.iterdir())
559
+ except OSError:
560
+ return result
561
+
562
+ for entry in entries:
563
+ # Lock files (`confirm_lock_path`) are tiny and self-explanatory by
564
+ # name; only the worktree directories themselves are the disk cost
565
+ # this sweep exists to reclaim. A stray lock with no matching
566
+ # worktree directory is harmless — the next `confirm_branch` call for
567
+ # that (repo, branch) simply re-creates and re-locks it.
568
+ if entry.name.endswith(".lock") or not entry.is_dir():
569
+ continue
570
+ try:
571
+ mtime = entry.stat().st_mtime
572
+ except OSError:
573
+ continue
574
+ if mtime >= cutoff:
575
+ continue
576
+ result["removed"].append(entry.name)
577
+ if dry_run:
578
+ continue
579
+ shutil.rmtree(entry, ignore_errors=True)
580
+ lock_path = root / f"{entry.name}.lock"
581
+ try:
582
+ lock_path.unlink(missing_ok=True)
583
+ except OSError:
584
+ pass
585
+ return result
586
+
587
+
487
588
  def branch_touched_files(repo_dir: Path, branch: str, base_branch: str) -> list[str]:
488
589
  """Paths the branch changes vs its merge-base with *base_branch*.
489
590
 
@@ -915,9 +1016,9 @@ def confirm_branch(
915
1016
  test_command,
916
1017
  )
917
1018
 
918
- # Green, and observed rather than reported. Clean up: nothing to
919
- # inspect.
920
- _remove_worktree(repo_dir, wt_path)
1019
+ # Green, and observed rather than reported. Nothing to inspect —
1020
+ # cleanup happens in `finally` below, same as every other exit from
1021
+ # this block.
921
1022
  return ConfirmationResult(
922
1023
  kind=KIND_OK,
923
1024
  reason=(
@@ -928,6 +1029,31 @@ def confirm_branch(
928
1029
  returncode=0,
929
1030
  )
930
1031
  finally:
1032
+ # #2974: EVERY exit from the block above — including KIND_TIMEOUT
1033
+ # (a hung/slow suite), KIND_SIGNAL (a coord-agent/coord-serve restart
1034
+ # landing mid-run, #2527), and a genuine refutation (KIND_BUILD/
1035
+ # KIND_SUITE) — must remove this worktree, not just the green path.
1036
+ #
1037
+ # `coord.revalidate`'s sibling helper deliberately KEEPS a failed
1038
+ # worktree "for inspection" (see its `_remove_worktree` docstring and
1039
+ # `format_failure`'s "worktree kept for inspection" line) because
1040
+ # `coord merge --revalidate` is opt-in, operator-initiated, and rare —
1041
+ # a human is watching and can go look at the tree it names.
1042
+ # `confirm_branch` is the opposite shape: it runs unattended, on every
1043
+ # PASS claim, inside the automatic reap path, keyed by (repo, branch)
1044
+ # — and a branch is rarely revisited, so nothing was ever going to
1045
+ # remove a "kept for inspection" tree here. That is exactly how this
1046
+ # leaked to 189G / 346 dirs on one host in nine days (#2974): the
1047
+ # biggest trees came from the slowest repos, i.e. precisely the
1048
+ # KIND_TIMEOUT/KIND_SIGNAL runs that used to fall through this
1049
+ # `finally` without cleanup.
1050
+ #
1051
+ # Nothing of diagnostic value is lost: the captured output tail
1052
+ # (`ConfirmationResult.output`) is already persisted to
1053
+ # `test_output/<assignment_id>.txt` by `write_confirmation_output`
1054
+ # regardless of outcome — the worktree itself was never the thing an
1055
+ # operator actually inspected.
1056
+ _remove_worktree(repo_dir, wt_path)
931
1057
  lock.release()
932
1058
 
933
1059
 
@@ -942,6 +1068,7 @@ __all__ = [
942
1068
  "NOTIFY_BASE_CLIENT_TIMEOUT_SECONDS",
943
1069
  "PERMISSION_DENIED_EXIT",
944
1070
  "REFUTING_KINDS",
1071
+ "STALE_WORKTREE_MAX_AGE_HOURS",
945
1072
  "ConfirmationResult",
946
1073
  "begin_confirmation_pass",
947
1074
  "branch_touched_files",
@@ -952,6 +1079,7 @@ __all__ = [
952
1079
  "confirmation_timeout",
953
1080
  "notify_client_timeout_seconds",
954
1081
  "spend_confirmation_budget",
1082
+ "sweep_stale_confirm_worktrees",
955
1083
  "unmet_confirmation_capabilities",
956
1084
  "write_confirmation_output",
957
1085
  ]
@@ -2302,12 +2302,20 @@ class UnreachableWait:
2302
2302
  evidence a genuine transient wouldn't have, and `last_reason` is
2303
2303
  whatever the last sweep to touch this row recorded — useful context,
2304
2304
  never re-interpreted here.
2305
+
2306
+ `dependents` (#2978) is the count of OTHER queue entries whose `after=`
2307
+ names this one — computed against the full entry set the caller passed
2308
+ to :func:`detect_unreachable_waits`, not just the flagged subset, so it
2309
+ is accurate even though those dependents themselves never appear in the
2310
+ result (see the predicate's own docstring for why). `0` for an entry
2311
+ nothing is chained behind.
2305
2312
  """
2306
2313
 
2307
2314
  key: str
2308
2315
  state: str
2309
2316
  deferrals: int
2310
2317
  last_reason: str
2318
+ dependents: int = 0
2311
2319
 
2312
2320
 
2313
2321
  def detect_unreachable_waits(
@@ -2317,35 +2325,73 @@ def detect_unreachable_waits(
2317
2325
  ) -> list[UnreachableWait]:
2318
2326
  """Entries sitting in the #2944 guaranteed-false wait.
2319
2327
 
2320
- ``state in (blocked, parked) AND attempts == 0 AND deferrals >
2321
- min_deferrals`` — see the module comment above this function for why
2322
- that combination can never resolve itself. Pure and cheap (a predicate
2323
- over already-loaded rows, no clock, no I/O), so the same function backs
2324
- both `coord drive-queue status`'s `alert:` line
2325
- (`coord.commands.drive_queue._queue_alert`) and the `coord doctor` WARN
2326
- (`coord.health.checks.wedged_drive_queue`) — one definition of "wedged",
2327
- not two that could drift apart.
2328
-
2329
- An entry with ``attempts > 0`` is excluded unconditionally, however long
2330
- it has sat: it WAS dispatched at least once, so it has (or had) a real
2331
- branch/PR/merge-queue row for a sweep to have a genuine opinion about —
2332
- that is a legitimate wait, not an unreachable one.
2328
+ Two independent shapes, either of which qualifies a `blocked`/`parked`
2329
+ entry — both provably have no branch/PR/merge-queue row for any sweep to
2330
+ ever form an opinion about, which is the actual invariant this predicate
2331
+ is checking, not "attempts == 0" as a proxy for it (#2978 found the proxy
2332
+ wrong for the second shape):
2333
+
2334
+ * ``attempts == 0`` and ``deferrals > min_deferrals`` — never dispatched
2335
+ at all. The original #2944 shape.
2336
+ * ``attempts > 0``, ``state == blocked``, and the entry's own
2337
+ `last_reason` carries #2273's "no assignment was ever created for this
2338
+ run" marker (:func:`_is_dispatch_failure_reason`) — every dispatch
2339
+ attempt died before `coord assign` produced a board-visible row, and
2340
+ the entry has now exhausted its retry budget (the only way to reach
2341
+ `blocked` with that reason: see `_reconcile_running`'s `exhausted`
2342
+ branch). Exhaustion is its own grace period — there is no next attempt
2343
+ left to wait out — so `min_deferrals` is not applied here.
2344
+
2345
+ A `blocked`/`parked` entry whose `last_reason` is instead one of
2346
+ `_resolve_prereqs`'s unsatisfiable-`after=` verdict shapes
2347
+ (:func:`_is_unsatisfiable_prereq_reason`) is excluded UNCONDITIONALLY,
2348
+ regardless of attempts/deferrals — #2978: that shape is
2349
+ :func:`_reconcile_blocked_after`'s to resolve (#2362, widened #2756),
2350
+ not an operator's, and flagging it here directly contradicts that
2351
+ function's own documented behaviour. This is what keeps a chain's
2352
+ dependents (each blocked with "pre-req X is queued but blocked — it will
2353
+ never satisfy") out of the result entirely, leaving only the root that
2354
+ actually needs a human.
2355
+
2356
+ Pure and cheap (a predicate over already-loaded rows, no clock, no I/O),
2357
+ so the same function backs both `coord drive-queue status`'s `alert:`
2358
+ line (`coord.commands.drive_queue._queue_alert`) and the `coord doctor`
2359
+ WARN (`coord.health.checks.wedged_drive_queue`) — one definition of
2360
+ "wedged", not two that could drift apart.
2333
2361
  """
2334
- return [
2335
- UnreachableWait(
2336
- key=e.key, state=e.state, deferrals=e.deferrals, last_reason=e.last_reason
2362
+ entries = list(entries)
2363
+ dependents_of: dict[str, int] = {}
2364
+ for e in entries:
2365
+ for dep in e.after:
2366
+ dependents_of[dep] = dependents_of.get(dep, 0) + 1
2367
+
2368
+ waits: list[UnreachableWait] = []
2369
+ for e in entries:
2370
+ if e.state not in (STATE_BLOCKED, STATE_PARKED):
2371
+ continue
2372
+ if _is_unsatisfiable_prereq_reason(e.last_reason):
2373
+ continue
2374
+ if e.attempts == 0:
2375
+ if e.deferrals <= min_deferrals:
2376
+ continue
2377
+ elif not (e.state == STATE_BLOCKED and _is_dispatch_failure_reason(e.last_reason)):
2378
+ continue
2379
+ waits.append(
2380
+ UnreachableWait(
2381
+ key=e.key,
2382
+ state=e.state,
2383
+ deferrals=e.deferrals,
2384
+ last_reason=e.last_reason,
2385
+ dependents=dependents_of.get(e.key, 0),
2386
+ )
2337
2387
  )
2338
- for e in entries
2339
- if e.state in (STATE_BLOCKED, STATE_PARKED)
2340
- and e.attempts == 0
2341
- and e.deferrals > min_deferrals
2342
- ]
2388
+ return waits
2343
2389
 
2344
2390
 
2345
2391
  def unreachable_wait_alert(waits: Sequence[UnreachableWait]) -> QueueAlert:
2346
2392
  """The queue-level record #2944's predicate raises, in :func:`_hold_alert`'s
2347
- shape — a message naming the entry (or entries), the deferral count that
2348
- is the evidence, and the ONE remedy that actually clears it.
2393
+ shape — a message naming the entry (or entries), the evidence that
2394
+ qualified it, and the ONE remedy that actually clears it.
2349
2395
 
2350
2396
  ``add`` alone does not clear ``blocked`` (the queue list already
2351
2397
  documents this as a footgun elsewhere) — only ``remove`` then ``add``
@@ -2357,29 +2403,52 @@ def unreachable_wait_alert(waits: Sequence[UnreachableWait]) -> QueueAlert:
2357
2403
  ``gate_readings``/``details`` lines are printed) so the remedy is visible
2358
2404
  wherever this alert's ``reason`` is, not just to a caller that also reads
2359
2405
  the structured field.
2406
+
2407
+ #2978: each name also carries its `dependents` count when non-zero — the
2408
+ entries chained behind a flagged root never appear in `waits` (see
2409
+ `detect_unreachable_waits`), so without this an operator has no way to
2410
+ know a fix to the one row named here will also resolve N others they
2411
+ never see mentioned. Explicitly says those dependents need no remedy of
2412
+ their own, since #2944's original wording ("for each entry named above")
2413
+ read, on a real incident, as an instruction to `remove`+`add` entries
2414
+ that were never named — but easy to mis-generalize to "the dependents
2415
+ too" by an operator who does not already know #2756 self-heals them.
2360
2416
  """
2361
- names = ", ".join(
2362
- f"{w.key} ({w.state}, {w.deferrals} deferrals)" for w in waits[:5]
2363
- )
2417
+ def _name(w: UnreachableWait) -> str:
2418
+ base = f"{w.key} ({w.state}, {w.deferrals} deferrals)"
2419
+ if w.dependents:
2420
+ plural = "ies" if w.dependents != 1 else "y"
2421
+ base += (
2422
+ f" — {w.dependents} dependent entr{plural} chained behind it "
2423
+ "will self-heal automatically once this clears (#2756), no "
2424
+ "remedy needed on them"
2425
+ )
2426
+ return base
2427
+
2428
+ names = ", ".join(_name(w) for w in waits[:5])
2364
2429
  more = ", ..." if len(waits) > 5 else ""
2365
2430
  plural = len(waits) != 1
2366
2431
  return QueueAlert(
2367
2432
  reason=(
2368
2433
  f"{len(waits)} queue entr{'ies' if plural else 'y'} stuck in a "
2369
- "guaranteed-false wait — never dispatched (attempts=0) yet "
2370
- f"blocked/parked past {UNREACHABLE_WAIT_MIN_DEFERRALS} deferrals; "
2434
+ "guaranteed-false wait — blocked/parked with no branch/PR/"
2435
+ "merge-queue row any sweep could ever act on (never dispatched, "
2436
+ "or every dispatch attempt died before creating an assignment); "
2371
2437
  f"no sweep can ever clear this on its own: {names}{more}. Fix: "
2372
2438
  "coord drive-queue remove <repo> <issue> && "
2373
- "coord drive-queue add <repo> <issue> for each entry named above."
2439
+ "coord drive-queue add <repo> <issue> for each ROOT entry named "
2440
+ "above — never on a dependent chained behind one."
2374
2441
  ),
2375
2442
  details=tuple(
2376
2443
  f"{w.key}: {w.state}, {w.deferrals} deferrals, "
2377
- f"last_reason={w.last_reason!r}"
2444
+ f"dependents={w.dependents}, last_reason={w.last_reason!r}"
2378
2445
  for w in waits
2379
2446
  ),
2380
2447
  command=(
2381
2448
  "coord drive-queue remove <repo> <issue> && "
2382
- "coord drive-queue add <repo> <issue> — for each entry named above"
2449
+ "coord drive-queue add <repo> <issue> — for each ROOT entry "
2450
+ "named above; any dependents chained behind it self-heal on "
2451
+ "their own (#2756)"
2383
2452
  ),
2384
2453
  )
2385
2454
 
@@ -19,6 +19,15 @@ so this check and that line can never say different things) — this probe
19
19
  just re-derives it, live, from ``drive_queue`` state every time ``coord
20
20
  doctor`` runs, independent of whatever the last tick happened to report.
21
21
 
22
+ #2978: the predicate also flags an ``attempts > 0`` entry that exhausted its
23
+ retry budget without ever getting a #2273 dispatch-layer death past `coord
24
+ assign` (same "no branch/PR ever existed" invariant, just reached a
25
+ different way) — and excludes an entry blocked solely on an unsatisfiable
26
+ ``after=`` pre-req, since that one is ``_reconcile_blocked_after``'s to
27
+ self-heal (#2362/#2756), not an operator's. See
28
+ ``coord.drive_queue.detect_unreachable_waits`` for the exact predicate; this
29
+ probe does not duplicate it, only renders its result.
30
+
22
31
  This is deliberately independent of #2935 (which fixes the specific sweep
23
32
  that produced the #2900/#2907 incident) and #2230 (the sweep's origin): both
24
33
  are about *why* a row gets wedged this way; this check is about the row
@@ -51,16 +60,19 @@ from coord.health.registry import COST_NETWORK, check
51
60
  cost=COST_NETWORK,
52
61
  description=(
53
62
  "Drive-queue rows in `coord.drive_queue`'s #2944 guaranteed-false "
54
- "wait: `blocked`/`parked`, `attempts == 0` (never dispatched — no "
55
- "branch, no PR, no merge-queue row ever existed or ever can), "
56
- "sitting past a few ticks of grace. Reads via `coord.state."
57
- "list_drive_queue`, which — per its own docstring — routes to the "
58
- "daemon over HTTP when `board_service` is set (the common case on a "
59
- "thin-client fleet machine, see `release_cordon.py`) and only reads "
60
- "the local DB directly otherwise; `cost=network` so `--no-network`/"
61
- "timer runs and the automatic per-agent health poll skip it exactly "
62
- "like the other network-costed checks, same precedent as "
63
- "`release_cordon`."
63
+ "wait: `blocked`/`parked` with no branch/PR/merge-queue row any "
64
+ "sweep could ever act on — either `attempts == 0` (never dispatched) "
65
+ "past a few ticks of grace, or `attempts > 0` with an exhausted "
66
+ "#2273 dispatch-layer death (#2978). Excludes an entry blocked "
67
+ "solely on an unsatisfiable `after=` pre-req — that one is "
68
+ "`_reconcile_blocked_after`'s to self-heal (#2756), not an "
69
+ "operator's. Reads via `coord.state.list_drive_queue`, which — per "
70
+ "its own docstring — routes to the daemon over HTTP when "
71
+ "`board_service` is set (the common case on a thin-client fleet "
72
+ "machine, see `release_cordon.py`) and only reads the local DB "
73
+ "directly otherwise; `cost=network` so `--no-network`/timer runs "
74
+ "and the automatic per-agent health poll skip it exactly like the "
75
+ "other network-costed checks, same precedent as `release_cordon`."
64
76
  ),
65
77
  )
66
78
  def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
@@ -92,7 +104,10 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
92
104
  )
93
105
 
94
106
  sample = ", ".join(
95
- f"{w.key} ({w.state}, {w.deferrals} deferrals)" for w in waits[:5]
107
+ f"{w.key} ({w.state}, {w.deferrals} deferrals"
108
+ + (f", {w.dependents} dependents self-heal (#2756)" if w.dependents else "")
109
+ + ")"
110
+ for w in waits[:5]
96
111
  )
97
112
  return CheckResult(
98
113
  check_id="wedged_drive_queue",
@@ -104,11 +119,17 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
104
119
  ),
105
120
  detail=(
106
121
  f"e.g. {sample}" + (", ..." if len(waits) > 5 else "")
107
- + " — never dispatched (attempts=0), cannot clear on its own; "
108
- "fix: coord drive-queue remove <repo> <issue> && "
109
- "coord drive-queue add <repo> <issue>"
122
+ + " — no branch/PR/merge-queue row any sweep could ever act on "
123
+ "(never dispatched, or every dispatch attempt died before "
124
+ "creating an assignment); cannot clear on its own. fix (root "
125
+ "only — any dependents self-heal, #2756): coord drive-queue "
126
+ "remove <repo> <issue> && coord drive-queue add <repo> <issue>"
127
+ ),
128
+ threshold=(
129
+ "warn when any entry is blocked/parked with no branch/PR a sweep "
130
+ "could ever act on: attempts=0 past a few ticks of grace, or "
131
+ "attempts>0 with an exhausted #2273 dispatch-layer death"
110
132
  ),
111
- threshold="warn when any entry is blocked/parked, attempts=0, past a few ticks of grace",
112
133
  values={
113
134
  "count": len(waits),
114
135
  "entries": [
@@ -116,6 +137,7 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
116
137
  "key": w.key,
117
138
  "state": w.state,
118
139
  "deferrals": w.deferrals,
140
+ "dependents": w.dependents,
119
141
  "last_reason": w.last_reason,
120
142
  }
121
143
  for w in waits
@@ -33,6 +33,14 @@ declog. ``coord.merge_queue.merged_issue_keys()`` unions the live table with
33
33
  the archive so the "already merged, don't re-enqueue" dedup in
34
34
  ``enqueue_approved_work``/``staging_items`` keeps working after a row ages
35
35
  out.
36
+
37
+ #2974: this is also the one existing low-cadence, filesystem-safe hook the
38
+ daemon already calls on a timer (and that ``coord housekeeping`` calls on
39
+ demand) — so it is where :func:`coord.confirm_test.sweep_stale_confirm_worktrees`
40
+ is wired in too, reclaiming ``~/.coord/confirm-worktrees/`` entries that
41
+ outlived ``confirm_branch``'s own per-run cleanup. That is disk hygiene, not
42
+ DB archiving, but reusing this sweep's cadence beats inventing a second timer
43
+ for a second maintenance job.
36
44
  """
37
45
 
38
46
  from __future__ import annotations
@@ -140,12 +148,13 @@ def _move_rows(
140
148
 
141
149
  def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
142
150
  """Archive stale terminal assignments + their notifications + merged
143
- merge_queue entries.
151
+ merge_queue entries, and reclaim leaked confirm-worktree directories.
144
152
 
145
153
  Returns ``{"archived_assignments": N, "archived_notifications": M,
146
- "archived_merge_queue": K, "dry_run": bool, "retention_days": D}``.
147
- ``archived_*`` are the counts that were (or, for ``dry_run``, would be)
148
- moved. A no-op returns zeros.
154
+ "archived_merge_queue": K, "removed_confirm_worktrees": W, "dry_run": bool,
155
+ "retention_days": D}``. ``archived_*``/``removed_confirm_worktrees`` are
156
+ the counts that were (or, for ``dry_run``, would be) moved/deleted. A
157
+ no-op returns zeros.
149
158
 
150
159
  Conservative by construction: nothing active, recent (within the archive
151
160
  window), queued-for-merge, latest-of-an-open-issue, or review-linked to any
@@ -153,17 +162,29 @@ def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
153
162
  are in the terminal ``MERGED`` state (#1107 Part 3) — non-terminal /
154
163
  conflicted entries are left for ``prune_stale_queue_entries`` or manual
155
164
  ``coord merge --drop``.
165
+
166
+ #2974: ``removed_confirm_worktrees`` is independent of the DB-archiving
167
+ ``cutoff``/``retention_days`` above (it has its own, much shorter,
168
+ :data:`coord.confirm_test.STALE_WORKTREE_MAX_AGE_HOURS` window) and runs
169
+ even when DB archiving itself is disabled (``COORD_ARCHIVE_RETENTION_DAYS``
170
+ ``<= 0``) — a disk leak on the daemon host is not something an operator
171
+ who merely turned off DB archiving meant to also keep.
156
172
  """
173
+ from coord.confirm_test import sweep_stale_confirm_worktrees # noqa: PLC0415
174
+
175
+ swept_worktrees = sweep_stale_confirm_worktrees(dry_run=dry_run, now=now)
176
+
157
177
  cutoff = _archive_cutoff(now)
158
178
  result = {
159
179
  "archived_assignments": 0,
160
180
  "archived_notifications": 0,
161
181
  "archived_merge_queue": 0,
182
+ "removed_confirm_worktrees": len(swept_worktrees["removed"]),
162
183
  "dry_run": dry_run,
163
184
  "retention_days": _archive_retention_days(),
164
185
  }
165
186
  if cutoff is None:
166
- return result # archiving disabled
187
+ return result # DB archiving disabled; the worktree sweep above still ran
167
188
 
168
189
  conn = get_connection()
169
190
  index = [
@@ -739,7 +739,9 @@ def _audit_housekeeping_sweep(swept: dict) -> None:
739
739
  f"housekeeping: archived {swept.get('archived_assignments', 0)} "
740
740
  f"assignment(s), {swept.get('archived_notifications', 0)} "
741
741
  f"notification(s), {swept.get('archived_merge_queue', 0)} "
742
- "merge_queue entry(ies)"
742
+ "merge_queue entry(ies), removed "
743
+ f"{swept.get('removed_confirm_worktrees', 0)} stale "
744
+ "confirm-worktree(s) (#2974)"
743
745
  ),
744
746
  details=swept,
745
747
  )
@@ -9477,13 +9479,16 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
9477
9479
  swept.get("archived_assignments")
9478
9480
  or swept.get("archived_notifications")
9479
9481
  or swept.get("archived_merge_queue")
9482
+ or swept.get("removed_confirm_worktrees")
9480
9483
  ):
9481
9484
  log.info(
9482
9485
  "housekeeping: archived %d assignment(s), "
9483
- "%d notification(s), %d merge_queue entry(ies)",
9486
+ "%d notification(s), %d merge_queue entry(ies), "
9487
+ "removed %d stale confirm-worktree(s)",
9484
9488
  swept["archived_assignments"],
9485
9489
  swept["archived_notifications"],
9486
9490
  swept.get("archived_merge_queue", 0),
9491
+ swept.get("removed_confirm_worktrees", 0),
9487
9492
  )
9488
9493
  _audit_housekeeping_sweep(swept)
9489
9494
  except Exception: # noqa: BLE001
@@ -20,6 +20,33 @@ RECENT = NOW - 2 * 86400 # 2 days ago → inside the 14d board window
20
20
  OLD = NOW - 40 * 86400 # 40 days ago → outside both windows
21
21
 
22
22
 
23
+ @pytest.fixture(autouse=True)
24
+ def _isolated_confirm_worktrees_dir(monkeypatch, tmp_path):
25
+ """#2974: ``housekeeping.sweep()`` now also calls
26
+ ``coord.confirm_test.sweep_stale_confirm_worktrees`` on every invocation
27
+ (even ``dry_run=False`` calls made directly, as most tests below do), and
28
+ that helper resolves its sweep root from the real, lazily-resolved
29
+ ``coord.state.COORD_DIR`` (``~/.coord`` on POSIX absent a ``$COORD_DIR``
30
+ override). Before this fixture, every test in this file that calls the
31
+ real (non-dry-run) ``housekeeping.sweep()`` — or drives it through the
32
+ real ``/housekeeping`` endpoint — would ``shutil.rmtree`` anything under
33
+ the OPERATOR's real ``~/.coord/confirm-worktrees/`` older than
34
+ ``coord.confirm_test.STALE_WORKTREE_MAX_AGE_HOURS`` as an untracked side
35
+ effect of running `pytest`. Pin ``coord.state.COORD_DIR`` to a private
36
+ ``tmp_path`` for every test in this module — mirrors
37
+ ``tests/test_confirm_test.py``'s own ``isolated_coord_dir`` fixture,
38
+ which the real ``sweep_stale_confirm_worktrees`` call site already
39
+ trusts (it re-imports ``coord.state.COORD_DIR`` fresh on every call, so
40
+ a plain ``monkeypatch.setattr`` here is picked up with no further
41
+ wiring). A file-local autouse fixture (rather than a global one in
42
+ ``tests/conftest.py``) is deliberate: ``tests/test_platform_paths.py``
43
+ has real tests that assert ``coord.state.COORD_DIR`` reflects the
44
+ *actual* default resolution with nothing overriding it, which a global
45
+ override would break.
46
+ """
47
+ monkeypatch.setattr("coord.state.COORD_DIR", tmp_path / "coord-state")
48
+
49
+
23
50
  def _ins_assignment(
24
51
  conn: sqlite3.Connection,
25
52
  aid: str,