code-coordinator 0.5.252__tar.gz → 0.5.255__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 (866) hide show
  1. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/release.py +7 -6
  5. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/config.py +41 -0
  6. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/release_propagate.py +11 -0
  7. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/release_verify.py +30 -0
  8. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/revalidate.py +161 -7
  9. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/serve_app.py +348 -8
  10. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_release_window.py +65 -3
  11. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config.py +46 -0
  12. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_propagate.py +10 -0
  13. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_verify.py +20 -8
  14. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_revalidate.py +362 -0
  15. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_serve.py +214 -0
  16. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/reports.rs +375 -117
  17. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/tests.rs +288 -0
  18. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.claude/commands/board.md +0 -0
  19. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.claude/commands/complete-session.md +0 -0
  20. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.claude/commands/coordinator.md +0 -0
  21. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.githooks/_lib.sh +0 -0
  22. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.githooks/post-checkout +0 -0
  23. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.githooks/post-commit +0 -0
  24. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.githooks/post-merge +0 -0
  25. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  26. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/coord-ci-acceptance.yml +0 -0
  27. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/auto-release.yml +0 -0
  28. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/cargo-test.yml +0 -0
  29. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/publish.yml +0 -0
  30. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/release-tui.yml +0 -0
  31. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/test.yml +0 -0
  32. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.gitignore +0 -0
  33. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/CLAUDE.md +0 -0
  34. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/GOAL.md +0 -0
  35. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/LICENSE +0 -0
  36. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/MANIFEST.in +0 -0
  37. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/README.md +0 -0
  38. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/SOURCES.txt +0 -0
  39. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/dependency_links.txt +0 -0
  40. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/entry_points.txt +0 -0
  41. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/requires.txt +0 -0
  42. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/scm_file_list.json +0 -0
  43. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/top_level.txt +0 -0
  44. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/__init__.py +0 -0
  45. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/_board_mapping.py +0 -0
  46. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/acceptance.py +0 -0
  47. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/acceptance_drivers.py +0 -0
  48. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agent.py +0 -0
  49. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agent_app.py +0 -0
  50. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agent_update.py +0 -0
  51. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agents/opencode/.gitignore +0 -0
  52. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agents/opencode/agents/work.md +0 -0
  53. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agents/opencode/routing.jsonc +0 -0
  54. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/approved_work.py +0 -0
  55. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/audit.py +0 -0
  56. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/auto_loop.py +0 -0
  57. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/block_log.py +0 -0
  58. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/board_bool_guard.py +0 -0
  59. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/board_schema.py +0 -0
  60. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/board_service.py +0 -0
  61. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/board_wire.py +0 -0
  62. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/brain.py +0 -0
  63. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/branch_model.py +0 -0
  64. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/bug_intake.py +0 -0
  65. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/cargo_cache.py +0 -0
  66. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/ci_fix.py +0 -0
  67. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/ci_github.py +0 -0
  68. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/ci_gitlab.py +0 -0
  69. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/ci_store.py +0 -0
  70. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/claim.py +0 -0
  71. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/cli.py +0 -0
  72. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/client.py +0 -0
  73. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/__init__.py +0 -0
  74. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/_common.py +0 -0
  75. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/acceptance.py +0 -0
  76. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/agent_ops.py +0 -0
  77. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/audit.py +0 -0
  78. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/chat.py +0 -0
  79. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/dispatch.py +0 -0
  80. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/dispatch_workers.py +0 -0
  81. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/drive.py +0 -0
  82. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/drive_queue.py +0 -0
  83. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/gate_a.py +0 -0
  84. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/gates.py +0 -0
  85. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/issues.py +0 -0
  86. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/lifecycle.py +0 -0
  87. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/merge.py +0 -0
  88. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/milestone.py +0 -0
  89. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/plan_followup.py +0 -0
  90. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/plans.py +0 -0
  91. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/portal.py +0 -0
  92. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/pr.py +0 -0
  93. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/repo.py +0 -0
  94. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/report.py +0 -0
  95. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/review.py +0 -0
  96. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/scorecard.py +0 -0
  97. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/sessions.py +0 -0
  98. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/setup.py +0 -0
  99. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/status.py +0 -0
  100. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/terminal.py +0 -0
  101. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/test_gate.py +0 -0
  102. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/tui.py +0 -0
  103. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/comments.py +0 -0
  104. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/config_reload.py +0 -0
  105. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/confirm_test.py +0 -0
  106. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/conflict_fix.py +0 -0
  107. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dao.py +0 -0
  108. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/__init__.py +0 -0
  109. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/fixture.py +0 -0
  110. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/index.html +0 -0
  111. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/server.py +0 -0
  112. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/terminal.py +0 -0
  113. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/db.py +0 -0
  114. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dead_end.py +0 -0
  115. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/decomposition_chat.py +0 -0
  116. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/README.md +0 -0
  117. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-agent.service +0 -0
  118. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-db-backup.service +0 -0
  119. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-db-backup.sh +0 -0
  120. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-db-backup.timer +0 -0
  121. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-drive-queue.service +0 -0
  122. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-drive-queue.timer +0 -0
  123. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-failure-notify.service +0 -0
  124. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-fleet-watchdog.service +0 -0
  125. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  126. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-notify.service +0 -0
  127. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-notify.timer +0 -0
  128. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-release-propagate.service +0 -0
  129. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-release-propagate.timer +0 -0
  130. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-release-window.service +0 -0
  131. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-release-window.timer +0 -0
  132. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-serve.service +0 -0
  133. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-web-dist-build.service +0 -0
  134. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-web-dist-build.timer +0 -0
  135. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-web.service +0 -0
  136. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy_manifest.py +0 -0
  137. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy_units.py +0 -0
  138. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deps.py +0 -0
  139. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/diagnose.py +0 -0
  140. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dispatch.py +0 -0
  141. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dist_name.py +0 -0
  142. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/drive.py +0 -0
  143. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/drive_queue.py +0 -0
  144. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/drive_state.py +0 -0
  145. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/events.py +0 -0
  146. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/failure_class.py +0 -0
  147. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/filelock.py +0 -0
  148. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/fleet_config_health.py +0 -0
  149. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/forge_availability.py +0 -0
  150. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/freshness.py +0 -0
  151. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/gate_a.py +0 -0
  152. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/gate_b.py +0 -0
  153. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/gate_snapshot.py +0 -0
  154. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/gates.py +0 -0
  155. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/github_ops.py +0 -0
  156. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/github_throttle.py +0 -0
  157. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/goal.py +0 -0
  158. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/graph_health.py +0 -0
  159. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/__init__.py +0 -0
  160. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/aggregate.py +0 -0
  161. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/__init__.py +0 -0
  162. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/agent_install.py +0 -0
  163. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/cargo_targets.py +0 -0
  164. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/claude_binary.py +0 -0
  165. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/coord_web_ci_pin.py +0 -0
  166. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/deploy_lane_facts.py +0 -0
  167. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/disk.py +0 -0
  168. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/fleet_board.py +0 -0
  169. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  170. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/fleet_phantom.py +0 -0
  171. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/fleet_unit_drift.py +0 -0
  172. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/graph.py +0 -0
  173. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/graphify_cli.py +0 -0
  174. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/index_lock.py +0 -0
  175. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/plan_usage.py +0 -0
  176. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/release_cordon.py +0 -0
  177. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/repo_state.py +0 -0
  178. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/spawned_coord.py +0 -0
  179. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/stalled_pipeline.py +0 -0
  180. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/timer_active.py +0 -0
  181. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/toolchain.py +0 -0
  182. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/unit_drift.py +0 -0
  183. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/unit_enablement.py +0 -0
  184. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/worktrees.py +0 -0
  185. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/cli.py +0 -0
  186. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/context.py +0 -0
  187. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/fleet_snapshot.py +0 -0
  188. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/models.py +0 -0
  189. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/pypi.py +0 -0
  190. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/registry.py +0 -0
  191. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/render.py +0 -0
  192. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/units.py +0 -0
  193. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/hooks.py +0 -0
  194. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/housekeeping.py +0 -0
  195. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/interactive.py +0 -0
  196. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/issue_store.py +0 -0
  197. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/liveness_auditor.py +0 -0
  198. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/machine_pause.py +0 -0
  199. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/merge_queue.py +0 -0
  200. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/milestone_chat.py +0 -0
  201. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/milestone_dispatch.py +0 -0
  202. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/milestone_gate.py +0 -0
  203. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/milestone_order.py +0 -0
  204. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/mock_author.py +0 -0
  205. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/models.py +0 -0
  206. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/network.py +0 -0
  207. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/new_issue_chat.py +0 -0
  208. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/__init__.py +0 -0
  209. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/baseline.py +0 -0
  210. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/cli.py +0 -0
  211. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/collect.py +0 -0
  212. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/digest.py +0 -0
  213. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/models.py +0 -0
  214. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/predicate.py +0 -0
  215. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/service.py +0 -0
  216. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/store.py +0 -0
  217. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/transport.py +0 -0
  218. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notify.py +0 -0
  219. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/openapi.py +0 -0
  220. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/overlap_fence.py +0 -0
  221. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/overlap_predict.py +0 -0
  222. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/parentage.py +0 -0
  223. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/parentage_github.py +0 -0
  224. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/pipeline.py +0 -0
  225. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/plan_parser.py +0 -0
  226. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/plans.py +0 -0
  227. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/platform_paths.py +0 -0
  228. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/portal_bridge.py +0 -0
  229. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/portal_store.py +0 -0
  230. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/portal_sync.py +0 -0
  231. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/pr_body_lint.py +0 -0
  232. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/prereqs.py +0 -0
  233. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/progress.py +0 -0
  234. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/__init__.py +0 -0
  235. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/base.py +0 -0
  236. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/claude.py +0 -0
  237. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/claude_pty.py +0 -0
  238. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/opencode.py +0 -0
  239. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/queue_diagnose.py +0 -0
  240. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/reconcile.py +0 -0
  241. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/reconcile_tick.py +0 -0
  242. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/refine_chat.py +0 -0
  243. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/release_cordon.py +0 -0
  244. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/release_window.py +0 -0
  245. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/repo_edit.py +0 -0
  246. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/repo_onboard.py +0 -0
  247. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/reports.py +0 -0
  248. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/review.py +0 -0
  249. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/scorecard.py +0 -0
  250. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/self_health.py +0 -0
  251. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  252. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  253. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  254. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  255. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  256. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/portal-followup/SKILL.md +0 -0
  257. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  258. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  259. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/update-issue/SKILL.md +0 -0
  260. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/smoke.py +0 -0
  261. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/spend_ceiling.py +0 -0
  262. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/split_work.py +0 -0
  263. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/sql.py +0 -0
  264. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/stage_projection.py +0 -0
  265. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/state.py +0 -0
  266. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/test_author.py +0 -0
  267. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/test_chat.py +0 -0
  268. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/test_orchestrator.py +0 -0
  269. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/test_report.py +0 -0
  270. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/tui_release.py +0 -0
  271. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/usage.py +0 -0
  272. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/usage_limits.py +0 -0
  273. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/usage_rollup.py +0 -0
  274. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/worker_events.py +0 -0
  275. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coordinator.example.yml +0 -0
  276. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-agent.service +0 -0
  277. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-db-backup.service +0 -0
  278. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-db-backup.sh +0 -0
  279. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-db-backup.timer +0 -0
  280. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-drive-queue.service +0 -0
  281. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-drive-queue.timer +0 -0
  282. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-failure-notify.service +0 -0
  283. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-failure-notify.sh +0 -0
  284. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-fleet-watchdog.service +0 -0
  285. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-fleet-watchdog.timer +0 -0
  286. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-notify.service +0 -0
  287. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-notify.timer +0 -0
  288. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-release-propagate.service +0 -0
  289. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-release-propagate.timer +0 -0
  290. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-release-window.service +0 -0
  291. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-release-window.timer +0 -0
  292. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-serve.service +0 -0
  293. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web-dist-build.service +0 -0
  294. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web-dist-build.sh +0 -0
  295. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web-dist-build.timer +0 -0
  296. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web-rollback.sh +0 -0
  297. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web.service +0 -0
  298. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/node-shim.sh +0 -0
  299. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  300. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ADR_COORD_WEB_CI.md +0 -0
  301. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ADR_COORD_WEB_DIST.md +0 -0
  302. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/AGENT_OPERATIONS.md +0 -0
  303. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ARCHITECTURE.md +0 -0
  304. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ARCH_SECURITY_GATES.md +0 -0
  305. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/COCKPIT.md +0 -0
  306. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/CONTROL_CENTER.md +0 -0
  307. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/COST_DISCIPLINE.md +0 -0
  308. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/CROSS_PLATFORM.md +0 -0
  309. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/CUSTOMER_FACING_APPS.md +0 -0
  310. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/CUSTOMER_PORTAL.md +0 -0
  311. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/DRIVE_QUEUE.md +0 -0
  312. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/EPHEMERAL_WORKERS.md +0 -0
  313. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/FORGE_MIGRATION.md +0 -0
  314. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/GRAPHIFY_SETUP.md +0 -0
  315. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ISSUE_GUIDANCE.md +0 -0
  316. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/MAC_MINI.md +0 -0
  317. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  318. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/NOTIFIER.md +0 -0
  319. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/OPENCODE_VERIFICATION.md +0 -0
  320. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/OPERATING_GOTCHAS.md +0 -0
  321. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/OPERATOR_GUIDES.md +0 -0
  322. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ORACLE_LOOP.md +0 -0
  323. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/PHONE_WEBAPP.md +0 -0
  324. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/PIPELINE_V2.md +0 -0
  325. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/PLATFORM_EVOLUTION.md +0 -0
  326. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/SECOND_BACKEND.md +0 -0
  327. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/STORE_SERVICE.md +0 -0
  328. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  329. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/WEB_CONTROL_CENTER.md +0 -0
  330. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/WSL_WINDOWS_WORKER.md +0 -0
  331. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/README.md +0 -0
  332. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/_tokens.css +0 -0
  333. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/issue-detail.html +0 -0
  334. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/pipeline-narrow.html +0 -0
  335. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/pipeline-wide.html +0 -0
  336. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/graphify-out/.gitignore +0 -0
  337. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/install-agent.sh +0 -0
  338. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/pyproject.toml +0 -0
  339. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/audit_review_verdict_overrides.py +0 -0
  340. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  341. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/build-worker-image.sh +0 -0
  342. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/coordinator-machine.py +0 -0
  343. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/epic-down.sh +0 -0
  344. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/epic-up.sh +0 -0
  345. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/preflight.sh +0 -0
  346. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/provision-worker.sh +0 -0
  347. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  348. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  349. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/verify-github-token.sh +0 -0
  350. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/check_gh_argv_containment.py +0 -0
  351. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/codegen.py +0 -0
  352. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/coord-test-runner.sh +0 -0
  353. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/coord-venv-rollback.sh +0 -0
  354. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/drive-batch.sh +0 -0
  355. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/fleet_watchdog.py +0 -0
  356. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/gen_board_fixture.py +0 -0
  357. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/gen_mock_index.py +0 -0
  358. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/next_release_tag.py +0 -0
  359. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/run_tests_in_populated_home.sh +0 -0
  360. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/run_tests_without_gh.sh +0 -0
  361. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/smoke_437_interactive.py +0 -0
  362. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/verify_878_review_capture.py +0 -0
  363. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/verify_release_published.py +0 -0
  364. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/verify_release_wheel.py +0 -0
  365. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/setup.cfg +0 -0
  366. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/SMOKE_SET.md +0 -0
  367. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/__init__.py +0 -0
  368. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  369. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/contract.md +0 -0
  370. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/manifest.yml +0 -0
  371. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  372. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  373. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  374. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  375. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/conftest.py +0 -0
  376. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/contract.md +0 -0
  377. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/manifest.yml +0 -0
  378. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  379. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  380. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/contract.md +0 -0
  381. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/manifest.yml +0 -0
  382. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  383. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  384. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  385. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  386. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  387. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  388. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  389. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  390. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  391. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  392. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/contract.md +0 -0
  393. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  394. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  395. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/manifest.yml +0 -0
  396. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  397. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/tsconfig.json +0 -0
  398. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  399. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  400. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  401. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/contract.md +0 -0
  402. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  403. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/manifest.yml +0 -0
  404. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  405. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  406. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  407. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  408. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  409. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  410. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  411. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  412. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  413. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  414. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  415. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  416. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/contract.md +0 -0
  417. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  418. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/manifest.yml +0 -0
  419. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  420. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  421. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  422. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  423. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  424. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  425. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  426. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/conftest.py +0 -0
  427. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/board-pipeline-basic.json +0 -0
  428. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  429. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  430. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  431. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  432. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/all_pass.json +0 -0
  433. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  434. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/mixed_fail.json +0 -0
  435. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  436. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  437. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/skip.json +0 -0
  438. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/truncated.json +0 -0
  439. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  440. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  441. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  442. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  443. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  444. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  445. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  446. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  447. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_acceptance.py +0 -0
  448. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_acceptance_drivers.py +0 -0
  449. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent.py +0 -0
  450. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_api_error.py +0 -0
  451. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_app.py +0 -0
  452. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_branch_base.py +0 -0
  453. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_branch_capture.py +0 -0
  454. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_config_free_1712.py +0 -0
  455. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_deploy_units_endpoint.py +0 -0
  456. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_dirty_worktree.py +0 -0
  457. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  458. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_graph_self_heal.py +0 -0
  459. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_health_h3.py +0 -0
  460. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_idle_restart.py +0 -0
  461. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_push_failure.py +0 -0
  462. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_reap.py +0 -0
  463. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_repos_and_pull.py +0 -0
  464. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_restart_services_endpoint.py +0 -0
  465. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_skills_self_heal.py +0 -0
  466. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_startup_diagnostics.py +0 -0
  467. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_update.py +0 -0
  468. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_update_bluegreen.py +0 -0
  469. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_usage_limit.py +0 -0
  470. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_zero_commit.py +0 -0
  471. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ambient_home_isolation.py +0 -0
  472. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_approve_dependency_busy_2804.py +0 -0
  473. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_approve_reject_plan.py +0 -0
  474. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_approve_usage_gate.py +0 -0
  475. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_approved_work_2532.py +0 -0
  476. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_assignment_already_recorded_daemon.py +0 -0
  477. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_audit_log.py +0 -0
  478. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_audit_outcome.py +0 -0
  479. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_audit_query.py +0 -0
  480. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_auto_loop.py +0 -0
  481. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_auto_release_publish_2035.py +0 -0
  482. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_base_checkout_restore.py +0 -0
  483. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_block_log.py +0 -0
  484. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_cap_762.py +0 -0
  485. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_fixture.py +0 -0
  486. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_read_path.py +0 -0
  487. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_schema.py +0 -0
  488. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_service.py +0 -0
  489. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_state.py +0 -0
  490. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_wire.py +0 -0
  491. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_brain.py +0 -0
  492. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_branch_model.py +0 -0
  493. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_bug_intake.py +0 -0
  494. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_build_worker_image_env_update.py +0 -0
  495. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cargo_cache.py +0 -0
  496. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_check_gh_argv_containment.py +0 -0
  497. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_acceptance_gate_1950.py +0 -0
  498. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_fix.py +0 -0
  499. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_gitlab.py +0 -0
  500. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_parity_2091.py +0 -0
  501. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_store.py +0 -0
  502. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_claim.py +0 -0
  503. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_claude_md_budget.py +0 -0
  504. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_acceptance.py +0 -0
  505. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign.py +0 -0
  506. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  507. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign_interactive_remote.py +0 -0
  508. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign_provider.py +0 -0
  509. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  510. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_audit.py +0 -0
  511. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_chat_continue.py +0 -0
  512. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_decide.py +0 -0
  513. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_diagnose_config_provenance.py +0 -0
  514. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_diagnose_forge_availability.py +0 -0
  515. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_diagnose_graph.py +0 -0
  516. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_diagnose_self.py +0 -0
  517. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_doctor.py +0 -0
  518. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_doctor_config_free_1801.py +0 -0
  519. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  520. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_drive.py +0 -0
  521. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_drive_queue.py +0 -0
  522. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_escalate.py +0 -0
  523. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_fix_headless_review.py +0 -0
  524. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_gate_a.py +0 -0
  525. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_install_drift.py +0 -0
  526. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_install_skills.py +0 -0
  527. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_issue_comment.py +0 -0
  528. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_issue_create_label.py +0 -0
  529. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_issue_reopen.py +0 -0
  530. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_issue_view_list.py +0 -0
  531. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_merge.py +0 -0
  532. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_assign.py +0 -0
  533. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_capture.py +0 -0
  534. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_chat_add_child.py +0 -0
  535. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_dispatch.py +0 -0
  536. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_gate_b.py +0 -0
  537. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_gate_c.py +0 -0
  538. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_order.py +0 -0
  539. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  540. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_ship.py +0 -0
  541. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_network.py +0 -0
  542. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_new_issue_chat.py +0 -0
  543. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_plans.py +0 -0
  544. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_portal.py +0 -0
  545. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_pr.py +0 -0
  546. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_pull_artifact.py +0 -0
  547. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_queue.py +0 -0
  548. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_reattach_sessions.py +0 -0
  549. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_refine_board.py +0 -0
  550. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_release_preflight.py +0 -0
  551. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_release_propagate.py +0 -0
  552. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_repo_2220.py +0 -0
  553. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  554. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_scorecard.py +0 -0
  555. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_set_review_findings.py +0 -0
  556. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_advisory_terminal.py +0 -0
  557. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_contested_tag.py +0 -0
  558. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_merge_queue.py +0 -0
  559. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_provider.py +0 -0
  560. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_review_finalizing.py +0 -0
  561. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_test_failed_tag.py +0 -0
  562. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_usage_limit.py +0 -0
  563. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_sync_comments_873.py +0 -0
  564. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_test_plan.py +0 -0
  565. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_track.py +0 -0
  566. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_tui_update.py +0 -0
  567. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_wait.py +0 -0
  568. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_client_base_install.py +0 -0
  569. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_commands_common.py +0 -0
  570. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_comments.py +0 -0
  571. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_completion_summary.py +0 -0
  572. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_acceptance.py +0 -0
  573. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_audit.py +0 -0
  574. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_pricing.py +0 -0
  575. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  576. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_usage_gate.py +0 -0
  577. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_confirm_test.py +0 -0
  578. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_conflict_fix.py +0 -0
  579. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_conflict_fix_semantic.py +0 -0
  580. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  581. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test.py +0 -0
  582. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test_runner_baseline.py +0 -0
  583. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test_runner_populated_home.py +0 -0
  584. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test_runner_routing.py +0 -0
  585. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test_runner_toolchain.py +0 -0
  586. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_uat.py +0 -0
  587. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_web_sse_restart_live.py +0 -0
  588. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coordinator_machine.py +0 -0
  589. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cross_platform_imports.py +0 -0
  590. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dao.py +0 -0
  591. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dashboard.py +0 -0
  592. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dashboard_fixture.py +0 -0
  593. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dashboard_terminal.py +0 -0
  594. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dashboard_terminal_live.py +0 -0
  595. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_db.py +0 -0
  596. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dead_end.py +0 -0
  597. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_decomposition_chat.py +0 -0
  598. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_coord_db_backup.py +0 -0
  599. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_coord_web_dist.py +0 -0
  600. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_coord_web_rollback.py +0 -0
  601. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_drive_queue_unit.py +0 -0
  602. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_failure_notify_unit.py +0 -0
  603. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_manifest.py +0 -0
  604. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_notify_unit.py +0 -0
  605. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_units_lane.py +0 -0
  606. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_web_unit.py +0 -0
  607. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deps.py +0 -0
  608. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_diagnose.py +0 -0
  609. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dispatch.py +0 -0
  610. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dispatch_target_validation.py +0 -0
  611. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dist_name.py +0 -0
  612. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_done_housekeeping.py +0 -0
  613. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive.py +0 -0
  614. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue.py +0 -0
  615. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_blocked_rendering.py +0 -0
  616. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_launch_argv.py +0 -0
  617. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  618. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_roll_pending.py +0 -0
  619. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  620. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_state.py +0 -0
  621. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_tmux.py +0 -0
  622. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_epic_up_capability_detection.py +0 -0
  623. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  624. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_epic_up_image_provenance.py +0 -0
  625. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_errors.py +0 -0
  626. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_events.py +0 -0
  627. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_failure_class.py +0 -0
  628. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_filelock.py +0 -0
  629. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  630. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fix_of_force_override.py +0 -0
  631. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fleet_config_health.py +0 -0
  632. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fleet_health_probes.py +0 -0
  633. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fleet_health_snapshot.py +0 -0
  634. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fleet_watchdog.py +0 -0
  635. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_forge_availability.py +0 -0
  636. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_freshness.py +0 -0
  637. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gate_a.py +0 -0
  638. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gate_b.py +0 -0
  639. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gate_snapshot_staleness.py +0 -0
  640. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gates.py +0 -0
  641. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  642. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gen_mock_index.py +0 -0
  643. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_generated_rust_fixture.py +0 -0
  644. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_generated_types_fixture.py +0 -0
  645. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_github_ops.py +0 -0
  646. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_github_throttle.py +0 -0
  647. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_goal.py +0 -0
  648. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_graph_health.py +0 -0
  649. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_graph_selfheal_absent_2237.py +0 -0
  650. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_handoff.py +0 -0
  651. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_checks.py +0 -0
  652. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_cli.py +0 -0
  653. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_cli_graph.py +0 -0
  654. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_config.py +0 -0
  655. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_context.py +0 -0
  656. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_coord_web_ci_pin.py +0 -0
  657. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_deploy_lane_facts.py +0 -0
  658. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_fix.py +0 -0
  659. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_incident_regression.py +0 -0
  660. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_pypi.py +0 -0
  661. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_registry.py +0 -0
  662. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_release_cordon_probe.py +0 -0
  663. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_timer_active.py +0 -0
  664. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_toolchain.py +0 -0
  665. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_unit_drift.py +0 -0
  666. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_unit_enablement.py +0 -0
  667. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_hooks.py +0 -0
  668. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_human_attended_437.py +0 -0
  669. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_init.py +0 -0
  670. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_integration.py +0 -0
  671. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_briefing_echo.py +0 -0
  672. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_pane_log_2541.py +0 -0
  673. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_prefill_state.py +0 -0
  674. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_session_relaunch.py +0 -0
  675. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_test_verdict_backstop.py +0 -0
  676. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_token_attribution.py +0 -0
  677. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_worktree.py +0 -0
  678. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_issue_store_seam.py +0 -0
  679. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_liveness_auditor.py +0 -0
  680. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_liveness_notify.py +0 -0
  681. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_machine_pause.py +0 -0
  682. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_merge_queue.py +0 -0
  683. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_merge_verify.py +0 -0
  684. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_chat.py +0 -0
  685. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_dispatch.py +0 -0
  686. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_gate.py +0 -0
  687. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_order.py +0 -0
  688. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_seam.py +0 -0
  689. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_mock_author.py +0 -0
  690. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_model_tiering.py +0 -0
  691. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_models.py +0 -0
  692. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_models_config_labels.py +0 -0
  693. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_needs_attention.py +0 -0
  694. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_network.py +0 -0
  695. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_new_issue_chat.py +0 -0
  696. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_next_release_tag.py +0 -0
  697. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_node_shim.py +0 -0
  698. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_baseline.py +0 -0
  699. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_cli.py +0 -0
  700. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_collect.py +0 -0
  701. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_config.py +0 -0
  702. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_drive_seam.py +0 -0
  703. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_isolation.py +0 -0
  704. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_predicate.py +0 -0
  705. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_quiet_hours.py +0 -0
  706. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_service.py +0 -0
  707. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notify.py +0 -0
  708. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notify_drain.py +0 -0
  709. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_openapi.py +0 -0
  710. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_operational_defaults.py +0 -0
  711. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_overlap_fence.py +0 -0
  712. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_overlap_predict.py +0 -0
  713. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_packaged_deploy_units.py +0 -0
  714. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_parentage.py +0 -0
  715. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_paste_landed.py +0 -0
  716. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  717. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_pipeline.py +0 -0
  718. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_followup_approve_plan_command.py +0 -0
  719. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_followup_pr_command.py +0 -0
  720. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_followup_review_command.py +0 -0
  721. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_only.py +0 -0
  722. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_parser.py +0 -0
  723. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_platform_paths.py +0 -0
  724. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_portal_bridge.py +0 -0
  725. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_portal_config.py +0 -0
  726. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_portal_store.py +0 -0
  727. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_portal_sync.py +0 -0
  728. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_pr_body_lint.py +0 -0
  729. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_prereqs.py +0 -0
  730. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_production_db_guard.py +0 -0
  731. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_progress.py +0 -0
  732. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_provider_seam.py +0 -0
  733. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_providers.py +0 -0
  734. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_providers_config_labels.py +0 -0
  735. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_providers_pty.py +0 -0
  736. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_quiet_hours.py +0 -0
  737. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_quiet_hours_store_2146.py +0 -0
  738. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reap_merged_sessions.py +0 -0
  739. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reap_stale_interactive_tick.py +0 -0
  740. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile.py +0 -0
  741. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_branch.py +0 -0
  742. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_completions.py +0 -0
  743. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  744. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_merges.py +0 -0
  745. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_no_agent_record.py +0 -0
  746. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_tick.py +0 -0
  747. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_usage_limit_done.py +0 -0
  748. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_refine_chat.py +0 -0
  749. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_cordon_2101.py +0 -0
  750. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  751. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_cordon_deadlock_2240.py +0 -0
  752. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_cordon_stuck_2490.py +0 -0
  753. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_propagate_threshold.py +0 -0
  754. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_roll_window_handoff.py +0 -0
  755. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_unified_1242.py +0 -0
  756. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_window.py +0 -0
  757. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_remote_auto_prune.py +0 -0
  758. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_remote_interactive_reaper.py +0 -0
  759. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_repo_add.py +0 -0
  760. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_repo_edit_2220.py +0 -0
  761. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_repo_graph_fleet_2237.py +0 -0
  762. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_repo_onboard_2220.py +0 -0
  763. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_report_result_push.py +0 -0
  764. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reports.py +0 -0
  765. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_retry.py +0 -0
  766. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_retry_advisory_1606.py +0 -0
  767. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_retry_type_1636.py +0 -0
  768. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review.py +0 -0
  769. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_end_review_without_verdict.py +0 -0
  770. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_parse_failure_diagnostic.py +0 -0
  771. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_reaffirm.py +0 -0
  772. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_state.py +0 -0
  773. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_verdict_backstop.py +0 -0
  774. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_verdict_override_audit.py +0 -0
  775. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_verdict_relay.py +0 -0
  776. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_zero_commits.py +0 -0
  777. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_scoped_review_wiring.py +0 -0
  778. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_scorecard.py +0 -0
  779. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_self_health.py +0 -0
  780. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_serve_app_board_trim.py +0 -0
  781. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_session.py +0 -0
  782. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_slice_issue_attribution.py +0 -0
  783. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_smoke.py +0 -0
  784. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_smoke_live_checkout_restore.py +0 -0
  785. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_smoke_workflow.py +0 -0
  786. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_spend_ceiling.py +0 -0
  787. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_spend_ceiling_coordinator.py +0 -0
  788. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_split.py +0 -0
  789. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_split_work.py +0 -0
  790. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_sql_dialect.py +0 -0
  791. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stage_projection.py +0 -0
  792. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stalled_pipeline.py +0 -0
  793. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_state.py +0 -0
  794. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_state_review_findings_daemon.py +0 -0
  795. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_status_fleet_footer.py +0 -0
  796. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stop_1567.py +0 -0
  797. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_store_contract.py +0 -0
  798. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stuck.py +0 -0
  799. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  800. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_terminal_command.py +0 -0
  801. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_author.py +0 -0
  802. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_chat.py +0 -0
  803. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_orchestrator.py +0 -0
  804. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_report.py +0 -0
  805. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_verdict_parsing.py +0 -0
  806. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_verdict_transcript_floor.py +0 -0
  807. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_text_io_encoding_audit.py +0 -0
  808. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_thin_client_board_audit.py +0 -0
  809. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_thin_client_config_load_1080.py +0 -0
  810. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_thin_client_daemon_routing_906.py +0 -0
  811. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_tmux_host.py +0 -0
  812. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_tmux_session.py +0 -0
  813. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_transcript_floor.py +0 -0
  814. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_usage.py +0 -0
  815. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_usage_limits.py +0 -0
  816. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_usage_rollup.py +0 -0
  817. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_venv_live_install_2121.py +0 -0
  818. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_version_single_source.py +0 -0
  819. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_watch.py +0 -0
  820. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  821. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_env_venv_isolation.py +0 -0
  822. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_events.py +0 -0
  823. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_image_pin_sync.py +0 -0
  824. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_safety.py +0 -0
  825. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_test_scoping.py +0 -0
  826. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worktree.py +0 -0
  827. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  828. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/Cargo.lock +0 -0
  829. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/Cargo.toml +0 -0
  830. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/cargo-config-local-quadraui.toml.example +0 -0
  831. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/approved.rs +0 -0
  832. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/audit.rs +0 -0
  833. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/chat.rs +0 -0
  834. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/data.rs +0 -0
  835. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/dialogs.rs +0 -0
  836. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/doc_tabs.rs +0 -0
  837. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/drive.rs +0 -0
  838. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/drive_queue.rs +0 -0
  839. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/escalation.rs +0 -0
  840. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/events.rs +0 -0
  841. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/fixtures.rs +0 -0
  842. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/fleet_health.rs +0 -0
  843. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/fleet_sessions.rs +0 -0
  844. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/fleet_terminals.rs +0 -0
  845. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/format.rs +0 -0
  846. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/milestone_dag.rs +0 -0
  847. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/mod.rs +0 -0
  848. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/msv.rs +0 -0
  849. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/pipeline.rs +0 -0
  850. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/plans.rs +0 -0
  851. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/render.rs +0 -0
  852. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/sessions.rs +0 -0
  853. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/settings_ui.rs +0 -0
  854. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/sidebar.rs +0 -0
  855. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/terminal.rs +0 -0
  856. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/types/generated.rs +0 -0
  857. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/types.rs +0 -0
  858. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/workspace.rs +0 -0
  859. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/bin/gtk.rs +0 -0
  860. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/commands.rs +0 -0
  861. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/lib.rs +0 -0
  862. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/main.rs +0 -0
  863. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/settings.rs +0 -0
  864. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/tests/acceptance.rs +0 -0
  865. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/tests/cli.rs +0 -0
  866. {code_coordinator-0.5.252 → code_coordinator-0.5.255}/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.252
