code-coordinator 0.5.232__tar.gz → 0.5.234__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 (816) hide show
  1. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/code_coordinator.egg-info/SOURCES.txt +3 -0
  4. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/code_coordinator.egg-info/scm_file_list.json +3 -0
  5. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/drive_queue.py +407 -12
  7. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/release.py +226 -166
  8. code_coordinator-0.5.234/coord/deploy/coord-release-window.service +157 -0
  9. {code_coordinator-0.5.232 → code_coordinator-0.5.234/coord}/deploy/coord-release-window.timer +11 -8
  10. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/drive_queue.py +213 -0
  11. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notify.py +85 -15
  12. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/release_window.py +33 -1
  13. code_coordinator-0.5.234/deploy/coord-release-window.service +157 -0
  14. {code_coordinator-0.5.232/coord → code_coordinator-0.5.234}/deploy/coord-release-window.timer +11 -8
  15. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/AGENT_OPERATIONS.md +106 -8
  16. code_coordinator-0.5.234/tests/acceptance/ms-67/manifest.d/2533.yml +64 -0
  17. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-67/manifest.yml +7 -3
  18. code_coordinator-0.5.234/tests/acceptance/ms-67/pull_decomposition_2533.rs +487 -0
  19. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/conftest.py +21 -0
  20. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_release_propagate.py +54 -0
  21. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_release_window.py +230 -211
  22. code_coordinator-0.5.234/tests/test_release_roll_window_handoff.py +795 -0
  23. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_release_window.py +6 -1
  24. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/tests/acceptance.rs +1 -0
  25. code_coordinator-0.5.232/coord/deploy/coord-release-window.service +0 -119
  26. code_coordinator-0.5.232/deploy/coord-release-window.service +0 -119
  27. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.claude/commands/board.md +0 -0
  28. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.claude/commands/complete-session.md +0 -0
  29. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.claude/commands/coordinator.md +0 -0
  30. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.githooks/_lib.sh +0 -0
  31. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.githooks/post-checkout +0 -0
  32. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.githooks/post-commit +0 -0
  33. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.githooks/post-merge +0 -0
  34. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  35. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.github/coord-ci-acceptance.yml +0 -0
  36. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.github/workflows/auto-release.yml +0 -0
  37. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.github/workflows/cargo-test.yml +0 -0
  38. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.github/workflows/publish.yml +0 -0
  39. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.github/workflows/release-tui.yml +0 -0
  40. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.github/workflows/test.yml +0 -0
  41. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/.gitignore +0 -0
  42. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/CLAUDE.md +0 -0
  43. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/GOAL.md +0 -0
  44. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/LICENSE +0 -0
  45. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/MANIFEST.in +0 -0
  46. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/README.md +0 -0
  47. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/code_coordinator.egg-info/dependency_links.txt +0 -0
  48. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/code_coordinator.egg-info/entry_points.txt +0 -0
  49. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/code_coordinator.egg-info/requires.txt +0 -0
  50. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/code_coordinator.egg-info/top_level.txt +0 -0
  51. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/__init__.py +0 -0
  52. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/_board_mapping.py +0 -0
  53. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/acceptance.py +0 -0
  54. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/acceptance_drivers.py +0 -0
  55. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/agent.py +0 -0
  56. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/agent_app.py +0 -0
  57. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/agent_update.py +0 -0
  58. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/agents/opencode/.gitignore +0 -0
  59. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/agents/opencode/agents/work.md +0 -0
  60. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/agents/opencode/routing.jsonc +0 -0
  61. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/approved_work.py +0 -0
  62. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/audit.py +0 -0
  63. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/auto_loop.py +0 -0
  64. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/block_log.py +0 -0
  65. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/board_bool_guard.py +0 -0
  66. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/board_service.py +0 -0
  67. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/board_wire.py +0 -0
  68. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/brain.py +0 -0
  69. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/branch_model.py +0 -0
  70. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/bug_intake.py +0 -0
  71. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/cargo_cache.py +0 -0
  72. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/ci_fix.py +0 -0
  73. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/ci_github.py +0 -0
  74. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/ci_gitlab.py +0 -0
  75. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/ci_store.py +0 -0
  76. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/claim.py +0 -0
  77. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/cli.py +0 -0
  78. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/client.py +0 -0
  79. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/__init__.py +0 -0
  80. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/_common.py +0 -0
  81. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/acceptance.py +0 -0
  82. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/agent_ops.py +0 -0
  83. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/audit.py +0 -0
  84. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/chat.py +0 -0
  85. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/dispatch.py +0 -0
  86. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/dispatch_workers.py +0 -0
  87. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/drive.py +0 -0
  88. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/gate_a.py +0 -0
  89. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/gates.py +0 -0
  90. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/issues.py +0 -0
  91. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/lifecycle.py +0 -0
  92. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/merge.py +0 -0
  93. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/milestone.py +0 -0
  94. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/plan_followup.py +0 -0
  95. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/plans.py +0 -0
  96. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/portal.py +0 -0
  97. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/repo.py +0 -0
  98. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/report.py +0 -0
  99. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/review.py +0 -0
  100. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/scorecard.py +0 -0
  101. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/sessions.py +0 -0
  102. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/setup.py +0 -0
  103. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/status.py +0 -0
  104. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/terminal.py +0 -0
  105. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/test_gate.py +0 -0
  106. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/commands/tui.py +0 -0
  107. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/comments.py +0 -0
  108. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/config.py +0 -0
  109. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/config_reload.py +0 -0
  110. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/confirm_test.py +0 -0
  111. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/conflict_fix.py +0 -0
  112. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/dao.py +0 -0
  113. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/dashboard/__init__.py +0 -0
  114. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/dashboard/fixture.py +0 -0
  115. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/dashboard/index.html +0 -0
  116. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/dashboard/server.py +0 -0
  117. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/dashboard/terminal.py +0 -0
  118. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/db.py +0 -0
  119. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/dead_end.py +0 -0
  120. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/README.md +0 -0
  121. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-agent.service +0 -0
  122. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-db-backup.service +0 -0
  123. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-db-backup.sh +0 -0
  124. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-db-backup.timer +0 -0
  125. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-drive-queue.service +0 -0
  126. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-drive-queue.timer +0 -0
  127. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-notify.service +0 -0
  128. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-notify.timer +0 -0
  129. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-release-propagate.service +0 -0
  130. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-release-propagate.timer +0 -0
  131. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-serve.service +0 -0
  132. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-web-dist-build.service +0 -0
  133. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-web-dist-build.timer +0 -0
  134. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy/coord-web.service +0 -0
  135. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy_manifest.py +0 -0
  136. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deploy_units.py +0 -0
  137. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/deps.py +0 -0
  138. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/diagnose.py +0 -0
  139. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/dispatch.py +0 -0
  140. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/dist_name.py +0 -0
  141. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/drive.py +0 -0
  142. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/drive_state.py +0 -0
  143. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/events.py +0 -0
  144. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/failure_class.py +0 -0
  145. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/filelock.py +0 -0
  146. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/fleet_config_health.py +0 -0
  147. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/forge_availability.py +0 -0
  148. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/freshness.py +0 -0
  149. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/gate_a.py +0 -0
  150. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/gate_b.py +0 -0
  151. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/gate_snapshot.py +0 -0
  152. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/gates.py +0 -0
  153. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/github_ops.py +0 -0
  154. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/goal.py +0 -0
  155. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/graph_health.py +0 -0
  156. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/__init__.py +0 -0
  157. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/aggregate.py +0 -0
  158. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/__init__.py +0 -0
  159. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/agent_install.py +0 -0
  160. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/cargo_targets.py +0 -0
  161. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/claude_binary.py +0 -0
  162. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/coord_web_ci_pin.py +0 -0
  163. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/deploy_lane_facts.py +0 -0
  164. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/disk.py +0 -0
  165. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/fleet_board.py +0 -0
  166. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  167. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/fleet_phantom.py +0 -0
  168. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/fleet_unit_drift.py +0 -0
  169. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/graph.py +0 -0
  170. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/graphify_cli.py +0 -0
  171. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/index_lock.py +0 -0
  172. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/plan_usage.py +0 -0
  173. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/repo_state.py +0 -0
  174. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/spawned_coord.py +0 -0
  175. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/timer_active.py +0 -0
  176. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/toolchain.py +0 -0
  177. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/unit_drift.py +0 -0
  178. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/unit_enablement.py +0 -0
  179. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/checks/worktrees.py +0 -0
  180. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/cli.py +0 -0
  181. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/context.py +0 -0
  182. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/fleet_snapshot.py +0 -0
  183. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/models.py +0 -0
  184. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/pypi.py +0 -0
  185. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/registry.py +0 -0
  186. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/render.py +0 -0
  187. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/health/units.py +0 -0
  188. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/hooks.py +0 -0
  189. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/housekeeping.py +0 -0
  190. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/interactive.py +0 -0
  191. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/issue_store.py +0 -0
  192. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/liveness_auditor.py +0 -0
  193. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/machine_pause.py +0 -0
  194. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/merge_queue.py +0 -0
  195. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/milestone_chat.py +0 -0
  196. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/milestone_dispatch.py +0 -0
  197. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/milestone_gate.py +0 -0
  198. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/milestone_order.py +0 -0
  199. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/mock_author.py +0 -0
  200. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/models.py +0 -0
  201. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/network.py +0 -0
  202. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/new_issue_chat.py +0 -0
  203. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/__init__.py +0 -0
  204. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/baseline.py +0 -0
  205. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/cli.py +0 -0
  206. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/collect.py +0 -0
  207. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/digest.py +0 -0
  208. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/models.py +0 -0
  209. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/predicate.py +0 -0
  210. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/service.py +0 -0
  211. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/store.py +0 -0
  212. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/notifier/transport.py +0 -0
  213. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/openapi.py +0 -0
  214. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/overlap_fence.py +0 -0
  215. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/overlap_predict.py +0 -0
  216. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/parentage.py +0 -0
  217. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/parentage_github.py +0 -0
  218. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/pipeline.py +0 -0
  219. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/plan_parser.py +0 -0
  220. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/plans.py +0 -0
  221. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/platform_paths.py +0 -0
  222. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/portal_bridge.py +0 -0
  223. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/portal_store.py +0 -0
  224. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/portal_sync.py +0 -0
  225. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/pr_body_lint.py +0 -0
  226. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/prereqs.py +0 -0
  227. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/progress.py +0 -0
  228. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/providers/__init__.py +0 -0
  229. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/providers/base.py +0 -0
  230. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/providers/claude.py +0 -0
  231. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/providers/claude_pty.py +0 -0
  232. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/providers/opencode.py +0 -0
  233. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/queue_diagnose.py +0 -0
  234. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/reconcile.py +0 -0
  235. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/reconcile_tick.py +0 -0
  236. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/refine_chat.py +0 -0
  237. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/release_cordon.py +0 -0
  238. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/release_propagate.py +0 -0
  239. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/release_verify.py +0 -0
  240. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/repo_edit.py +0 -0
  241. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/repo_onboard.py +0 -0
  242. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/reports.py +0 -0
  243. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/revalidate.py +0 -0
  244. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/review.py +0 -0
  245. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/scorecard.py +0 -0
  246. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/self_health.py +0 -0
  247. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/serve_app.py +0 -0
  248. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  249. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  250. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  251. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  252. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  253. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/skills/portal-followup/SKILL.md +0 -0
  254. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  255. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  256. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/skills/update-issue/SKILL.md +0 -0
  257. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/smoke.py +0 -0
  258. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/spend_ceiling.py +0 -0
  259. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/split_work.py +0 -0
  260. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/stage_projection.py +0 -0
  261. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/state.py +0 -0
  262. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/test_author.py +0 -0
  263. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/test_chat.py +0 -0
  264. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/test_orchestrator.py +0 -0
  265. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/test_report.py +0 -0
  266. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/tui_release.py +0 -0
  267. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/usage.py +0 -0
  268. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/usage_limits.py +0 -0
  269. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/usage_rollup.py +0 -0
  270. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coord/worker_events.py +0 -0
  271. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/coordinator.example.yml +0 -0
  272. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-agent.service +0 -0
  273. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-db-backup.service +0 -0
  274. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-db-backup.sh +0 -0
  275. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-db-backup.timer +0 -0
  276. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-drive-queue.service +0 -0
  277. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-drive-queue.timer +0 -0
  278. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-notify.service +0 -0
  279. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-notify.timer +0 -0
  280. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-release-propagate.service +0 -0
  281. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-release-propagate.timer +0 -0
  282. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-serve.service +0 -0
  283. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-web-dist-build.service +0 -0
  284. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-web-dist-build.sh +0 -0
  285. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-web-dist-build.timer +0 -0
  286. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-web-rollback.sh +0 -0
  287. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/coord-web.service +0 -0
  288. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/deploy/node-shim.sh +0 -0
  289. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  290. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/ADR_COORD_WEB_CI.md +0 -0
  291. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/ADR_COORD_WEB_DIST.md +0 -0
  292. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/ARCHITECTURE.md +0 -0
  293. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/ARCH_SECURITY_GATES.md +0 -0
  294. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/COCKPIT.md +0 -0
  295. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/CONTROL_CENTER.md +0 -0
  296. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/COST_DISCIPLINE.md +0 -0
  297. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/CROSS_PLATFORM.md +0 -0
  298. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/CUSTOMER_PORTAL.md +0 -0
  299. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/DRIVE_QUEUE.md +0 -0
  300. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/EPHEMERAL_WORKERS.md +0 -0
  301. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/FORGE_MIGRATION.md +0 -0
  302. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/GRAPHIFY_SETUP.md +0 -0
  303. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/ISSUE_GUIDANCE.md +0 -0
  304. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/MAC_MINI.md +0 -0
  305. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  306. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/NOTIFIER.md +0 -0
  307. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/OPENCODE_VERIFICATION.md +0 -0
  308. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/OPERATING_GOTCHAS.md +0 -0
  309. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/ORACLE_LOOP.md +0 -0
  310. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/PHONE_WEBAPP.md +0 -0
  311. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/PIPELINE_V2.md +0 -0
  312. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/PLATFORM_EVOLUTION.md +0 -0
  313. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/SECOND_BACKEND.md +0 -0
  314. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/STORE_SERVICE.md +0 -0
  315. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  316. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/WEB_CONTROL_CENTER.md +0 -0
  317. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/WSL_WINDOWS_WORKER.md +0 -0
  318. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/mocks/web/README.md +0 -0
  319. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/mocks/web/_tokens.css +0 -0
  320. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/mocks/web/issue-detail.html +0 -0
  321. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/mocks/web/pipeline-narrow.html +0 -0
  322. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/docs/mocks/web/pipeline-wide.html +0 -0
  323. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/graphify-out/.gitignore +0 -0
  324. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/install-agent.sh +0 -0
  325. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/pyproject.toml +0 -0
  326. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/audit_review_verdict_overrides.py +0 -0
  327. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  328. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/build-worker-image.sh +0 -0
  329. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/coordinator-machine.py +0 -0
  330. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/epic-down.sh +0 -0
  331. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/epic-up.sh +0 -0
  332. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/preflight.sh +0 -0
  333. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/provision-worker.sh +0 -0
  334. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  335. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  336. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/azure-workers/verify-github-token.sh +0 -0
  337. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/check_gh_argv_containment.py +0 -0
  338. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/codegen.py +0 -0
  339. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/coord-test-runner.sh +0 -0
  340. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/drive-batch.sh +0 -0
  341. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/gen_board_fixture.py +0 -0
  342. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/gen_mock_index.py +0 -0
  343. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/next_release_tag.py +0 -0
  344. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/run_tests_in_populated_home.sh +0 -0
  345. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/run_tests_without_gh.sh +0 -0
  346. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/smoke_437_interactive.py +0 -0
  347. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/verify_878_review_capture.py +0 -0
  348. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/verify_release_published.py +0 -0
  349. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/scripts/verify_release_wheel.py +0 -0
  350. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/setup.cfg +0 -0
  351. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/SMOKE_SET.md +0 -0
  352. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/__init__.py +0 -0
  353. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  354. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-33/contract.md +0 -0
  355. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-33/manifest.yml +0 -0
  356. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  357. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  358. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  359. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  360. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-37/conftest.py +0 -0
  361. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-37/contract.md +0 -0
  362. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-37/manifest.yml +0 -0
  363. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  364. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  365. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/contract.md +0 -0
  366. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/manifest.yml +0 -0
  367. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  368. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  369. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  370. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  371. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  372. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  373. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  374. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  375. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  376. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  377. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-51/contract.md +0 -0
  378. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  379. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  380. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-51/manifest.yml +0 -0
  381. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  382. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-51/tsconfig.json +0 -0
  383. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  384. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  385. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  386. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/contract.md +0 -0
  387. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  388. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/manifest.yml +0 -0
  389. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  390. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  391. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  392. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  393. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  394. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  395. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  396. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  397. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  398. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  399. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  400. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  401. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-67/contract.md +0 -0
  402. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  403. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  404. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  405. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  406. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  407. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  408. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/board-pipeline-basic.json +0 -0
  409. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  410. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  411. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  412. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  413. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/playwright/all_pass.json +0 -0
  414. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  415. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/playwright/mixed_fail.json +0 -0
  416. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  417. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  418. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/playwright/skip.json +0 -0
  419. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/playwright/truncated.json +0 -0
  420. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  421. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  422. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  423. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  424. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  425. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  426. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  427. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  428. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_acceptance.py +0 -0
  429. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_acceptance_drivers.py +0 -0
  430. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent.py +0 -0
  431. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_api_error.py +0 -0
  432. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_app.py +0 -0
  433. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_branch_base.py +0 -0
  434. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_branch_capture.py +0 -0
  435. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_config_free_1712.py +0 -0
  436. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_deploy_units_endpoint.py +0 -0
  437. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_dirty_worktree.py +0 -0
  438. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  439. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_graph_self_heal.py +0 -0
  440. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_health_h3.py +0 -0
  441. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_idle_restart.py +0 -0
  442. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_push_failure.py +0 -0
  443. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_reap.py +0 -0
  444. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_repos_and_pull.py +0 -0
  445. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_restart_services_endpoint.py +0 -0
  446. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_skills_self_heal.py +0 -0
  447. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_startup_diagnostics.py +0 -0
  448. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_update.py +0 -0
  449. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_update_bluegreen.py +0 -0
  450. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_usage_limit.py +0 -0
  451. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_agent_zero_commit.py +0 -0
  452. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_ambient_home_isolation.py +0 -0
  453. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_approve_reject_plan.py +0 -0
  454. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_approve_usage_gate.py +0 -0
  455. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_approved_work_2532.py +0 -0
  456. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_assignment_already_recorded_daemon.py +0 -0
  457. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_audit_log.py +0 -0
  458. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_audit_outcome.py +0 -0
  459. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_audit_query.py +0 -0
  460. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_auto_loop.py +0 -0
  461. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_auto_release_publish_2035.py +0 -0
  462. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_base_checkout_restore.py +0 -0
  463. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_block_log.py +0 -0
  464. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_board_cap_762.py +0 -0
  465. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_board_fixture.py +0 -0
  466. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_board_read_path.py +0 -0
  467. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_board_service.py +0 -0
  468. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_board_state.py +0 -0
  469. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_board_wire.py +0 -0
  470. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_brain.py +0 -0
  471. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_branch_model.py +0 -0
  472. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_bug_intake.py +0 -0
  473. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_build_worker_image_env_update.py +0 -0
  474. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cargo_cache.py +0 -0
  475. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_check_gh_argv_containment.py +0 -0
  476. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_ci_acceptance_gate_1950.py +0 -0
  477. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_ci_fix.py +0 -0
  478. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_ci_gitlab.py +0 -0
  479. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_ci_parity_2091.py +0 -0
  480. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_ci_store.py +0 -0
  481. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_claim.py +0 -0
  482. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_acceptance.py +0 -0
  483. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_assign.py +0 -0
  484. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  485. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_assign_interactive_remote.py +0 -0
  486. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_assign_provider.py +0 -0
  487. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  488. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_audit.py +0 -0
  489. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_chat_continue.py +0 -0
  490. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_decide.py +0 -0
  491. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_diagnose_config_provenance.py +0 -0
  492. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_diagnose_forge_availability.py +0 -0
  493. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_diagnose_graph.py +0 -0
  494. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_diagnose_self.py +0 -0
  495. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_doctor.py +0 -0
  496. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_doctor_config_free_1801.py +0 -0
  497. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  498. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_drive.py +0 -0
  499. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_drive_queue.py +0 -0
  500. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_escalate.py +0 -0
  501. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_fix_headless_review.py +0 -0
  502. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_gate_a.py +0 -0
  503. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_install_drift.py +0 -0
  504. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_install_skills.py +0 -0
  505. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_issue_create_label.py +0 -0
  506. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_issue_reopen.py +0 -0
  507. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_merge.py +0 -0
  508. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_milestone_assign.py +0 -0
  509. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_milestone_capture.py +0 -0
  510. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_milestone_chat_add_child.py +0 -0
  511. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_milestone_dispatch.py +0 -0
  512. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_milestone_gate_b.py +0 -0
  513. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_milestone_gate_c.py +0 -0
  514. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_milestone_order.py +0 -0
  515. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  516. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_milestone_ship.py +0 -0
  517. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_network.py +0 -0
  518. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_new_issue_chat.py +0 -0
  519. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_plans.py +0 -0
  520. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_portal.py +0 -0
  521. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_pull_artifact.py +0 -0
  522. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_queue.py +0 -0
  523. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_reattach_sessions.py +0 -0
  524. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_refine_board.py +0 -0
  525. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_release_preflight.py +0 -0
  526. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_repo_2220.py +0 -0
  527. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_scorecard.py +0 -0
  528. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_set_review_findings.py +0 -0
  529. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_status_advisory_terminal.py +0 -0
  530. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_status_merge_queue.py +0 -0
  531. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_status_provider.py +0 -0
  532. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_status_review_finalizing.py +0 -0
  533. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_status_test_failed_tag.py +0 -0
  534. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_status_usage_limit.py +0 -0
  535. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_sync_comments_873.py +0 -0
  536. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_test_plan.py +0 -0
  537. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_track.py +0 -0
  538. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_tui_update.py +0 -0
  539. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cli_wait.py +0 -0
  540. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_client_base_install.py +0 -0
  541. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_comments.py +0 -0
  542. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_completion_summary.py +0 -0
  543. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_config.py +0 -0
  544. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_config_acceptance.py +0 -0
  545. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_config_audit.py +0 -0
  546. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_config_pricing.py +0 -0
  547. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  548. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_config_usage_gate.py +0 -0
  549. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_confirm_test.py +0 -0
  550. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_conflict_fix.py +0 -0
  551. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_conflict_fix_semantic.py +0 -0
  552. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_coord_test.py +0 -0
  553. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_coord_test_runner_baseline.py +0 -0
  554. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_coord_test_runner_populated_home.py +0 -0
  555. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_coord_test_runner_routing.py +0 -0
  556. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_coord_test_runner_toolchain.py +0 -0
  557. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_coord_web_sse_restart_live.py +0 -0
  558. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_coordinator_machine.py +0 -0
  559. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_cross_platform_imports.py +0 -0
  560. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_dashboard.py +0 -0
  561. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_dashboard_fixture.py +0 -0
  562. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_dashboard_terminal.py +0 -0
  563. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_dashboard_terminal_live.py +0 -0
  564. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_db.py +0 -0
  565. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_dead_end.py +0 -0
  566. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_deploy_coord_db_backup.py +0 -0
  567. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_deploy_coord_web_dist.py +0 -0
  568. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_deploy_coord_web_rollback.py +0 -0
  569. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_deploy_drive_queue_unit.py +0 -0
  570. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_deploy_manifest.py +0 -0
  571. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_deploy_notify_unit.py +0 -0
  572. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_deploy_units_lane.py +0 -0
  573. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_deploy_web_unit.py +0 -0
  574. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_deps.py +0 -0
  575. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_diagnose.py +0 -0
  576. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_dispatch.py +0 -0
  577. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_dispatch_target_validation.py +0 -0
  578. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_dist_name.py +0 -0
  579. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_done_housekeeping.py +0 -0
  580. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_drive.py +0 -0
  581. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_drive_queue.py +0 -0
  582. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_drive_state.py +0 -0
  583. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_drive_tmux.py +0 -0
  584. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_epic_up_capability_detection.py +0 -0
  585. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  586. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_epic_up_image_provenance.py +0 -0
  587. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_errors.py +0 -0
  588. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_events.py +0 -0
  589. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_failure_class.py +0 -0
  590. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_filelock.py +0 -0
  591. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  592. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_fix_of_force_override.py +0 -0
  593. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_fleet_config_health.py +0 -0
  594. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_fleet_health_probes.py +0 -0
  595. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_fleet_health_snapshot.py +0 -0
  596. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_forge_availability.py +0 -0
  597. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_freshness.py +0 -0
  598. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_gate_a.py +0 -0
  599. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_gate_b.py +0 -0
  600. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_gate_snapshot_staleness.py +0 -0
  601. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_gates.py +0 -0
  602. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  603. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_gen_mock_index.py +0 -0
  604. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_generated_types_fixture.py +0 -0
  605. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_github_ops.py +0 -0
  606. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_goal.py +0 -0
  607. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_graph_health.py +0 -0
  608. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_graph_selfheal_absent_2237.py +0 -0
  609. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_handoff.py +0 -0
  610. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_checks.py +0 -0
  611. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_cli.py +0 -0
  612. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_cli_graph.py +0 -0
  613. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_config.py +0 -0
  614. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_context.py +0 -0
  615. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_coord_web_ci_pin.py +0 -0
  616. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_deploy_lane_facts.py +0 -0
  617. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_incident_regression.py +0 -0
  618. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_pypi.py +0 -0
  619. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_registry.py +0 -0
  620. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_timer_active.py +0 -0
  621. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_toolchain.py +0 -0
  622. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_unit_drift.py +0 -0
  623. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_health_unit_enablement.py +0 -0
  624. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_hooks.py +0 -0
  625. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_human_attended_437.py +0 -0
  626. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_init.py +0 -0
  627. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_integration.py +0 -0
  628. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_interactive_briefing_echo.py +0 -0
  629. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_interactive_pane_log_2541.py +0 -0
  630. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_interactive_prefill_state.py +0 -0
  631. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_interactive_session_relaunch.py +0 -0
  632. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_interactive_test_verdict_backstop.py +0 -0
  633. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_interactive_token_attribution.py +0 -0
  634. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_interactive_worktree.py +0 -0
  635. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_issue_store_seam.py +0 -0
  636. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_liveness_auditor.py +0 -0
  637. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_liveness_notify.py +0 -0
  638. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_machine_pause.py +0 -0
  639. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_merge_queue.py +0 -0
  640. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_merge_verify.py +0 -0
  641. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_milestone_chat.py +0 -0
  642. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_milestone_dispatch.py +0 -0
  643. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_milestone_gate.py +0 -0
  644. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_milestone_order.py +0 -0
  645. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_milestone_seam.py +0 -0
  646. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_mock_author.py +0 -0
  647. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_model_tiering.py +0 -0
  648. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_models.py +0 -0
  649. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_models_config_labels.py +0 -0
  650. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_needs_attention.py +0 -0
  651. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_network.py +0 -0
  652. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_new_issue_chat.py +0 -0
  653. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_next_release_tag.py +0 -0
  654. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_node_shim.py +0 -0
  655. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notifier_baseline.py +0 -0
  656. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notifier_cli.py +0 -0
  657. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notifier_collect.py +0 -0
  658. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notifier_config.py +0 -0
  659. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notifier_drive_seam.py +0 -0
  660. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notifier_isolation.py +0 -0
  661. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notifier_predicate.py +0 -0
  662. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notifier_quiet_hours.py +0 -0
  663. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notifier_service.py +0 -0
  664. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notify.py +0 -0
  665. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_notify_drain.py +0 -0
  666. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_openapi.py +0 -0
  667. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_operational_defaults.py +0 -0
  668. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_overlap_fence.py +0 -0
  669. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_overlap_predict.py +0 -0
  670. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_packaged_deploy_units.py +0 -0
  671. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_parentage.py +0 -0
  672. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_paste_landed.py +0 -0
  673. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_pipeline.py +0 -0
  674. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_plan_followup_approve_plan_command.py +0 -0
  675. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_plan_followup_pr_command.py +0 -0
  676. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_plan_followup_review_command.py +0 -0
  677. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_plan_only.py +0 -0
  678. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_plan_parser.py +0 -0
  679. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_platform_paths.py +0 -0
  680. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_portal_bridge.py +0 -0
  681. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_portal_config.py +0 -0
  682. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_portal_store.py +0 -0
  683. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_portal_sync.py +0 -0
  684. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_pr_body_lint.py +0 -0
  685. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_prereqs.py +0 -0
  686. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_production_db_guard.py +0 -0
  687. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_progress.py +0 -0
  688. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_provider_seam.py +0 -0
  689. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_providers.py +0 -0
  690. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_providers_config_labels.py +0 -0
  691. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_providers_pty.py +0 -0
  692. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_quiet_hours.py +0 -0
  693. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_quiet_hours_store_2146.py +0 -0
  694. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reap_merged_sessions.py +0 -0
  695. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reap_stale_interactive_tick.py +0 -0
  696. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reconcile.py +0 -0
  697. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reconcile_branch.py +0 -0
  698. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reconcile_completions.py +0 -0
  699. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reconcile_merges.py +0 -0
  700. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reconcile_no_agent_record.py +0 -0
  701. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reconcile_tick.py +0 -0
  702. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reconcile_usage_limit_done.py +0 -0
  703. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_refine_chat.py +0 -0
  704. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_release_cordon_2101.py +0 -0
  705. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  706. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_release_cordon_deadlock_2240.py +0 -0
  707. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_release_cordon_stuck_2490.py +0 -0
  708. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_release_propagate.py +0 -0
  709. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_release_unified_1242.py +0 -0
  710. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_release_verify.py +0 -0
  711. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_remote_auto_prune.py +0 -0
  712. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_remote_interactive_reaper.py +0 -0
  713. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_repo_edit_2220.py +0 -0
  714. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_repo_graph_fleet_2237.py +0 -0
  715. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_repo_onboard_2220.py +0 -0
  716. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_report_result_push.py +0 -0
  717. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_reports.py +0 -0
  718. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_retry.py +0 -0
  719. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_retry_advisory_1606.py +0 -0
  720. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_retry_type_1636.py +0 -0
  721. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_revalidate.py +0 -0
  722. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_review.py +0 -0
  723. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_review_end_review_without_verdict.py +0 -0
  724. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_review_parse_failure_diagnostic.py +0 -0
  725. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_review_reaffirm.py +0 -0
  726. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_review_state.py +0 -0
  727. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_review_verdict_backstop.py +0 -0
  728. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_review_verdict_override_audit.py +0 -0
  729. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_review_verdict_relay.py +0 -0
  730. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_review_zero_commits.py +0 -0
  731. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_scoped_review_wiring.py +0 -0
  732. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_scorecard.py +0 -0
  733. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_self_health.py +0 -0
  734. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_serve.py +0 -0
  735. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_serve_app_board_trim.py +0 -0
  736. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_session.py +0 -0
  737. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_slice_issue_attribution.py +0 -0
  738. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_smoke.py +0 -0
  739. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_smoke_live_checkout_restore.py +0 -0
  740. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_smoke_workflow.py +0 -0
  741. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_spend_ceiling.py +0 -0
  742. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_spend_ceiling_coordinator.py +0 -0
  743. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_split.py +0 -0
  744. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_split_work.py +0 -0
  745. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_stage_projection.py +0 -0
  746. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_stalled_pipeline.py +0 -0
  747. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_state.py +0 -0
  748. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_state_review_findings_daemon.py +0 -0
  749. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_status_fleet_footer.py +0 -0
  750. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_stop_1567.py +0 -0
  751. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_stuck.py +0 -0
  752. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_terminal_command.py +0 -0
  753. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_test_author.py +0 -0
  754. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_test_chat.py +0 -0
  755. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_test_orchestrator.py +0 -0
  756. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_test_report.py +0 -0
  757. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_test_verdict_parsing.py +0 -0
  758. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_test_verdict_transcript_floor.py +0 -0
  759. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_thin_client_board_audit.py +0 -0
  760. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_thin_client_config_load_1080.py +0 -0
  761. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_thin_client_daemon_routing_906.py +0 -0
  762. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_tmux_host.py +0 -0
  763. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_tmux_session.py +0 -0
  764. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_transcript_floor.py +0 -0
  765. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_usage.py +0 -0
  766. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_usage_limits.py +0 -0
  767. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_usage_rollup.py +0 -0
  768. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_venv_live_install_2121.py +0 -0
  769. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_version_single_source.py +0 -0
  770. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_watch.py +0 -0
  771. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  772. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_worker_events.py +0 -0
  773. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_worker_image_pin_sync.py +0 -0
  774. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_worker_safety.py +0 -0
  775. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_worker_test_scoping.py +0 -0
  776. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_worktree.py +0 -0
  777. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  778. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/Cargo.lock +0 -0
  779. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/Cargo.toml +0 -0
  780. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/cargo-config-local-quadraui.toml.example +0 -0
  781. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/approved.rs +0 -0
  782. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/audit.rs +0 -0
  783. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/chat.rs +0 -0
  784. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/data.rs +0 -0
  785. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/dialogs.rs +0 -0
  786. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/doc_tabs.rs +0 -0
  787. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/drive.rs +0 -0
  788. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/drive_queue.rs +0 -0
  789. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/escalation.rs +0 -0
  790. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/events.rs +0 -0
  791. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/fixtures.rs +0 -0
  792. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/fleet_health.rs +0 -0
  793. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/fleet_sessions.rs +0 -0
  794. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/fleet_terminals.rs +0 -0
  795. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/format.rs +0 -0
  796. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/milestone_dag.rs +0 -0
  797. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/mod.rs +0 -0
  798. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/msv.rs +0 -0
  799. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/pipeline.rs +0 -0
  800. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/plans.rs +0 -0
  801. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/render.rs +0 -0
  802. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/reports.rs +0 -0
  803. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/sessions.rs +0 -0
  804. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/settings_ui.rs +0 -0
  805. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/sidebar.rs +0 -0
  806. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/terminal.rs +0 -0
  807. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/tests.rs +0 -0
  808. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/types.rs +0 -0
  809. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/app/workspace.rs +0 -0
  810. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/bin/gtk.rs +0 -0
  811. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/commands.rs +0 -0
  812. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/lib.rs +0 -0
  813. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/main.rs +0 -0
  814. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/src/settings.rs +0 -0
  815. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/tests/cli.rs +0 -0
  816. {code_coordinator-0.5.232 → code_coordinator-0.5.234}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.232
