code-coordinator 0.5.196__tar.gz → 0.5.200__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 (791) hide show
  1. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/release.py +67 -1
  7. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/status.py +43 -0
  8. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/pipeline.py +62 -7
  9. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/release_cordon.py +43 -0
  10. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/release_propagate.py +8 -0
  11. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_pipeline.py +96 -0
  12. code_coordinator-0.5.200/tests/test_release_cordon_stuck_2490.py +272 -0
  13. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_propagate.py +20 -0
  14. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/data.rs +49 -0
  15. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/dialogs.rs +54 -6
  16. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/doc_tabs.rs +6 -0
  17. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/drive.rs +2 -0
  18. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/drive_queue.rs +2 -0
  19. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/escalation.rs +2 -0
  20. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/fixtures.rs +4 -0
  21. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/milestone_dag.rs +40 -3
  22. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/mod.rs +19 -0
  23. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/pipeline.rs +55 -0
  24. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/render.rs +28 -2
  25. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/reports.rs +4 -0
  26. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/settings_ui.rs +38 -0
  27. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/tests.rs +975 -3
  28. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/types.rs +22 -0
  29. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/workspace.rs +2 -0
  30. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.claude/commands/board.md +0 -0
  31. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.claude/commands/complete-session.md +0 -0
  32. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.claude/commands/coordinator.md +0 -0
  33. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.githooks/_lib.sh +0 -0
  34. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.githooks/post-checkout +0 -0
  35. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.githooks/post-commit +0 -0
  36. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.githooks/post-merge +0 -0
  37. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  38. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/coord-ci-acceptance.yml +0 -0
  39. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/auto-release.yml +0 -0
  40. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/cargo-test.yml +0 -0
  41. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/publish.yml +0 -0
  42. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/release-tui.yml +0 -0
  43. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/test.yml +0 -0
  44. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.gitignore +0 -0
  45. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/CLAUDE.md +0 -0
  46. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/GOAL.md +0 -0
  47. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/LICENSE +0 -0
  48. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/MANIFEST.in +0 -0
  49. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/README.md +0 -0
  50. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/dependency_links.txt +0 -0
  51. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/entry_points.txt +0 -0
  52. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/requires.txt +0 -0
  53. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/top_level.txt +0 -0
  54. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/__init__.py +0 -0
  55. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/_board_mapping.py +0 -0
  56. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/acceptance.py +0 -0
  57. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/acceptance_drivers.py +0 -0
  58. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agent.py +0 -0
  59. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agent_app.py +0 -0
  60. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agent_update.py +0 -0
  61. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agents/opencode/.gitignore +0 -0
  62. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agents/opencode/agents/work.md +0 -0
  63. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agents/opencode/routing.jsonc +0 -0
  64. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/audit.py +0 -0
  65. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/auto_loop.py +0 -0
  66. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/block_log.py +0 -0
  67. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/board_bool_guard.py +0 -0
  68. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/board_service.py +0 -0
  69. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/board_wire.py +0 -0
  70. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/brain.py +0 -0
  71. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/branch_model.py +0 -0
  72. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/bug_intake.py +0 -0
  73. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/cargo_cache.py +0 -0
  74. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/ci_github.py +0 -0
  75. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/ci_store.py +0 -0
  76. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/claim.py +0 -0
  77. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/cli.py +0 -0
  78. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/client.py +0 -0
  79. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/__init__.py +0 -0
  80. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/_common.py +0 -0
  81. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/acceptance.py +0 -0
  82. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/agent_ops.py +0 -0
  83. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/audit.py +0 -0
  84. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/chat.py +0 -0
  85. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/dispatch.py +0 -0
  86. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/dispatch_workers.py +0 -0
  87. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/drive.py +0 -0
  88. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/drive_queue.py +0 -0
  89. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/gate_a.py +0 -0
  90. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/gates.py +0 -0
  91. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/issues.py +0 -0
  92. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/lifecycle.py +0 -0
  93. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/merge.py +0 -0
  94. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/milestone.py +0 -0
  95. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/plan_followup.py +0 -0
  96. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/plans.py +0 -0
  97. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/portal.py +0 -0
  98. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/repo.py +0 -0
  99. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/report.py +0 -0
  100. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/review.py +0 -0
  101. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/scorecard.py +0 -0
  102. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/sessions.py +0 -0
  103. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/setup.py +0 -0
  104. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/terminal.py +0 -0
  105. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/test_gate.py +0 -0
  106. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/tui.py +0 -0
  107. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/comments.py +0 -0
  108. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/config.py +0 -0
  109. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/config_reload.py +0 -0
  110. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/confirm_test.py +0 -0
  111. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/conflict_fix.py +0 -0
  112. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dao.py +0 -0
  113. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/__init__.py +0 -0
  114. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/fixture.py +0 -0
  115. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/index.html +0 -0
  116. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/server.py +0 -0
  117. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/terminal.py +0 -0
  118. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/db.py +0 -0
  119. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dead_end.py +0 -0
  120. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/README.md +0 -0
  121. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-agent.service +0 -0
  122. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-db-backup.service +0 -0
  123. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-db-backup.sh +0 -0
  124. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-db-backup.timer +0 -0
  125. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-drive-queue.service +0 -0
  126. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-drive-queue.timer +0 -0
  127. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-notify.service +0 -0
  128. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-notify.timer +0 -0
  129. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-release-propagate.service +0 -0
  130. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-release-propagate.timer +0 -0
  131. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-release-window.service +0 -0
  132. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-release-window.timer +0 -0
  133. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-serve.service +0 -0
  134. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-web-dist-build.service +0 -0
  135. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-web-dist-build.timer +0 -0
  136. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-web.service +0 -0
  137. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy_manifest.py +0 -0
  138. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy_units.py +0 -0
  139. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deps.py +0 -0
  140. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/diagnose.py +0 -0
  141. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dispatch.py +0 -0
  142. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dist_name.py +0 -0
  143. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/drive.py +0 -0
  144. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/drive_queue.py +0 -0
  145. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/drive_state.py +0 -0
  146. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/events.py +0 -0
  147. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/failure_class.py +0 -0
  148. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/filelock.py +0 -0
  149. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/fleet_config_health.py +0 -0
  150. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/forge_availability.py +0 -0
  151. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/freshness.py +0 -0
  152. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/gate_a.py +0 -0
  153. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/gate_b.py +0 -0
  154. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/gate_snapshot.py +0 -0
  155. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/gates.py +0 -0
  156. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/github_ops.py +0 -0
  157. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/goal.py +0 -0
  158. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/graph_health.py +0 -0
  159. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/__init__.py +0 -0
  160. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/aggregate.py +0 -0
  161. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/__init__.py +0 -0
  162. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/agent_install.py +0 -0
  163. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/cargo_targets.py +0 -0
  164. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/claude_binary.py +0 -0
  165. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/coord_web_ci_pin.py +0 -0
  166. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/deploy_lane_facts.py +0 -0
  167. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/disk.py +0 -0
  168. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/fleet_board.py +0 -0
  169. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  170. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/fleet_phantom.py +0 -0
  171. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/fleet_unit_drift.py +0 -0
  172. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/graph.py +0 -0
  173. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/graphify_cli.py +0 -0
  174. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/index_lock.py +0 -0
  175. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/plan_usage.py +0 -0
  176. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/repo_state.py +0 -0
  177. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/spawned_coord.py +0 -0
  178. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/timer_active.py +0 -0
  179. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/toolchain.py +0 -0
  180. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/unit_drift.py +0 -0
  181. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/unit_enablement.py +0 -0
  182. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/worktrees.py +0 -0
  183. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/cli.py +0 -0
  184. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/context.py +0 -0
  185. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/fleet_snapshot.py +0 -0
  186. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/models.py +0 -0
  187. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/pypi.py +0 -0
  188. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/registry.py +0 -0
  189. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/render.py +0 -0
  190. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/units.py +0 -0
  191. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/hooks.py +0 -0
  192. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/housekeeping.py +0 -0
  193. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/interactive.py +0 -0
  194. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/issue_store.py +0 -0
  195. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/liveness_auditor.py +0 -0
  196. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/machine_pause.py +0 -0
  197. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/merge_queue.py +0 -0
  198. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/milestone_chat.py +0 -0
  199. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/milestone_dispatch.py +0 -0
  200. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/milestone_gate.py +0 -0
  201. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/milestone_order.py +0 -0
  202. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/mock_author.py +0 -0
  203. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/models.py +0 -0
  204. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/network.py +0 -0
  205. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/new_issue_chat.py +0 -0
  206. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/__init__.py +0 -0
  207. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/baseline.py +0 -0
  208. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/cli.py +0 -0
  209. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/collect.py +0 -0
  210. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/digest.py +0 -0
  211. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/models.py +0 -0
  212. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/predicate.py +0 -0
  213. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/service.py +0 -0
  214. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/store.py +0 -0
  215. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/transport.py +0 -0
  216. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notify.py +0 -0
  217. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/openapi.py +0 -0
  218. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/overlap_fence.py +0 -0
  219. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/overlap_predict.py +0 -0
  220. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/parentage.py +0 -0
  221. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/parentage_github.py +0 -0
  222. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/plan_parser.py +0 -0
  223. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/plans.py +0 -0
  224. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/platform_paths.py +0 -0
  225. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/portal_bridge.py +0 -0
  226. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/portal_store.py +0 -0
  227. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/portal_sync.py +0 -0
  228. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/pr_body_lint.py +0 -0
  229. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/prereqs.py +0 -0
  230. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/progress.py +0 -0
  231. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/__init__.py +0 -0
  232. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/base.py +0 -0
  233. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/claude.py +0 -0
  234. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/claude_pty.py +0 -0
  235. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/opencode.py +0 -0
  236. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/queue_diagnose.py +0 -0
  237. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/reconcile.py +0 -0
  238. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/reconcile_tick.py +0 -0
  239. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/refine_chat.py +0 -0
  240. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/release_verify.py +0 -0
  241. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/release_window.py +0 -0
  242. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/repo_edit.py +0 -0
  243. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/repo_onboard.py +0 -0
  244. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/reports.py +0 -0
  245. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/revalidate.py +0 -0
  246. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/review.py +0 -0
  247. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/scorecard.py +0 -0
  248. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/self_health.py +0 -0
  249. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/serve_app.py +0 -0
  250. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  251. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  252. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  253. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  254. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  255. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/portal-followup/SKILL.md +0 -0
  256. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  257. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  258. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/update-issue/SKILL.md +0 -0
  259. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/smoke.py +0 -0
  260. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/spend_ceiling.py +0 -0
  261. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/split_work.py +0 -0
  262. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/stage_projection.py +0 -0
  263. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/state.py +0 -0
  264. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/test_author.py +0 -0
  265. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/test_chat.py +0 -0
  266. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/test_orchestrator.py +0 -0
  267. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/test_report.py +0 -0
  268. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/tui_release.py +0 -0
  269. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/usage.py +0 -0
  270. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/usage_limits.py +0 -0
  271. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/usage_rollup.py +0 -0
  272. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/worker_events.py +0 -0
  273. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coordinator.example.yml +0 -0
  274. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-agent.service +0 -0
  275. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-db-backup.service +0 -0
  276. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-db-backup.sh +0 -0
  277. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-db-backup.timer +0 -0
  278. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-drive-queue.service +0 -0
  279. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-drive-queue.timer +0 -0
  280. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-notify.service +0 -0
  281. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-notify.timer +0 -0
  282. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-release-propagate.service +0 -0
  283. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-release-propagate.timer +0 -0
  284. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-release-window.service +0 -0
  285. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-release-window.timer +0 -0
  286. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-serve.service +0 -0
  287. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web-dist-build.service +0 -0
  288. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web-dist-build.sh +0 -0
  289. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web-dist-build.timer +0 -0
  290. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web-rollback.sh +0 -0
  291. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web.service +0 -0
  292. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/node-shim.sh +0 -0
  293. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  294. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ADR_COORD_WEB_CI.md +0 -0
  295. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ADR_COORD_WEB_DIST.md +0 -0
  296. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/AGENT_OPERATIONS.md +0 -0
  297. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ARCHITECTURE.md +0 -0
  298. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ARCH_SECURITY_GATES.md +0 -0
  299. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/COCKPIT.md +0 -0
  300. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/CONTROL_CENTER.md +0 -0
  301. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/COST_DISCIPLINE.md +0 -0
  302. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/CROSS_PLATFORM.md +0 -0
  303. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/CUSTOMER_PORTAL.md +0 -0
  304. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/DRIVE_QUEUE.md +0 -0
  305. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/EPHEMERAL_WORKERS.md +0 -0
  306. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/FORGE_MIGRATION.md +0 -0
  307. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/GRAPHIFY_SETUP.md +0 -0
  308. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ISSUE_GUIDANCE.md +0 -0
  309. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/MAC_MINI.md +0 -0
  310. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  311. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/NOTIFIER.md +0 -0
  312. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/OPENCODE_VERIFICATION.md +0 -0
  313. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/OPERATING_GOTCHAS.md +0 -0
  314. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ORACLE_LOOP.md +0 -0
  315. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/PHONE_WEBAPP.md +0 -0
  316. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/PIPELINE_V2.md +0 -0
  317. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/PLATFORM_EVOLUTION.md +0 -0
  318. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/SECOND_BACKEND.md +0 -0
  319. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/STORE_SERVICE.md +0 -0
  320. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  321. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/WEB_CONTROL_CENTER.md +0 -0
  322. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/WSL_WINDOWS_WORKER.md +0 -0
  323. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/README.md +0 -0
  324. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/_tokens.css +0 -0
  325. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/issue-detail.html +0 -0
  326. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/pipeline-narrow.html +0 -0
  327. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/pipeline-wide.html +0 -0
  328. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/graphify-out/.gitignore +0 -0
  329. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/install-agent.sh +0 -0
  330. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/pyproject.toml +0 -0
  331. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/audit_review_verdict_overrides.py +0 -0
  332. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  333. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/build-worker-image.sh +0 -0
  334. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/coordinator-machine.py +0 -0
  335. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/epic-down.sh +0 -0
  336. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/epic-up.sh +0 -0
  337. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/preflight.sh +0 -0
  338. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/provision-worker.sh +0 -0
  339. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  340. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  341. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/verify-github-token.sh +0 -0
  342. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/check_gh_argv_containment.py +0 -0
  343. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/codegen.py +0 -0
  344. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/coord-test-runner.sh +0 -0
  345. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/drive-batch.sh +0 -0
  346. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/gen_board_fixture.py +0 -0
  347. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/next_release_tag.py +0 -0
  348. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/run_tests_in_populated_home.sh +0 -0
  349. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/run_tests_without_gh.sh +0 -0
  350. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/smoke_437_interactive.py +0 -0
  351. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/verify_878_review_capture.py +0 -0
  352. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/verify_release_published.py +0 -0
  353. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/verify_release_wheel.py +0 -0
  354. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/setup.cfg +0 -0
  355. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/SMOKE_SET.md +0 -0
  356. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/__init__.py +0 -0
  357. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  358. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/contract.md +0 -0
  359. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/manifest.yml +0 -0
  360. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  361. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  362. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  363. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  364. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/conftest.py +0 -0
  365. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/contract.md +0 -0
  366. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/manifest.yml +0 -0
  367. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  368. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  369. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/contract.md +0 -0
  370. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/manifest.yml +0 -0
  371. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  372. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  373. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  374. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  375. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  376. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  377. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  378. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  379. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  380. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  381. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/contract.md +0 -0
  382. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  383. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  384. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/manifest.yml +0 -0
  385. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  386. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/tsconfig.json +0 -0
  387. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  388. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  389. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  390. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/contract.md +0 -0
  391. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  392. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/manifest.yml +0 -0
  393. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  394. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  395. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  396. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  397. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  398. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  399. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  400. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  401. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  402. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  403. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  404. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  405. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/conftest.py +0 -0
  406. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/board-pipeline-basic.json +0 -0
  407. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  408. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  409. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  410. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  411. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/all_pass.json +0 -0
  412. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  413. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/mixed_fail.json +0 -0
  414. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  415. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  416. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/skip.json +0 -0
  417. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/truncated.json +0 -0
  418. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  419. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  420. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  421. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  422. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  423. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  424. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  425. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  426. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_acceptance.py +0 -0
  427. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_acceptance_drivers.py +0 -0
  428. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent.py +0 -0
  429. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_api_error.py +0 -0
  430. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_app.py +0 -0
  431. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_branch_base.py +0 -0
  432. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_branch_capture.py +0 -0
  433. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_config_free_1712.py +0 -0
  434. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_deploy_units_endpoint.py +0 -0
  435. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_dirty_worktree.py +0 -0
  436. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  437. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_graph_self_heal.py +0 -0
  438. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_health_h3.py +0 -0
  439. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_idle_restart.py +0 -0
  440. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_push_failure.py +0 -0
  441. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_reap.py +0 -0
  442. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_repos_and_pull.py +0 -0
  443. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_restart_services_endpoint.py +0 -0
  444. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_skills_self_heal.py +0 -0
  445. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_startup_diagnostics.py +0 -0
  446. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_update.py +0 -0
  447. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_update_bluegreen.py +0 -0
  448. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_usage_limit.py +0 -0
  449. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_zero_commit.py +0 -0
  450. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_ambient_home_isolation.py +0 -0
  451. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_approve_reject_plan.py +0 -0
  452. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_approve_usage_gate.py +0 -0
  453. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_assignment_already_recorded_daemon.py +0 -0
  454. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_audit_log.py +0 -0
  455. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_audit_outcome.py +0 -0
  456. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_audit_query.py +0 -0
  457. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_auto_loop.py +0 -0
  458. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_auto_release_publish_2035.py +0 -0
  459. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_base_checkout_restore.py +0 -0
  460. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_block_log.py +0 -0
  461. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_cap_762.py +0 -0
  462. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_fixture.py +0 -0
  463. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_read_path.py +0 -0
  464. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_service.py +0 -0
  465. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_state.py +0 -0
  466. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_wire.py +0 -0
  467. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_brain.py +0 -0
  468. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_branch_model.py +0 -0
  469. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_bug_intake.py +0 -0
  470. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_build_worker_image_env_update.py +0 -0
  471. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cargo_cache.py +0 -0
  472. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_check_gh_argv_containment.py +0 -0
  473. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_ci_acceptance_gate_1950.py +0 -0
  474. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_ci_parity_2091.py +0 -0
  475. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_ci_store.py +0 -0
  476. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_claim.py +0 -0
  477. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_acceptance.py +0 -0
  478. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign.py +0 -0
  479. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  480. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign_interactive_remote.py +0 -0
  481. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign_provider.py +0 -0
  482. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  483. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_audit.py +0 -0
  484. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_chat_continue.py +0 -0
  485. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_decide.py +0 -0
  486. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_diagnose_config_provenance.py +0 -0
  487. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_diagnose_forge_availability.py +0 -0
  488. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_diagnose_graph.py +0 -0
  489. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_diagnose_self.py +0 -0
  490. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_doctor.py +0 -0
  491. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_doctor_config_free_1801.py +0 -0
  492. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  493. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_drive.py +0 -0
  494. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_drive_queue.py +0 -0
  495. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_escalate.py +0 -0
  496. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_fix_headless_review.py +0 -0
  497. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_gate_a.py +0 -0
  498. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_install_drift.py +0 -0
  499. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_install_skills.py +0 -0
  500. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_issue_create_label.py +0 -0
  501. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_issue_reopen.py +0 -0
  502. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_merge.py +0 -0
  503. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_assign.py +0 -0
  504. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_capture.py +0 -0
  505. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_chat_add_child.py +0 -0
  506. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_dispatch.py +0 -0
  507. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_gate_b.py +0 -0
  508. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_gate_c.py +0 -0
  509. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_order.py +0 -0
  510. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  511. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_ship.py +0 -0
  512. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_network.py +0 -0
  513. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_new_issue_chat.py +0 -0
  514. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_plans.py +0 -0
  515. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_portal.py +0 -0
  516. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_pull_artifact.py +0 -0
  517. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_queue.py +0 -0
  518. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_reattach_sessions.py +0 -0
  519. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_refine_board.py +0 -0
  520. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_release_preflight.py +0 -0
  521. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_release_propagate.py +0 -0
  522. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_release_window.py +0 -0
  523. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_repo_2220.py +0 -0
  524. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_scorecard.py +0 -0
  525. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_set_review_findings.py +0 -0
  526. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_advisory_terminal.py +0 -0
  527. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_merge_queue.py +0 -0
  528. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_provider.py +0 -0
  529. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_review_finalizing.py +0 -0
  530. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_test_failed_tag.py +0 -0
  531. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_usage_limit.py +0 -0
  532. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_sync_comments_873.py +0 -0
  533. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_test_plan.py +0 -0
  534. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_track.py +0 -0
  535. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_tui_update.py +0 -0
  536. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_wait.py +0 -0
  537. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_client_base_install.py +0 -0
  538. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_comments.py +0 -0
  539. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_completion_summary.py +0 -0
  540. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config.py +0 -0
  541. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_acceptance.py +0 -0
  542. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_audit.py +0 -0
  543. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_pricing.py +0 -0
  544. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  545. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_usage_gate.py +0 -0
  546. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_confirm_test.py +0 -0
  547. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_conflict_fix.py +0 -0
  548. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_conflict_fix_semantic.py +0 -0
  549. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test.py +0 -0
  550. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test_runner_baseline.py +0 -0
  551. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test_runner_populated_home.py +0 -0
  552. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test_runner_routing.py +0 -0
  553. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test_runner_toolchain.py +0 -0
  554. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_web_sse_restart_live.py +0 -0
  555. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coordinator_machine.py +0 -0
  556. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cross_platform_imports.py +0 -0
  557. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dashboard.py +0 -0
  558. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dashboard_fixture.py +0 -0
  559. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dashboard_terminal.py +0 -0
  560. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dashboard_terminal_live.py +0 -0
  561. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_db.py +0 -0
  562. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dead_end.py +0 -0
  563. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_coord_db_backup.py +0 -0
  564. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_coord_web_dist.py +0 -0
  565. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_coord_web_rollback.py +0 -0
  566. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_drive_queue_unit.py +0 -0
  567. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_manifest.py +0 -0
  568. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_units_lane.py +0 -0
  569. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_web_unit.py +0 -0
  570. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deps.py +0 -0
  571. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_diagnose.py +0 -0
  572. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dispatch.py +0 -0
  573. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dispatch_target_validation.py +0 -0
  574. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dist_name.py +0 -0
  575. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_done_housekeeping.py +0 -0
  576. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_drive.py +0 -0
  577. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_drive_queue.py +0 -0
  578. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_drive_state.py +0 -0
  579. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_drive_tmux.py +0 -0
  580. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_epic_up_capability_detection.py +0 -0
  581. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  582. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_epic_up_image_provenance.py +0 -0
  583. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_errors.py +0 -0
  584. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_events.py +0 -0
  585. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_failure_class.py +0 -0
  586. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_filelock.py +0 -0
  587. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  588. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_fix_of_force_override.py +0 -0
  589. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_fleet_config_health.py +0 -0
  590. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_fleet_health_probes.py +0 -0
  591. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_fleet_health_snapshot.py +0 -0
  592. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_forge_availability.py +0 -0
  593. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_freshness.py +0 -0
  594. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gate_a.py +0 -0
  595. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gate_b.py +0 -0
  596. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gate_snapshot_staleness.py +0 -0
  597. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gates.py +0 -0
  598. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  599. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_generated_types_fixture.py +0 -0
  600. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_github_ops.py +0 -0
  601. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_goal.py +0 -0
  602. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_graph_health.py +0 -0
  603. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_graph_selfheal_absent_2237.py +0 -0
  604. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_handoff.py +0 -0
  605. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_checks.py +0 -0
  606. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_cli.py +0 -0
  607. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_cli_graph.py +0 -0
  608. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_config.py +0 -0
  609. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_context.py +0 -0
  610. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_coord_web_ci_pin.py +0 -0
  611. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_deploy_lane_facts.py +0 -0
  612. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_incident_regression.py +0 -0
  613. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_pypi.py +0 -0
  614. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_registry.py +0 -0
  615. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_timer_active.py +0 -0
  616. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_toolchain.py +0 -0
  617. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_unit_drift.py +0 -0
  618. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_unit_enablement.py +0 -0
  619. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_hooks.py +0 -0
  620. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_human_attended_437.py +0 -0
  621. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_init.py +0 -0
  622. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_integration.py +0 -0
  623. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_briefing_echo.py +0 -0
  624. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_prefill_state.py +0 -0
  625. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_session_relaunch.py +0 -0
  626. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_test_verdict_backstop.py +0 -0
  627. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_token_attribution.py +0 -0
  628. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_worktree.py +0 -0
  629. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_issue_store_seam.py +0 -0
  630. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_liveness_auditor.py +0 -0
  631. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_liveness_notify.py +0 -0
  632. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_machine_pause.py +0 -0
  633. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_merge_queue.py +0 -0
  634. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_merge_verify.py +0 -0
  635. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_chat.py +0 -0
  636. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_dispatch.py +0 -0
  637. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_gate.py +0 -0
  638. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_order.py +0 -0
  639. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_seam.py +0 -0
  640. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_mock_author.py +0 -0
  641. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_model_tiering.py +0 -0
  642. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_models.py +0 -0
  643. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_models_config_labels.py +0 -0
  644. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_needs_attention.py +0 -0
  645. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_network.py +0 -0
  646. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_new_issue_chat.py +0 -0
  647. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_next_release_tag.py +0 -0
  648. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_node_shim.py +0 -0
  649. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_baseline.py +0 -0
  650. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_cli.py +0 -0
  651. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_collect.py +0 -0
  652. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_config.py +0 -0
  653. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_drive_seam.py +0 -0
  654. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_isolation.py +0 -0
  655. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_predicate.py +0 -0
  656. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_quiet_hours.py +0 -0
  657. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_service.py +0 -0
  658. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notify.py +0 -0
  659. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notify_drain.py +0 -0
  660. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_openapi.py +0 -0
  661. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_operational_defaults.py +0 -0
  662. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_overlap_fence.py +0 -0
  663. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_overlap_predict.py +0 -0
  664. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_packaged_deploy_units.py +0 -0
  665. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_parentage.py +0 -0
  666. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_paste_landed.py +0 -0
  667. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_followup_approve_plan_command.py +0 -0
  668. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_followup_pr_command.py +0 -0
  669. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_followup_review_command.py +0 -0
  670. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_only.py +0 -0
  671. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_parser.py +0 -0
  672. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_platform_paths.py +0 -0
  673. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_portal_bridge.py +0 -0
  674. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_portal_config.py +0 -0
  675. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_portal_sync.py +0 -0
  676. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_pr_body_lint.py +0 -0
  677. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_prereqs.py +0 -0
  678. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_production_db_guard.py +0 -0
  679. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_progress.py +0 -0
  680. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_provider_seam.py +0 -0
  681. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_providers.py +0 -0
  682. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_providers_config_labels.py +0 -0
  683. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_providers_pty.py +0 -0
  684. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_quiet_hours.py +0 -0
  685. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_quiet_hours_store_2146.py +0 -0
  686. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reap_merged_sessions.py +0 -0
  687. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reap_stale_interactive_tick.py +0 -0
  688. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile.py +0 -0
  689. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_branch.py +0 -0
  690. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_completions.py +0 -0
  691. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_merges.py +0 -0
  692. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_no_agent_record.py +0 -0
  693. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_tick.py +0 -0
  694. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_usage_limit_done.py +0 -0
  695. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_refine_chat.py +0 -0
  696. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_cordon_2101.py +0 -0
  697. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  698. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_cordon_deadlock_2240.py +0 -0
  699. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_unified_1242.py +0 -0
  700. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_verify.py +0 -0
  701. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_window.py +0 -0
  702. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_remote_auto_prune.py +0 -0
  703. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_remote_interactive_reaper.py +0 -0
  704. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_repo_edit_2220.py +0 -0
  705. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_repo_graph_fleet_2237.py +0 -0
  706. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_repo_onboard_2220.py +0 -0
  707. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_report_result_push.py +0 -0
  708. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reports.py +0 -0
  709. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_retry.py +0 -0
  710. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_retry_advisory_1606.py +0 -0
  711. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_retry_type_1636.py +0 -0
  712. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_revalidate.py +0 -0
  713. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review.py +0 -0
  714. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_end_review_without_verdict.py +0 -0
  715. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_parse_failure_diagnostic.py +0 -0
  716. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_reaffirm.py +0 -0
  717. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_state.py +0 -0
  718. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_verdict_backstop.py +0 -0
  719. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_verdict_override_audit.py +0 -0
  720. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_verdict_relay.py +0 -0
  721. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_zero_commits.py +0 -0
  722. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_scoped_review_wiring.py +0 -0
  723. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_scorecard.py +0 -0
  724. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_self_health.py +0 -0
  725. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_serve.py +0 -0
  726. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_serve_app_board_trim.py +0 -0
  727. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_session.py +0 -0
  728. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_slice_issue_attribution.py +0 -0
  729. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_smoke.py +0 -0
  730. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_smoke_live_checkout_restore.py +0 -0
  731. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_smoke_workflow.py +0 -0
  732. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_spend_ceiling.py +0 -0
  733. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_spend_ceiling_coordinator.py +0 -0
  734. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_split.py +0 -0
  735. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_split_work.py +0 -0
  736. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_stage_projection.py +0 -0
  737. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_stalled_pipeline.py +0 -0
  738. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_state.py +0 -0
  739. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_state_review_findings_daemon.py +0 -0
  740. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_status_fleet_footer.py +0 -0
  741. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_stop_1567.py +0 -0
  742. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_stuck.py +0 -0
  743. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_terminal_command.py +0 -0
  744. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_author.py +0 -0
  745. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_chat.py +0 -0
  746. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_orchestrator.py +0 -0
  747. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_report.py +0 -0
  748. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_verdict_parsing.py +0 -0
  749. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_verdict_transcript_floor.py +0 -0
  750. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_thin_client_board_audit.py +0 -0
  751. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_thin_client_config_load_1080.py +0 -0
  752. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_thin_client_daemon_routing_906.py +0 -0
  753. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_tmux_host.py +0 -0
  754. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_tmux_session.py +0 -0
  755. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_transcript_floor.py +0 -0
  756. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_usage.py +0 -0
  757. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_usage_limits.py +0 -0
  758. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_usage_rollup.py +0 -0
  759. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_venv_live_install_2121.py +0 -0
  760. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_version_single_source.py +0 -0
  761. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_watch.py +0 -0
  762. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  763. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worker_events.py +0 -0
  764. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worker_image_pin_sync.py +0 -0
  765. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worker_safety.py +0 -0
  766. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worker_test_scoping.py +0 -0
  767. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worktree.py +0 -0
  768. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  769. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/Cargo.lock +0 -0
  770. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/Cargo.toml +0 -0
  771. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/cargo-config-local-quadraui.toml.example +0 -0
  772. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/audit.rs +0 -0
  773. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/chat.rs +0 -0
  774. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/events.rs +0 -0
  775. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/fleet_health.rs +0 -0
  776. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/fleet_sessions.rs +0 -0
  777. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/fleet_terminals.rs +0 -0
  778. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/format.rs +0 -0
  779. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/msv.rs +0 -0
  780. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/plans.rs +0 -0
  781. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/sessions.rs +0 -0
  782. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/sidebar.rs +0 -0
  783. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/terminal.rs +0 -0
  784. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/bin/gtk.rs +0 -0
  785. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/commands.rs +0 -0
  786. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/lib.rs +0 -0
  787. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/main.rs +0 -0
  788. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/settings.rs +0 -0
  789. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/tests/acceptance.rs +0 -0
  790. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/tests/cli.rs +0 -0
  791. {code_coordinator-0.5.196 → code_coordinator-0.5.200}/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.196