3
+ Version: 0.5.255
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.252
3
+ Version: 0.5.255
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.252",
2
+ "tag": "0.5.255",
3
3
  "distance": 0,
4
- "node": "g05161051c601022afb4bd68113723cd72c2514f1",
4
+ "node": "g80d66a029ac6afe592c096343787da7edcc591a0",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-27"
@@ -1337,16 +1337,17 @@ def _python_lane_versions(
1337
1337
  """``{host: the OLDEST version its python lane reports}`` (#2101).
1338
1338
 
1339
1339
  "Python lane" is whatever :func:`coord.release_propagate.verify_lane_kind`
1340
- grades as one — the venv itself plus the live `coord-serve` process —
1341
- rather than a second list that could drift from the one the roll and the
1342
- gate already use.
1340
+ grades as one — the venv itself plus the live `coord-serve` and
1341
+ `coord-agent` processes — rather than a second list that could drift
1342
+ from the one the roll and the gate already use.
1343
1343
 
1344
1344
  Two deliberate readings:
1345
1345
 
1346
1346
  * the OLDEST readable version wins, because a host is as behind as its
1347
- most stale python lane. A venv that swapped while `coord-serve` still
1348
- runs the old generation is #2069's exact defect, and it must read as
1349
- "behind", not as "done";
1347
+ most stale python lane. A venv that swapped while `coord-serve` (or,
1348
+ on the daemon host, `coord-agent` — #2841) still runs the old
1349
+ generation is #2069's exact defect, and it must read as "behind", not
1350
+ as "done";
1350
1351
  * a host with an unreadable lane and no readable lane BEHIND the target is
1351
1352
  ``None`` — "no data", never "current" (#1834). `None` is what stops the
1352
1353
  host being cordoned on a guess *and* what stops an existing cordon being
@@ -1349,12 +1349,41 @@ class MergeConfig:
1349
1349
  oldest entry in a file-overlapping cluster of approved (PENDING) queue
1350
1350
  entries must have been waiting before the warning fires. ``0`` disables
1351
1351
  the warning entirely. Default ``24.0``.
1352
+
1353
+ ``auto_revalidate`` (#2829) lets the daemon's own tick resolve a
1354
+ stale-but-``passed`` verdict the same way an operator does by hand with
1355
+ ``coord merge --revalidate``: compose the candidate(s) onto the current
1356
+ base, run the suite once, merge on green. **Default-off**, and a
1357
+ strictly larger grant than ``auto_drain`` — it *starts test runs*, not
1358
+ just merges pre-approved ones — so it gets its own sibling trust bar
1359
+ (tracked in ``docs/MERGE_AUTO_DRAIN_TRUST_BAR.md``) rather than riding
1360
+ in on ``auto_drain``'s track record. See
1361
+ :func:`coord.serve_app._auto_revalidate_tick` for the lock-hold
1362
+ restructure this required: the composite runs OUTSIDE ``_merge_lock``
1363
+ and the lock is taken only to re-check the base hasn't moved and then
1364
+ merge, so an unattended composite (up to
1365
+ ``coord.revalidate.DEFAULT_TIMEOUT_SECONDS`` × ``1 +
1366
+ auto_revalidate_max_batch`` worst case) never wedges the whole fleet's
1367
+ merge lane the way running it inside the lock would.
1368
+
1369
+ ``auto_revalidate_max_batch`` caps how many candidates one unattended
1370
+ composite may validate together — deliberately well under
1371
+ :data:`coord.revalidate.MAX_REVALIDATION_BATCH` (10), since a RED
1372
+ composite's 1+N solo-run fallback is what actually holds the lock once
1373
+ the merge step runs, and that cost must stay small when nobody is
1374
+ watching it happen. Default ``3``. Combined with the "at most one
1375
+ composite per tick, never a burst" rule ``_auto_revalidate_tick``
1376
+ enforces in code (not a config knob — there is nothing to tune), this
1377
+ is the per-tick ceiling the trust bar calls for, analogous to
1378
+ ``auto_drain``'s ``max_per_tick``.
1352
1379
  """
1353
1380
 
1354
1381
  auto_drain: bool = False
1355
1382
  max_per_tick: int = 0
1356
1383
  auto_reap_merged: bool = True
1357
1384
  sibling_overlap_aging_hours: float = 24.0
1385
+ auto_revalidate: bool = False
1386
+ auto_revalidate_max_batch: int = 3
1358
1387
 
1359
1388
 
1360
1389
  @dataclass
@@ -3672,6 +3701,18 @@ def _parse_merge(raw: Any) -> MergeConfig:
3672
3701
  "merge.sibling_overlap_aging_hours must be a non-negative number"
3673
3702
  )