3
+ Version: 0.5.234
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.232
3
+ Version: 0.5.234
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
@@ -621,6 +621,7 @@ tests/test_release_cordon_daemon_leads_2176.py
621
621
  tests/test_release_cordon_deadlock_2240.py
622
622
  tests/test_release_cordon_stuck_2490.py
623
623
  tests/test_release_propagate.py
624
+ tests/test_release_roll_window_handoff.py
624
625
  tests/test_release_unified_1242.py
625
626
  tests/test_release_verify.py
626
627
  tests/test_release_window.py
@@ -741,6 +742,8 @@ tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen
741
742
  tests/acceptance/ms-67/approved_items_2532.rs
742
743
  tests/acceptance/ms-67/contract.md
743
744
  tests/acceptance/ms-67/manifest.yml
745
+ tests/acceptance/ms-67/pull_decomposition_2533.rs
746
+ tests/acceptance/ms-67/manifest.d/2533.yml
744
747
  tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen
745
748
  tests/acceptance/ms-67/mocks/approved-items-context-menu.screen
746
749
  tests/acceptance/ms-67/mocks/approved-items-detail.screen
@@ -380,12 +380,14 @@
380
380
  "tests/acceptance/ms-65/tabs_persistence_2286.rs",
381
381
  "tests/acceptance/ms-67/approved_items_2532.rs",
