code-coordinator 0.5.311__tar.gz → 0.5.313__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 (818) hide show
  1. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/lifecycle.py +13 -1
  5. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/release.py +23 -1
  6. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/tui.py +19 -0
  7. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/confirm_test.py +131 -3
  8. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/housekeeping.py +26 -5
  9. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/serve_app.py +7 -2
  10. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/tui_release.py +40 -4
  11. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_cap_762.py +27 -0
  12. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_release_propagate.py +137 -0
  13. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_tui_update.py +31 -4
  14. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_confirm_test.py +153 -6
  15. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.claude/commands/board.md +0 -0
  16. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.claude/commands/complete-session.md +0 -0
  17. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.claude/commands/coordinator.md +0 -0
  18. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.githooks/_lib.sh +0 -0
  19. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.githooks/post-checkout +0 -0
  20. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.githooks/post-commit +0 -0
  21. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.githooks/post-merge +0 -0
  22. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/coord-ci-acceptance.yml +0 -0
  24. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/workflows/auto-release.yml +0 -0
  25. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/workflows/publish.yml +0 -0
  26. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.github/workflows/test.yml +0 -0
  27. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/.gitignore +0 -0
  28. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/CLAUDE.md +0 -0
  29. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/GOAL.md +0 -0
  30. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/LICENSE +0 -0
  31. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/MANIFEST.in +0 -0
  32. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/README.md +0 -0
  33. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/SOURCES.txt +0 -0
  34. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/dependency_links.txt +0 -0
  35. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/entry_points.txt +0 -0
  36. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/requires.txt +0 -0
  37. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/scm_file_list.json +0 -0
  38. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/code_coordinator.egg-info/top_level.txt +0 -0
  39. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/__init__.py +0 -0
  40. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/_board_mapping.py +0 -0
  41. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/acceptance.py +0 -0
  42. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/acceptance_drivers.py +0 -0
  43. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agent.py +0 -0
  44. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/approved_work.py +0 -0
  50. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/audit.py +0 -0
  51. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/auto_loop.py +0 -0
  52. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/block_log.py +0 -0
  53. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/board_schema.py +0 -0
  54. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/board_service.py +0 -0
  55. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/board_wire.py +0 -0
  56. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/brain.py +0 -0
  57. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/branch_model.py +0 -0
  58. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/bug_intake.py +0 -0
  59. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/cargo_cache.py +0 -0
  60. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/ci_fix.py +0 -0
  61. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/ci_github.py +0 -0
  62. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/ci_gitlab.py +0 -0
  63. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/ci_store.py +0 -0
  64. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/claim.py +0 -0
  65. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/cli.py +0 -0
  66. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/client.py +0 -0
  67. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/__init__.py +0 -0
  68. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/_common.py +0 -0
  69. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/acceptance.py +0 -0
  70. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/agent_ops.py +0 -0
  71. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/audit.py +0 -0
  72. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/chat.py +0 -0
  73. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/dispatch.py +0 -0
  74. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/dispatch_workers.py +0 -0
  75. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/drive.py +0 -0
  76. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/drive_queue.py +0 -0
  77. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/gate_a.py +0 -0
  78. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/gates.py +0 -0
  79. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/issues.py +0 -0
  80. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/machine.py +0 -0
  81. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/portal.py +0 -0
  86. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/pr.py +0 -0
  87. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/repo.py +0 -0
  88. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/report.py +0 -0
  89. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/review.py +0 -0
  90. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/scorecard.py +0 -0
  91. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/sessions.py +0 -0
  92. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/setup.py +0 -0
  93. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/status.py +0 -0
  94. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/store_migrate.py +0 -0
  95. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/terminal.py +0 -0
  96. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/commands/test_gate.py +0 -0
  97. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/comments.py +0 -0
  98. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/config.py +0 -0
  99. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/config_reload.py +0 -0
  100. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/conflict_fix.py +0 -0
  101. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dao.py +0 -0
  102. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/__init__.py +0 -0
  103. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/fixture.py +0 -0
  104. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/index.html +0 -0
  105. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/server.py +0 -0
  106. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dashboard/terminal.py +0 -0
  107. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/db.py +0 -0
  108. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dead_end.py +0 -0
  109. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/decomposition_chat.py +0 -0
  110. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/README.md +0 -0
  111. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-agent.service +0 -0
  112. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-db-backup.service +0 -0
  113. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-db-backup.sh +0 -0
  114. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-db-backup.timer +0 -0
  115. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-drive-queue.service +0 -0
  116. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-drive-queue.timer +0 -0
  117. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-failure-notify.service +0 -0
  118. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-fleet-watchdog.service +0 -0
  119. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  120. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-notify.service +0 -0
  121. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-notify.timer +0 -0
  122. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-release-propagate.service +0 -0
  123. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-release-propagate.timer +0 -0
  124. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-release-window.service +0 -0
  125. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-release-window.timer +0 -0
  126. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-serve.service +0 -0
  127. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-web-dist-build.service +0 -0
  128. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-web-dist-build.timer +0 -0
  129. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy/coord-web.service +0 -0
  130. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy_manifest.py +0 -0
  131. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deploy_units.py +0 -0
  132. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deprecation_telemetry.py +0 -0
  133. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/deps.py +0 -0
  134. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/diagnose.py +0 -0
  135. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dispatch.py +0 -0
  136. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/dist_name.py +0 -0
  137. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/drive.py +0 -0
  138. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/drive_queue.py +0 -0
  139. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/drive_state.py +0 -0
  140. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/events.py +0 -0
  141. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/failure_class.py +0 -0
  142. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/filelock.py +0 -0
  143. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/fleet_config_health.py +0 -0
  144. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/forge_availability.py +0 -0
  145. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/freshness.py +0 -0
  146. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/gate_a.py +0 -0
  147. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/gate_b.py +0 -0
  148. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/gate_snapshot.py +0 -0
  149. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/gates.py +0 -0
  150. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/github_ops.py +0 -0
  151. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/github_throttle.py +0 -0
  152. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/goal.py +0 -0
  153. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/graph_health.py +0 -0
  154. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/__init__.py +0 -0
  155. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/aggregate.py +0 -0
  156. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/__init__.py +0 -0
  157. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/_ci_pin.py +0 -0
  158. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/agent_install.py +0 -0
  159. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/cargo_targets.py +0 -0
  160. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/claude_binary.py +0 -0
  161. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  162. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/coord_web_ci_pin.py +0 -0
  163. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/deploy_lane_facts.py +0 -0
  164. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/disk.py +0 -0
  165. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/fleet_board.py +0 -0
  166. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  167. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/fleet_phantom.py +0 -0
  168. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/fleet_unit_drift.py +0 -0
  169. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/graph.py +0 -0
  170. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/graphify_cli.py +0 -0
  171. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/index_lock.py +0 -0
  172. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/issues_sync_staleness.py +0 -0
  173. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/plan_usage.py +0 -0
  174. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/release_cordon.py +0 -0
  175. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/repo_state.py +0 -0
  176. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/spawned_coord.py +0 -0
  177. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/stalled_pipeline.py +0 -0
  178. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/timer_active.py +0 -0
  179. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/toolchain.py +0 -0
  180. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/unit_drift.py +0 -0
  181. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/unit_enablement.py +0 -0
  182. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/wedged_drive_queue.py +0 -0
  183. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/checks/worktrees.py +0 -0
  184. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/cli.py +0 -0
  185. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/context.py +0 -0
  186. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/fleet_snapshot.py +0 -0
  187. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/models.py +0 -0
  188. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/pypi.py +0 -0
  189. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/registry.py +0 -0
  190. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/render.py +0 -0
  191. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/health/units.py +0 -0
  192. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/hooks.py +0 -0
  193. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/interactive.py +0 -0
  194. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/issue_store.py +0 -0
  195. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/issues_sync_status.py +0 -0
  196. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/liveness_auditor.py +0 -0
  197. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/machine_onboard.py +0 -0
  198. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/machine_pause.py +0 -0
  199. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/merge_queue.py +0 -0
  200. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/milestone_chat.py +0 -0
  201. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/milestone_dispatch.py +0 -0
  202. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/milestone_gate.py +0 -0
  203. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/milestone_order.py +0 -0
  204. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/mock_author.py +0 -0
  205. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/models.py +0 -0
  206. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/network.py +0 -0
  207. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/new_issue_chat.py +0 -0
  208. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/__init__.py +0 -0
  209. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/baseline.py +0 -0
  210. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/cli.py +0 -0
  211. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/collect.py +0 -0
  212. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/digest.py +0 -0
  213. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/models.py +0 -0
  214. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/predicate.py +0 -0
  215. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/service.py +0 -0
  216. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/store.py +0 -0
  217. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notifier/transport.py +0 -0
  218. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/notify.py +0 -0
  219. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/openapi.py +0 -0
  220. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/overlap_fence.py +0 -0
  221. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/overlap_predict.py +0 -0
  222. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/parentage.py +0 -0
  223. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/parentage_github.py +0 -0
  224. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/pipeline.py +0 -0
  225. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/plan_parser.py +0 -0
  226. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/plans.py +0 -0
  227. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/platform_paths.py +0 -0
  228. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/portal_bridge.py +0 -0
  229. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/portal_store.py +0 -0
  230. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/portal_sync.py +0 -0
  231. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/pr_body_lint.py +0 -0
  232. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/prereqs.py +0 -0
  233. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/progress.py +0 -0
  234. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/__init__.py +0 -0
  235. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/base.py +0 -0
  236. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/claude.py +0 -0
  237. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/claude_pty.py +0 -0
  238. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/providers/opencode.py +0 -0
  239. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/queue_diagnose.py +0 -0
  240. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/reconcile.py +0 -0
  241. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/reconcile_tick.py +0 -0
  242. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/refine_chat.py +0 -0
  243. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/release_cordon.py +0 -0
  244. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/release_propagate.py +0 -0
  245. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/release_verify.py +0 -0
  246. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/release_window.py +0 -0
  247. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/repo_edit.py +0 -0
  248. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/repo_onboard.py +0 -0
  249. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/reports.py +0 -0
  250. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/rest_schema.py +0 -0
  251. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/revalidate.py +0 -0
  252. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/review.py +0 -0
  253. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/scorecard.py +0 -0
  254. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/self_health.py +0 -0
  255. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  256. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  257. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  258. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  259. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/portal-followup/SKILL.md +0 -0
  261. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/release-now/SKILL.md +0 -0
  262. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  263. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  264. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/skills/update-issue/SKILL.md +0 -0
  265. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/smoke.py +0 -0
  266. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/spend_ceiling.py +0 -0
  267. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/split_work.py +0 -0
  268. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/sql.py +0 -0
  269. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/stage_projection.py +0 -0
  270. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/state.py +0 -0
  271. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/store_migrate.py +0 -0
  272. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/test_author.py +0 -0
  273. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/test_chat.py +0 -0
  274. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/test_orchestrator.py +0 -0
  275. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/test_report.py +0 -0
  276. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/usage.py +0 -0
  277. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/usage_limits.py +0 -0
  278. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/usage_rollup.py +0 -0
  279. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coord/worker_events.py +0 -0
  280. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/coordinator.example.yml +0 -0
  281. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-agent.service +0 -0
  282. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-db-backup.service +0 -0
  283. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-db-backup.sh +0 -0
  284. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-db-backup.timer +0 -0
  285. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-drive-queue.service +0 -0
  286. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-drive-queue.timer +0 -0
  287. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-failure-notify.service +0 -0
  288. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-failure-notify.sh +0 -0
  289. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-fleet-watchdog.service +0 -0
  290. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-fleet-watchdog.timer +0 -0
  291. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-notify.service +0 -0
  292. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-notify.timer +0 -0
  293. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-release-propagate.service +0 -0
  294. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-release-propagate.timer +0 -0
  295. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-release-window.service +0 -0
  296. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-release-window.timer +0 -0
  297. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-serve.service +0 -0
  298. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web-dist-build.service +0 -0
  299. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web-dist-build.sh +0 -0
  300. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web-dist-build.timer +0 -0
  301. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web-rollback.sh +0 -0
  302. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/coord-web.service +0 -0
  303. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/deploy/node-shim.sh +0 -0
  304. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_COORD_TUI_CI.md +0 -0
  305. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  306. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_COORD_WEB_CI.md +0 -0
  307. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_COORD_WEB_DIST.md +0 -0
  308. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  309. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/AGENT_OPERATIONS.md +0 -0
  310. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ARCHITECTURE.md +0 -0
  311. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ARCH_SECURITY_GATES.md +0 -0
  312. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/COCKPIT.md +0 -0
  313. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/CONTROL_CENTER.md +0 -0
  314. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/COST_DISCIPLINE.md +0 -0
  315. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/CROSS_PLATFORM.md +0 -0
  316. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/CUSTOMER_FACING_APPS.md +0 -0
  317. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/CUSTOMER_PORTAL.md +0 -0
  318. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/DRIVE_QUEUE.md +0 -0
  319. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/EPHEMERAL_WORKERS.md +0 -0
  320. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/FORGE_MIGRATION.md +0 -0
  321. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/GRAPHIFY_SETUP.md +0 -0
  322. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ISSUE_GUIDANCE.md +0 -0
  323. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/MAC_MINI.md +0 -0
  324. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  325. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/NOTIFIER.md +0 -0
  326. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/OPENCODE_VERIFICATION.md +0 -0
  327. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/OPERATING_GOTCHAS.md +0 -0
  328. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/OPERATOR_GUIDES.md +0 -0
  329. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/ORACLE_LOOP.md +0 -0
  330. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/PHONE_WEBAPP.md +0 -0
  331. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/PIPELINE_V2.md +0 -0
  332. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/PLATFORM_EVOLUTION.md +0 -0
  333. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/SECOND_BACKEND.md +0 -0
  334. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/STORE_SERVICE.md +0 -0
  335. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  336. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/WEB_CONTROL_CENTER.md +0 -0
  337. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/WSL_WINDOWS_WORKER.md +0 -0
  338. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/README.md +0 -0
  339. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/_tokens.css +0 -0
  340. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/issue-detail.html +0 -0
  341. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/pipeline-narrow.html +0 -0
  342. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/docs/mocks/web/pipeline-wide.html +0 -0
  343. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/graphify-out/.gitignore +0 -0
  344. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/install-agent.sh +0 -0
  345. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/pyproject.toml +0 -0
  346. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/audit_review_verdict_overrides.py +0 -0
  347. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  348. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/build-worker-image.sh +0 -0
  349. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/coordinator-machine.py +0 -0
  350. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/epic-down.sh +0 -0
  351. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/epic-up.sh +0 -0
  352. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/preflight.sh +0 -0
  353. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/provision-worker.sh +0 -0
  354. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  355. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  356. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/azure-workers/verify-github-token.sh +0 -0
  357. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/check_gh_argv_containment.py +0 -0
  358. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/codegen.py +0 -0
  359. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-test-runner.sh +0 -0
  360. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  361. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  362. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  363. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  364. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/coord-venv-rollback.sh +0 -0
  365. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/drive-batch.sh +0 -0
  366. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/extract-coord-tui.sh +0 -0
  367. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/fleet_watchdog.py +0 -0
  368. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/gen_board_fixture.py +0 -0
  369. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/gen_mock_index.py +0 -0
  370. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/next_release_tag.py +0 -0
  371. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/run_tests_in_populated_home.sh +0 -0
  372. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/run_tests_without_gh.sh +0 -0
  373. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/smoke_437_interactive.py +0 -0
  374. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/verify_878_review_capture.py +0 -0
  375. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/verify_release_published.py +0 -0
  376. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/scripts/verify_release_wheel.py +0 -0
  377. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/setup.cfg +0 -0
  378. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/SMOKE_SET.md +0 -0
  379. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/__init__.py +0 -0
  380. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/conftest.py +0 -0
  381. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/contract.md +0 -0
  382. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/manifest.yml +0 -0
  383. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  384. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  385. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/contract.md +0 -0
  386. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  387. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  388. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/manifest.yml +0 -0
  389. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  390. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-51/tsconfig.json +0 -0
  391. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  392. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/backends.py +0 -0
  393. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/conftest.py +0 -0
  394. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/board-pipeline-basic.json +0 -0
  395. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  396. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  397. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  398. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  399. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/all_pass.json +0 -0
  400. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  401. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/mixed_fail.json +0 -0
  402. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  403. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  404. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/skip.json +0 -0
  405. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/playwright/truncated.json +0 -0
  406. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  407. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  408. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  409. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  410. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  411. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  412. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  413. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  414. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_acceptance.py +0 -0
  415. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_acceptance_drivers.py +0 -0
  416. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent.py +0 -0
  417. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_api_error.py +0 -0
  418. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_app.py +0 -0
  419. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_branch_base.py +0 -0
  420. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_branch_capture.py +0 -0
  421. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_config_free_1712.py +0 -0
  422. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_deploy_units_endpoint.py +0 -0
  423. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_dirty_worktree.py +0 -0
  424. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  425. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_graph_self_heal.py +0 -0
  426. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_health_h3.py +0 -0
  427. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_idle_restart.py +0 -0
  428. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_push_failure.py +0 -0
  429. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_reap.py +0 -0
  430. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_repos_and_pull.py +0 -0
  431. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_restart_services_endpoint.py +0 -0
  432. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_skills_self_heal.py +0 -0
  433. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_startup_diagnostics.py +0 -0
  434. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_update.py +0 -0
  435. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_update_bluegreen.py +0 -0
  436. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_usage_limit.py +0 -0
  437. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_agent_zero_commit.py +0 -0
  438. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ambient_home_isolation.py +0 -0
  439. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_approve_dependency_busy_2804.py +0 -0
  440. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_approve_reject_plan.py +0 -0
  441. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_approve_usage_gate.py +0 -0
  442. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_approved_work_2532.py +0 -0
  443. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_assignment_already_recorded_daemon.py +0 -0
  444. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_audit_log.py +0 -0
  445. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_audit_outcome.py +0 -0
  446. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_audit_query.py +0 -0
  447. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_auto_loop.py +0 -0
  448. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_auto_release_publish_2035.py +0 -0
  449. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_backend_selection.py +0 -0
  450. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_base_checkout_restore.py +0 -0
  451. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_block_log.py +0 -0
  452. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_fixture.py +0 -0
  453. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_read_path.py +0 -0
  454. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_schema.py +0 -0
  455. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_service.py +0 -0
  456. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_state.py +0 -0
  457. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_board_wire.py +0 -0
  458. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_brain.py +0 -0
  459. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_branch_model.py +0 -0
  460. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_bug_intake.py +0 -0
  461. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_build_worker_image_env_update.py +0 -0
  462. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cargo_cache.py +0 -0
  463. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_check_gh_argv_containment.py +0 -0
  464. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_acceptance_gate_1950.py +0 -0
  465. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_fix.py +0 -0
  466. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_gitlab.py +0 -0
  467. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_parity_2091.py +0 -0
  468. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_ci_store.py +0 -0
  469. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_claim.py +0 -0
  470. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_claude_md_budget.py +0 -0
  471. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_acceptance.py +0 -0
  472. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign.py +0 -0
  473. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  474. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign_interactive_remote.py +0 -0
  475. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign_provider.py +0 -0
  476. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  477. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_audit.py +0 -0
  478. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_chat_continue.py +0 -0
  479. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_decide.py +0 -0
  480. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_capability_rules.py +0 -0
  481. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_config_provenance.py +0 -0
  482. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_forge_availability.py +0 -0
  483. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_graph.py +0 -0
  484. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_self.py +0 -0
  485. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_diagnose_test_coverage.py +0 -0
  486. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_doctor.py +0 -0
  487. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_doctor_config_free_1801.py +0 -0
  488. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  489. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_drive.py +0 -0
  490. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_drive_queue.py +0 -0
  491. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_escalate.py +0 -0
  492. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_fix_headless_review.py +0 -0
  493. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_gate_a.py +0 -0
  494. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_install_drift.py +0 -0
  495. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_install_skills.py +0 -0
  496. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_issue_comment.py +0 -0
  497. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_issue_create_label.py +0 -0
  498. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_issue_reopen.py +0 -0
  499. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_issue_view_list.py +0 -0
  500. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_merge.py +0 -0
  501. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_assign.py +0 -0
  502. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_capture.py +0 -0
  503. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_chat_add_child.py +0 -0
  504. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_dispatch.py +0 -0
  505. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_gate_b.py +0 -0
  506. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_gate_c.py +0 -0
  507. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_order.py +0 -0
  508. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  509. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_milestone_ship.py +0 -0
  510. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_network.py +0 -0
  511. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_new_issue_chat.py +0 -0
  512. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_plans.py +0 -0
  513. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_portal.py +0 -0
  514. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_pr.py +0 -0
  515. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_pull_artifact.py +0 -0
  516. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_queue.py +0 -0
  517. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_reattach_sessions.py +0 -0
  518. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_refine_board.py +0 -0
  519. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_release_preflight.py +0 -0
  520. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_release_window.py +0 -0
  521. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_repo_2220.py +0 -0
  522. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  523. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_scorecard.py +0 -0
  524. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_set_review_findings.py +0 -0
  525. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_advisory_terminal.py +0 -0
  526. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_contested_tag.py +0 -0
  527. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_merge_queue.py +0 -0
  528. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_provider.py +0 -0
  529. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_review_finalizing.py +0 -0
  530. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_test_failed_tag.py +0 -0
  531. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_status_usage_limit.py +0 -0
  532. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_sync_comments_873.py +0 -0
  533. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_test_plan.py +0 -0
  534. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_track.py +0 -0
  535. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cli_wait.py +0 -0
  536. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_client_base_install.py +0 -0
  537. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_client_resource_migration_1946.py +0 -0
  538. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_commands_common.py +0 -0
  539. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_comments.py +0 -0
  540. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_completion_summary.py +0 -0
  541. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config.py +0 -0
  542. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_acceptance.py +0 -0
  543. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_audit.py +0 -0
  544. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_pricing.py +0 -0
  545. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  546. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_config_usage_gate.py +0 -0
  547. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_conflict_fix.py +0 -0
  548. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_conflict_fix_semantic.py +0 -0
  549. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  550. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test.py +0 -0
  551. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  552. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_baseline.py +0 -0
  553. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_populated_home.py +0 -0
  554. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_routing.py +0 -0
  555. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_test_runner_toolchain.py +0 -0
  556. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_uat.py +0 -0
  557. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coord_web_sse_restart_live.py +0 -0
  558. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_coordinator_machine.py +0 -0
  559. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_cross_platform_imports.py +0 -0
  560. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dao.py +0 -0
  561. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dashboard.py +0 -0
  562. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dashboard_fixture.py +0 -0
  563. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dashboard_terminal.py +0 -0
  564. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dashboard_terminal_live.py +0 -0
  565. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_db.py +0 -0
  566. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dead_end.py +0 -0
  567. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_decomposition_chat.py +0 -0
  568. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_coord_db_backup.py +0 -0
  569. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_coord_web_dist.py +0 -0
  570. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_coord_web_rollback.py +0 -0
  571. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_drive_queue_unit.py +0 -0
  572. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_failure_notify_unit.py +0 -0
  573. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_manifest.py +0 -0
  574. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_notify_unit.py +0 -0
  575. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_units_lane.py +0 -0
  576. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deploy_web_unit.py +0 -0
  577. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deprecation_telemetry.py +0 -0
  578. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_deps.py +0 -0
  579. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_diagnose.py +0 -0
  580. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dispatch.py +0 -0
  581. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dispatch_target_validation.py +0 -0
  582. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_dist_name.py +0 -0
  583. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_done_housekeeping.py +0 -0
  584. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive.py +0 -0
  585. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue.py +0 -0
  586. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_blocked_rendering.py +0 -0
  587. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_launch_argv.py +0 -0
  588. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  589. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_roll_pending.py +0 -0
  590. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  591. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_state.py +0 -0
  592. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_drive_tmux.py +0 -0
  593. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_epic_up_capability_detection.py +0 -0
  594. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  595. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_epic_up_image_provenance.py +0 -0
  596. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_errors.py +0 -0
  597. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_events.py +0 -0
  598. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_failure_class.py +0 -0
  599. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_filelock.py +0 -0
  600. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  601. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fix_of_force_override.py +0 -0
  602. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fleet_config_health.py +0 -0
  603. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fleet_health_probes.py +0 -0
  604. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fleet_health_snapshot.py +0 -0
  605. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_fleet_watchdog.py +0 -0
  606. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_forge_availability.py +0 -0
  607. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_freshness.py +0 -0
  608. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gate_a.py +0 -0
  609. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gate_b.py +0 -0
  610. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gate_snapshot_staleness.py +0 -0
  611. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gates.py +0 -0
  612. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  613. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_gen_mock_index.py +0 -0
  614. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_generated_rust_fixture.py +0 -0
  615. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_generated_rust_requests.py +0 -0
  616. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_generated_types_fixture.py +0 -0
  617. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_github_ops.py +0 -0
  618. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_github_throttle.py +0 -0
  619. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_goal.py +0 -0
  620. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_graph_health.py +0 -0
  621. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_graph_selfheal_absent_2237.py +0 -0
  622. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_handoff.py +0 -0
  623. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_checks.py +0 -0
  624. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_cli.py +0 -0
  625. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_cli_graph.py +0 -0
  626. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_config.py +0 -0
  627. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_context.py +0 -0
  628. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_coord_tui_ci_pin.py +0 -0
  629. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_coord_web_ci_pin.py +0 -0
  630. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_deploy_lane_facts.py +0 -0
  631. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_fix.py +0 -0
  632. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_incident_regression.py +0 -0
  633. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_issues_sync_staleness.py +0 -0
  634. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_pypi.py +0 -0
  635. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_registry.py +0 -0
  636. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_release_cordon_probe.py +0 -0
  637. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_timer_active.py +0 -0
  638. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_toolchain.py +0 -0
  639. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_unit_drift.py +0 -0
  640. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_unit_enablement.py +0 -0
  641. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_health_wedged_drive_queue.py +0 -0
  642. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_hooks.py +0 -0
  643. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_human_attended_437.py +0 -0
  644. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_init.py +0 -0
  645. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_install_agent_venv_2911.py +0 -0
  646. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_integration.py +0 -0
  647. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_briefing_echo.py +0 -0
  648. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_pane_log_2541.py +0 -0
  649. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_prefill_state.py +0 -0
  650. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_session_relaunch.py +0 -0
  651. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_test_verdict_backstop.py +0 -0
  652. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_token_attribution.py +0 -0
  653. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_interactive_worktree.py +0 -0
  654. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_issue_store_seam.py +0 -0
  655. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_issues_sync_status.py +0 -0
  656. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_liveness_auditor.py +0 -0
  657. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_liveness_notify.py +0 -0
  658. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_lock_contention_ratchet.py +0 -0
  659. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_machine_onboard.py +0 -0
  660. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_machine_pause.py +0 -0
  661. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_merge_queue.py +0 -0
  662. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_merge_verify.py +0 -0
  663. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_chat.py +0 -0
  664. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_dispatch.py +0 -0
  665. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_gate.py +0 -0
  666. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_order.py +0 -0
  667. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_milestone_seam.py +0 -0
  668. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_mock_author.py +0 -0
  669. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_model_tiering.py +0 -0
  670. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_models.py +0 -0
  671. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_models_config_labels.py +0 -0
  672. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_needs_attention.py +0 -0
  673. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_network.py +0 -0
  674. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_new_issue_chat.py +0 -0
  675. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_next_release_tag.py +0 -0
  676. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_node_shim.py +0 -0
  677. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_baseline.py +0 -0
  678. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_cli.py +0 -0
  679. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_collect.py +0 -0
  680. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_config.py +0 -0
  681. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_drive_seam.py +0 -0
  682. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_isolation.py +0 -0
  683. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_predicate.py +0 -0
  684. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_quiet_hours.py +0 -0
  685. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notifier_service.py +0 -0
  686. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notify.py +0 -0
  687. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_notify_drain.py +0 -0
  688. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_openapi.py +0 -0
  689. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_operational_defaults.py +0 -0
  690. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_overlap_fence.py +0 -0
  691. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_overlap_predict.py +0 -0
  692. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_packaged_deploy_units.py +0 -0
  693. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_parentage.py +0 -0
  694. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_paste_landed.py +0 -0
  695. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  696. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_pipeline.py +0 -0
  697. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_followup_approve_plan_command.py +0 -0
  698. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_followup_pr_command.py +0 -0
  699. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_followup_review_command.py +0 -0
  700. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_only.py +0 -0
  701. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_plan_parser.py +0 -0
  702. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_platform_paths.py +0 -0
  703. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_portal_bridge.py +0 -0
  704. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_portal_config.py +0 -0
  705. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_portal_store.py +0 -0
  706. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_portal_sync.py +0 -0
  707. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_pr_body_lint.py +0 -0
  708. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_prereqs.py +0 -0
  709. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_production_db_guard.py +0 -0
  710. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_progress.py +0 -0
  711. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_provider_seam.py +0 -0
  712. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_providers.py +0 -0
  713. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_providers_config_labels.py +0 -0
  714. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_providers_pty.py +0 -0
  715. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_py_rust_mirror_inventory.py +0 -0
  716. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_quiet_hours.py +0 -0
  717. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_quiet_hours_store_2146.py +0 -0
  718. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reap_merged_sessions.py +0 -0
  719. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reap_stale_interactive_tick.py +0 -0
  720. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile.py +0 -0
  721. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_branch.py +0 -0
  722. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_completions.py +0 -0
  723. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  724. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_merges.py +0 -0
  725. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_no_agent_record.py +0 -0
  726. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_tick.py +0 -0
  727. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reconcile_usage_limit_done.py +0 -0
  728. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_refine_chat.py +0 -0
  729. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_cordon_2101.py +0 -0
  730. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  731. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_cordon_deadlock_2240.py +0 -0
  732. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_cordon_stuck_2490.py +0 -0
  733. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_propagate.py +0 -0
  734. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_propagate_threshold.py +0 -0
  735. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_roll_between_legs_2854.py +0 -0
  736. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_roll_window_handoff.py +0 -0
  737. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_unified_1242.py +0 -0
  738. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_verify.py +0 -0
  739. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_release_window.py +0 -0
  740. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_remote_auto_prune.py +0 -0
  741. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_remote_interactive_reaper.py +0 -0
  742. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_repo_add.py +0 -0
  743. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_repo_edit_2220.py +0 -0
  744. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_repo_graph_fleet_2237.py +0 -0
  745. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_repo_onboard_2220.py +0 -0
  746. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_report_result_push.py +0 -0
  747. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_reports.py +0 -0
  748. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_retry.py +0 -0
  749. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_retry_advisory_1606.py +0 -0
  750. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_retry_type_1636.py +0 -0
  751. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_revalidate.py +0 -0
  752. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review.py +0 -0
  753. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_end_review_without_verdict.py +0 -0
  754. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_parse_failure_diagnostic.py +0 -0
  755. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_reaffirm.py +0 -0
  756. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_state.py +0 -0
  757. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_verdict_backstop.py +0 -0
  758. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_verdict_override_audit.py +0 -0
  759. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_verdict_relay.py +0 -0
  760. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_review_zero_commits.py +0 -0
  761. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_scoped_review_wiring.py +0 -0
  762. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_scorecard.py +0 -0
  763. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_self_health.py +0 -0
  764. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_serve.py +0 -0
  765. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_serve_app_board_trim.py +0 -0
  766. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_serve_rest_routes.py +0 -0
  767. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_session.py +0 -0
  768. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_slice_issue_attribution.py +0 -0
  769. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_smoke.py +0 -0
  770. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_smoke_live_checkout_restore.py +0 -0
  771. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_smoke_workflow.py +0 -0
  772. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_spend_ceiling.py +0 -0
  773. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_spend_ceiling_coordinator.py +0 -0
  774. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_split.py +0 -0
  775. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_split_work.py +0 -0
  776. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_sql_dialect.py +0 -0
  777. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_sqlite_connect_ratchet.py +0 -0
  778. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stage_projection.py +0 -0
  779. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stale_busy_reviewer_697.py +0 -0
  780. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stalled_pipeline.py +0 -0
  781. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_state.py +0 -0
  782. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_state_review_findings_daemon.py +0 -0
  783. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_status_fleet_footer.py +0 -0
  784. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stop_1567.py +0 -0
  785. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_store_contract.py +0 -0
  786. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_store_migrate.py +0 -0
  787. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stuck.py +0 -0
  788. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  789. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_terminal_command.py +0 -0
  790. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_author.py +0 -0
  791. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_chat.py +0 -0
  792. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_orchestrator.py +0 -0
  793. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_report.py +0 -0
  794. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_verdict_parsing.py +0 -0
  795. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_test_verdict_transcript_floor.py +0 -0
  796. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_text_io_encoding_audit.py +0 -0
  797. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_thin_client_board_audit.py +0 -0
  798. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_thin_client_config_load_1080.py +0 -0
  799. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_thin_client_daemon_routing_906.py +0 -0
  800. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_tmux_host.py +0 -0
  801. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_tmux_session.py +0 -0
  802. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_transcript_floor.py +0 -0
  803. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_usage.py +0 -0
  804. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_usage_limits.py +0 -0
  805. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_usage_rollup.py +0 -0
  806. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_venv_live_install_2121.py +0 -0
  807. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_version_single_source.py +0 -0
  808. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_watch.py +0 -0
  809. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  810. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_env_venv_isolation.py +0 -0
  811. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_events.py +0 -0
  812. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_image_pin_sync.py +0 -0
  813. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_safety.py +0 -0
  814. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worker_test_scoping.py +0 -0
  815. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worktree.py +0 -0
  816. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  817. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/tests/test_write_parity.py +0 -0
  818. {code_coordinator-0.5.311 → code_coordinator-0.5.313}/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.311
