code-coordinator 0.5.268__tar.gz → 0.5.270__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 (874) hide show
  1. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/drive_queue.py +113 -9
  7. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/release.py +71 -5
  8. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/drive_queue.py +37 -0
  9. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/review.py +108 -2
  10. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_release_propagate.py +31 -0
  11. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_release_window.py +53 -0
  12. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_propagate_threshold.py +56 -0
  13. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_roll_window_handoff.py +93 -0
  14. code_coordinator-0.5.270/tests/test_stale_busy_reviewer_697.py +192 -0
  15. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.claude/commands/board.md +0 -0
  16. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.claude/commands/complete-session.md +0 -0
  17. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.claude/commands/coordinator.md +0 -0
  18. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.githooks/_lib.sh +0 -0
  19. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.githooks/post-checkout +0 -0
  20. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.githooks/post-commit +0 -0
  21. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.githooks/post-merge +0 -0
  22. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.github/coord-ci-acceptance.yml +0 -0
  24. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.github/workflows/auto-release.yml +0 -0
  25. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.github/workflows/cargo-test.yml +0 -0
  26. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.github/workflows/publish.yml +0 -0
  27. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.github/workflows/release-tui.yml +0 -0
  28. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.github/workflows/test.yml +0 -0
  29. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/.gitignore +0 -0
  30. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/CLAUDE.md +0 -0
  31. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/GOAL.md +0 -0
  32. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/LICENSE +0 -0
  33. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/MANIFEST.in +0 -0
  34. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/README.md +0 -0
  35. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/code_coordinator.egg-info/dependency_links.txt +0 -0
  36. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/code_coordinator.egg-info/entry_points.txt +0 -0
  37. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/code_coordinator.egg-info/requires.txt +0 -0
  38. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/code_coordinator.egg-info/top_level.txt +0 -0
  39. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/__init__.py +0 -0
  40. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/_board_mapping.py +0 -0
  41. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/acceptance.py +0 -0
  42. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/acceptance_drivers.py +0 -0
  43. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/agent.py +0 -0
  44. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/approved_work.py +0 -0
  50. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/audit.py +0 -0
  51. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/auto_loop.py +0 -0
  52. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/block_log.py +0 -0
  53. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/board_bool_guard.py +0 -0
  54. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/board_schema.py +0 -0
  55. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/board_service.py +0 -0
  56. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/board_wire.py +0 -0
  57. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/brain.py +0 -0
  58. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/branch_model.py +0 -0
  59. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/bug_intake.py +0 -0
  60. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/cargo_cache.py +0 -0
  61. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/ci_fix.py +0 -0
  62. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/ci_github.py +0 -0
  63. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/ci_gitlab.py +0 -0
  64. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/ci_store.py +0 -0
  65. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/claim.py +0 -0
  66. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/cli.py +0 -0
  67. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/client.py +0 -0
  68. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/_common.py +0 -0
  70. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/acceptance.py +0 -0
  71. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/agent_ops.py +0 -0
  72. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/audit.py +0 -0
  73. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/dispatch.py +0 -0
  75. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/dispatch_workers.py +0 -0
  76. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/drive.py +0 -0
  77. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/gate_a.py +0 -0
  78. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/gates.py +0 -0
  79. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/issues.py +0 -0
  80. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/lifecycle.py +0 -0
  81. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/portal.py +0 -0
  86. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/pr.py +0 -0
  87. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/repo.py +0 -0
  88. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/report.py +0 -0
  89. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/review.py +0 -0
  90. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/scorecard.py +0 -0
  91. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/sessions.py +0 -0
  92. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/setup.py +0 -0
  93. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/status.py +0 -0
  94. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/terminal.py +0 -0
  95. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/test_gate.py +0 -0
  96. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/commands/tui.py +0 -0
  97. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/comments.py +0 -0
  98. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/config.py +0 -0
  99. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/config_reload.py +0 -0
  100. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/confirm_test.py +0 -0
  101. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/conflict_fix.py +0 -0
  102. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/dao.py +0 -0
  103. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/dashboard/__init__.py +0 -0
  104. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/dashboard/fixture.py +0 -0
  105. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/dashboard/index.html +0 -0
  106. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/dashboard/server.py +0 -0
  107. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/dashboard/terminal.py +0 -0
  108. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/db.py +0 -0
  109. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/dead_end.py +0 -0
  110. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/decomposition_chat.py +0 -0
  111. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/README.md +0 -0
  112. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-agent.service +0 -0
  113. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-db-backup.service +0 -0
  114. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-db-backup.sh +0 -0
  115. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-db-backup.timer +0 -0
  116. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-drive-queue.service +0 -0
  117. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-drive-queue.timer +0 -0
  118. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-failure-notify.service +0 -0
  119. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-fleet-watchdog.service +0 -0
  120. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  121. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-notify.service +0 -0
  122. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-notify.timer +0 -0
  123. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-release-propagate.service +0 -0
  124. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-release-propagate.timer +0 -0
  125. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-release-window.service +0 -0
  126. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-release-window.timer +0 -0
  127. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-serve.service +0 -0
  128. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-web-dist-build.service +0 -0
  129. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-web-dist-build.timer +0 -0
  130. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy/coord-web.service +0 -0
  131. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy_manifest.py +0 -0
  132. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deploy_units.py +0 -0
  133. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/deps.py +0 -0
  134. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/diagnose.py +0 -0
  135. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/dispatch.py +0 -0
  136. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/dist_name.py +0 -0
  137. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/drive.py +0 -0
  138. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/drive_state.py +0 -0
  139. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/events.py +0 -0
  140. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/failure_class.py +0 -0
  141. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/filelock.py +0 -0
  142. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/fleet_config_health.py +0 -0
  143. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/forge_availability.py +0 -0
  144. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/freshness.py +0 -0
  145. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/gate_a.py +0 -0
  146. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/gate_b.py +0 -0
  147. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/gate_snapshot.py +0 -0
  148. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/gates.py +0 -0
  149. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/github_ops.py +0 -0
  150. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/github_throttle.py +0 -0
  151. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/goal.py +0 -0
  152. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/graph_health.py +0 -0
  153. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/__init__.py +0 -0
  154. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/aggregate.py +0 -0
  155. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/__init__.py +0 -0
  156. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/agent_install.py +0 -0
  157. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/cargo_targets.py +0 -0
  158. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/claude_binary.py +0 -0
  159. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/coord_web_ci_pin.py +0 -0
  160. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/deploy_lane_facts.py +0 -0
  161. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/disk.py +0 -0
  162. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/fleet_board.py +0 -0
  163. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  164. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/fleet_phantom.py +0 -0
  165. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/fleet_unit_drift.py +0 -0
  166. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/graph.py +0 -0
  167. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/graphify_cli.py +0 -0
  168. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/index_lock.py +0 -0
  169. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/issues_sync_staleness.py +0 -0
  170. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/plan_usage.py +0 -0
  171. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/release_cordon.py +0 -0
  172. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/repo_state.py +0 -0
  173. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/spawned_coord.py +0 -0
  174. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/stalled_pipeline.py +0 -0
  175. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/timer_active.py +0 -0
  176. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/toolchain.py +0 -0
  177. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/unit_drift.py +0 -0
  178. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/unit_enablement.py +0 -0
  179. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/checks/worktrees.py +0 -0
  180. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/cli.py +0 -0
  181. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/context.py +0 -0
  182. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/fleet_snapshot.py +0 -0
  183. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/models.py +0 -0
  184. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/pypi.py +0 -0
  185. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/registry.py +0 -0
  186. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/render.py +0 -0
  187. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/health/units.py +0 -0
  188. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/hooks.py +0 -0
  189. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/housekeeping.py +0 -0
  190. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/interactive.py +0 -0
  191. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/issue_store.py +0 -0
  192. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/issues_sync_status.py +0 -0
  193. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/liveness_auditor.py +0 -0
  194. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/machine_pause.py +0 -0
  195. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/merge_queue.py +0 -0
  196. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/milestone_chat.py +0 -0
  197. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/milestone_dispatch.py +0 -0
  198. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/milestone_gate.py +0 -0
  199. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/milestone_order.py +0 -0
  200. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/mock_author.py +0 -0
  201. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/models.py +0 -0
  202. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/network.py +0 -0
  203. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/new_issue_chat.py +0 -0
  204. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/__init__.py +0 -0
  205. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/baseline.py +0 -0
  206. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/cli.py +0 -0
  207. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/collect.py +0 -0
  208. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/digest.py +0 -0
  209. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/models.py +0 -0
  210. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/predicate.py +0 -0
  211. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/service.py +0 -0
  212. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/store.py +0 -0
  213. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notifier/transport.py +0 -0
  214. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/notify.py +0 -0
  215. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/openapi.py +0 -0
  216. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/overlap_fence.py +0 -0
  217. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/overlap_predict.py +0 -0
  218. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/parentage.py +0 -0
  219. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/parentage_github.py +0 -0
  220. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/pipeline.py +0 -0
  221. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/plan_parser.py +0 -0
  222. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/plans.py +0 -0
  223. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/platform_paths.py +0 -0
  224. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/portal_bridge.py +0 -0
  225. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/portal_store.py +0 -0
  226. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/portal_sync.py +0 -0
  227. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/pr_body_lint.py +0 -0
  228. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/prereqs.py +0 -0
  229. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/progress.py +0 -0
  230. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/providers/__init__.py +0 -0
  231. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/providers/base.py +0 -0
  232. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/providers/claude.py +0 -0
  233. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/providers/claude_pty.py +0 -0
  234. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/providers/opencode.py +0 -0
  235. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/queue_diagnose.py +0 -0
  236. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/reconcile.py +0 -0
  237. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/reconcile_tick.py +0 -0
  238. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/refine_chat.py +0 -0
  239. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/release_cordon.py +0 -0
  240. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/release_propagate.py +0 -0
  241. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/release_verify.py +0 -0
  242. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/release_window.py +0 -0
  243. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/repo_edit.py +0 -0
  244. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/repo_onboard.py +0 -0
  245. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/reports.py +0 -0
  246. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/revalidate.py +0 -0
  247. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/scorecard.py +0 -0
  248. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/self_health.py +0 -0
  249. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/serve_app.py +0 -0
  250. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  251. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  252. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  253. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  254. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  255. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/portal-followup/SKILL.md +0 -0
  256. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/release-now/SKILL.md +0 -0
  257. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  258. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  259. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/skills/update-issue/SKILL.md +0 -0
  260. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/smoke.py +0 -0
  261. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/spend_ceiling.py +0 -0
  262. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/split_work.py +0 -0
  263. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/sql.py +0 -0
  264. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/stage_projection.py +0 -0
  265. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/state.py +0 -0
  266. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/test_author.py +0 -0
  267. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/test_chat.py +0 -0
  268. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/test_orchestrator.py +0 -0
  269. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/test_report.py +0 -0
  270. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/tui_release.py +0 -0
  271. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/usage.py +0 -0
  272. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/usage_limits.py +0 -0
  273. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/usage_rollup.py +0 -0
  274. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coord/worker_events.py +0 -0
  275. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/coordinator.example.yml +0 -0
  276. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-agent.service +0 -0
  277. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-db-backup.service +0 -0
  278. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-db-backup.sh +0 -0
  279. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-db-backup.timer +0 -0
  280. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-drive-queue.service +0 -0
  281. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-drive-queue.timer +0 -0
  282. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-failure-notify.service +0 -0
  283. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-failure-notify.sh +0 -0
  284. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-fleet-watchdog.service +0 -0
  285. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-fleet-watchdog.timer +0 -0
  286. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-notify.service +0 -0
  287. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-notify.timer +0 -0
  288. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-release-propagate.service +0 -0
  289. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-release-propagate.timer +0 -0
  290. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-release-window.service +0 -0
  291. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-release-window.timer +0 -0
  292. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-serve.service +0 -0
  293. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-web-dist-build.service +0 -0
  294. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-web-dist-build.sh +0 -0
  295. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-web-dist-build.timer +0 -0
  296. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-web-rollback.sh +0 -0
  297. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/coord-web.service +0 -0
  298. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/deploy/node-shim.sh +0 -0
  299. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  300. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/ADR_COORD_WEB_CI.md +0 -0
  301. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/ADR_COORD_WEB_DIST.md +0 -0
  302. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/AGENT_OPERATIONS.md +0 -0
  303. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/ARCHITECTURE.md +0 -0
  304. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/ARCH_SECURITY_GATES.md +0 -0
  305. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/COCKPIT.md +0 -0
  306. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/CONTROL_CENTER.md +0 -0
  307. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/COST_DISCIPLINE.md +0 -0
  308. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/CROSS_PLATFORM.md +0 -0
  309. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/CUSTOMER_FACING_APPS.md +0 -0
  310. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/CUSTOMER_PORTAL.md +0 -0
  311. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/DRIVE_QUEUE.md +0 -0
  312. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/EPHEMERAL_WORKERS.md +0 -0
  313. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/FORGE_MIGRATION.md +0 -0
  314. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/GRAPHIFY_SETUP.md +0 -0
  315. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/ISSUE_GUIDANCE.md +0 -0
  316. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/MAC_MINI.md +0 -0
  317. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  318. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/NOTIFIER.md +0 -0
  319. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/OPENCODE_VERIFICATION.md +0 -0
  320. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/OPERATING_GOTCHAS.md +0 -0
  321. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/OPERATOR_GUIDES.md +0 -0
  322. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/ORACLE_LOOP.md +0 -0
  323. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/PHONE_WEBAPP.md +0 -0
  324. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/PIPELINE_V2.md +0 -0
  325. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/PLATFORM_EVOLUTION.md +0 -0
  326. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/SECOND_BACKEND.md +0 -0
  327. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/STORE_SERVICE.md +0 -0
  328. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  329. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/WEB_CONTROL_CENTER.md +0 -0
  330. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/WSL_WINDOWS_WORKER.md +0 -0
  331. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/mocks/web/README.md +0 -0
  332. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/mocks/web/_tokens.css +0 -0
  333. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/mocks/web/issue-detail.html +0 -0
  334. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/mocks/web/pipeline-narrow.html +0 -0
  335. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/docs/mocks/web/pipeline-wide.html +0 -0
  336. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/graphify-out/.gitignore +0 -0
  337. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/install-agent.sh +0 -0
  338. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/pyproject.toml +0 -0
  339. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/audit_review_verdict_overrides.py +0 -0
  340. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  341. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/build-worker-image.sh +0 -0
  342. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/coordinator-machine.py +0 -0
  343. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/epic-down.sh +0 -0
  344. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/epic-up.sh +0 -0
  345. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/preflight.sh +0 -0
  346. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/provision-worker.sh +0 -0
  347. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  348. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  349. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/azure-workers/verify-github-token.sh +0 -0
  350. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/check_gh_argv_containment.py +0 -0
  351. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/codegen.py +0 -0
  352. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/coord-test-runner.sh +0 -0
  353. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/coord-venv-rollback.sh +0 -0
  354. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/drive-batch.sh +0 -0
  355. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/fleet_watchdog.py +0 -0
  356. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/gen_board_fixture.py +0 -0
  357. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/gen_mock_index.py +0 -0
  358. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/next_release_tag.py +0 -0
  359. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/run_tests_in_populated_home.sh +0 -0
  360. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/run_tests_without_gh.sh +0 -0
  361. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/smoke_437_interactive.py +0 -0
  362. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/verify_878_review_capture.py +0 -0
  363. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/verify_release_published.py +0 -0
  364. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/scripts/verify_release_wheel.py +0 -0
  365. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/setup.cfg +0 -0
  366. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/SMOKE_SET.md +0 -0
  367. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/__init__.py +0 -0
  368. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  369. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-33/contract.md +0 -0
  370. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-33/manifest.yml +0 -0
  371. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  372. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  373. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  374. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  375. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-37/conftest.py +0 -0
  376. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-37/contract.md +0 -0
  377. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-37/manifest.yml +0 -0
  378. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  379. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  380. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/contract.md +0 -0
  381. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/manifest.yml +0 -0
  382. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  383. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  384. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  385. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  386. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  387. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  388. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  389. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  390. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  391. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  392. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-51/contract.md +0 -0
  393. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  394. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  395. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-51/manifest.yml +0 -0
  396. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  397. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-51/tsconfig.json +0 -0
  398. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  399. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  400. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  401. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/contract.md +0 -0
  402. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  403. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/manifest.yml +0 -0
  404. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  405. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  406. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  407. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  408. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  409. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  410. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  411. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  412. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  413. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  414. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  415. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  416. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/contract.md +0 -0
  417. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  418. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/manifest.yml +0 -0
  419. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  420. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  421. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  422. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  423. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  424. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  425. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  426. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/conftest.py +0 -0
  427. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/board-pipeline-basic.json +0 -0
  428. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  429. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  430. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  431. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  432. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/playwright/all_pass.json +0 -0
  433. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  434. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/playwright/mixed_fail.json +0 -0
  435. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  436. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  437. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/playwright/skip.json +0 -0
  438. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/playwright/truncated.json +0 -0
  439. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  440. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  441. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  442. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  443. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  444. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  445. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  446. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  447. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_acceptance.py +0 -0
  448. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_acceptance_drivers.py +0 -0
  449. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent.py +0 -0
  450. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_api_error.py +0 -0
  451. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_app.py +0 -0
  452. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_branch_base.py +0 -0
  453. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_branch_capture.py +0 -0
  454. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_config_free_1712.py +0 -0
  455. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_deploy_units_endpoint.py +0 -0
  456. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_dirty_worktree.py +0 -0
  457. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  458. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_graph_self_heal.py +0 -0
  459. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_health_h3.py +0 -0
  460. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_idle_restart.py +0 -0
  461. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_push_failure.py +0 -0
  462. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_reap.py +0 -0
  463. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_repos_and_pull.py +0 -0
  464. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_restart_services_endpoint.py +0 -0
  465. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_skills_self_heal.py +0 -0
  466. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_startup_diagnostics.py +0 -0
  467. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_update.py +0 -0
  468. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_update_bluegreen.py +0 -0
  469. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_usage_limit.py +0 -0
  470. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_agent_zero_commit.py +0 -0
  471. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_ambient_home_isolation.py +0 -0
  472. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_approve_dependency_busy_2804.py +0 -0
  473. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_approve_reject_plan.py +0 -0
  474. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_approve_usage_gate.py +0 -0
  475. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_approved_work_2532.py +0 -0
  476. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_assignment_already_recorded_daemon.py +0 -0
  477. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_audit_log.py +0 -0
  478. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_audit_outcome.py +0 -0
  479. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_audit_query.py +0 -0
  480. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_auto_loop.py +0 -0
  481. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_auto_release_publish_2035.py +0 -0
  482. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_base_checkout_restore.py +0 -0
  483. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_block_log.py +0 -0
  484. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_board_cap_762.py +0 -0
  485. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_board_fixture.py +0 -0
  486. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_board_read_path.py +0 -0
  487. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_board_schema.py +0 -0
  488. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_board_service.py +0 -0
  489. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_board_state.py +0 -0
  490. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_board_wire.py +0 -0
  491. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_brain.py +0 -0
  492. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_branch_model.py +0 -0
  493. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_bug_intake.py +0 -0
  494. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_build_worker_image_env_update.py +0 -0
  495. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cargo_cache.py +0 -0
  496. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_check_gh_argv_containment.py +0 -0
  497. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_ci_acceptance_gate_1950.py +0 -0
  498. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_ci_fix.py +0 -0
  499. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_ci_gitlab.py +0 -0
  500. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_ci_parity_2091.py +0 -0
  501. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_ci_store.py +0 -0
  502. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_claim.py +0 -0
  503. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_claude_md_budget.py +0 -0
  504. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_acceptance.py +0 -0
  505. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_assign.py +0 -0
  506. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  507. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_assign_interactive_remote.py +0 -0
  508. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_assign_provider.py +0 -0
  509. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  510. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_audit.py +0 -0
  511. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_chat_continue.py +0 -0
  512. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_decide.py +0 -0
  513. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_diagnose_config_provenance.py +0 -0
  514. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_diagnose_forge_availability.py +0 -0
  515. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_diagnose_graph.py +0 -0
  516. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_diagnose_self.py +0 -0
  517. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_doctor.py +0 -0
  518. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_doctor_config_free_1801.py +0 -0
  519. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  520. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_drive.py +0 -0
  521. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_drive_queue.py +0 -0
  522. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_escalate.py +0 -0
  523. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_fix_headless_review.py +0 -0
  524. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_gate_a.py +0 -0
  525. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_install_drift.py +0 -0
  526. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_install_skills.py +0 -0
  527. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_issue_comment.py +0 -0
  528. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_issue_create_label.py +0 -0
  529. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_issue_reopen.py +0 -0
  530. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_issue_view_list.py +0 -0
  531. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_merge.py +0 -0
  532. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_milestone_assign.py +0 -0
  533. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_milestone_capture.py +0 -0
  534. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_milestone_chat_add_child.py +0 -0
  535. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_milestone_dispatch.py +0 -0
  536. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_milestone_gate_b.py +0 -0
  537. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_milestone_gate_c.py +0 -0
  538. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_milestone_order.py +0 -0
  539. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  540. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_milestone_ship.py +0 -0
  541. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_network.py +0 -0
  542. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_new_issue_chat.py +0 -0
  543. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_plans.py +0 -0
  544. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_portal.py +0 -0
  545. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_pr.py +0 -0
  546. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_pull_artifact.py +0 -0
  547. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_queue.py +0 -0
  548. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_reattach_sessions.py +0 -0
  549. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_refine_board.py +0 -0
  550. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_release_preflight.py +0 -0
  551. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_repo_2220.py +0 -0
  552. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  553. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_scorecard.py +0 -0
  554. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_set_review_findings.py +0 -0
  555. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_status_advisory_terminal.py +0 -0
  556. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_status_contested_tag.py +0 -0
  557. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_status_merge_queue.py +0 -0
  558. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_status_provider.py +0 -0
  559. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_status_review_finalizing.py +0 -0
  560. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_status_test_failed_tag.py +0 -0
  561. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_status_usage_limit.py +0 -0
  562. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_sync_comments_873.py +0 -0
  563. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_test_plan.py +0 -0
  564. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_track.py +0 -0
  565. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_tui_update.py +0 -0
  566. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cli_wait.py +0 -0
  567. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_client_base_install.py +0 -0
  568. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_commands_common.py +0 -0
  569. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_comments.py +0 -0
  570. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_completion_summary.py +0 -0
  571. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_config.py +0 -0
  572. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_config_acceptance.py +0 -0
  573. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_config_audit.py +0 -0
  574. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_config_pricing.py +0 -0
  575. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  576. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_config_usage_gate.py +0 -0
  577. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_confirm_test.py +0 -0
  578. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_conflict_fix.py +0 -0
  579. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_conflict_fix_semantic.py +0 -0
  580. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  581. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_coord_test.py +0 -0
  582. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_coord_test_runner_baseline.py +0 -0
  583. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_coord_test_runner_populated_home.py +0 -0
  584. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_coord_test_runner_routing.py +0 -0
  585. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_coord_test_runner_toolchain.py +0 -0
  586. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_coord_uat.py +0 -0
  587. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_coord_web_sse_restart_live.py +0 -0
  588. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_coordinator_machine.py +0 -0
  589. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_cross_platform_imports.py +0 -0
  590. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_dao.py +0 -0
  591. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_dashboard.py +0 -0
  592. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_dashboard_fixture.py +0 -0
  593. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_dashboard_terminal.py +0 -0
  594. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_dashboard_terminal_live.py +0 -0
  595. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_db.py +0 -0
  596. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_dead_end.py +0 -0
  597. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_decomposition_chat.py +0 -0
  598. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deploy_coord_db_backup.py +0 -0
  599. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deploy_coord_web_dist.py +0 -0
  600. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deploy_coord_web_rollback.py +0 -0
  601. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deploy_drive_queue_unit.py +0 -0
  602. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deploy_failure_notify_unit.py +0 -0
  603. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deploy_manifest.py +0 -0
  604. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deploy_notify_unit.py +0 -0
  605. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deploy_units_lane.py +0 -0
  606. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deploy_web_unit.py +0 -0
  607. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_deps.py +0 -0
  608. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_diagnose.py +0 -0
  609. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_dispatch.py +0 -0
  610. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_dispatch_target_validation.py +0 -0
  611. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_dist_name.py +0 -0
  612. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_done_housekeeping.py +0 -0
  613. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_drive.py +0 -0
  614. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_drive_queue.py +0 -0
  615. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_drive_queue_blocked_rendering.py +0 -0
  616. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_drive_queue_launch_argv.py +0 -0
  617. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  618. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_drive_queue_roll_pending.py +0 -0
  619. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  620. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_drive_state.py +0 -0
  621. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_drive_tmux.py +0 -0
  622. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_epic_up_capability_detection.py +0 -0
  623. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  624. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_epic_up_image_provenance.py +0 -0
  625. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_errors.py +0 -0
  626. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_events.py +0 -0
  627. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_failure_class.py +0 -0
  628. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_filelock.py +0 -0
  629. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  630. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_fix_of_force_override.py +0 -0
  631. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_fleet_config_health.py +0 -0
  632. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_fleet_health_probes.py +0 -0
  633. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_fleet_health_snapshot.py +0 -0
  634. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_fleet_watchdog.py +0 -0
  635. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_forge_availability.py +0 -0
  636. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_freshness.py +0 -0
  637. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_gate_a.py +0 -0
  638. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_gate_b.py +0 -0
  639. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_gate_snapshot_staleness.py +0 -0
  640. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_gates.py +0 -0
  641. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  642. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_gen_mock_index.py +0 -0
  643. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_generated_rust_fixture.py +0 -0
  644. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_generated_types_fixture.py +0 -0
  645. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_github_ops.py +0 -0
  646. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_github_throttle.py +0 -0
  647. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_goal.py +0 -0
  648. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_graph_health.py +0 -0
  649. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_graph_selfheal_absent_2237.py +0 -0
  650. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_handoff.py +0 -0
  651. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_checks.py +0 -0
  652. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_cli.py +0 -0
  653. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_cli_graph.py +0 -0
  654. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_config.py +0 -0
  655. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_context.py +0 -0
  656. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_coord_web_ci_pin.py +0 -0
  657. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_deploy_lane_facts.py +0 -0
  658. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_fix.py +0 -0
  659. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_incident_regression.py +0 -0
  660. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_issues_sync_staleness.py +0 -0
  661. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_pypi.py +0 -0
  662. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_registry.py +0 -0
  663. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_release_cordon_probe.py +0 -0
  664. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_timer_active.py +0 -0
  665. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_toolchain.py +0 -0
  666. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_unit_drift.py +0 -0
  667. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_health_unit_enablement.py +0 -0
  668. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_hooks.py +0 -0
  669. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_human_attended_437.py +0 -0
  670. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_init.py +0 -0
  671. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_integration.py +0 -0
  672. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_interactive_briefing_echo.py +0 -0
  673. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_interactive_pane_log_2541.py +0 -0
  674. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_interactive_prefill_state.py +0 -0
  675. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_interactive_session_relaunch.py +0 -0
  676. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_interactive_test_verdict_backstop.py +0 -0
  677. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_interactive_token_attribution.py +0 -0
  678. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_interactive_worktree.py +0 -0
  679. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_issue_store_seam.py +0 -0
  680. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_issues_sync_status.py +0 -0
  681. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_liveness_auditor.py +0 -0
  682. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_liveness_notify.py +0 -0
  683. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_lock_contention_ratchet.py +0 -0
  684. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_machine_pause.py +0 -0
  685. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_merge_queue.py +0 -0
  686. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_merge_verify.py +0 -0
  687. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_milestone_chat.py +0 -0
  688. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_milestone_dispatch.py +0 -0
  689. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_milestone_gate.py +0 -0
  690. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_milestone_order.py +0 -0
  691. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_milestone_seam.py +0 -0
  692. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_mock_author.py +0 -0
  693. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_model_tiering.py +0 -0
  694. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_models.py +0 -0
  695. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_models_config_labels.py +0 -0
  696. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_needs_attention.py +0 -0
  697. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_network.py +0 -0
  698. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_new_issue_chat.py +0 -0
  699. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_next_release_tag.py +0 -0
  700. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_node_shim.py +0 -0
  701. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notifier_baseline.py +0 -0
  702. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notifier_cli.py +0 -0
  703. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notifier_collect.py +0 -0
  704. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notifier_config.py +0 -0
  705. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notifier_drive_seam.py +0 -0
  706. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notifier_isolation.py +0 -0
  707. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notifier_predicate.py +0 -0
  708. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notifier_quiet_hours.py +0 -0
  709. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notifier_service.py +0 -0
  710. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notify.py +0 -0
  711. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_notify_drain.py +0 -0
  712. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_openapi.py +0 -0
  713. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_operational_defaults.py +0 -0
  714. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_overlap_fence.py +0 -0
  715. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_overlap_predict.py +0 -0
  716. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_packaged_deploy_units.py +0 -0
  717. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_parentage.py +0 -0
  718. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_paste_landed.py +0 -0
  719. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  720. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_pipeline.py +0 -0
  721. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_plan_followup_approve_plan_command.py +0 -0
  722. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_plan_followup_pr_command.py +0 -0
  723. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_plan_followup_review_command.py +0 -0
  724. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_plan_only.py +0 -0
  725. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_plan_parser.py +0 -0
  726. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_platform_paths.py +0 -0
  727. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_portal_bridge.py +0 -0
  728. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_portal_config.py +0 -0
  729. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_portal_store.py +0 -0
  730. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_portal_sync.py +0 -0
  731. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_pr_body_lint.py +0 -0
  732. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_prereqs.py +0 -0
  733. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_production_db_guard.py +0 -0
  734. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_progress.py +0 -0
  735. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_provider_seam.py +0 -0
  736. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_providers.py +0 -0
  737. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_providers_config_labels.py +0 -0
  738. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_providers_pty.py +0 -0
  739. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_quiet_hours.py +0 -0
  740. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_quiet_hours_store_2146.py +0 -0
  741. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reap_merged_sessions.py +0 -0
  742. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reap_stale_interactive_tick.py +0 -0
  743. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reconcile.py +0 -0
  744. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reconcile_branch.py +0 -0
  745. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reconcile_completions.py +0 -0
  746. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  747. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reconcile_merges.py +0 -0
  748. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reconcile_no_agent_record.py +0 -0
  749. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reconcile_tick.py +0 -0
  750. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reconcile_usage_limit_done.py +0 -0
  751. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_refine_chat.py +0 -0
  752. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_cordon_2101.py +0 -0
  753. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  754. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_cordon_deadlock_2240.py +0 -0
  755. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_cordon_stuck_2490.py +0 -0
  756. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_propagate.py +0 -0
  757. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_roll_between_legs_2854.py +0 -0
  758. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_unified_1242.py +0 -0
  759. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_verify.py +0 -0
  760. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_release_window.py +0 -0
  761. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_remote_auto_prune.py +0 -0
  762. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_remote_interactive_reaper.py +0 -0
  763. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_repo_add.py +0 -0
  764. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_repo_edit_2220.py +0 -0
  765. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_repo_graph_fleet_2237.py +0 -0
  766. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_repo_onboard_2220.py +0 -0
  767. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_report_result_push.py +0 -0
  768. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_reports.py +0 -0
  769. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_retry.py +0 -0
  770. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_retry_advisory_1606.py +0 -0
  771. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_retry_type_1636.py +0 -0
  772. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_revalidate.py +0 -0
  773. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_review.py +0 -0
  774. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_review_end_review_without_verdict.py +0 -0
  775. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_review_parse_failure_diagnostic.py +0 -0
  776. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_review_reaffirm.py +0 -0
  777. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_review_state.py +0 -0
  778. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_review_verdict_backstop.py +0 -0
  779. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_review_verdict_override_audit.py +0 -0
  780. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_review_verdict_relay.py +0 -0
  781. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_review_zero_commits.py +0 -0
  782. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_scoped_review_wiring.py +0 -0
  783. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_scorecard.py +0 -0
  784. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_self_health.py +0 -0
  785. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_serve.py +0 -0
  786. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_serve_app_board_trim.py +0 -0
  787. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_session.py +0 -0
  788. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_slice_issue_attribution.py +0 -0
  789. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_smoke.py +0 -0
  790. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_smoke_live_checkout_restore.py +0 -0
  791. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_smoke_workflow.py +0 -0
  792. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_spend_ceiling.py +0 -0
  793. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_spend_ceiling_coordinator.py +0 -0
  794. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_split.py +0 -0
  795. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_split_work.py +0 -0
  796. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_sql_dialect.py +0 -0
  797. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_stage_projection.py +0 -0
  798. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_stalled_pipeline.py +0 -0
  799. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_state.py +0 -0
  800. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_state_review_findings_daemon.py +0 -0
  801. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_status_fleet_footer.py +0 -0
  802. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_stop_1567.py +0 -0
  803. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_store_contract.py +0 -0
  804. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_stuck.py +0 -0
  805. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  806. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_terminal_command.py +0 -0
  807. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_test_author.py +0 -0
  808. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_test_chat.py +0 -0
  809. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_test_orchestrator.py +0 -0
  810. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_test_report.py +0 -0
  811. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_test_verdict_parsing.py +0 -0
  812. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_test_verdict_transcript_floor.py +0 -0
  813. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_text_io_encoding_audit.py +0 -0
  814. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_thin_client_board_audit.py +0 -0
  815. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_thin_client_config_load_1080.py +0 -0
  816. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_thin_client_daemon_routing_906.py +0 -0
  817. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_tmux_host.py +0 -0
  818. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_tmux_session.py +0 -0
  819. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_transcript_floor.py +0 -0
  820. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_usage.py +0 -0
  821. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_usage_limits.py +0 -0
  822. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_usage_rollup.py +0 -0
  823. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_venv_live_install_2121.py +0 -0
  824. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_version_single_source.py +0 -0
  825. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_watch.py +0 -0
  826. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  827. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_worker_env_venv_isolation.py +0 -0
  828. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_worker_events.py +0 -0
  829. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_worker_image_pin_sync.py +0 -0
  830. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_worker_safety.py +0 -0
  831. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_worker_test_scoping.py +0 -0
  832. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_worktree.py +0 -0
  833. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  834. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/Cargo.lock +0 -0
  835. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/Cargo.toml +0 -0
  836. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/cargo-config-local-quadraui.toml.example +0 -0
  837. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/approved.rs +0 -0
  838. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/audit.rs +0 -0
  839. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/chat.rs +0 -0
  840. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/data.rs +0 -0
  841. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/dialogs.rs +0 -0
  842. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/doc_tabs.rs +0 -0
  843. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/drive.rs +0 -0
  844. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/drive_queue.rs +0 -0
  845. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/escalation.rs +0 -0
  846. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/events.rs +0 -0
  847. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/fixtures.rs +0 -0
  848. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/fleet_health.rs +0 -0
  849. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/fleet_sessions.rs +0 -0
  850. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/fleet_terminals.rs +0 -0
  851. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/format.rs +0 -0
  852. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/milestone_dag.rs +0 -0
  853. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/mod.rs +0 -0
  854. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/msv.rs +0 -0
  855. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/pipeline.rs +0 -0
  856. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/plans.rs +0 -0
  857. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/render.rs +0 -0
  858. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/reports.rs +0 -0
  859. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/sessions.rs +0 -0
  860. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/settings_ui.rs +0 -0
  861. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/sidebar.rs +0 -0
  862. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/terminal.rs +0 -0
  863. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/tests.rs +0 -0
  864. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/types/generated.rs +0 -0
  865. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/types.rs +0 -0
  866. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/app/workspace.rs +0 -0
  867. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/bin/gtk.rs +0 -0
  868. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/commands.rs +0 -0
  869. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/lib.rs +0 -0
  870. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/main.rs +0 -0
  871. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/src/settings.rs +0 -0
  872. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/tests/acceptance.rs +0 -0
  873. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/tui/tests/cli.rs +0 -0
  874. {code_coordinator-0.5.268 → code_coordinator-0.5.270}/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.268