382
382
  "tests/acceptance/ms-67/contract.md",
383
+ "tests/acceptance/ms-67/manifest.d/2533.yml",
383
384
  "tests/acceptance/ms-67/manifest.yml",
384
385
  "tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen",
385
386
  "tests/acceptance/ms-67/mocks/approved-items-context-menu.screen",
386
387
  "tests/acceptance/ms-67/mocks/approved-items-detail.screen",
387
388
  "tests/acceptance/ms-67/mocks/approved-items-empty.screen",
388
389
  "tests/acceptance/ms-67/mocks/approved-items-populated.screen",
390
+ "tests/acceptance/ms-67/pull_decomposition_2533.rs",
389
391
  "tests/acceptance/ms-example/mocks/home-active.html",
390
392
  "tests/conftest.py",
391
393
  "tests/fixtures/board-pipeline-basic.json",
@@ -691,6 +693,7 @@
691
693
  "tests/test_release_cordon_deadlock_2240.py",
692
694
  "tests/test_release_cordon_stuck_2490.py",
693
695
  "tests/test_release_propagate.py",
696
+ "tests/test_release_roll_window_handoff.py",
694
697
  "tests/test_release_unified_1242.py",
695
698
  "tests/test_release_verify.py",
696
699
  "tests/test_release_window.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.232",