3
+ Version: 0.5.200
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.196
3
+ Version: 0.5.200
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
@@ -608,6 +608,7 @@ tests/test_refine_chat.py
608
608
  tests/test_release_cordon_2101.py
609
609
  tests/test_release_cordon_daemon_leads_2176.py
610
610
  tests/test_release_cordon_deadlock_2240.py
611
+ tests/test_release_cordon_stuck_2490.py
611
612
  tests/test_release_propagate.py
612
613
  tests/test_release_unified_1242.py
613
614
  tests/test_release_verify.py
@@ -670,6 +670,7 @@
670
670
  "tests/test_release_cordon_2101.py",
671
671
  "tests/test_release_cordon_daemon_leads_2176.py",
672
672
  "tests/test_release_cordon_deadlock_2240.py",
673
+ "tests/test_release_cordon_stuck_2490.py",
673
674
  "tests/test_release_propagate.py",
674
675
  "tests/test_release_unified_1242.py",
675
676
  "tests/test_release_verify.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.196",
2
+ "tag": "0.5.200",
3
3
  "distance": 0,
4
- "node": "g049ba86f1fa5713231873ab0a75ea2fa2c2fe27f",
4
+ "node": "gc8878ff7b1ebea74a3711aba656f4ccbb265122e",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-21"
@@ -1354,6 +1354,7 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1354
1354
  outcome.cooling_seconds = plan.cooling_seconds