3
+ Version: 0.5.270
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.268
3
+ Version: 0.5.270
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
@@ -714,6 +714,7 @@ tests/test_split.py
714
714
  tests/test_split_work.py
715
715
  tests/test_sql_dialect.py
716
716
  tests/test_stage_projection.py
717
+ tests/test_stale_busy_reviewer_697.py
717
718
  tests/test_stalled_pipeline.py
718
719
  tests/test_state.py
719
720
  tests/test_state_review_findings_daemon.py
@@ -786,6 +786,7 @@
786
786
  "tests/test_split_work.py",
787
787
  "tests/test_sql_dialect.py",
788
788
  "tests/test_stage_projection.py",
789
+ "tests/test_stale_busy_reviewer_697.py",
789
790
  "tests/test_stalled_pipeline.py",
790
791
  "tests/test_state.py",
791
792
  "tests/test_state_review_findings_daemon.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.268",
2
+ "tag": "0.5.270",
3
3
  "distance": 0,
4
- "node": "gf1fb3361f55813adaa28edcc31c2b9a1b6a20836",
4
+ "node": "g03d05893c4dd0a33802455a4bac412f730e4f018",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-28"
@@ -2587,6 +2587,68 @@ def clear_roll_pending() -> None:
2587
2587
  pass
2588
2588
 