2
+ "tag": "0.5.234",
3
3
  "distance": 0,
4
- "node": "geaf0ae75fe41add5924a913f93d8c3a955bb2c8c",
4
+ "node": "g24d0c079b3a206f0037f3385f58eefdf567c593d",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-22"
@@ -52,6 +52,8 @@ from coord.drive_queue import (
52
52
  QUEUE_ALERT_REPO,
53
53
  QUEUE_ALERT_STAGE,
54
54
  RESUME_PROBE_TIMEOUT_SECONDS,
55
+ ROLL_PENDING_DEFAULT_MAX_DEFERRALS,
56
+ ROLL_PENDING_DEFAULT_TTL_SECONDS,
55
57
  STATE_BLOCKED,
56
58
  STATE_DONE,
57
59
  STATE_FAILED,
@@ -63,6 +65,7 @@ from coord.drive_queue import (
63
65
  ProbeResult,
64
66
  QueueEntry,
65
67
  QueueError,
68
+ RollPending,
66
69
  TickPlan,
67
70
  build_board_view,
68
71
  diagnose_blocked_after,
@@ -1034,6 +1037,11 @@ def drive_queue_status(output_json: bool, config_path: Path) -> None:
1034
1037
  counts = _counts(rows)
1035
1038
  alert = _queue_alert()
1036
1039
  held = fired_holds(entries_from_rows(rows))
1040
+ # #2587: read directly from the marker file, not from the last tick's
1041
+ # `TickPlan` — `status` may run between ticks (or on a machine that never
1042
+ # ticks at all), and the marker's own `deferrals`/TTL are exactly what an
1043
+ # operator needs to see this is a DELIBERATE hold, not a stalled queue.
1044
+ roll_pending = read_roll_pending()
1037
1045
 
1038
1046
  if output_json:
1039
1047
  click.echo(
@@ -1057,6 +1065,9 @@ def drive_queue_status(output_json: bool, config_path: Path) -> None:
1057
1065
  }
1058
1066
  for e in held
1059
1067
  ],
1068
+ "roll_pending": (
1069
+ roll_pending.to_dict() if roll_pending is not None else None
1070
+ ),
1060
1071
  }