3674
3703
  cfg.sibling_overlap_aging_hours = float(value)
3704
+ if "auto_revalidate" in raw:
3705
+ value = raw["auto_revalidate"]
3706
+ if not isinstance(value, bool):
3707
+ raise ConfigError("merge.auto_revalidate must be a boolean")
3708
+ cfg.auto_revalidate = value
3709
+ if "auto_revalidate_max_batch" in raw:
3710
+ value = raw["auto_revalidate_max_batch"]
3711
+ if isinstance(value, bool) or not isinstance(value, int) or value < 1:
3712
+ raise ConfigError(
3713
+ "merge.auto_revalidate_max_batch must be a positive integer"
3714
+ )
3715
+ cfg.auto_revalidate_max_batch = value
3675
3716
  return cfg
3676
3717
 
3677
3718
 
@@ -271,10 +271,21 @@ ALL_LANES: tuple[str, ...] = (LANE_PYTHON, LANE_UNITS, LANE_TUI)
271
271
  #: spawns`` (what it would hand subprocesses), and the one #2069's restart
272
272
  #: actually targets, so it needs its own exact entry rather than falling out
273
273
  #: of the ``" spawns"`` suffix rule below.
274
+ #:
275
+ #: ``coord-agent process`` (:func:`coord.release_verify.lanes_for_host`) is
276
+ #: #2069 for ``coord-agent``: the agent's own frozen-at-start ``__version__``,
277
+ #: as distinct from ``coord-agent spawns`` (a fresh subprocess re-resolving
278
+ #: the venv on every poll, which flips the instant a swap lands whether or
279
+ #: not the agent restarted). On the daemon host the agent can *never*
280
+ #: self-restart (`agent_app.py`'s `_idle_restart_target` refuses there on
281
+ #: purpose), so this is the only lane that still reads a staged-but-
282
+ #: unrestarted swap as behind on that host — see the module docstring's
283
+ #: "REACH MUST GROW TO MEET THE GATE" section.
274
284
  _VERIFY_LANE_EXACT: dict[str, str] = {
275
285
  "~/.coord-venv": LANE_PYTHON,
276
286
  "coord-tui": LANE_TUI,
277
287
  "coord-serve process": LANE_PYTHON,
288
+ "coord-agent process": LANE_PYTHON,
278
289
  }