2589
2589
 
2590
+ def _roll_pending_may_fire(*, occupied: int, now: float, queue_rows) -> tuple[bool, str]:
2591
+ """Is it worth attempting to fire a pending roll THIS tick? (#2870 part 2)
2592
+
2593
+ #2587's original rule was ``occupied == 0`` — this tick's own
2594
+ reconciliation (`_reconcile_running`'s ``occupies`` verdict) found
2595
+ literally nothing left running. That rule never learned #2854: `coord
2596
+ release propagate`'s own quiescence check
2597
+ (:func:`coord.release_propagate.assess_quiescence`) treats a `running`
2598
+ drive-queue row with no LIVE assignment right now, past its settle
2599
+ window, as genuinely idle — the row just hasn't reached a terminal state
2600
+ yet (nothing has reconciled it to ``done``). This tick's own ``occupied``
2601
+ count has no such reading: a between-legs row launched on a different
2602
+ host reads ``unknown`` here (#1870 — this tick's local tmux check proves
2603
+ nothing about a row launched elsewhere) and stays charged, forever,
2604
+ against an ``occupied == 0`` bar it can never clear. The 2026-08-28
2605
+ incident this closes: `coord release propagate`, run directly, reported
2606
+ ``quiescent — nothing in flight`` (between-legs, past the settle window)
2607
+ for the SAME row this tick's own ``occupied`` reading was still counting
2608
+ — so the tick never even ATTEMPTED the roll `coord release propagate`
2609
+ would have accepted.
2610
+
2611
+ ``occupied == 0`` stays the cheap fast path — no extra board read. Only
2612
+ when it is nonzero does this re-derive the SAME between-legs/settle-
2613
+ window reading `coord release propagate` itself makes, from a fresh
2614
+ board fetch. This is an ADVISORY re-check, not the authoritative one:
2615
+ firing merely hands off to `coord-release-window.service`, which invokes
2616
+ `coord release propagate` for real (never `--force`) and simply defers
2617
+ again — costing nothing — if this read turns out to have been too
2618
+ optimistic. So there is no harm in checking, and every reason to: the
2619
+ alternative is a marker that can sit past its own between-legs row
2620
+ forever with `coord drive-queue status` reporting `alert: (none)` the
2621
+ whole time, because from the queue's own point of view nothing is wrong
2622
+ — it is waiting on a roll, exactly as designed.
2623
+
2624
+ *queue_rows* are the SAME raw `drive_queue` rows this tick already read
2625
+ (`coord.state.list_drive_queue()`) — reused rather than re-fetched, and
2626
+ passed straight through as `assess_quiescence`'s ``queue_entries``: that
2627
+ function reads the raw ``state``/``repo_name``/``issue_number`` columns,
2628
+ not `QueueEntry` or `BoardView`'s reduced shapes.
2629
+
2630
+ A board this cannot read degrades to "no, don't fire" (never raises) —
2631
+ the tick's own fail-closed abort already covers a board it cannot read
2632
+ for reconciliation; a re-check that itself cannot read the board must
2633
+ not provoke a fire it cannot justify.
2634
+ """
2635
+ if occupied == 0:
2636
+ return True, ""
2637
+ from coord import release_propagate as rp # noqa: PLC0415
2638
+
2639
+ try:
2640
+ payload = _fetch_board_payload()
2641
+ except Exception: # noqa: BLE001 — see docstring: fail closed, never raise
2642
+ return False, ""
2643
+ quiescence = rp.assess_quiescence(
2644
+ queue_entries=queue_rows,
2645
+ assignments=payload.get("assignments") or [],
2646
+ issues=payload.get("issues") or [],
2647
+ now=now,
2648
+ )
2649
+ return quiescence.quiescent, quiescence.reason
2650
+
2651
+
2590
2652
  def _fire_pending_roll(*, dry_run: bool = False) -> tuple[bool, str]:
2591
2653
  """Best-effort ``systemctl --user start --no-block
2592
2654
  coord-release-window.service`` (#2587 design point 3).
@@ -2954,16 +3016,22 @@ def _escalate_persistent_self_cordon(
2954
3016
  _write_self_cordon_state(state)
2955
3017
 
2956
3018
 
2957
- def _fetch_board_view() -> BoardView:
2958
- """Board + live drive sessions, typed.
3019
+ def _fetch_board_payload() -> dict:
3020
+ """The raw ``/board`` payload (+ standalone top-ups), untyped.
2959
3021
 
2960
- Raises whatever the fetch raised — the caller turns that into a fail-closed
2961
- abort. ``list_drive_sessions()`` is deliberately NOT allowed to fail the
2962
- tick: it returns ``[]`` when tmux is unavailable, and the board's
2963
- ``active_work`` signal still holds the capacity line in that case.
3022
+ Split out of :func:`_fetch_board_view` (#2870) so a caller that needs the
3023
+ RAW ``assignments``/``issues`` rows — not `BoardView`'s already-reduced
3024
+ per-issue facts — has one place to get them. :func:`coord.
3025
+ release_propagate.assess_quiescence` is exactly such a caller (#2870's
3026
+ between-legs settle-window re-check for the roll-pending fire condition,
3027
+ see :func:`_roll_pending_may_fire`): it reads raw assignment rows
3028
+ (``machine_name``/``dispatched_at``/``finished_at``) `BoardView` never
3029
+ carries at all.
3030
+
3031
+ Raises whatever the fetch raised — same fail-closed contract as before
3032
+ this split.
2964
3033
  """