1061
1072
  )
1062
1073
  )
@@ -1078,6 +1089,19 @@ def drive_queue_status(output_json: bool, config_path: Path) -> None:
1078
1089
  for line in _hold_lines(entry):
1079
1090
  click.echo(line)
1080
1091
  click.echo(" release with: coord drive-queue resume")
1092
+ if roll_pending is not None:
1093
+ # #2587: deliberately its OWN line, not folded into `alert:` below —
1094
+ # this is a benign, self-clearing, EXPECTED state ("the fleet is
1095
+ # about to upgrade itself"), not an anomaly needing operator action,
1096
+ # and #2587 is explicit that a held-for-a-roll queue must never read
1097
+ # as broken.
1098
+ age = max(0.0, time.time() - roll_pending.set_at)
1099
+ click.echo(
1100
+ f"{roll_pending.describe()} — set {age:.0f}s ago, "
1101
+ f"{roll_pending.deferrals}/{roll_pending.max_deferrals} deferrals, "
1102
+ f"launches nothing until the queue empties out or "
1103
+ f"{max(0.0, roll_pending.ttl_seconds - age):.0f}s pass"
1104
+ )
1081
1105
  if alert is not None:
1082
1106
  click.echo(f"alert: {alert.get('reason') or ''}")
1083
1107
  for detail in (alert.get("gate_readings") or "").split(" | "):
@@ -1872,6 +1896,228 @@ def _fetch_editable_drift() -> tuple[str, str] | None:
1872
1896
  return (str(repo_root), shown)
1873
1897
 
1874
1898
 