279
290
 
280
291
  #: Units whose *live process* a python-lane roll actually replaces. ``POST
@@ -245,6 +245,36 @@ def lanes_for_host(host: str, health: dict | None) -> list[Lane]:
245
245
  )
246
246
  )
247
247
 
248
+ # ── coord-agent process — the agent's OWN running version (#2841) ────
249
+ # `version` is `coord.__version__`, imported once at process start and
250
+ # frozen for that process's whole life (`coord/agent_app.py`'s health
251
+ # handler: `data["version"] = __version__`). That is exactly what #1834
252
+ # means by "verify the running process, not the venv" — unlike
253
+ # `coord-agent spawns` above, which resolves a *fresh* `coord --version`
254
+ # subprocess through the service PATH and therefore reports the new
255
+ # version the instant a blue/green swap flips `~/.coord-venv`, whether or
256
+ # not the agent that would spawn it has itself restarted.
257
+ #
258
+ # That distinction is cosmetic almost everywhere, because the agent
259
+ # self-restarts on an idle swap (`_idle_restart_target`) and the two
260
+ # lanes reconverge within one poll cycle. It stops being cosmetic on the
261
+ # daemon host: `_idle_restart_target` deliberately returns `None` there
262
+ # (a self-restarted agent would out-rank the `coord-serve` sitting next
263
+ # to it — see that function's docstring), so the daemon host's agent is
264
+ # the one case where nothing but this lane ever reads a staged-but-
265
+ # unrestarted swap as behind. #2069 gave `coord-serve` a `process` lane
266
+ # for the identical reason; this is that fix one unit over, for
267
+ # `coord-agent`.
268
+ if health is not None and "version" in health:
269
+ lanes.append(
270
+ Lane(
271
+ host=host,
272
+ lane="coord-agent process",
273
+ version=health.get("version") or None,
274
+ process=True,
275
+ )
276
+ )
277
+
248
278
  return lanes