2965
3034
  from coord.board_service import resolve as resolve_board_service # noqa: PLC0415
2966
- from coord.drive import list_drive_sessions # noqa: PLC0415
2967
3035
  from coord.drive_state import BoardFetcher # noqa: PLC0415
2968
3036
 
2969
3037
  payload = BoardFetcher().fetch()
@@ -2986,6 +3054,20 @@ def _fetch_board_view() -> BoardView:
2986
3054
  top_up["merge_queue"] = _local_merge_queue_rows()
2987
3055
  if top_up:
2988
3056
  payload = {**payload, **top_up}
3057
+ return payload
3058
+
3059
+
3060
+ def _fetch_board_view() -> BoardView:
3061
+ """Board + live drive sessions, typed.
3062
+
3063
+ Raises whatever the fetch raised — the caller turns that into a fail-closed
3064
+ abort. ``list_drive_sessions()`` is deliberately NOT allowed to fail the
3065
+ tick: it returns ``[]`` when tmux is unavailable, and the board's
3066
+ ``active_work`` signal still holds the capacity line in that case.
3067
+ """
3068
+ from coord.drive import list_drive_sessions # noqa: PLC0415
3069
+
3070
+ payload = _fetch_board_payload()
2989
3071
  return build_board_view(payload, list_drive_sessions())