1899
+ # ── #2587: roll-pending marker store ──────────────────────────────────────────
1900
+ #
1901
+ # A plain JSON file, not a `board_meta` DB row: every reader/writer —
1902
+ # `coord release propagate` / `coord release nightly-window`
1903
+ # (`coord/commands/release.py`), this module's own `tick`, and `coord notify`
1904
+ # (`coord/notify.py`) — runs ONLY on the daemon host in production
1905
+ # (`deploy/coord-release-window.service`'s and `deploy/coord-notify.service`'s
1906
+ # own headers both say so: `coord-drive-queue.timer`/`coord.db` exist there and
1907
+ # nowhere else). There is therefore exactly one process family ever touching
1908
+ # this file, on exactly one machine, and no daemon-routing/thin-client seam
1909
+ # (`coord.board_service`) to plug into — the same reasoning
1910
+ # `coord.machine_pause`'s local pause/cordon store predates its own daemon-aware
1911
+ # half. Kept a standalone file (mirroring `coord.machine_pause`'s
1912
+ # `paused_machines.json`) rather than a new `board_meta` key: unlike a cordon or
1913
+ # a milestone drain, at most one roll is ever pending at a time, so there is no
1914
+ # list to keep, and it lets `coord release propagate`/`nightly-window` set this
1915
+ # marker without importing `coord.state`'s DB machinery at all.
1916
+ _ROLL_PENDING_FILENAME = "roll_pending.json"
1917
+
1918
+
1919
+ def roll_pending_path() -> Path:
1920
+ """Absolute path to the roll-pending marker file.
1921
+
1922
+ ``$COORD_ROLL_PENDING_STATE`` overrides it — the same seam
1923
+ ``coord.notifier.store.state_path`` uses, so a test redirects this store
1924
+ with one env var rather than monkeypatching a private function
1925
+ (``_no_real_pause_store``'s (#2101) heavier-weight approach, from before
1926
+ this seam existed). Never let a test write the OPERATOR'S real
1927
+ ``~/.coord/roll_pending.json`` — a state file a test *can* write is a
1928
+ state file a test *will* write, and this one gates whether the daemon
1929
+ host's drive queue launches anything at all.
1930
+ """
1931
+ import os # noqa: PLC0415
1932
+
1933
+ from coord.platform_paths import default_coord_dir # noqa: PLC0415
1934
+
1935
+ override = os.environ.get("COORD_ROLL_PENDING_STATE")
1936
+ if override:
1937
+ return Path(override).expanduser()
1938
+ return default_coord_dir() / _ROLL_PENDING_FILENAME
1939
+
1940
+
1941
+ def read_roll_pending() -> RollPending | None:
1942
+ """The current marker, or ``None`` when no roll is pending.
1943
+
1944
+ Fail-soft on a missing/corrupt/hand-edited file — same posture
1945
+ :func:`_fetch_cordons` takes on an unreadable cordon store, and for the
1946
+ same reason: a marker this read cannot make sense of must read as "no
1947
+ roll pending" (resume launching), never as a reason to stop the tick.
1948
+ """
1949
+ path = roll_pending_path()
1950
+ try:
1951
+ raw = path.read_text(encoding="utf-8")
1952
+ except FileNotFoundError:
1953
+ return None
1954
+ except OSError as exc:
1955
+ click.echo(
1956
+ f"warning: could not read {path} ({exc}) — treating no roll as pending",
1957
+ err=True,
1958
+ )
1959
+ return None
1960
+ if not raw.strip():
1961
+ return None
1962
+ try:
1963
+ data = _json.loads(raw)
1964
+ except ValueError:
1965
+ click.echo(f"warning: {path} is not valid JSON — ignoring it", err=True)
1966
+ return None
1967
+ if not isinstance(data, dict) or not data:
1968
+ return None
1969
+ try:
1970
+ return RollPending.from_dict(data)
1971
+ except ValueError as exc:
1972
+ click.echo(f"warning: {path} is not a usable roll-pending record ({exc})", err=True)
1973
+ return None
1974
+
1975
+
1976
+ def write_roll_pending(pending: RollPending) -> None:
1977
+ """Persist *pending*, overwriting whatever was there before.
1978
+
1979
+ Used both for the INITIAL set (`coord release propagate`/
1980
+ `nightly-window`) and for this module's own re-write after bumping
1981
+ ``deferrals`` each tick it does not fire the roll.
1982
+
1983
+ Atomic tempfile-then-rename — the same pattern
1984
+ `coord.machine_pause._save_state` uses for its own shared JSON state
1985
+ file. This one has THREE independent process families writing it (this
1986
+ module's own tick, and `coord release propagate`/`nightly-window`) with
1987
+ no cross-process lock between them (#2587 review) — a plain
1988
+ ``write_text`` is a real torn-read window a concurrent
1989
+ :func:`read_roll_pending` could land in, even though that reader's
1990
+ fail-soft parse degrades a torn read to "no marker" rather than raising.
1991
+ """
1992
+ import os # noqa: PLC0415
1993
+ import tempfile # noqa: PLC0415
1994
+
1995
+ path = roll_pending_path()
1996
+ path.parent.mkdir(parents=True, exist_ok=True)
1997
+ payload = _json.dumps(pending.to_dict(), sort_keys=True)
1998
+ fd, tmp_name = tempfile.mkstemp(prefix=".roll_pending.", suffix=".tmp", dir=path.parent)
1999
+ try:
2000
+ with os.fdopen(fd, "w", encoding="utf-8") as fh:
2001
+ fh.write(payload)
2002
+ os.replace(tmp_name, path)
2003
+ except Exception:
2004
+ try:
2005
+ os.unlink(tmp_name)
2006
+ except OSError:
2007
+ pass
2008
+ raise
2009
+
2010
+
2011
+ def clear_roll_pending() -> None:
2012
+ """Drop the marker. A no-op (not an error) when nothing was pending."""
2013
+ path = roll_pending_path()
2014
+ try:
2015
+ path.unlink()
2016
+ except FileNotFoundError:
2017
+ pass
2018
+
2019
+
2020
+ def _fire_pending_roll(*, dry_run: bool = False) -> tuple[bool, str]:
2021
+ """Best-effort ``systemctl --user start --no-block
2022
+ coord-release-window.service`` (#2587 design point 3).
2023
+
2024
+ ``--no-block`` (a.k.a. ``--job-mode=fail`` without ``--wait``, the
2025
+ systemctl default) is the whole point: this must return almost instantly
2026
+ and hand the actual roll off to a unit that outlives THIS tick's process
2027
+ tree, never a synchronous, in-process ``coord release propagate`` call —
2028
+ the roll swaps the venv the tick is executing from, so it must not be a
2029
+ child of the tick's own cgroup or share its lifetime. See
2030
+ ``deploy/coord-release-window.service`` for what that unit actually does.
2031
+
2032
+ Returns ``(fired, detail)``, never raises — a `systemctl` this host
2033
+ cannot run (no systemd, PATH issue, unit not installed) must be a
2034
+ deferral the marker survives to retry next tick, not a crashed tick.
2035
+ """
2036
+ if dry_run:
2037
+ return True, "--dry-run: would run `systemctl --user start --no-block coord-release-window.service`"
2038
+ try:
2039
+ proc = subprocess.run( # noqa: S603, S607 — fixed argv, no shell
2040
+ ["systemctl", "--user", "start", "--no-block", "coord-release-window.service"],
2041
+ capture_output=True,
2042
+ text=True,
2043
+ timeout=30,
2044
+ )
2045
+ except (subprocess.SubprocessError, OSError) as exc:
2046
+ return False, f"{type(exc).__name__}: {exc}"
2047
+ if proc.returncode == 0:
2048
+ return True, "started coord-release-window.service"
2049
+ detail = (proc.stderr or proc.stdout or "").strip() or f"exit {proc.returncode}"
2050
+ return False, detail
2051
+
2052
+
2053
+ def _bump_roll_pending_deferral(pending: RollPending) -> RollPending:
2054
+ """*pending* with ``deferrals`` incremented by one — every OTHER field
2055
+ (including ``set_at``, deliberately never refreshed) unchanged.
2056
+
2057
+ Called once per tick this marker survives without firing — the tick-count
2058
+ half of #2587's bound (see `ROLL_PENDING_DEFAULT_MAX_DEFERRALS`'s
2059
+ comment). `set_at` stays frozen at the ORIGINAL set time so the TTL half
2060
+ of the bound measures real wall-clock age, not "time since last bumped" —
2061
+ a marker re-armed every tick would otherwise never age out on the clock
2062
+ at all, defeating the whole point of having two independent bounds.
2063
+ """
2064
+ import dataclasses as _dataclasses # noqa: PLC0415
2065
+
2066
+ return _dataclasses.replace(pending, deferrals=pending.deferrals + 1)
2067
+
2068
+
2069
+ #: #2587's own escalation key — deliberately NOT `QUEUE_ALERT_REPO`/
2070
+ #: `QUEUE_ALERT_ISSUE`: that single slot is overwritten (or cleared via
2071
+ #: `_clear_queue_alert()`) by THIS SAME tick's `plan.alert` handling further
2072
+ #: down, which would erase an expiry record the instant it was written (the
2073
+ #: marker is already cleared by the time that code runs, so `plan.alert` is
2074
+ #: back to whatever the rest of the tick decided). Mirrors
2075
+ #: `coord.commands.release`'s `WINDOW_ALERT_REPO`/`WINDOW_ALERT_ISSUE`/
2076
+ #: `WINDOW_ALERT_STAGE` — same shape, same reasoning, one escalation slot per
2077
+ #: independent "this must be loud" condition.
2078
+ ROLL_PENDING_ALERT_REPO = "(roll-pending)"
2079
+ ROLL_PENDING_ALERT_ISSUE = 0
2080
+ ROLL_PENDING_ALERT_STAGE = "roll-pending"
2081
+
2082
+
2083
+ def _escalate_roll_pending_expired(pending: RollPending, *, now: float) -> None:
2084
+ """Surface an expired roll-pending marker loudly (#2587's own "never
2085
+ silently held" requirement — mirrors `coord.commands.release.
2086
+ _escalate_window`'s "a skipped/failed night must be loud" reasoning, one
2087
+ level up: here it is a roll that never got its window, not a night that
2088
+ never rolled).
2089
+ """
2090
+ from coord.state import record_drive_escalation # noqa: PLC0415
2091
+
2092
+ age_seconds = max(0.0, now - pending.set_at)
2093
+ reason = (
2094
+ f"roll-pending for v{pending.target_version} expired without reaching "
2095
+ f"a quiescent window ({age_seconds:.0f}s elapsed / {pending.deferrals} "
2096
+ "tick(s) deferred) — resuming normal launching (#2587: a pending "
2097
+ "roll must never hold the queue down indefinitely)"
2098
+ )
2099
+ click.echo(f"warning: {reason}", err=True)
2100
+ try:
2101
+ record_drive_escalation(
2102
+ ROLL_PENDING_ALERT_REPO,
2103
+ ROLL_PENDING_ALERT_ISSUE,
2104
+ stage=ROLL_PENDING_ALERT_STAGE,
2105
+ reason=reason,
2106
+ gate_readings=(
2107
+ f"target_version={pending.target_version} | reason={pending.reason} | "
2108
+ f"ttl_seconds={pending.ttl_seconds} | "
2109
+ f"deferrals={pending.deferrals}/{pending.max_deferrals}"
2110
+ ),
2111
+ proposed_command=(
2112
+ f"coord release propagate --target {pending.target_version}"
2113
+ ),
2114
+ )
2115
+ except Exception as exc: # noqa: BLE001 — the stderr line above is the
2116
+ # floor; an escalation table that cannot be written must not take
2117
+ # the message down with it.
2118
+ click.echo(f" (could not record the roll-pending escalation: {exc})", err=True)
2119
+
2120
+
1875
2121
  def _fetch_board_view() -> BoardView:
1876
2122
  """Board + live drive sessions, typed.
1877
2123
 
@@ -2842,6 +3088,24 @@ def drive_queue_tick(
2842
3088
  safe to run with the periodic timer stopped — see
2843
3089
  `docs/AGENT_OPERATIONS.md`'s propagation section for why that combination
2844
3090
  used to deadlock.
3091
+
3092
+ #2587: when a fleet roll is pending (`coord release propagate`/
3093
+ `nightly-window` set the marker instead of draining — see
3094
+ `coord.drive_queue.RollPending`), this tick refuses to LAUNCH, whatever
3095
+ `--max-parallel` says — the same capacity-0 posture `--reconcile-only`
3096
+ gives #2110 — and, once THIS tick's own reconciliation empties the queue
3097
+ out (zero entries still occupying a slot), fires the roll
3098
+ (`systemctl --user start --no-block coord-release-window.service`).
3099
+ Unlike an EXPLICIT `--reconcile-only`/`--max-parallel 0` run, a pending
3100
+ roll does not also skip the #2350 direct-merge fast path: merging an
3101
+ already-fully-approved entry is not "launching new work", and letting it
3102
+ proceed frees that entry rather than leaving it queued for the whole
3103
+ span the marker survives. Never stops `coord-drive-queue.timer` to reach
3104
+ the gap — see the marker's own docstring for why that would reproduce
3105
+ #2569. Firing the roll does NOT clear the marker itself — see
3106
+ `RollPending`'s own docstring for why that clear belongs solely to the
3107
+ spawned `coord-release-window.service`, once it has actually confirmed
3108
+ the roll.
2845
3109
  """
2846
3110
  from coord.filelock import FileLock, LockBusy, drive_queue_lock_path # noqa: PLC0415
2847
3111
  from coord.state import list_drive_queue, update_drive_queue_entry # noqa: PLC0415