249
279
 
250
280
 
@@ -81,11 +81,44 @@ terminates with a clear reason rather than spinning.
81
81
 
82
82
  OPT-IN, ALWAYS
83
83
  --------------
84
- None of this may ever run unattended. ``merge.auto_drain`` is ``false`` by
85
- design after the 2026-06-07 token-burn incident, and the daemon's
86
- ``_auto_drain_tick`` passes ``revalidate=False`` permanently. Batch
87
- revalidation inherits that posture wholesale: an operator asks for it, or it
88
- does not happen.
84
+ None of *this module's own functions* start running on a schedule — ``coord
85
+ merge --revalidate`` is the only caller that invokes :func:`revalidate` /
86
+ :func:`revalidate_group` directly, and the daemon's ``_auto_drain_tick``
87
+ passes ``revalidate=False`` permanently, exactly as before.
88
+
89
+ #2829 adds a SIBLING unattended caller instead of changing that:
90
+ :func:`coord.serve_app._auto_revalidate_tick`, gated on its own
91
+ ``merge.auto_revalidate`` flag (default ``false``, its own trust bar in
92
+ ``docs/MERGE_AUTO_DRAIN_TRUST_BAR.md``). The argument for treating this
93
+ differently from the 2026-06-07 token-burn shape that keeps ``auto_drain``
94
+ off: nothing here dispatches a worker or spends a token either way — see the
95
+ module-level paragraph above — so the guard that incident justifies does not
96
+ apply to this code path. What DOES apply, and what makes this "not a
97
+ one-line flag flip", is the lock-hold hazard: calling ``coord merge
98
+ --revalidate``'s existing plumbing (``_apply_revalidation`` →
99
+ ``revalidate_group`` → ``process()``, all under ``_merge_lock`` on the daemon
100
+ route) from an unattended tick would hold that lock for up to
101
+ ``DEFAULT_TIMEOUT_SECONDS × (1 + N)`` on every tick, wedging every other
102
+ merge in the fleet for as long as a sleeping operator doesn't notice.
103
+ ``_auto_revalidate_tick`` therefore does NOT reuse that call chain — it runs
104
+ :func:`revalidate_group` with **no lock held at all**, and takes
105
+ ``_merge_lock`` only immediately before merging, after
106
+ :func:`revalidated_base_still_current` confirms the base the composite
107
+ validated is still current. See that function's docstring for why the
108
+ recheck is the correctness crux, not an optional extra.
109
+
110
+ Acknowledged, not fixed (#2829 review round 1, non-blocking): with no lock
111
+ held at all, this function's own ``git fetch``/``git worktree add`` against
112
+ the shared, non-throwaway ``repo_dir`` (below) can now run at the same moment
113
+ an attended ``coord merge --revalidate`` (still under ``_merge_lock`` for its
114
+ whole duration) does the same thing against that identical checkout — an
115
+ overlap that could never happen before this module had two independent
116
+ unlocked callers. Git's own locking (``index.lock``, ref locks) generally
117
+ turns a clash into a clean failure rather than corruption, and this class of
118
+ unguarded concurrent local-checkout access already exists elsewhere in this
119
+ codebase (``coord test`` via ``confirm_test.py``), so it is left unguarded
120
+ here too — a repo-scoped mutex around the checkout is the fix if it ever
121
+ bites in practice.
89
122
  """
90
123
 
91
124
  from __future__ import annotations
@@ -348,6 +381,15 @@ class RevalidationResult:
348
381
 
349
382
  ``kind`` classifies a failure (#1715) so :func:`revalidate_group` can tell
350
383
  "this branch broke it" from "nothing here could ever have run".
384
+
385
+ ``validated_base_sha`` (#2829) is ``origin/<target_branch>``'s SHA at the
386
+ moment this run's worktree was built — ``None`` when no worktree was ever
387
+ created (every :data:`KIND_SETUP` return). It is the anchor an unattended
388
+ caller re-checks immediately before merging (see
389
+ :func:`revalidated_base_still_current`): a caller that takes no lock
390
+ while the suite runs must confirm, right before it acts on ``recorded``,
391
+ that this SHA is still what the base actually is — otherwise it would be
392
+ merging a tree the suite never validated.
351
393
  """
352
394
 
353
395
  ok: bool
@@ -357,6 +399,7 @@ class RevalidationResult:
357
399
  recorded: list[str] = field(default_factory=list)
358
400
  worktree: Path | None = None
359
401
  kind: str = KIND_OK
402
+ validated_base_sha: str | None = None
360
403
 
361
404
  def __bool__(self) -> bool: # pragma: no cover — convenience only
362
405
  return self.ok
@@ -746,6 +789,15 @@ def revalidate(
746
789
  ),
747
790
  )