1355
1355
  outcome.collateral_spared = list(plan.collateral_spared)
1356
1356
  outcome.blocked_behind = plan.blocked_behind
1357
+ outcome.stuck_in_cooldown = list(plan.stuck_in_cooldown)
1357
1358
  if plan.released is not None:
1358
1359
  outcome.released = plan.released.to_dict()
1359
1360
  # stderr as well as stdout: on the timer host this line IS the
@@ -2148,8 +2149,18 @@ def release_cordon(
2148
2149
  )
2149
2150
  )
2150
2151
  return
2152
+ # #2490: hosts the newest propagate run flagged as behind, idle, and
2153
+ # left uncordoned only because the #2240 cooldown is suppressing new
2154
+ # cordons. These are exactly the machines an operator would otherwise
2155
+ # have to notice by hand (`coord status` showing `online • idle` on a
2156
+ # host that's actually stuck on an old version) — surface them even when
2157
+ # `active` is empty, since a stuck host is by definition NOT cordoned.
2158
+ stuck_hosts, stuck_target = _stuck_hosts_from_journal()
2151
2159
  if not active:
2152
- click.echo("no machines are cordoned — the fleet is free to take work")
2160
+ if stuck_hosts:
2161
+ _echo_stuck_hosts(stuck_hosts, stuck_target)
2162
+ else:
2163
+ click.echo("no machines are cordoned — the fleet is free to take work")
2153
2164
  return