3
+ Version: 0.5.313
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.311
3
+ Version: 0.5.313
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.311",
2
+ "tag": "0.5.313",
3
3
  "distance": 0,
4
- "node": "g8003167b7c6ac292c1b0e3a06e71cc4dd08761b2",
4
+ "node": "g55f6fe539f84cd3b47398af2d29c746352db15e2",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -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(
@@ -2319,10 +2319,26 @@ def _roll_tui(machine, *, local_name: str | None) -> tuple[bool | None, str]:
2319
2319
  (:func:`coord.tui_release.fetch_latest_release_tag`) — that is the
2320
2320
  :data:`~coord.release_propagate.CHANNEL_TUI` channel doing its own version
2321
2321
  selection, not this run guessing across a channel boundary.
2322
+
2323
+ #2981 — AN EMPTY CHANNEL IS NOT A FAILED ROLL.
2324
+ A channel with zero releases/tags 404s on every ``coord tui update``
2325
+ forever, until someone cuts a first release — that is a fact about
2326
+ ``coord-tui``'s Releases, not about whatever this host just attempted.
2327
+ ``coord tui update`` exits :data:`~coord.commands.tui.EXIT_EMPTY_CHANNEL`
2328
+ specifically for that case (``EmptyReleaseChannelError``, raised at the
2329
+ source in :func:`coord.tui_release.fetch_latest_release_tag`), so this
2330
+ reads that exact exit code and returns ``ok=None`` — the same "no channel
2331
+ to roll" treatment already given to a remote host above, which
2332
+ :func:`coord.release_propagate.scope_verification` excludes from the
2333
+ gate that ``--rollback-on-red`` acts on. A *genuine* failure (a real
2334
+ release exists but the asset/checksum/install step fails) still exits
2335
+ ``1`` here and stays ``ok=False`` — still blocking, still eligible to
2336
+ trigger a rollback.
2322
2337
  """
2323
2338
  import subprocess # noqa: PLC0415
2324
2339
 
2325
2340
  from coord import release_propagate as rp # noqa: PLC0415
2341
+ from coord.commands.tui import EXIT_EMPTY_CHANNEL # noqa: PLC0415
2326
2342
 
2327
2343
  if local_name is None or machine.name != local_name:
2328
2344
  return None, (
@@ -2343,7 +2359,13 @@ def _roll_tui(machine, *, local_name: str | None) -> tuple[bool | None, str]:
2343
2359
  if installed
2344
2360
  else f"coord-tui updated from the {rp.CHANNEL_TUI} channel"
2345
2361
  )
2346
- return False, (proc.stderr or proc.stdout or f"exit {proc.returncode}").strip()[:300]
2362
+ detail = (proc.stderr or proc.stdout or f"exit {proc.returncode}").strip()[:300]
2363
+ if proc.returncode == EXIT_EMPTY_CHANNEL:
2364
+ return None, (
2365
+ f"{rp.CHANNEL_TUI} channel has no published release yet — "
2366
+ f"nothing to install, not a roll failure (#2981): {detail}"
2367
+ )
2368
+ return False, detail
2347
2369
 
2348
2370
 
2349
2371
  def _installed_tui_version(stdout: str) -> str | None:
@@ -49,6 +49,7 @@ from coord.tui_release import (
49
49
  DEFAULT_INSTALL_PATH,
50
50
  DEFAULT_REPO,
51
51
  DEV_BUILD_SENTINEL_VERSION,
52
+ EmptyReleaseChannelError,
52
53
  ReleaseAssetNotFoundError,
53
54
  UnsupportedPlatformError,
54
55
  detect_target,
@@ -63,6 +64,15 @@ from coord.tui_release import (
63
64
  sha256_file,
64
65
  )
65
66
 
67
+ #: `tui update`'s exit code when the channel has never published a release
68
+ #: (#2981) — distinct from the generic ``1`` used for every other failure so
69
+ #: `coord/commands/release.py`'s `_roll_tui` can tell "nothing to install
70
+ #: yet" apart from "the roll actually failed" by exit code alone, with no
71
+ #: string-matching of the error message. Kept here (not in `tui_release.py`)
72
+ #: because it is a detail of *this command's* process-exit contract, the
73
+ #: same reason `3` (the dev-build refusal below) lives here too.
74
+ EXIT_EMPTY_CHANNEL = 4
75
+
66
76
 
67
77
  def _dest_path(dest: str | None) -> Path:
68
78
  return Path(dest).expanduser() if dest else Path(DEFAULT_INSTALL_PATH).expanduser()
@@ -310,6 +320,15 @@ def tui_update(
310
320
  target_version = fetch_latest_release_tag(
311
321
  repo=repo, api_base=api_base, timeout=timeout
312
322
  )
323
+ except EmptyReleaseChannelError as exc:
324
+ # #2981: this channel has never published a release -- there is
325
+ # nothing to install, but that is a fact about the CHANNEL, not
326
+ # evidence that this run's attempt failed. A distinct exit code
327
+ # (rather than the generic `1` below) lets a caller such as
328
+ # `coord release propagate` grade the two differently without
329
+ # parsing this message.
330
+ click.echo(f"error: {exc}", err=True)
331
+ sys.exit(EXIT_EMPTY_CHANNEL)
313
332
  except Exception as exc: # noqa: BLE001 -- surface any network/HTTP failure plainly
314
333
  click.echo(
315
334
  f"error: could not resolve coord-tui's latest release from "
@@ -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
  ]
@@ -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
@@ -127,6 +127,25 @@ class ReleaseAssetNotFoundError(RuntimeError):
127
127
  """The release exists but doesn't carry the asset this host needs."""
128
128
 
129
129
 
130
+ class EmptyReleaseChannelError(RuntimeError):
131
+ """The channel has never published a release at all (#2981).
132
+
133
+ Distinct from :class:`ReleaseAssetNotFoundError` on purpose: that one
134
+ means a real release exists but is missing something (an asset, a usable
135
+ ``tag_name``); this one means there is **no release to even look at** —
136
+ ``/releases/latest`` 404s because the repo has zero releases and zero
137
+ tags, not because of a network problem or a malformed one.
138
+
139
+ The distinction matters to callers precisely because the two are not
140
+ graded the same way: "nothing has been published yet" is a fact about
141
+ the channel, not about whatever this run tried to do, so it must never
142
+ be treated as evidence that an install/roll attempt itself failed (see
143
+ ``coord/commands/tui.py``'s ``tui update`` and
144
+ ``coord/commands/release.py``'s ``_roll_tui``, which special-case this
145
+ exact exception type rather than string-matching an error message).
146
+ """
147
+
148
+
130
149
  @dataclass(frozen=True)
131
150
  class ReleaseAsset:
132
151
  name: str
@@ -220,9 +239,21 @@ def fetch_latest_release_tag(
220
239
  invocation, or worse, an accidental match on an unrelated release that
221
240
  happened to share a number.
222
241
 
223
- Raises on any HTTP/network failure, or when the channel has no release at
224
- all — callers decide whether that is fatal (``coord tui update`` has
225
- nothing to install) or a soft "could not check" (``coord tui status``).
242
+ Raises :class:`EmptyReleaseChannelError` when the channel has no release
243
+ at all — a bare 404 from ``/releases/latest`` (GitHub's own signal for
244
+ "this repo has never published a release"), or a 200 whose body carries
245
+ no usable ``tag_name`` (belt-and-braces; not observed from the real API
246
+ but no less "nothing to resolve" if it ever happened). Any *other*
247
+ HTTP/network failure (5xx, auth, timeout, DNS) is left to raise as-is —
248
+ that is a real "could not check", not "nothing published yet".
249
+
250
+ #2981: this distinction is exactly what callers need to decide whether
251
+ an empty channel is fatal (``coord tui update`` has nothing to install)
252
+ or a soft "could not check" (``coord tui status``) *without* also
253
+ swallowing a genuine failure into the same bucket. Before this, a bare
254
+ 404 escaped as an undifferentiated ``httpx.HTTPStatusError`` — callers
255
+ that wanted to tell "empty channel" apart from "the roll failed" had
256
+ nothing but the error message to match against.
226
257
  """
227
258
  import httpx # noqa: PLC0415 — keep import cost off the non-network path
228
259
 
@@ -231,11 +262,16 @@ def fetch_latest_release_tag(
231
262
  if token:
232
263
  headers["Authorization"] = f"Bearer {token}"
233
264
  response = httpx.get(url, timeout=timeout, headers=headers, follow_redirects=True)
265
+ if response.status_code == 404:
266
+ raise EmptyReleaseChannelError(
267
+ f"{repo} has no published release to resolve a latest version "
268
+ f"from (GET {url} -> 404 — this repo has zero releases/tags)"
269
+ )
234
270
  response.raise_for_status()
235
271
  data = response.json()
236
272
  version = normalize_version((data or {}).get("tag_name"))
237
273
  if not version:
238
- raise ReleaseAssetNotFoundError(
274
+ raise EmptyReleaseChannelError(
239
275
  f"{repo} has no published release to resolve a latest version from"
240
276
  )
241
277
  return version
@@ -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,
@@ -1393,6 +1393,99 @@ def test_2026_08_09_a_good_roll_is_not_reverted_by_lanes_it_cannot_roll(
1393
1393
  assert "advisory" in result.output
1394
1394
 
1395
1395
 
1396
+ def test_2981_an_empty_tui_channel_does_not_roll_back_the_python_lanes(
1397
+ valid_config_path, state_dir, no_network, monkeypatch
1398
+ ):
1399
+ """THE #2981 regression, end to end.
1400
+
1401
+ `JDonaghy/coord-tui` had zero releases/tags, so `coord tui update` 404s
1402
+ from `/releases/latest` on every run, forever, until someone cuts a
1403
+ first release. `_roll_tui` on the one host that actually has an install
1404
+ path (`dellserver` in the real incident, `server` here) used to read
1405
+ that 404 exactly like a genuine install failure and report `ok=False` —
1406
+ a BLOCKING result. That put `(tui, server)` inside this run's attempted
1407
+ scope, so a merely-advisory "coord-tui is stale" verify finding on that
1408
+ same host turned blocking, `gate.red` went true, and
1409
+ `--rollback-on-red` reverted the two good python rolls right alongside
1410
+ the tui lane that was never actually broken — a fleet rolled forward
1411
+ and straight back for nothing, twice in a row, per the issue.
1412
+
1413
+ `coord tui update` now exits `EXIT_EMPTY_CHANNEL` for exactly this case
1414
+ (`EmptyReleaseChannelError`, raised at the source in
1415
+ `fetch_latest_release_tag`), and `_roll_tui` reads that exit code back
1416
+ into `ok=None` — the same "no channel to roll" treatment already given
1417
+ to a remote host with no install path at all. `ok=None` excludes the
1418
+ lane from `attempted_scope`, so the verify finding below stays
1419
+ advisory, the gate stays green, and nothing gets rolled back."""
1420
+ from coord import release_verify as rv
1421
+
1422
+ calls = _stub_lanes(monkeypatch)
1423
+
1424
+ def _tui(machine, **kwargs):
1425
+ calls.append(("tui", machine.name))
1426
+ if machine.name == "server":
1427
+ # What `_roll_tui` itself now returns when `coord tui update`
1428
+ # exits `EXIT_EMPTY_CHANNEL` — see its #2981 docstring section.
1429
+ return None, (
1430
+ f"{rp.CHANNEL_TUI} channel has no published release yet — "
1431
+ "nothing to install, not a roll failure (#2981): "
1432
+ "404 Not Found"
1433
+ )
1434
+ return None, "coord-tui is a per-host binary with no remote install path"
1435
+
1436
+ monkeypatch.setattr(release_cmd, "_roll_tui", _tui)
1437
+ _stub_verify(
1438
+ monkeypatch,
1439
+ versions={"laptop": ["0.4.110"], "server": ["0.4.110"]},
1440
+ findings=[
1441
+ # Even a CRIT finding, on the very host that attempted this
1442
+ # lane, must not turn the gate red once the attempt itself is
1443
+ # `ok=None` — that is the whole point of #2052's scoping.
1444
+ rv.Finding(severity="crit", host="server", lane="coord-tui",
1445
+ summary="coord-tui is 40h older than source"),
1446
+ ],
1447
+ )
1448
+ monkeypatch.setattr(
1449
+ release_cmd, "_rollback_host",
1450
+ lambda *a, **k: pytest.fail(
1451
+ "an empty coord-tui channel is not a failed roll — it must "
1452
+ "never trigger --rollback-on-red"
1453
+ ),
1454
+ )
1455
+ result = CliRunner().invoke(
1456
+ main,
1457
+ ["release", "propagate", "--config", str(valid_config_path),
1458
+ "--target", "0.4.111", "--daemon-host", "server"],
1459
+ )
1460
+ assert result.exit_code == 0, result.output
1461
+
1462
+ record = _records(state_dir)[0]
1463
+ # The run completed and verified — it was never reverted.
1464
+ assert record["status"] == rp.STATUS_VERIFIED
1465
+ # The python lanes for BOTH hosts stayed rolled.
1466
+ for host in ("server", "laptop"):
1467
+ python_lane = next(
1468
+ l for l in record["lanes"] if l["lane"] == "python" and l["host"] == host
1469
+ )
1470
+ assert python_lane["ok"] is True, f"{host}'s good python roll must survive"
1471
+
1472
+ # The tui lane itself is recorded as unrollable, not failed.
1473
+ server_tui = next(
1474
+ l for l in record["lanes"] if l["lane"] == "tui" and l["host"] == "server"
1475
+ )
1476
+ assert server_tui["ok"] is None
1477
+ assert server_tui["unrollable"] is True
1478
+
1479
+ # The verify finding is still journalled in full...
1480
+ assert record["verification"]["severity"] == "crit"
1481
+ assert len(record["verification"]["findings"]) == 1
1482
+ # ...but the gate that `--rollback-on-red` actually acts on is clean.
1483
+ assert record["gate"]["severity"] == "ok"
1484
+ assert len(record["gate"]["blocking"]) == 0
1485
+ assert len(record["gate"]["advisory"]) == 1
1486
+ assert "advisory" in result.output
1487
+
1488
+
1396
1489
  def test_the_outside_reach_message_names_the_manual_remedy(
1397
1490
  valid_config_path, state_dir, no_network, monkeypatch
1398
1491
  ):
@@ -2386,3 +2479,47 @@ def test_roll_tui_surfaces_a_failed_update(monkeypatch):
2386
2479
  ok, detail = release_cmd._roll_tui(_machine(name="server"), local_name="server")
2387
2480
  assert ok is False
2388
2481
  assert "could not resolve" in detail
2482
+
2483
+
2484
+ def test_roll_tui_treats_an_empty_channel_as_unrollable_not_failed(monkeypatch):
2485
+ """#2981: `coord tui update` exits `EXIT_EMPTY_CHANNEL` (not the generic
2486
+ `1`) specifically when the channel has never published a release —
2487
+ `JDonaghy/coord-tui`'s actual state, which 404s from `/releases/latest`
2488
+ on every run forever. `_roll_tui` must read that exit code back into
2489
+ `ok=None`, exactly like the "no remote install path" case, so this
2490
+ lane never lands inside a run's attempted scope and can never be
2491
+ grounds for `--rollback-on-red` — see
2492
+ `test_2981_an_empty_tui_channel_does_not_roll_back_the_python_lanes` for
2493
+ the full propagate-level regression this unlocks."""
2494
+ from coord.commands.tui import EXIT_EMPTY_CHANNEL
2495
+
2496
+ class _Proc:
2497
+ returncode = EXIT_EMPTY_CHANNEL
2498
+ stdout = ""
2499
+ stderr = (
2500
+ "error: JDonaghy/coord-tui has no published release to resolve "
2501
+ "a latest version from (GET .../releases/latest -> 404 — this "
2502
+ "repo has zero releases/tags)"
2503
+ )
2504
+
2505
+ monkeypatch.setattr("subprocess.run", lambda argv, **kw: _Proc())
2506
+ ok, detail = release_cmd._roll_tui(_machine(name="server"), local_name="server")
2507
+ assert ok is None
2508
+ assert "not a roll failure" in detail
2509
+ assert "no published release" in detail
2510
+
2511
+
2512
+ def test_roll_tui_a_real_failure_still_blocks_after_the_2981_fix(monkeypatch):
2513
+ """The other half of the #2981 acceptance bar: a GENUINE failure (a real
2514
+ release exists, but e.g. the asset/checksum/install step failed) must
2515
+ still exit the generic `1`, and `_roll_tui` must still report `ok=False`
2516
+ -- still blocking, still eligible to trigger a rollback."""
2517
+ class _Proc:
2518
+ returncode = 1
2519
+ stdout = ""
2520
+ stderr = "error: checksum mismatch for coord-tui-x86_64-linux"
2521
+
2522
+ monkeypatch.setattr("subprocess.run", lambda argv, **kw: _Proc())
2523
+ ok, detail = release_cmd._roll_tui(_machine(name="server"), local_name="server")
2524
+ assert ok is False
2525
+ assert "checksum mismatch" in detail