748
791
 
792
+ # #2829: the base every return from here on actually validated against —
793
+ # stamped on every `RevalidationResult` below (success or failure) so an
794
+ # unattended caller that runs this whole function with no lock held can,
795
+ # right before it acts on a green result, re-check this SHA is still
796
+ # current (see `revalidated_base_still_current`). Read once, right after
797
+ # the worktree is built from it, rather than re-derived later — this IS
798
+ # the base the composed tree and the suite run actually saw.
799
+ base_sha = _rev_parse(repo_dir, f"origin/{target_branch}")
800
+
749
801
  composed: list[str] = []
750
802
  # `git merge` (not rebase) with an explicit commit: we only need a tree
751
803
  # that contains every candidate's content on top of the current base.
@@ -769,6 +821,7 @@ def revalidate(
769
821
  output=_tail(merged.stdout + "\n" + merged.stderr),
770
822
  composed=list(composed),
771
823
  worktree=wt_path,
824
+ validated_base_sha=base_sha,
772
825
  )
773
826
  composed.append(branch)
774
827
  echo(f" composed {branch}")
@@ -786,6 +839,7 @@ def revalidate(
786
839
  reason=f"revalidation build timed out after {timeout}s",
787
840
  composed=list(composed),
788
841
  worktree=wt_path,
842
+ validated_base_sha=base_sha,
789
843
  )