2154
2165
  for name, record in sorted(active.items()):
2155
2166
  remaining = max(0.0, record.expires_at - now) / 60.0
@@ -2180,6 +2191,8 @@ def release_cordon(
2180
2191
  f"`coord release propagate` releases it by itself after "
2181
2192
  f"{rc.DEFAULT_MAX_DEFERRALS}."
2182
2193
  )
2194
+ if stuck_hosts:
2195
+ _echo_stuck_hosts(stuck_hosts, stuck_target)
2183
2196
  click.echo(
2184
2197
  f"\nclear one with `coord release cordon --clear <machine>` "
2185
2198
  f"(default lifetime {rc.DEFAULT_TTL_SECONDS / 60:.0f}m — a cordon "
@@ -2197,6 +2210,59 @@ def _read_propagation_records() -> list[dict]:
2197
2210
  return []
2198
2211
 
2199
2212
 
2213
+ def _stuck_hosts_from_journal() -> tuple[list[str], str | None]:
2214
+ """Hosts the NEWEST propagate run flagged as stuck-in-cooldown (#2490).
2215
+
2216
+ ``CordonPlan.stuck_in_cooldown`` (mirrored onto ``CordonOutcome`` and
2217
+ journalled under a run's ``cordons`` key) names behind, idle hosts a run
2218
+ left uncordoned only because the #2240 deadlock-release cooldown is
2219
+ still active — the gap the issue is about: nothing gave such a host a
2220
+ signal or a path back to rolling for up to the cooldown's full length.
2221
+
2222
+ Only the single newest record counts, deliberately: this is a
2223
+ point-in-time reading ("as of the last tick"), and a host named in an
2224
+ older record may since have gone busy, rolled, or had its cooldown
2225
+ lift — reporting it from a stale record would be a false alarm, which is
2226
+ exactly the kind of noise this fleet already has too much of. No
2227
+ journal (a thin client, or a host that has never run propagate)
2228
+ degrades to nothing rather than raising — mirrors every other reader of
2229
+ this journal in this module.
2230
+ """
2231
+ try:
2232
+ records = _read_propagation_records()
2233
+ except Exception: # noqa: BLE001 — never load-bearing
2234
+ return [], None
2235
+ if not records:
2236
+ return [], None
2237
+ newest = records[-1]
2238
+ if not isinstance(newest, dict):
2239
+ return [], None
2240
+ cordons = newest.get("cordons")
2241
+ if not isinstance(cordons, dict):
2242
+ return [], None
2243
+ stuck = cordons.get("stuck_in_cooldown") or []
2244
+ if not isinstance(stuck, list):
2245
+ return [], None
2246
+ target = newest.get("target_version")
2247
+ return [str(h) for h in stuck], (str(target) if target else None)
2248
+
2249
+
2250
+ def _echo_stuck_hosts(stuck_hosts: list[str], stuck_target: str | None) -> None:
2251
+ """The #2490 notice both branches of ``release_cordon`` share.
2252
+
2253
+ One line per host, each naming its own override command — the format
2254
+ the issue itself asks for: "precision: 18m behind v0.5.192, idle, cordon
2255
+ suppressed by cooldown (#2240) — consider `coord agent update --machine
2256
+ precision`."
2257
+ """
2258
+ version = f"v{stuck_target}" if stuck_target else "the release"
2259
+ click.echo(f"\n! STUCK (#2490): behind {version}, idle, cordon suppressed "
2260
+ "by the #2240 deadlock-release cooldown — no automatic path "
2261
+ "back to rolling until it lifts on its own:")
2262
+ for host in sorted(stuck_hosts):
2263
+ click.echo(f" ! {host}: consider `coord agent update --machine {host}`")
2264
+
2265
+
2200
2266
  @release_group.command(
2201
2267
  "rollback",
2202
2268
  help=(
@@ -55,6 +55,30 @@ def _cordon_stall_suffix(cordons: dict) -> str:
55
55
  return f" ({described})" if described else ""
56
56
 
57
57
 
58
+ def _stuck_in_cooldown_hosts() -> dict[str, str | None]:
59
+ """Machine name -> target version, for hosts stuck-in-cooldown (#2490).
60
+
61
+ Thin wrapper around :func:`coord.commands.release._stuck_hosts_from_journal`
62
+ — same journal, same "newest record only" reading, reused rather than
63
+ reimplemented. A host in this dict is behind the target version, was
64
+ idle as of the last `coord release propagate` tick, and is NOT cordoned
65
+ (the #2240 cooldown is suppressing it) — which is exactly why it shows
66
+ up everywhere else in this command as a flatly ordinary `online • idle`.
67
+ That silence is the whole finding of #2490: a human noticed only because
68
+ they happened to be watching `coord status` themselves.
69
+
70
+ Degrades to ``{}`` on any error (no journal, an unreadable one, a thin
71
+ client) — never load-bearing, same contract as `_cordon_stall_suffix`.
72
+ """
73
+ from coord.commands.release import _stuck_hosts_from_journal # noqa: PLC0415
74
+
75
+ try:
76
+ hosts, target = _stuck_hosts_from_journal()
77
+ except Exception: # noqa: BLE001 — a status render must never fail on this
78
+ return {}
79
+ return {h: target for h in hosts}
80
+
81
+
58
82
  def _live_advisory_entries(
59
83
  entries: list[dict],
60
84
  cfg: "Config",
@@ -187,6 +211,9 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
187
211
  # same, which is why the 70-minute stall was invisible.
188
212
  cordon_stall = _cordon_stall_suffix(cordons)
189
213
  quiet_windows = effective_quiet_hours(cfg.machines)
214
+ # #2490: hosts the last propagate run flagged as behind + idle + stuck
215
+ # behind an active #2240 cooldown — see `_stuck_in_cooldown_hosts`.
216
+ stuck_in_cooldown = _stuck_in_cooldown_hosts()
190
217
 
191
218
  statuses = check_all(machines, timeout=timeout)
192
219
  agent_completed: dict[str, dict] = {}
@@ -314,6 +341,22 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
314
341
  for repo_name, reason in degraded.items():
315
342
  click.echo(f" ⚠ degraded: {repo_name} — {reason}")
316
343
 
344
+ # #2490: this host is behind the release, was idle last tick, and
345
+ # nothing is cordoning it because a #2240 deadlock-release cooldown
346
+ # is suppressing all new cordons fleet-wide. Without this line the
347
+ # machine above reads as a plain `online • idle` — indistinguishable
348
+ # from a machine with nothing to do, which is exactly how the
349
+ # 2026-08-20 incident went unnoticed for the length of the cooldown.
350
+ if m.name in stuck_in_cooldown:
351
+ stuck_target = stuck_in_cooldown[m.name]
352
+ stuck_version = f"v{stuck_target}" if stuck_target else "the release"
353
+ click.echo(
354
+ f" ⚠ STUCK: behind {stuck_version} and idle, but cordoning "
355
+ "is suppressed by an active #2240 deadlock-release cooldown "
356
+ "(#2490) — no automatic path back to rolling until it lifts; "
357
+ f"consider `coord agent update --machine {m.name}`"
358
+ )
359
+
317
360
  if status_result and status_result.ok and status_result.data:
318
361
  for entry in status_result.data.get("active", []):
319
362
  progress = entry.get("progress")
@@ -228,6 +228,17 @@ def compute_pipeline(
228
228
  None,
229
229
  )
230
230
 
231
+ # #2498: a review that came back "request-changes" must never read as
232
+ # mergeable, no matter what else is true about the assignment (including
233
+ # a stray `mq_entry` — see the `mq_entry is not None` branch below, and
234
+ # the unconditional "enqueue" gate this used to feed). Computed once here
235
+ # so both the stage-progression chain and the stage-status/gate-list
236
+ # logic further down share the same verdict check.
237
+ review_rejected = (
238
+ review_assignment is not None
239
+ and review_assignment.review_verdict == "request-changes"
240
+ )
241
+
231
242
  # ── Determine current_stage ──────────────────────────────────────────────
232
243
  current_stage: str
233
244
  if assignment.status == "running":
@@ -251,7 +262,39 @@ def compute_pipeline(
251
262
  current_stage = "merged"
252
263
  elif assignment.status in ("done", "pending"):
253
264
  # Evaluate from most advanced to least advanced.
254
- if mq_entry is not None:
265
+ # #2498: an `mq_entry` (queued/merging/merged) no longer trumps
266
+ # everything else when the linked review came back request-changes —
267
+ # fall through to the normal review/smoke evaluation below instead,
268
+ # so a rejected review keeps showing as blocked even if it was
269
+ # (incorrectly) enqueued before this fix, or by any other path that
270
+ # doesn't re-check the verdict.
271
+ #
272
+ # #2498 (review 1): a *genuine* smoke/test failure or an
273
+ # in-progress smoke assignment must still be checked, and still win,
274
+ # BEFORE `review_assignment` — those are real, distinct signals
275
+ # (an infra failure, or a smoke run that hasn't finished yet) and
276
+ # existing coverage (test_failed_smoke_assignment_does_not_fall_
277
+ # through_to_review) depends on a failed smoke assignment surfacing
278
+ # even when a review also completed.
279
+ #
280
+ # But `assignment.smoke_test == "pass"` (and the sibling
281
+ # "smoke_assignment done → treat as passed" branch) is a different
282
+ # kind of signal: per `coord/state.py:_record_test_verdict_local`
283
+ # (#1384), recording `test_state="passed"` always mirrors to
284
+ # `smoke_test="pass"` on this same work assignment — the default
285
+ # behaviour on every ordinary Test-gate pass, not an edge case — and
286
+ # `auto_loop.py`'s `test_precedes_review` gate requires exactly that
287
+ # mirrored "passed" state before it will ever dispatch a review. So
288
+ # by the time `review_assignment` exists at all, `smoke_test` is
289
+ # already "pass" essentially every time — meaning checking it before
290
+ # `review_assignment` resolved `current_stage` to "smoke_passed" and
291
+ # never reached the review branch at all, leaving `review_rejected`
292
+ # unenforced on the realistic "Test passed, then Review rejected"
293
+ # path. A dispatched review is definitionally more advanced than a
294
+ # merely-passed Test gate (Test precedes Review), so the "pass"
295
+ # branches move below the review check while the failure/running
296
+ # branches stay above it.
297
+ if mq_entry is not None and not review_rejected:
255
298
  from coord.merge_queue import MERGED, MERGING
256
299
 
257
300
  if mq_entry.state == MERGED:
@@ -260,8 +303,6 @@ def compute_pipeline(
260
303
  current_stage = "merging"
261
304
  else:
262
305
  current_stage = "merge_ready"
263
- elif assignment.smoke_test == "pass":
264
- current_stage = "smoke_passed"
265
306
  elif assignment.smoke_test == "fail":
266
307
  current_stage = "smoke_failed"
267
308
  elif smoke_assignment is not None and smoke_assignment.status in ("running", "pending"):
@@ -270,9 +311,6 @@ def compute_pipeline(
270
311
  # Smoke assignment itself failed (infra failure) — not the same as
271
312
  # the smoke *test* failing, but still unblocks the work assignment.
272
313
  current_stage = "smoke_failed"
273
- elif smoke_assignment is not None and smoke_assignment.status in ("done",):
274
- # Smoke assignment completed but smoke_test not yet set — treat as passed.
275
- current_stage = "smoke_passed"
276
314
  elif review_assignment is not None:
277
315
  if review_assignment.status in ("running", "pending", "finalizing"):
278
316
  # #1566: "finalizing" is a review row whose agent finished but
@@ -288,6 +326,11 @@ def compute_pipeline(
288
326
  current_stage = "review_failed"
289
327
  else:
290
328
  current_stage = "review_done"
329
+ elif assignment.smoke_test == "pass":
330
+ current_stage = "smoke_passed"
331
+ elif smoke_assignment is not None and smoke_assignment.status in ("done",):
332
+ # Smoke assignment completed but smoke_test not yet set — treat as passed.
333
+ current_stage = "smoke_passed"
291
334
  else:
292
335
  current_stage = "done"
293
336
  else:
@@ -327,6 +370,12 @@ def compute_pipeline(
327
370
  # This is the current stage.
328
371
  if current_stage == "merged":
329
372
  status = "completed" # final state, show as completed
373
+ elif current_stage == "review_done" and review_rejected:
374
+ # #2498: the review step finished, but a request-changes
375
+ # verdict means it did NOT clear the assignment for the next
376
+ # gate — show "active"/blocked, not a green "completed" that
377
+ # reads as "review passed."
378
+ status = "active"
330
379
  elif current_stage in ("smoke_passed", "review_done"):
331
380
  status = "completed" # sub-stage "done", ready for next gate
332
381
  elif current_stage == "failed":
@@ -367,7 +416,13 @@ def compute_pipeline(
367
416
  elif current_stage == "review_failed":
368
417
  available_gates.append(PipelineGate("dispatch_review", "Dispatch Review", _EP))
369
418
  elif current_stage == "review_done":
370
- available_gates.append(PipelineGate("enqueue", "Queue for Merge", _EP))
419
+ # #2498: only offer "Queue for Merge" when the review is approved or
420
+ # hasn't produced a verdict yet — a request-changes verdict must not
421
+ # be one click from the merge queue. `dispatch_fix` just below is
422
+ # already correctly gated the mirror-image way (only offered ON
423
+ # request-changes); this makes `enqueue` its proper complement.
424
+ if not review_rejected:
425
+ available_gates.append(PipelineGate("enqueue", "Queue for Merge", _EP))
371
426
  if review_assignment is not None and review_assignment.review_posted_at is None:
372
427
  available_gates.append(PipelineGate("post_findings", "Post Findings", _EP))
373
428
  # Offer the phone a way to record a review verdict manually when the
@@ -658,6 +658,17 @@ class CordonPlan:
658
658
  #: exactly when `collateral_spared` is non-empty. The single fact that
659
659
  #: would have turned a 40-minute puzzle into one line of output.
660
660
  blocked_behind: str | None = None
661
+ #: #2490: hosts that are BEHIND *target_version*, have no busy signal of
662
+ #: their own this run (idle), and are not being cordoned only because an
663
+ #: unexpired deadlock-release cooldown is suppressing all new cordons —
664
+ #: set exactly when ``cooling_seconds > 0``. This is the gap the issue
665
+ #: names: a host in this state has no automatic path back to rolling for
666
+ #: up to the cooldown's full length, and nothing surfaced that it was
667
+ #: sitting there idle, behind, and unflagged. Reported separately from
668
+ #: ``collateral_spared`` (blocked behind a busy daemon host — a different
669
+ #: reason a behind host stays uncordoned) so each surface can name the
670
+ #: actual cause instead of collapsing both into "not cordoned".
671
+ stuck_in_cooldown: tuple[str, ...] = ()
661
672
 
662
673
  @property
663
674
  def empty(self) -> bool:
@@ -668,6 +679,7 @@ class CordonPlan:
668
679
  or self.expired
669
680
  or self.released
670
681
  or self.collateral_spared
682
+ or self.stuck_in_cooldown
671
683
  )
672
684
 
673
685
  def to_dict(self) -> dict:
@@ -681,6 +693,7 @@ class CordonPlan:
681
693
  "cooling_seconds": self.cooling_seconds,
682
694
  "collateral_spared": list(self.collateral_spared),
683
695
  "blocked_behind": self.blocked_behind,
696
+ "stuck_in_cooldown": list(self.stuck_in_cooldown),
684
697
  }
685
698
 
686
699
  def render(self) -> list[str]:
@@ -718,6 +731,13 @@ class CordonPlan:
718
731
  "release (#2240) is still letting the fleet work; nothing was "
719
732
  "cordoned this run"
720
733
  )
734
+ for host in self.stuck_in_cooldown:
735
+ lines.append(
736
+ f" ! STUCK: {host} is behind and idle, but cordoning is "
737
+ "suppressed by the deadlock-release cooldown above (#2490) — "
738
+ f"it has no automatic path back to rolling until the cooldown "
739
+ f"lifts. Consider `coord agent update --machine {host}`."
740
+ )
721
741
  for esc in self.escalations:
722
742
  lines.append(f" ! {esc.message}")
723
743
  return lines
@@ -880,6 +900,21 @@ def plan_cordons(
880
900
  pressure = pressure or DeferralPressure()
881
901
  cooling = pressure.cooling_for(now, release_cooldown)
882
902
  if cooling > 0:
903
+ # #2490: a behind host with no busy signal of its own has nothing
904
+ # left holding it back except this cooldown — it is idle, it is
905
+ # behind, and it will sit exactly like that until the cooldown
906
+ # lifts (up to `release_cooldown` seconds) with no cordon and,
907
+ # before this, no signal anywhere that it needs attention.
908
+ # `collateral` hosts are excluded: those are uncordoned for an
909
+ # unrelated reason (blocked behind a busy daemon host) that already
910
+ # has its own name (`collateral_spared`/`blocked_behind`).
911
+ stuck = tuple(
912
+ sorted(
913
+ host
914
+ for host in (drift.behind - collateral)
915
+ if not (busy_reasons or {}).get(host)
916
+ )
917
+ )
883
918
  return CordonPlan(
884
919
  uncordon=to_uncordon,
885
920
  expired=expired,
@@ -887,6 +922,7 @@ def plan_cordons(
887
922
  unknown=tuple(sorted(drift.undecided & set(live))),
888
923
  collateral_spared=tuple(sorted(collateral)),
889
924
  blocked_behind=blocked_behind,
925
+ stuck_in_cooldown=stuck,
890
926
  )
891
927
  if max_deferrals > 0 and pressure.consecutive >= max_deferrals:
892
928
  return CordonPlan(
@@ -984,6 +1020,12 @@ class CordonOutcome:
984
1020
  #: #2176: the daemon host `collateral_spared` was spared on account of.
985
1021
  #: Mirrors `CordonPlan.blocked_behind`.
986
1022
  blocked_behind: str | None = None
1023
+ #: #2490: mirrors `CordonPlan.stuck_in_cooldown` — behind, idle hosts this
1024
+ #: run left uncordoned only because the #2240 deadlock cooldown is still
1025
+ #: active. Journalled (not just printed) so a read-only surface like
1026
+ #: `coord status` can flag them without recomputing `plan_cordons` itself
1027
+ #: — see `coord.commands.status._stuck_in_cooldown_hosts`.
1028
+ stuck_in_cooldown: list[str] = field(default_factory=list)
987
1029
 
988
1030
  def to_dict(self) -> dict:
989
1031
  return {
@@ -999,4 +1041,5 @@ class CordonOutcome:
999
1041
  "max_deferrals": self.max_deferrals,
1000
1042
  "collateral_spared": list(self.collateral_spared),
1001
1043
  "blocked_behind": self.blocked_behind,
1044
+ "stuck_in_cooldown": list(self.stuck_in_cooldown),
1002
1045
  }
@@ -1294,6 +1294,14 @@ def render_record(record: PropagationRecord | Mapping[str, Any]) -> list[str]:
1294
1294
  " cordons held off (post-release cooldown, #2240): "
1295
1295
  f"{float(cordons['cooling_seconds']) / 60.0:.0f}m left"
1296
1296
  )
1297
+ # #2490: name the hosts that were behind and idle but left uncordoned
1298
+ # purely because of the cooldown above — the gap that let `precision`
1299
+ # sit stuck for 30 minutes with no automatic path back to rolling.
1300
+ if cordons.get("stuck_in_cooldown"):
1301
+ lines.append(
1302
+ " ! STUCK (idle, behind, cooldown-suppressed, #2490): "
1303
+ + ", ".join(cordons["stuck_in_cooldown"])
1304
+ )
1297
1305
  for esc in cordons.get("escalated") or []:
1298
1306
  lines.append(f" ! {esc.get('message') or esc}")
1299
1307
  for err in cordons.get("errors") or []:
@@ -1787,3 +1787,99 @@ class TestDispatchFixGateForRequestChanges:
1787
1787
  pv = compute_pipeline(work, board, [], _config())
1788
1788
  gate_actions = {g.action for g in pv.available_gates}
1789
1789
  assert "dispatch_fix" not in gate_actions
1790
+
1791
+
1792
+ class TestMergeQueueIgnoresRejectedReview:
1793
+ """#2498: coord-web showed a request-changes review as mergeable once
1794
+ merge-queued — the top badge read "mergeable," the Review row in the
1795
+ gate-status list read green/"completed," and "Merge" was enabled,
1796
+ directly under a Review section whose own verdict said "Changes
1797
+ requested." Root cause was `current_stage`'s `mq_entry is not None`
1798
+ check firing unconditionally, before ever consulting
1799
+ `review_assignment.review_verdict` — and a second bug feeding it: the
1800
+ "enqueue" gate at review_done was offered unconditionally instead of
1801
+ being gated on the verdict the way `dispatch_fix` already was."""
1802
+
1803
+ def test_mq_entry_with_rejected_review_is_not_merge_ready(self) -> None:
1804
+ """An mq_entry existing (e.g. from before this fix, or any other path
1805
+ that skipped the verdict check) must not make a request-changes
1806
+ assignment read as merge_ready/merging/merged."""
1807
+ work = _work(aid="work-1", status="done")
1808
+ rev = _review(of_aid="work-1", status="done")
1809
+ rev.review_verdict = "request-changes"
1810
+ mq = [_mq_entry(state=PENDING)]
1811
+ board = Board(completed=[work, rev])
1812
+ pv = compute_pipeline(work, board, mq, _config())
1813
+
1814
+ assert pv.current_stage not in ("merge_ready", "merging", "merged")
1815
+ assert pv.current_stage == "review_done"
1816
+
1817
+ gate_actions = {g.action for g in pv.available_gates}
1818
+ assert "merge" not in gate_actions
1819
+ assert "enqueue" not in gate_actions
1820
+ assert "dispatch_fix" in gate_actions
1821
+
1822
+ review = next(s for s in pv.stages if s.name == "review")
1823
+ assert review.status != "completed"
1824
+
1825
+ def test_review_done_rejected_does_not_offer_enqueue(self) -> None:
1826
+ """Even with no mq_entry at all, "Queue for Merge" must not be
1827
+ offered on a request-changes verdict (the bug's proximate cause: a
1828
+ human — or an automated caller — one click from queueing rejected
1829
+ code)."""
1830
+ work = _work(aid="work-1", status="done")
1831
+ rev = _review(of_aid="work-1", status="done")
1832
+ rev.review_verdict = "request-changes"
1833
+ board = Board(completed=[work, rev])
1834
+ pv = compute_pipeline(work, board, [], _config())
1835
+
1836
+ assert pv.current_stage == "review_done"
1837
+ gate_actions = {g.action for g in pv.available_gates}
1838
+ assert "enqueue" not in gate_actions
1839
+ assert "dispatch_fix" in gate_actions
1840
+
1841
+ def test_smoke_test_pass_then_rejected_review_is_not_smoke_passed(self) -> None:
1842
+ """#2498 review 1: the realistic path. Per `_record_test_verdict_local`
1843
+ (#1384), a passed Test gate always mirrors `smoke_test="pass"` onto
1844
+ the parent work assignment BEFORE review ever dispatches (Test
1845
+ precedes Review) — so `smoke_test == "pass"` is the normal state by
1846
+ the time a review completes, not an edge case. The old elif-chain
1847
+ checked `assignment.smoke_test == "pass"` before `review_assignment
1848
+ is not None`, so it resolved to "smoke_passed" and never reached the
1849
+ review_rejected guard at all: the review stage rendered "waiting"
1850
+ (hiding that a review even ran) and the untouched `smoke_passed`
1851
+ branch offered "enqueue" unconditionally — one click from queueing
1852
+ rejected code. No `mq_entry` needed to trigger it."""
1853
+ work = _work(aid="work-1", status="done", smoke_test="pass")
1854
+ rev = _review(of_aid="work-1", status="done")
1855
+ rev.review_verdict = "request-changes"
1856
+ board = Board(completed=[work, rev])
1857
+ pv = compute_pipeline(work, board, [], _config())
1858
+
1859
+ assert pv.current_stage not in ("smoke_passed", "merge_ready", "merging", "merged")
1860
+ assert pv.current_stage == "review_done"
1861
+
1862
+ gate_actions = {g.action for g in pv.available_gates}
1863
+ assert "enqueue" not in gate_actions
1864
+ assert "dispatch_fix" in gate_actions
1865
+
1866
+ review = next(s for s in pv.stages if s.name == "review")
1867
+ assert review.status != "waiting"
1868
+ assert review.status != "completed"
1869
+
1870
+ def test_review_done_approved_still_offers_enqueue_with_mq_entry_absent(self) -> None:
1871
+ """Sanity check the fix doesn't over-correct: an approved (or
1872
+ no-verdict-yet) review_done still offers enqueue, unaffected."""
1873
+ work = _work(aid="work-1", status="done")
1874
+ rev = _review(of_aid="work-1", status="done")
1875
+ rev.review_verdict = "approve"
1876
+ board = Board(completed=[work, rev])
1877
+ pv = compute_pipeline(work, board, [], _config())
1878
+
1879
+ assert pv.current_stage == "review_done"
1880
+ gate_actions = {g.action for g in pv.available_gates}
1881
+ assert "enqueue" in gate_actions
1882
+ assert "dispatch_fix" not in gate_actions
1883
+
1884
+ review = next(s for s in pv.stages if s.name == "review")
1885
+ assert review.status == "completed"