@@ -2860,7 +3124,15 @@ def drive_queue_tick(
2860
3124
  # one flag is a mnemonic for the other rather than a second code path, so
2861
3125
  # there is exactly one way this behaves, not two that could drift apart.
2862
3126
  reconcile_only = reconcile_only or max_parallel == 0
2863
- effective_capacity = 0 if reconcile_only else max_parallel
3127
+ # #2587 review: captured BEFORE a pending roll (below) forces
3128
+ # `reconcile_only` too — this is the operator's own EXPLICIT request,
3129
+ # used only to gate the #2350 merge-only fast path and the #2535
3130
+ # CI-revalidate sweep (both real external actions that flag's contract
3131
+ # promises not to take). A roll-pending marker must NOT also suppress
3132
+ # those: merging an already-approved entry is not "launching new work",
3133
+ # and skipping it would leave a mergeable entry queued for the marker's
3134
+ # entire span for no reason connected to the roll.
3135
+ explicit_reconcile_only = reconcile_only
2864
3136
 
2865
3137
  lock = FileLock(drive_queue_lock_path())
2866
3138
  try:
@@ -2887,6 +3159,28 @@ def drive_queue_tick(
2887
3159
 
2888
3160
  entries = entries_from_rows(list_drive_queue())
2889
3161
 
3162
+ # #2587: is a fleet roll queued for the next inter-drive gap? Read
3163
+ # BEFORE `effective_capacity` is resolved — a live, unexpired marker
3164
+ # forces this tick into the same capacity-0 posture `--reconcile-only`
3165
+ # already gives #2110 (see `RollPending`'s docstring for why this
3166
+ # reuses that path rather than inventing a new one): reconcile,
3167
+ # launch nothing. It does NOT also force `explicit_reconcile_only`
3168
+ # (captured above, BEFORE this), so the #2350 merge-only fast path
3169
+ # below still runs — see this function's own docstring for why.
3170
+ # An EXPIRED marker (TTL or deferral ceiling — `RollPending.expired`)
3171
+ # is dropped right here, loudly (`_escalate_roll_pending_expired`),
3172
+ # and this tick proceeds exactly as if no marker had ever been set —
3173
+ # the #2587 "never hold the queue down indefinitely" requirement.
3174
+ now = time.time()
3175
+ roll_pending = read_roll_pending()
3176
+ if roll_pending is not None and roll_pending.expired(now):
3177
+ _escalate_roll_pending_expired(roll_pending, now=now)
3178
+ clear_roll_pending()
3179
+ roll_pending = None
3180
+ if roll_pending is not None:
3181
+ reconcile_only = True
3182
+ effective_capacity = 0 if reconcile_only else max_parallel
3183
+
2890
3184
  # #1757: run each held gate's `--resume-when` BEFORE deciding
2891
3185
  # anything, and hand the results to `plan_tick` as data so the
2892
3186
  # decision half stays pure. Deliberately skipped under `--dry-run`:
@@ -2983,7 +3277,7 @@ def drive_queue_tick(
2983
3277
  effective_capacity,
2984
3278
  max_parallel_per_repo=max_parallel_per_repo,
2985
3279
  probes=probes,
2986
- now=time.time(),
3280
+ now=now,
2987
3281
  local_host=_local_host_id(),
2988
3282
  exit_reasons=exit_reasons,
2989
3283
  exit_refused=exit_refused,
@@ -2995,9 +3289,19 @@ def drive_queue_tick(
2995
3289
  live_blocked_gate=live_blocked_gate,
2996
3290
  editable_drift=editable_drift,
2997
3291
  merge_only_ready=merge_only_ready,
3292
+ roll_pending_reason=roll_pending.describe() if roll_pending is not None else "",
2998
3293
  )
2999
3294
 
3000
- if reconcile_only:
3295
+ if roll_pending is not None:
3296
+ # #2587: name the marker, not just the generic reconcile-only
3297
+ # notice below — an operator reading the journal should see WHY
3298
+ # without cross-referencing `coord drive-queue status`.
3299
+ click.echo(
3300
+ f"({roll_pending.describe()}: updating queue state, launching "
3301
+ f"nothing until the queue empties out — {plan.occupied} "
3302
+ "entries still occupying a slot)"
3303
+ )
3304
+ elif reconcile_only:
3001
3305
  # #2110: capacity 0 already makes `plan_tick` return before its
3002
3306
  # capacity walk (no deferrals, no queue-level alert, no launch —
3003
3307
  # see its docstring's step 3), so `plan.launch` is guaranteed
@@ -3013,22 +3317,113 @@ def drive_queue_tick(
3013
3317
 
3014
3318
  _apply_writes(plan)
3015
3319
 
3320
+ # #2587: this tick's own reconciliation (just applied above) may have
3321
+ # been the very thing that emptied the queue out — `plan.occupied` is
3322
+ # the POST-reconcile reading (see `RollPending`'s docstring), so this
3323
+ # is the earliest point at which "the inter-drive gap arrived" can be
3324
+ # known. Fires the roll the INSTANT that is true, rather than polling
3325
+ # a separate bounded drain — the whole point of #2587. Skipped
3326
+ # entirely once `dry_run` has already returned above, matching
3327
+ # `--dry-run`'s "mutate nothing" contract for every other write in
3328
+ # this function.
3329
+ if roll_pending is not None:
3330
+ if plan.occupied == 0:
3331
+ fired, detail = _fire_pending_roll()
3332
+ if fired:
3333
+ # #2587 review: this must NOT clear the marker. `fired`
3334
+ # here only means `systemctl --user start --no-block`
3335
+ # returned 0 — i.e. the start request was ACCEPTED — not
3336
+ # that a roll happened; `--no-block` returns the instant
3337
+ # the job is queued, before the spawned unit has even
3338
+ # begun executing, let alone reached its own read of this
3339
+ # marker. Clearing it here, in this same statement, raced
3340
+ # the freshly spawned `coord-release-window.service` out
3341
+ # from under it on every real invocation: that process
3342
+ # (`coord.commands.release.release_nightly_window`, run
3343
+ # with no `--target`) re-resolves the target from scratch
3344
+ # — a PyPI lookup plus a fleet-wide health gather, both
3345
+ # real network I/O — before it ever reaches its own
3346
+ # `existing = read_roll_pending()`. By then this tick's
3347
+ # `clear_roll_pending()` had already run, so `existing`
3348
+ # was always `None` and the spawned process took the "no
3349
+ # marker pending -> (re)set one and return" branch
3350
+ # instead of ever calling `coord release propagate` — the
3351
+ # roll never actually happened, silently, forever.
3352
+ #
3353
+ # The marker now stays exactly as it was (nothing here
3354
+ # rewrites `set_at`/`deferrals` either — this tick spends
3355
+ # no deferral on a successful fire attempt) and is
3356
+ # cleared ONLY by the spawned process itself, and only
3357
+ # once it has confirmed the roll — see
3358
+ # `release_nightly_window`'s "existing marker pending for
3359
+ # THIS target" branch, which attempts `coord release
3360
+ # propagate` and clears the marker on a verified/rolled/
3361
+ # up-to-date outcome. A `systemctl --user start` against
3362
+ # an already-active `Type=oneshot` unit is systemd's own
3363
+ # no-op (see `deploy/coord-release-window.service`), so
3364
+ # re-firing on every subsequent tick while that process
3365
+ # is still mid-run (or has already finished and cleared
3366
+ # the marker, in which case `roll_pending` reads `None`
3367
+ # next tick and this branch is never reached again) costs
3368
+ # nothing. Bounded, as ever, by the marker's own TTL — a
3369
+ # roll that never confirms still self-clears, per
3370
+ # `RollPending.expired`, rather than holding the queue
3371
+ # down waiting for a confirmation that never comes.
3372
+ click.echo(
3373
+ f"requested roll for {roll_pending.describe()}: {detail} "
3374
+ "— marker left in place; coord-release-window.service "
3375
+ "clears it once `coord release propagate` confirms the "
3376
+ "roll"
3377
+ )
3378
+ else:
3379
+ # Could not even hand off to systemd — stays pending, one
3380
+ # deferral spent, retried next tick. Loud (stderr): a
3381
+ # roll that is quiescent-ready but cannot be started is
3382
+ # not the benign "still busy" case below.
3383
+ bumped = _bump_roll_pending_deferral(roll_pending)
3384
+ write_roll_pending(bumped)
3385
+ click.echo(
3386
+ f"roll pending for v{roll_pending.target_version}: queue is "
3387
+ f"quiescent but could not start coord-release-window.service "
3388
+ f"({detail}) — will retry next tick "
3389
+ f"({bumped.deferrals}/{bumped.max_deferrals} deferrals)",
3390
+ err=True,
3391
+ )
3392
+ else:
3393
+ # Still busy — the normal, expected steady state while
3394
+ # waiting for a gap. Quiet on purpose: this is every tick's
3395
+ # cadence (every ~3 minutes in production) until the gap
3396
+ # arrives, same "benign, not a stall" reasoning
3397
+ # `Deferral.benign` already applies to a cordon/repo-limit/
3398
+ # backoff deferral elsewhere in this module.
3399
+ bumped = _bump_roll_pending_deferral(roll_pending)
3400
+ write_roll_pending(bumped)
3401
+
3016
3402
  # #2350: attempt the direct merges `plan_tick` marked `merge_only`,
3017
3403
  # right after the rest of the plan's writes have landed. Skipped
3018
- # under `--reconcile-only` (also forced by `--max-parallel 0`, see
3019
- # `effective_capacity` above) that mode's whole contract is
3020
- # "update queue state, launch nothing", and a live `coord merge
3021
- # --only` attempt is exactly the external action it promises not to
3022
- # take, same posture as the launch subprocess further down.
3023
- if not reconcile_only:
3404
+ # under an EXPLICIT `--reconcile-only`/`--max-parallel 0`
3405
+ # (`explicit_reconcile_only`, captured above before a roll-pending
3406
+ # marker can force plain `reconcile_only`) that mode's whole
3407
+ # contract is "update queue state, launch nothing", and a live
3408
+ # `coord merge --only` attempt is exactly the external action it
3409
+ # promises not to take, same posture as the launch subprocess
3410
+ # further down. Deliberately NOT skipped merely because a roll is
3411
+ # pending (#2587 review): merging an already-fully-approved entry
3412
+ # is not "launching new work" — it is completing work the queue
3413
+ # already decided to do — and letting it proceed frees that entry
3414
+ # instead of leaving it queued, unmerged, for the marker's entire
3415
+ # span for no reason connected to the roll.
3416
+ if not explicit_reconcile_only:
3024
3417
  _run_merge_only_candidates(plan, config_path)
3025
3418
 
3026
3419
  # #2535: independent of the drive-queue plan above (this scans the
3027
3420
  # MERGE queue directly, not drive-queue rows) — a bounded, best-effort
3028
3421
  # CI re-run for any entry blocked solely on stale-but-green checks
3029
- # with an already-approved review. Same `not reconcile_only` posture
3030
- # as the merge-only fast path just above: a `gh run rerun` is a real
3031
- # external action that mode promises not to take.
3422
+ # with an already-approved review. Still gated on the FULL
3423
+ # `reconcile_only` (roll-pending included, unlike the merge-only fast
3424
+ # path just above) a `gh run rerun` is a real external action, and
3425
+ # unlike a direct merge it does not free a queued entry on its own,
3426
+ # so there is no equivalent reason to run it while a roll is pending.
3032
3427
  if not reconcile_only:
3033
3428
  _run_auto_revalidate_checks_stale(config_path)
3034
3429