2990
3072
 
2991
3073
 
@@ -4382,7 +4464,12 @@ def drive_queue_tick(
4382
4464
  f"could not read the board — aborting without launching anything: {exc}"
4383
4465
  ) from None
4384
4466
 
4385
- entries = entries_from_rows(list_drive_queue())
4467
+ # #2870: the raw rows are kept alongside the typed `entries` — see
4468
+ # `_roll_pending_may_fire`'s `queue_rows` parameter, which needs the
4469
+ # untyped `state`/`repo_name`/`issue_number` shape
4470
+ # `coord.release_propagate.assess_quiescence` reads, not `QueueEntry`.
4471
+ raw_queue_rows = list_drive_queue()
4472
+ entries = entries_from_rows(raw_queue_rows)
4386
4473
 
4387
4474
  # #2587: is a fleet roll queued for the next inter-drive gap? Read
4388
4475
  # BEFORE `effective_capacity` is resolved — a live, unexpired marker
@@ -4563,7 +4650,24 @@ def drive_queue_tick(
4563
4650
  # `--dry-run`'s "mutate nothing" contract for every other write in
4564
4651
  # this function.
4565
4652
  if roll_pending is not None:
4566
- if plan.occupied == 0:
4653
+ # #2870: `plan.occupied == 0` alone is the pre-#2854 reading —
4654
+ # a between-legs row with no live assignment right now, past
4655
+ # its settle window, can sit `occupied` here (e.g. #1870's
4656
+ # `unknown` verdict for a row launched on another host)
4657
+ # forever, even though `coord release propagate` itself would
4658
+ # already call the fleet quiescent for that exact row. See
4659
+ # `_roll_pending_may_fire`'s own docstring for the full
4660
+ # mechanism and the incident this closes.
4661
+ fire_ready, fire_note = _roll_pending_may_fire(
4662
+ occupied=plan.occupied, now=now, queue_rows=raw_queue_rows
4663
+ )
4664
+ if fire_ready:
4665
+ if plan.occupied and fire_note:
4666
+ click.echo(
4667
+ f"(queue still shows {plan.occupied} occupying a slot, "
4668
+ f"but #2854's settle-window reading calls it quiescent — "
4669
+ f"{fire_note} — attempting the roll anyway)"
4670
+ )
4567
4671
  fired, detail = _fire_pending_roll()
4568
4672
  if fired:
4569
4673
  # #2587 review: this must NOT clear the marker. `fired`
@@ -654,11 +654,24 @@ def _lane_versions_by_host(report) -> dict[str, list[str | None]]:
654
654
 
655
655
 
656
656
  def _ensure_roll_pending_marker(
657
- target_version: str, *, reason: str, dry_run: bool = False
657
+ target_version: str, *, reason: str, min_releases_behind: int | None = None,
658
+ dry_run: bool = False,
658
659
  ) -> None:
659
660
  """#2587: make sure a roll-pending marker exists for *target_version*,
660
661
  without resetting an already-live one's clock.
661
662
 
663
+ #2870: *min_releases_behind* is the effective `propagation.
664
+ min_releases_behind`/`--min-behind` threshold THIS run resolved and
665
+ already gated on before reaching this call (see the #2583 gate just
666
+ above this function's one call site) — stamped onto the marker
667
+ (`RollPending.min_releases_behind`) so whatever eventually discharges it
668
+ (`coord.commands.release._run_propagate`, threaded a matching
669
+ `--min-behind`) is gated at the SAME threshold this arm used, not
670
+ whatever threshold ITS OWN invocation happens to resolve. Like
671
+ `target_version`/`reason`, this is updated on every re-arm (a re-arm is
672
+ a fresh decision about what SHOULD roll and at what threshold) — only
673
+ `set_at`/`deferrals` stay frozen (see below).
674
+
662
675
  #2869: ``dry_run=True`` is the ONE seam every call site must go through —
663
676
  it never touches disk, only echoing what it *would* have written, in the
664
677
  same "would ..." register as ``_fire_pending_roll``'s and
@@ -712,7 +725,10 @@ def _ensure_roll_pending_marker(
712
725
  )
713
726
  return
714
727
  write_roll_pending(
715
- _dataclasses.replace(existing, target_version=target_version, reason=reason)
728
+ _dataclasses.replace(
729
+ existing, target_version=target_version, reason=reason,
730
+ min_releases_behind=min_releases_behind,
731
+ )
716
732
  )
717
733
  return
718
734
  if dry_run:
@@ -723,7 +739,10 @@ def _ensure_roll_pending_marker(
723
739
  )
724
740
  return
725
741
  write_roll_pending(
726
- RollPending(target_version=target_version, set_at=_time.time(), reason=reason)
742
+ RollPending(
743
+ target_version=target_version, set_at=_time.time(), reason=reason,
744
+ min_releases_behind=min_releases_behind,
745
+ )
727
746
  )
728
747
 
729
748
 
@@ -1123,7 +1142,14 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
1123
1142
  # too, so a plain periodic `coord-release-propagate.timer` run also
1124
1143
  # arms the drive-queue tick's own inter-drive-gap trigger instead of
1125
1144
  # requiring an operator to separately reach for `nightly-window`.
1126
- _ensure_roll_pending_marker(record.target_version, reason="propagate", dry_run=dry_run)
1145
+ # #2870: stamp THIS run's own already-passed `effective_min_behind`
1146
+ # (resolved above, 3a) onto the marker, so whatever discharges it is
1147
+ # gated at the threshold that armed it, not a threshold re-resolved
1148
+ # from scratch later.
1149
+ _ensure_roll_pending_marker(
1150
+ record.target_version, reason="propagate",
1151
+ min_releases_behind=effective_min_behind, dry_run=dry_run,
1152
+ )
1127
1153
  _finish(rp.STATUS_DEFERRED, 0)
1128
1154
 
1129
1155
  still_busy = busy_hosts - set(current)
@@ -2846,7 +2872,7 @@ def _latest_propagate_record_since(state_dir: Path, since: float) -> dict | None
2846
2872
 
2847
2873
  def _run_propagate(
2848
2874
  *, daemon_host: str, target_version: str, config_path: Path, state_dir: Path,
2849
- runner=None, now_fn=None,
2875
+ min_behind: int | None = None, runner=None, now_fn=None,
2850
2876
  ) -> tuple[str, int, str, float | None]:
2851
2877
  """``coord release propagate --daemon-host ... --target ... --json``.
2852
2878
 
@@ -2858,6 +2884,20 @@ def _run_propagate(
2858
2884
  run decided was needed is the version that actually rolls, even if a new
2859
2885
  release lands on PyPI mid-drain.
2860
2886
 
2887
+ #2870: *min_behind*, when given, is passed through as `--min-behind` —
2888
+ the threshold the roll-pending marker being discharged here was ARMED
2889
+ at (`RollPending.min_releases_behind`), NOT this process's own
2890
+ `propagation.min_releases_behind`. Before this, this call never passed
2891
+ `--min-behind` at all, so `coord release propagate` always re-resolved
2892
+ ITS OWN threshold from `coordinator.yml` — a marker armed below the
2893
+ fleet default (e.g. `coord release nightly-window --min-behind 1`
2894
+ against a fleet configured `min_releases_behind: 5`) could never reach
2895
+ the threshold ITS discharge required and held forever, `alert: (none)`
2896
+ the whole time. ``None`` (an old marker with no recorded threshold, or
2897
+ one whose arming run never evaluated the gate) omits the flag, matching
2898
+ the pre-#2870 behaviour — this process resolves its own default exactly
2899
+ as it always did.
2900
+
2861
2901
  Returns ``(status, exit_code, combined_output, propagate_started_at)``.
2862
2902
  ``status`` is read from the propagation journal entry that run itself
2863
2903
  wrote (:func:`_latest_propagate_record_since`) — the same ground truth
@@ -2883,6 +2923,8 @@ def _run_propagate(
2883
2923
  "--daemon-host", daemon_host, "--target", target_version,
2884
2924
  "--json", "--config", str(config_path),
2885
2925
  ]
2926
+ if min_behind is not None:
2927
+ argv.extend(["--min-behind", str(min_behind)])
2886
2928
  try:
2887
2929
  proc = run(argv, capture_output=True, text=True, timeout=1800)
2888
2930
  except Exception as exc: # noqa: BLE001
@@ -3224,9 +3266,24 @@ def release_nightly_window(
3224
3266
  # attempt, safe to make redundantly since `coord release propagate`
3225
3267
  # never carries `--force` here (trap 1) and simply defers again if
3226
3268
  # the fleet is still busy.
3269
+ # #2870: gate the discharge at the threshold the marker was ARMED
3270
+ # at (`existing.min_releases_behind`), not whatever `coord release
3271
+ # propagate` would re-resolve on its own — that mismatch is exactly
3272
+ # how a marker armed via `--min-behind 1` froze the queue against a
3273
+ # fleet configured `min_releases_behind: 5`, forever holding at "3
3274
+ # behind, threshold 5" no matter how many times this fired. A
3275
+ # marker with no recorded threshold (written before this field
3276
+ # existed, or whose arming run never evaluated the gate at all)
3277
+ # falls back to THIS run's own `effective_min_behind` — the same
3278
+ # value it would have used before #2870.
3227
3279
  prop_status, prop_exit, prop_output, prop_started_at = _run_propagate(
3228
3280
  daemon_host=daemon_name, target_version=existing.target_version,
3229
3281
  config_path=config_path, state_dir=state_dir,
3282
+ min_behind=(
3283
+ existing.min_releases_behind
3284
+ if existing.min_releases_behind is not None
3285
+ else effective_min_behind
3286
+ ),
3230
3287
  )
3231
3288
  record.propagate_status = prop_status
3232
3289
  record.propagate_exit_code = prop_exit
@@ -3303,6 +3360,13 @@ def release_nightly_window(
3303
3360
  # re-arm — the queue froze because the bound that was supposed to save it
3304
3361
  # could never be reached. Only a genuinely fresh marker (no existing one
3305
3362
  # at all) gets a new clock.
3363
+ # #2870: every write below stamps `effective_min_behind` — THIS run's
3364
+ # own already-resolved threshold (section 2b above) — onto the marker,
3365
+ # so `_run_propagate`'s belt-and-braces call above (and any future
3366
+ # discharge) is gated at the SAME threshold that armed it, not whatever
3367
+ # `coord release propagate` would re-resolve on its own later. Updated
3368
+ # on every re-arm, same as `target_version`/`reason` just below — only
3369
+ # `set_at`/`deferrals` are the frozen "clock" #2607 protects.
3306
3370
  if existing is not None:
3307
3371
  click.echo(
3308
3372
  f"replacing stale roll-pending marker ({existing.describe()}) "
@@ -3313,6 +3377,7 @@ def release_nightly_window(
3313
3377
  write_roll_pending(
3314
3378
  _dataclasses.replace(
3315
3379
  existing, target_version=record.target_version, reason="nightly-window",
3380
+ min_releases_behind=effective_min_behind,
3316
3381
  )
3317
3382
  )
3318
3383
  else:
@@ -3321,6 +3386,7 @@ def release_nightly_window(
3321
3386
  target_version=record.target_version,
3322
3387
  set_at=time.time(),
3323
3388
  reason="nightly-window",
3389
+ min_releases_behind=effective_min_behind,
3324
3390
  )
3325
3391
  )
3326
3392
  click.echo(
@@ -1561,6 +1561,26 @@ class RollPending:
1561
1561
  #: fleet still busy — bumped by the shell each tick it does NOT fire the
1562
1562
  #: roll. Never bumped by `plan_tick` itself (pure; no counting state).
1563
1563
  deferrals: int = 0
1564
+ #: #2870: the ``propagation.min_releases_behind``/``--min-behind``
1565
+ #: threshold this marker was ARMED at — `coord release nightly-window`/
1566
+ #: `coord.commands.release._ensure_roll_pending_marker` stamp the
1567
+ #: effective threshold THEIR OWN run resolved (override, else
1568
+ #: `coordinator.yml`, else 1) at the moment they write this marker.
1569
+ #: Before #2870, discharge (`_run_propagate`'s `coord release propagate`
1570
+ #: subprocess) always re-resolved its OWN threshold from scratch — the
1571
+ #: fleet default, never whatever `--min-behind` armed this marker at —
1572
+ #: so a marker armed below the fleet default (e.g. a
1573
+ #: `coord-release-window.service` ExecStart carrying `--min-behind 1`
1574
+ #: against a fleet configured `min_releases_behind: 5`) could never
1575
+ #: reach the threshold its own discharge path required and froze the
1576
+ #: queue forever. Carried through to `_run_propagate` as `--min-behind`
1577
+ #: so discharge is gated at the SAME threshold arm used. `None` for a
1578
+ #: marker written before this field existed (`from_dict`'s tolerant
1579
+ #: parse) or one whose arming run never evaluated the gate at all
1580
+ #: (`effective_min_behind <= 1`) — the discharge call then falls back to
1581
+ #: ITS OWN effective threshold, matching the pre-#2870 behaviour rather
1582
+ #: than guessing.
1583
+ min_releases_behind: int | None = None
1564
1584
 
1565
1585
  def expired(self, now: float) -> bool:
1566
1586
  """Has this marker outlived ITS OWN bound — TTL or deferral ceiling?
@@ -1589,6 +1609,7 @@ class RollPending:
1589
1609
  "ttl_seconds": self.ttl_seconds,
1590
1610
  "max_deferrals": self.max_deferrals,
1591
1611
  "deferrals": self.deferrals,
1612
+ "min_releases_behind": self.min_releases_behind,
1592
1613
  }
1593
1614
 
1594
1615
  @classmethod
@@ -1615,6 +1636,7 @@ class RollPending:
1615
1636
  data.get("max_deferrals"), ROLL_PENDING_DEFAULT_MAX_DEFERRALS
1616
1637
  ),
1617
1638
  deferrals=_as_int_default(data.get("deferrals"), 0),
1639
+ min_releases_behind=_as_optional_int(data.get("min_releases_behind")),
1618
1640
  )
1619
1641
 
1620
1642
 
@@ -1632,6 +1654,21 @@ def _as_int_default(value: Any, default: int) -> int:
1632
1654
  return default
1633
1655
 
1634
1656
 
1657
+ def _as_optional_int(value: Any) -> int | None:
1658
+ """Tolerant parse for a field that is legitimately absent (``None``),
1659
+ unlike :func:`_as_int_default`'s fields which always have a real
1660
+ fallback — see `RollPending.min_releases_behind`'s own docstring for why
1661
+ "not recorded" must stay `None` rather than silently becoming some
1662
+ default int a caller could mistake for a real threshold.
1663
+ """
1664
+ if value is None:
1665
+ return None
1666
+ try:
1667
+ return int(value)
1668
+ except (TypeError, ValueError):
1669
+ return None
1670
+
1671
+
1635
1672
  @dataclass(frozen=True)
1636
1673
  class TickPlan:
1637
1674
  """Everything one tick decided, and nothing it has done yet."""
@@ -1090,6 +1090,104 @@ class ReviewerChoice:
1090
1090
  rationale: str
1091
1091
 
1092
1092
 
1093
+ # #697: how far past a row's OWN needs-attention threshold a `pending`/
1094
+ # `running` row must sit before reviewer selection stops counting its machine
1095
+ # as busy. One hour of margin on top of a threshold that is itself measured
1096
+ # in tens of minutes: comfortably longer than any reap path needs
1097
+ # (`coord.reconcile._reconcile_no_agent_record` on the daemon's 30s tick,
1098
+ # `coord.diagnose.sweep_dead_running_rows` on `coord-notify.timer`'s 5min
1099
+ # cadence), so a row still counted busy here is one every reaper has already
1100
+ # had many chances at.
1101
+ STALE_BUSY_BUFFER_SECONDS = 3600.0
1102
+
1103
+ # The same horizon for rows whose type has NO wall-clock threshold at all —
1104
+ # `PipelineConfig.attention_threshold_for` returns `inf` for the attended
1105
+ # chat/troubleshoot/audit family (#1133). Those are exactly the rows #697
1106
+ # observed at 51h and 70h, so "never expires" is not an option here; a flat,
1107
+ # deliberately generous day is. A human really attending a chat session for
1108
+ # a full day is far rarer than a tmux session that died without being reaped.
1109
+ STALE_BUSY_INTERACTIVE_SECONDS = 24 * 3600.0
1110
+
1111
+
1112
+ def _is_stale_busy_row(a: Assignment, config: Config, now: float) -> bool:
1113
+ """True when *a* is too old to still be believed as occupying its machine (#697).
1114
+
1115
+ Reviewer selection's ``busy`` set used to count **every** ``pending``/
1116
+ ``running`` board row, which is how a zombie row broke dispatch in #697:
1117
+ rows whose worker had been dead for hours-to-days kept inflating the set,
1118
+ so real machines looked occupied and selection was pushed onto whatever
1119
+ candidate happened to look "free" — on #669 that was an *offline* machine,
1120
+ and the review could not be dispatched at all.
1121
+
1122
+ This is deliberately **not** a liveness probe, and deliberately **not** a
1123
+ reap. The reapers (``coord.reconcile._reconcile_no_agent_record``,
1124
+ ``coord.interactive.reap_stale_interactive_sessions``,
1125
+ ``coord.diagnose.sweep_dead_running_rows``) own the "is it actually dead?"
1126
+ question, they answer it with a positive disproof or a real tmux/agent
1127
+ probe, and they are the only things allowed to write a terminal status.
1128
+ Guessing from age alone would be #1870's mistake if it gated a *write*.
1129
+
1130
+ Here it gates only a *ranking*, where being wrong is cheap and
1131
+ self-correcting in both directions:
1132
+
1133
+ * Wrong about a genuinely-live row → its machine is ranked as idle and may
1134
+ receive the review. That is the SAME outcome fallback 1
1135
+ ("different machine, currently busy — review will queue") already
1136
+ produces on a one-other-machine fleet, and a genuinely-saturated agent
1137
+ answers with a rejection that ``_ranked_reviewer_candidates`` already
1138
+ falls through on (#904).
1139
+ * Wrong about a dead row (age not yet reached) → status quo ante: the
1140
+ machine stays "busy" and merely ranks lower.
1141
+
1142
+ A row with no ``dispatched_at`` is never stale — there is nothing to
1143
+ compute an age from, and this path never guesses, mirroring
1144
+ ``sweep_dead_running_rows``.
1145
+ """
1146
+ dispatched_at = getattr(a, "dispatched_at", None)
1147
+ if not dispatched_at:
1148
+ return False
1149
+ try:
1150
+ dispatched = float(dispatched_at)
1151
+ except (TypeError, ValueError):
1152
+ return False
1153
+
1154
+ threshold = config.pipeline.attention_threshold_for(
1155
+ a.type or "work",
1156
+ provider_name=a.provider_name,
1157
+ review_of_assignment_id=a.review_of_assignment_id,
1158
+ )
1159
+ if threshold == float("inf"):
1160
+ horizon = STALE_BUSY_INTERACTIVE_SECONDS
1161
+ else:
1162
+ horizon = threshold + STALE_BUSY_BUFFER_SECONDS
1163
+ return (now - dispatched) > horizon
1164
+
1165
+
1166
+ def busy_machine_names(
1167
+ board: Board,
1168
+ config: Config,
1169
+ *,
1170
+ now: float | None = None,
1171
+ ) -> set[str]:
1172
+ """Machines with at least one *believable* in-flight row (#697).
1173
+
1174
+ The shared ``busy`` set for :func:`pick_reviewer_machine` and
1175
+ :func:`_ranked_reviewer_candidates` — a ``pending``/``running`` row whose
1176
+ age is past :func:`_is_stale_busy_row`'s horizon is presumed dead and no
1177
+ longer holds its machine down. See that function for why an age-only
1178
+ heuristic is the right instrument *for a ranking* and the wrong one for a
1179
+ reap.
1180
+ """
1181
+ if now is None:
1182
+ now = time.time()
1183
+ return {
1184
+ a.machine_name
1185
+ for a in board.active
1186
+ if a.status in ("pending", "running")
1187
+ and not _is_stale_busy_row(a, config, now)
1188
+ }
1189
+
1190
+
1093
1191
  def pick_reviewer_machine(
1094
1192
  worker_machine_name: str,
1095
1193
  repo_name: str,
@@ -1111,6 +1209,11 @@ def pick_reviewer_machine(
1111
1209
  cordon blocked the review, the unreviewable entry stayed `running`, the
1112
1210
  running entry deferred the roll, and the deferred roll left the cordon
1113
1211
  up. Explicit pauses and quiet hours still apply.
1212
+
1213
+ #697: the ``busy`` set is :func:`busy_machine_names`, which drops
1214
+ ``pending``/``running`` rows too old to still be believed — a zombie row
1215
+ used to make a real machine look occupied indefinitely and push selection
1216
+ onto an offline "free" candidate.
1114
1217
  """
1115
1218
  from coord.machine_pause import follow_on_paused_set
1116
1219
  paused = follow_on_paused_set(config.machines)
@@ -1121,7 +1224,7 @@ def pick_reviewer_machine(
1121
1224
  if not candidates:
1122
1225
  return None
1123
1226
 
1124
- busy = {a.machine_name for a in board.active if a.status in ("pending", "running")}
1227
+ busy = busy_machine_names(board, config)
1125
1228
 
1126
1229
  different = [
1127
1230
  m for m in candidates
@@ -1191,6 +1294,9 @@ def _ranked_reviewer_candidates(
1191
1294
  literal "no eligible reviewer machine configured for repo
1192
1295
  'claude-coordinator'" that a cordoned fleet answered every review
1193
1296
  dispatch with for 70 minutes.
1297
+
1298
+ #697: shares :func:`busy_machine_names` with ``pick_reviewer_machine``, so
1299
+ tier 1 vs tier 2 here is decided on *believable* in-flight rows only.
1194
1300
  """
1195
1301
  from coord.machine_pause import follow_on_paused_set # noqa: PLC0415
1196
1302
 
@@ -1202,7 +1308,7 @@ def _ranked_reviewer_candidates(
1202
1308
  if not candidates:
1203
1309
  return []
1204
1310
 
1205
- busy = {a.machine_name for a in board.active if a.status in ("pending", "running")}
1311
+ busy = busy_machine_names(board, config)
1206
1312
 
1207
1313
  result: list[tuple[Machine, bool]] = []
1208
1314
  for m in candidates:
@@ -459,6 +459,37 @@ def test_a_busy_daemon_host_defers_the_whole_run(
459
459
  assert pending.reason == "propagate"
460
460
 
461
461
 
462
+ def test_a_busy_daemon_deferral_stamps_this_runs_own_threshold_onto_the_marker(
463
+ valid_config_path, state_dir, no_network, monkeypatch
464
+ ):
465
+ """#2870: the marker `_ensure_roll_pending_marker` arms here must carry
466
+ THIS run's own already-passed `--min-behind`/`propagation.
467
+ min_releases_behind` threshold (`RollPending.min_releases_behind`) — so
468
+ whatever eventually discharges it (`coord release nightly-window`'s
469
+ belt-and-braces `coord release propagate` call, or the drive-queue
470
+ tick's spawned `coord-release-window.service`) is gated at the SAME
471
+ threshold that armed it, not a threshold re-resolved from scratch."""
472
+ monkeypatch.setattr(
473
+ release_cmd, "_fetch_board",
474
+ lambda: ({"assignments": [{"machine_name": "server", "issue_number": 9,
475
+ "status": "RUNNING"}]}, None),
476
+ )
477
+ monkeypatch.setattr(
478
+ release_cmd, "_releases_behind_count", lambda *a, **k: (7, None),
479
+ )
480
+ _stub_verify(monkeypatch, versions={"laptop": ["0.4.110"], "server": ["0.4.110"]},
481
+ daemon="server")
482
+ result = CliRunner().invoke(
483
+ main,
484
+ ["release", "propagate", "--config", str(valid_config_path),
485
+ "--target", "0.4.111", "--min-behind", "5"],
486
+ )
487
+ assert result.exit_code == 0, result.output
488
+ pending = dq_cmd.read_roll_pending()
489
+ assert pending is not None
490
+ assert pending.min_releases_behind == 5
491
+
492
+
462
493
  def test_a_busy_daemon_dry_run_defers_without_writing_the_marker(
463
494
  valid_config_path, state_dir, no_network, monkeypatch
464
495
  ):