790
844
  if built.returncode != 0:
791
845
  build_output = (built.stdout or "") + "\n" + (built.stderr or "")
@@ -814,6 +868,7 @@ def revalidate(
814
868
  output=_tail(build_output),
815
869
  composed=list(composed),
816
870
  worktree=wt_path,
871
+ validated_base_sha=base_sha,
817
872
  )
818
873
 
819
874
  echo(f" running tests: {test_command}")
@@ -826,6 +881,7 @@ def revalidate(
826
881
  reason=f"revalidation suite timed out after {timeout}s",
827
882
  composed=list(composed),
828
883
  worktree=wt_path,
884
+ validated_base_sha=base_sha,
829
885
  )
830
886
  if tested.returncode != 0:
831
887
  test_output = (tested.stdout or "") + "\n" + (tested.stderr or "")
@@ -854,6 +910,7 @@ def revalidate(
854
910
  output=_tail(test_output),
855
911
  composed=list(composed),
856
912
  worktree=wt_path,
913
+ validated_base_sha=base_sha,
857
914
  )
858
915
 
859
916
  # ── Suite green: record the fresh verdicts ──────────────────────────────
@@ -862,8 +919,11 @@ def revalidate(
862
919
  # The commits this run ACTUALLY validated, read from the local refs the
863
920
  # worktree was built from — not re-discovered from GitHub afterwards. See
864
921
  # `record_test_staleness_anchor`'s docstring for why that distinction is
865
- # load-bearing rather than an optimisation.
866
- validated_base_sha = _rev_parse(repo_dir, f"origin/{target_branch}")
922
+ # load-bearing rather than an optimisation. Same value as `base_sha`
923
+ # above (nothing has fetched again since); reuse it rather than
924
+ # re-deriving so the RESULT's `validated_base_sha` and the ANCHOR written
925
+ # to the DB can never disagree.
926
+ validated_base_sha = base_sha
867
927
 
868
928
  recorded: list[str] = []
869
929
  composite_note = (
@@ -903,6 +963,7 @@ def revalidate(
903
963
  composed=composed,
904
964
  recorded=recorded,
905
965
  worktree=None,
966
+ validated_base_sha=validated_base_sha,
906
967
  )
907
968
 
908
969
 
@@ -1074,6 +1135,97 @@ def revalidate_group(
1074
1135
  return batch
1075
1136
 
1076
1137
 
1138
+ def recorded_validated_base_shas(
1139
+ batch: BatchRevalidationResult,
1140
+ candidates: list[RevalidationCandidate],
1141
+ ) -> dict[str, str | None]:
1142
+ """Map each RECORDED candidate to the base SHA the run that actually
1143
+ cleared it validated against (#2829).
1144
+
1145
+ Only :data:`coord.serve_app._auto_revalidate_tick` — the unattended
1146
+ caller — needs this: an attended ``coord merge --revalidate`` acts on
1147
+ ``batch.recorded`` immediately, under the same lock the whole call was
1148
+ already made under, so there is no gap for the base to move in. The
1149
+ unattended tick runs the composite (and any per-entry fallback) with NO
1150
+ lock held at all, so before it merges anything it must re-confirm, via
1151
+ :func:`revalidated_base_still_current`, that each recorded id's base is
1152
+ still what THIS mapping says was validated.
1153
+
1154
+ A clean composite validates every candidate against the SAME base
1155
+ (``batch.composite.validated_base_sha``). A composite that fell back to
1156
+ per-entry narrowing (#1715) took one run per candidate, each
1157
+ conceivably (if rarely) against a slightly later ``git fetch`` — so
1158
+ each survivor gets its OWN solo run's SHA instead. ``batch.per_entry``
1159
+ is built by :func:`revalidate_group` iterating *candidates* in order,
1160
+ appending exactly one entry per candidate whether it passed or failed
1161
+ (never skipped, never reordered) — so zipping the two by position
1162
+ recovers the correspondence without re-deriving the ``_label`` string
1163
+ matching :func:`format_batch` uses for display.
1164
+
1165
+ Only recorded (merge-eligible) candidates appear in the result — a
1166
+ candidate that never got a fresh verdict has nothing for a caller to
1167
+ gate before merging.
1168
+ """
1169
+ recorded = set(batch.recorded)
1170
+ result: dict[str, str | None] = {}
1171
+ if not batch.fell_back:
1172
+ for c in candidates:
1173
+ if c.work_assignment_id in recorded:
1174
+ result[c.work_assignment_id] = batch.composite.validated_base_sha
1175
+ return result
1176
+ for c, (_label, solo) in zip(candidates, batch.per_entry):
1177
+ if solo.ok and c.work_assignment_id in recorded:
1178
+ result[c.work_assignment_id] = solo.validated_base_sha
1179
+ return result
1180
+
1181
+
1182
+ def revalidated_base_still_current(
1183
+ config, repo_name: str, target_branch: str, validated_base_sha: str | None,
1184
+ ) -> bool:
1185
+ """True when *validated_base_sha* is still ``origin/<target_branch>``'s
1186
+ HEAD — the base-SHA recheck an unattended caller must run immediately
1187
+ before merging anything a lock-free composite just validated (#2829).
1188
+
1189
+ THE CORRECTNESS CRUX. :func:`coord.serve_app._auto_revalidate_tick` runs
1190
+ the (potentially 30-minute) composite with `_merge_lock` released, so
1191
+ another merge can move the base while it runs. A green composite is a
1192
+ claim about the tree it was BUILT from, not about whatever
1193
+ ``origin/<target_branch>`` happens to be by the time the suite finishes.
1194
+ Skipping this check would trade the liveness bug (a sleeping fleet
1195
+ wedged for 30+ minutes behind one composite) for a soundness bug
1196
+ (merging a tree the suite never actually ran against) — which is worse,
1197
+ because it fails silently instead of just being slow.
1198
+
1199
+ Fetches fresh (mirrors :func:`revalidate`'s own first step) rather than
1200
+ trusting whatever the caller's board/queue snapshot says, since the
1201
+ whole point is to catch a move that happened AFTER that snapshot was
1202
+ taken. Fail-closed: a ``None`` SHA (nothing was ever validated — e.g. a
1203
+ :data:`KIND_SETUP` result), a missing/unreachable local checkout, or a
1204
+ failed fetch all return ``False``. "Cannot confirm the base is
1205
+ unchanged" must never be treated as "confirmed unchanged" on a path
1206
+ that is about to merge with nobody watching — the caller's response to
1207
+ ``False`` is simply to skip merging this tick; the next tick's
1208
+ :func:`coord.merge_queue.plan` will see the recorded verdict's anchor no
1209
+ longer matches the (now different) base, call it stale again, and
1210
+ ``_auto_revalidate_tick`` will re-revalidate it against the new base —
1211
+ exactly the "discard the result and let the next tick retry" behaviour
1212
+ the issue calls for, with no explicit revert needed.
1213
+ """
1214
+ if not validated_base_sha:
1215
+ return False
1216
+ repo_dir = local_repo_dir(config, repo_name)
1217
+ if repo_dir is None or not repo_dir.exists():
1218
+ return False
1219
+ try:
1220
+ fetched = _run(["git", "fetch", "origin", "--prune"], cwd=repo_dir)
1221
+ except (subprocess.SubprocessError, OSError):
1222
+ return False
1223
+ if fetched.returncode != 0:
1224
+ return False
1225
+ current = _rev_parse(repo_dir, f"origin/{target_branch}")
1226
+ return current is not None and current == validated_base_sha
1227
+
1228
+
1077
1229
  def compose_conflict_error(entry) -> str:
1078
1230
  """The ``entry.error`` text for a branch that will not compose (#2231).
1079
1231
 
@@ -1268,7 +1420,9 @@ __all__ = [
1268
1420
  "is_baseline_red_failure",
1269
1421
  "is_infrastructure_failure",
1270
1422
  "local_repo_dir",
1423
+ "recorded_validated_base_shas",
1271
1424
  "revalidate",
1272
1425
  "revalidate_group",
1426
+ "revalidated_base_still_current",
1273
1427
  "revalidation_worktree_path",
1274
1428
  ]