code-coordinator 0.5.239__tar.gz → 0.5.241__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 (817) hide show
  1. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/audit.py +156 -24
  5. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/auto_loop.py +2 -1
  6. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/drive_queue.py +147 -6
  7. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/merge.py +60 -2
  8. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/milestone.py +12 -2
  9. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/db.py +27 -4
  10. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/overlap_predict.py +51 -0
  11. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/serve_app.py +19 -0
  12. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/state.py +27 -8
  13. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_audit_log.py +213 -0
  14. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_drive_queue.py +99 -0
  15. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_merge.py +138 -0
  16. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_db.py +67 -0
  17. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_overlap_predict.py +50 -0
  18. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_state.py +134 -0
  19. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.claude/commands/board.md +0 -0
  20. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.claude/commands/complete-session.md +0 -0
  21. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.claude/commands/coordinator.md +0 -0
  22. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.githooks/_lib.sh +0 -0
  23. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.githooks/post-checkout +0 -0
  24. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.githooks/post-commit +0 -0
  25. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.githooks/post-merge +0 -0
  26. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/coord-ci-acceptance.yml +0 -0
  28. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/auto-release.yml +0 -0
  29. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/cargo-test.yml +0 -0
  30. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/publish.yml +0 -0
  31. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/release-tui.yml +0 -0
  32. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/test.yml +0 -0
  33. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.gitignore +0 -0
  34. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/CLAUDE.md +0 -0
  35. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/GOAL.md +0 -0
  36. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/LICENSE +0 -0
  37. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/MANIFEST.in +0 -0
  38. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/README.md +0 -0
  39. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/SOURCES.txt +0 -0
  40. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/dependency_links.txt +0 -0
  41. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/entry_points.txt +0 -0
  42. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/requires.txt +0 -0
  43. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/scm_file_list.json +0 -0
  44. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/top_level.txt +0 -0
  45. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/__init__.py +0 -0
  46. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/_board_mapping.py +0 -0
  47. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/acceptance.py +0 -0
  48. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/acceptance_drivers.py +0 -0
  49. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agent.py +0 -0
  50. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agent_app.py +0 -0
  51. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agent_update.py +0 -0
  52. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agents/opencode/.gitignore +0 -0
  53. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agents/opencode/agents/work.md +0 -0
  54. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agents/opencode/routing.jsonc +0 -0
  55. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/approved_work.py +0 -0
  56. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/block_log.py +0 -0
  57. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/board_bool_guard.py +0 -0
  58. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/board_service.py +0 -0
  59. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/board_wire.py +0 -0
  60. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/brain.py +0 -0
  61. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/branch_model.py +0 -0
  62. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/bug_intake.py +0 -0
  63. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/cargo_cache.py +0 -0
  64. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/ci_fix.py +0 -0
  65. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/ci_github.py +0 -0
  66. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/ci_gitlab.py +0 -0
  67. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/ci_store.py +0 -0
  68. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/claim.py +0 -0
  69. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/cli.py +0 -0
  70. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/client.py +0 -0
  71. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/__init__.py +0 -0
  72. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/_common.py +0 -0
  73. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/acceptance.py +0 -0
  74. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/agent_ops.py +0 -0
  75. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/audit.py +0 -0
  76. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/chat.py +0 -0
  77. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/dispatch.py +0 -0
  78. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/dispatch_workers.py +0 -0
  79. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/drive.py +0 -0
  80. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/gate_a.py +0 -0
  81. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/gates.py +0 -0
  82. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/issues.py +0 -0
  83. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/lifecycle.py +0 -0
  84. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/portal.py +0 -0
  87. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/release.py +0 -0
  88. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/repo.py +0 -0
  89. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/report.py +0 -0
  90. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/review.py +0 -0
  91. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/scorecard.py +0 -0
  92. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/sessions.py +0 -0
  93. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/setup.py +0 -0
  94. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/status.py +0 -0
  95. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/terminal.py +0 -0
  96. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/test_gate.py +0 -0
  97. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/tui.py +0 -0
  98. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/comments.py +0 -0
  99. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/config.py +0 -0
  100. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/config_reload.py +0 -0
  101. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/confirm_test.py +0 -0
  102. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/conflict_fix.py +0 -0
  103. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dao.py +0 -0
  104. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/__init__.py +0 -0
  105. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/fixture.py +0 -0
  106. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/index.html +0 -0
  107. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/server.py +0 -0
  108. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dead_end.py +0 -0
  110. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/decomposition_chat.py +0 -0
  111. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/README.md +0 -0
  112. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-agent.service +0 -0
  113. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-db-backup.service +0 -0
  114. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-db-backup.sh +0 -0
  115. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-db-backup.timer +0 -0
  116. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-drive-queue.service +0 -0
  117. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-drive-queue.timer +0 -0
  118. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-notify.service +0 -0
  119. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-notify.timer +0 -0
  120. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-release-propagate.service +0 -0
  121. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-release-propagate.timer +0 -0
  122. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-release-window.service +0 -0
  123. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-release-window.timer +0 -0
  124. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-serve.service +0 -0
  125. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-web-dist-build.service +0 -0
  126. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-web-dist-build.timer +0 -0
  127. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-web.service +0 -0
  128. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy_manifest.py +0 -0
  129. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy_units.py +0 -0
  130. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deps.py +0 -0
  131. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/diagnose.py +0 -0
  132. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dispatch.py +0 -0
  133. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dist_name.py +0 -0
  134. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/drive.py +0 -0
  135. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/drive_queue.py +0 -0
  136. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/drive_state.py +0 -0
  137. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/events.py +0 -0
  138. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/failure_class.py +0 -0
  139. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/filelock.py +0 -0
  140. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/fleet_config_health.py +0 -0
  141. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/forge_availability.py +0 -0
  142. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/freshness.py +0 -0
  143. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/gate_a.py +0 -0
  144. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/gate_b.py +0 -0
  145. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/gate_snapshot.py +0 -0
  146. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/gates.py +0 -0
  147. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/github_ops.py +0 -0
  148. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/goal.py +0 -0
  149. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/graph_health.py +0 -0
  150. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/__init__.py +0 -0
  151. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/aggregate.py +0 -0
  152. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/__init__.py +0 -0
  153. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/agent_install.py +0 -0
  154. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/cargo_targets.py +0 -0
  155. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/claude_binary.py +0 -0
  156. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/coord_web_ci_pin.py +0 -0
  157. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/deploy_lane_facts.py +0 -0
  158. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/disk.py +0 -0
  159. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/fleet_board.py +0 -0
  160. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  161. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/fleet_phantom.py +0 -0
  162. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/fleet_unit_drift.py +0 -0
  163. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/graph.py +0 -0
  164. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/graphify_cli.py +0 -0
  165. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/index_lock.py +0 -0
  166. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/plan_usage.py +0 -0
  167. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/repo_state.py +0 -0
  168. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/spawned_coord.py +0 -0
  169. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/timer_active.py +0 -0
  170. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/toolchain.py +0 -0
  171. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/unit_drift.py +0 -0
  172. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/unit_enablement.py +0 -0
  173. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/worktrees.py +0 -0
  174. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/cli.py +0 -0
  175. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/context.py +0 -0
  176. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/fleet_snapshot.py +0 -0
  177. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/models.py +0 -0
  178. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/pypi.py +0 -0
  179. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/registry.py +0 -0
  180. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/render.py +0 -0
  181. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/units.py +0 -0
  182. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/hooks.py +0 -0
  183. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/housekeeping.py +0 -0
  184. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/interactive.py +0 -0
  185. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/issue_store.py +0 -0
  186. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/liveness_auditor.py +0 -0
  187. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/machine_pause.py +0 -0
  188. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/merge_queue.py +0 -0
  189. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/milestone_chat.py +0 -0
  190. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/milestone_dispatch.py +0 -0
  191. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/milestone_gate.py +0 -0
  192. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/milestone_order.py +0 -0
  193. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/mock_author.py +0 -0
  194. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/models.py +0 -0
  195. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/network.py +0 -0
  196. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/new_issue_chat.py +0 -0
  197. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/__init__.py +0 -0
  198. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/baseline.py +0 -0
  199. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/cli.py +0 -0
  200. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/collect.py +0 -0
  201. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/digest.py +0 -0
  202. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/models.py +0 -0
  203. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/predicate.py +0 -0
  204. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/service.py +0 -0
  205. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/store.py +0 -0
  206. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/transport.py +0 -0
  207. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notify.py +0 -0
  208. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/openapi.py +0 -0
  209. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/overlap_fence.py +0 -0
  210. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/parentage.py +0 -0
  211. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/parentage_github.py +0 -0
  212. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/pipeline.py +0 -0
  213. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/plan_parser.py +0 -0
  214. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/plans.py +0 -0
  215. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/platform_paths.py +0 -0
  216. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/portal_bridge.py +0 -0
  217. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/portal_store.py +0 -0
  218. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/portal_sync.py +0 -0
  219. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/pr_body_lint.py +0 -0
  220. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/prereqs.py +0 -0
  221. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/progress.py +0 -0
  222. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/__init__.py +0 -0
  223. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/base.py +0 -0
  224. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/claude.py +0 -0
  225. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/claude_pty.py +0 -0
  226. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/opencode.py +0 -0
  227. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/queue_diagnose.py +0 -0
  228. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/reconcile.py +0 -0
  229. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/reconcile_tick.py +0 -0
  230. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/refine_chat.py +0 -0
  231. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/release_cordon.py +0 -0
  232. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/release_propagate.py +0 -0
  233. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/release_verify.py +0 -0
  234. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/release_window.py +0 -0
  235. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/repo_edit.py +0 -0
  236. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/repo_onboard.py +0 -0
  237. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/reports.py +0 -0
  238. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/revalidate.py +0 -0
  239. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/review.py +0 -0
  240. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/scorecard.py +0 -0
  241. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/self_health.py +0 -0
  242. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  243. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  244. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  245. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  246. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  247. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/portal-followup/SKILL.md +0 -0
  248. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  249. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  250. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/update-issue/SKILL.md +0 -0
  251. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/smoke.py +0 -0
  252. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/spend_ceiling.py +0 -0
  253. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/split_work.py +0 -0
  254. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/stage_projection.py +0 -0
  255. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/test_author.py +0 -0
  256. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/test_chat.py +0 -0
  257. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/test_orchestrator.py +0 -0
  258. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/test_report.py +0 -0
  259. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/tui_release.py +0 -0
  260. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/usage.py +0 -0
  261. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/usage_limits.py +0 -0
  262. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/usage_rollup.py +0 -0
  263. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/worker_events.py +0 -0
  264. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coordinator.example.yml +0 -0
  265. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-agent.service +0 -0
  266. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-db-backup.service +0 -0
  267. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-db-backup.sh +0 -0
  268. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-db-backup.timer +0 -0
  269. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-drive-queue.service +0 -0
  270. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-drive-queue.timer +0 -0
  271. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-notify.service +0 -0
  272. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-notify.timer +0 -0
  273. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-release-propagate.service +0 -0
  274. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-release-propagate.timer +0 -0
  275. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-release-window.service +0 -0
  276. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-release-window.timer +0 -0
  277. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-serve.service +0 -0
  278. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web-dist-build.service +0 -0
  279. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web-dist-build.sh +0 -0
  280. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web-dist-build.timer +0 -0
  281. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web-rollback.sh +0 -0
  282. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web.service +0 -0
  283. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/node-shim.sh +0 -0
  284. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  285. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ADR_COORD_WEB_CI.md +0 -0
  286. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ADR_COORD_WEB_DIST.md +0 -0
  287. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/AGENT_OPERATIONS.md +0 -0
  288. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ARCHITECTURE.md +0 -0
  289. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ARCH_SECURITY_GATES.md +0 -0
  290. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/COCKPIT.md +0 -0
  291. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/CONTROL_CENTER.md +0 -0
  292. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/COST_DISCIPLINE.md +0 -0
  293. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/CROSS_PLATFORM.md +0 -0
  294. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/CUSTOMER_PORTAL.md +0 -0
  295. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/DRIVE_QUEUE.md +0 -0
  296. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/EPHEMERAL_WORKERS.md +0 -0
  297. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/FORGE_MIGRATION.md +0 -0
  298. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/GRAPHIFY_SETUP.md +0 -0
  299. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ISSUE_GUIDANCE.md +0 -0
  300. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/MAC_MINI.md +0 -0
  301. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  302. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/NOTIFIER.md +0 -0
  303. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/OPENCODE_VERIFICATION.md +0 -0
  304. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/OPERATING_GOTCHAS.md +0 -0
  305. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ORACLE_LOOP.md +0 -0
  306. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/PHONE_WEBAPP.md +0 -0
  307. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/PIPELINE_V2.md +0 -0
  308. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/PLATFORM_EVOLUTION.md +0 -0
  309. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/SECOND_BACKEND.md +0 -0
  310. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/STORE_SERVICE.md +0 -0
  311. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  312. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/WEB_CONTROL_CENTER.md +0 -0
  313. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/WSL_WINDOWS_WORKER.md +0 -0
  314. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/README.md +0 -0
  315. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/_tokens.css +0 -0
  316. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/issue-detail.html +0 -0
  317. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/pipeline-narrow.html +0 -0
  318. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/pipeline-wide.html +0 -0
  319. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/graphify-out/.gitignore +0 -0
  320. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/install-agent.sh +0 -0
  321. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/pyproject.toml +0 -0
  322. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/audit_review_verdict_overrides.py +0 -0
  323. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  324. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/build-worker-image.sh +0 -0
  325. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/coordinator-machine.py +0 -0
  326. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/epic-down.sh +0 -0
  327. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/epic-up.sh +0 -0
  328. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/preflight.sh +0 -0
  329. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/provision-worker.sh +0 -0
  330. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  331. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  332. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/verify-github-token.sh +0 -0
  333. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/check_gh_argv_containment.py +0 -0
  334. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/codegen.py +0 -0
  335. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/coord-test-runner.sh +0 -0
  336. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/drive-batch.sh +0 -0
  337. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/gen_board_fixture.py +0 -0
  338. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/gen_mock_index.py +0 -0
  339. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/next_release_tag.py +0 -0
  340. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/run_tests_in_populated_home.sh +0 -0
  341. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/run_tests_without_gh.sh +0 -0
  342. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/smoke_437_interactive.py +0 -0
  343. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/verify_878_review_capture.py +0 -0
  344. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/verify_release_published.py +0 -0
  345. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/verify_release_wheel.py +0 -0
  346. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/setup.cfg +0 -0
  347. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/SMOKE_SET.md +0 -0
  348. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/__init__.py +0 -0
  349. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  350. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/contract.md +0 -0
  351. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/manifest.yml +0 -0
  352. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  353. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  354. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  355. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  356. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/conftest.py +0 -0
  357. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/contract.md +0 -0
  358. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/manifest.yml +0 -0
  359. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  360. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  361. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/contract.md +0 -0
  362. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/manifest.yml +0 -0
  363. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  364. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  365. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  366. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  367. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  368. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  369. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  370. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  371. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  372. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  373. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/contract.md +0 -0
  374. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  375. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  376. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/manifest.yml +0 -0
  377. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  378. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/tsconfig.json +0 -0
  379. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  380. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  381. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  382. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/contract.md +0 -0
  383. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  384. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/manifest.yml +0 -0
  385. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  386. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  387. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  388. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  389. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  390. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  391. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  392. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  393. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  394. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  395. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  396. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  397. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/contract.md +0 -0
  398. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  399. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/manifest.yml +0 -0
  400. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  401. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  402. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  403. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  404. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  405. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  406. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  407. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/conftest.py +0 -0
  408. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/board-pipeline-basic.json +0 -0
  409. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  410. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  411. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  412. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  413. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/all_pass.json +0 -0
  414. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  415. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/mixed_fail.json +0 -0
  416. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  417. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  418. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/skip.json +0 -0
  419. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/truncated.json +0 -0
  420. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  421. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  422. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  423. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  424. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  425. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  426. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  427. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  428. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_acceptance.py +0 -0
  429. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_acceptance_drivers.py +0 -0
  430. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent.py +0 -0
  431. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_api_error.py +0 -0
  432. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_app.py +0 -0
  433. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_branch_base.py +0 -0
  434. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_branch_capture.py +0 -0
  435. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_config_free_1712.py +0 -0
  436. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_deploy_units_endpoint.py +0 -0
  437. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_dirty_worktree.py +0 -0
  438. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  439. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_graph_self_heal.py +0 -0
  440. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_health_h3.py +0 -0
  441. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_idle_restart.py +0 -0
  442. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_push_failure.py +0 -0
  443. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_reap.py +0 -0
  444. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_repos_and_pull.py +0 -0
  445. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_restart_services_endpoint.py +0 -0
  446. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_skills_self_heal.py +0 -0
  447. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_startup_diagnostics.py +0 -0
  448. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_update.py +0 -0
  449. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_update_bluegreen.py +0 -0
  450. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_usage_limit.py +0 -0
  451. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_zero_commit.py +0 -0
  452. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ambient_home_isolation.py +0 -0
  453. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_approve_reject_plan.py +0 -0
  454. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_approve_usage_gate.py +0 -0
  455. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_approved_work_2532.py +0 -0
  456. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_assignment_already_recorded_daemon.py +0 -0
  457. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_audit_outcome.py +0 -0
  458. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_audit_query.py +0 -0
  459. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_auto_loop.py +0 -0
  460. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_auto_release_publish_2035.py +0 -0
  461. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_base_checkout_restore.py +0 -0
  462. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_block_log.py +0 -0
  463. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_cap_762.py +0 -0
  464. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_fixture.py +0 -0
  465. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_read_path.py +0 -0
  466. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_service.py +0 -0
  467. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_state.py +0 -0
  468. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_wire.py +0 -0
  469. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_brain.py +0 -0
  470. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_branch_model.py +0 -0
  471. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_bug_intake.py +0 -0
  472. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_build_worker_image_env_update.py +0 -0
  473. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cargo_cache.py +0 -0
  474. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_check_gh_argv_containment.py +0 -0
  475. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_acceptance_gate_1950.py +0 -0
  476. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_fix.py +0 -0
  477. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_gitlab.py +0 -0
  478. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_parity_2091.py +0 -0
  479. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_store.py +0 -0
  480. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_claim.py +0 -0
  481. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_acceptance.py +0 -0
  482. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign.py +0 -0
  483. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  484. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign_interactive_remote.py +0 -0
  485. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign_provider.py +0 -0
  486. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  487. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_audit.py +0 -0
  488. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_chat_continue.py +0 -0
  489. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_decide.py +0 -0
  490. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_diagnose_config_provenance.py +0 -0
  491. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_diagnose_forge_availability.py +0 -0
  492. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_diagnose_graph.py +0 -0
  493. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_diagnose_self.py +0 -0
  494. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_doctor.py +0 -0
  495. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_doctor_config_free_1801.py +0 -0
  496. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  497. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_drive.py +0 -0
  498. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_escalate.py +0 -0
  499. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_fix_headless_review.py +0 -0
  500. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_gate_a.py +0 -0
  501. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_install_drift.py +0 -0
  502. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_install_skills.py +0 -0
  503. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_issue_create_label.py +0 -0
  504. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_issue_reopen.py +0 -0
  505. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_assign.py +0 -0
  506. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_capture.py +0 -0
  507. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_chat_add_child.py +0 -0
  508. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_dispatch.py +0 -0
  509. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_gate_b.py +0 -0
  510. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_gate_c.py +0 -0
  511. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_order.py +0 -0
  512. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  513. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_ship.py +0 -0
  514. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_network.py +0 -0
  515. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_new_issue_chat.py +0 -0
  516. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_plans.py +0 -0
  517. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_portal.py +0 -0
  518. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_pull_artifact.py +0 -0
  519. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_queue.py +0 -0
  520. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_reattach_sessions.py +0 -0
  521. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_refine_board.py +0 -0
  522. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_release_preflight.py +0 -0
  523. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_release_propagate.py +0 -0
  524. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_release_window.py +0 -0
  525. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_repo_2220.py +0 -0
  526. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_scorecard.py +0 -0
  527. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_set_review_findings.py +0 -0
  528. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_advisory_terminal.py +0 -0
  529. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_merge_queue.py +0 -0
  530. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_provider.py +0 -0
  531. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_review_finalizing.py +0 -0
  532. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_test_failed_tag.py +0 -0
  533. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_usage_limit.py +0 -0
  534. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_sync_comments_873.py +0 -0
  535. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_test_plan.py +0 -0
  536. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_track.py +0 -0
  537. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_tui_update.py +0 -0
  538. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_wait.py +0 -0
  539. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_client_base_install.py +0 -0
  540. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_comments.py +0 -0
  541. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_completion_summary.py +0 -0
  542. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config.py +0 -0
  543. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_acceptance.py +0 -0
  544. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_audit.py +0 -0
  545. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_pricing.py +0 -0
  546. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  547. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_usage_gate.py +0 -0
  548. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_confirm_test.py +0 -0
  549. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_conflict_fix.py +0 -0
  550. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_conflict_fix_semantic.py +0 -0
  551. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test.py +0 -0
  552. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test_runner_baseline.py +0 -0
  553. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test_runner_populated_home.py +0 -0
  554. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test_runner_routing.py +0 -0
  555. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test_runner_toolchain.py +0 -0
  556. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_web_sse_restart_live.py +0 -0
  557. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coordinator_machine.py +0 -0
  558. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cross_platform_imports.py +0 -0
  559. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dashboard.py +0 -0
  560. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dashboard_fixture.py +0 -0
  561. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dashboard_terminal.py +0 -0
  562. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dashboard_terminal_live.py +0 -0
  563. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dead_end.py +0 -0
  564. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_decomposition_chat.py +0 -0
  565. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_coord_db_backup.py +0 -0
  566. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_coord_web_dist.py +0 -0
  567. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_coord_web_rollback.py +0 -0
  568. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_drive_queue_unit.py +0 -0
  569. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_manifest.py +0 -0
  570. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_notify_unit.py +0 -0
  571. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_units_lane.py +0 -0
  572. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_web_unit.py +0 -0
  573. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deps.py +0 -0
  574. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_diagnose.py +0 -0
  575. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dispatch.py +0 -0
  576. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dispatch_target_validation.py +0 -0
  577. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dist_name.py +0 -0
  578. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_done_housekeeping.py +0 -0
  579. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive.py +0 -0
  580. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive_queue.py +0 -0
  581. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive_queue_roll_pending.py +0 -0
  582. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive_state.py +0 -0
  583. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive_tmux.py +0 -0
  584. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_epic_up_capability_detection.py +0 -0
  585. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  586. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_epic_up_image_provenance.py +0 -0
  587. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_errors.py +0 -0
  588. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_events.py +0 -0
  589. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_failure_class.py +0 -0
  590. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_filelock.py +0 -0
  591. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  592. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_fix_of_force_override.py +0 -0
  593. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_fleet_config_health.py +0 -0
  594. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_fleet_health_probes.py +0 -0
  595. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_fleet_health_snapshot.py +0 -0
  596. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_forge_availability.py +0 -0
  597. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_freshness.py +0 -0
  598. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gate_a.py +0 -0
  599. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gate_b.py +0 -0
  600. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gate_snapshot_staleness.py +0 -0
  601. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gates.py +0 -0
  602. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  603. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gen_mock_index.py +0 -0
  604. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_generated_types_fixture.py +0 -0
  605. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_github_ops.py +0 -0
  606. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_goal.py +0 -0
  607. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_graph_health.py +0 -0
  608. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_graph_selfheal_absent_2237.py +0 -0
  609. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_handoff.py +0 -0
  610. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_checks.py +0 -0
  611. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_cli.py +0 -0
  612. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_cli_graph.py +0 -0
  613. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_config.py +0 -0
  614. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_context.py +0 -0
  615. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_coord_web_ci_pin.py +0 -0
  616. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_deploy_lane_facts.py +0 -0
  617. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_incident_regression.py +0 -0
  618. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_pypi.py +0 -0
  619. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_registry.py +0 -0
  620. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_timer_active.py +0 -0
  621. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_toolchain.py +0 -0
  622. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_unit_drift.py +0 -0
  623. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_unit_enablement.py +0 -0
  624. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_hooks.py +0 -0
  625. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_human_attended_437.py +0 -0
  626. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_init.py +0 -0
  627. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_integration.py +0 -0
  628. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_briefing_echo.py +0 -0
  629. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_pane_log_2541.py +0 -0
  630. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_prefill_state.py +0 -0
  631. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_session_relaunch.py +0 -0
  632. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_test_verdict_backstop.py +0 -0
  633. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_token_attribution.py +0 -0
  634. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_worktree.py +0 -0
  635. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_issue_store_seam.py +0 -0
  636. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_liveness_auditor.py +0 -0
  637. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_liveness_notify.py +0 -0
  638. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_machine_pause.py +0 -0
  639. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_merge_queue.py +0 -0
  640. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_merge_verify.py +0 -0
  641. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_chat.py +0 -0
  642. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_dispatch.py +0 -0
  643. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_gate.py +0 -0
  644. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_order.py +0 -0
  645. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_seam.py +0 -0
  646. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_mock_author.py +0 -0
  647. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_model_tiering.py +0 -0
  648. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_models.py +0 -0
  649. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_models_config_labels.py +0 -0
  650. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_needs_attention.py +0 -0
  651. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_network.py +0 -0
  652. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_new_issue_chat.py +0 -0
  653. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_next_release_tag.py +0 -0
  654. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_node_shim.py +0 -0
  655. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_baseline.py +0 -0
  656. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_cli.py +0 -0
  657. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_collect.py +0 -0
  658. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_config.py +0 -0
  659. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_drive_seam.py +0 -0
  660. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_isolation.py +0 -0
  661. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_predicate.py +0 -0
  662. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_quiet_hours.py +0 -0
  663. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_service.py +0 -0
  664. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notify.py +0 -0
  665. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notify_drain.py +0 -0
  666. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_openapi.py +0 -0
  667. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_operational_defaults.py +0 -0
  668. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_overlap_fence.py +0 -0
  669. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_packaged_deploy_units.py +0 -0
  670. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_parentage.py +0 -0
  671. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_paste_landed.py +0 -0
  672. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_pipeline.py +0 -0
  673. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_followup_approve_plan_command.py +0 -0
  674. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_followup_pr_command.py +0 -0
  675. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_followup_review_command.py +0 -0
  676. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_only.py +0 -0
  677. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_parser.py +0 -0
  678. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_platform_paths.py +0 -0
  679. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_portal_bridge.py +0 -0
  680. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_portal_config.py +0 -0
  681. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_portal_store.py +0 -0
  682. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_portal_sync.py +0 -0
  683. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_pr_body_lint.py +0 -0
  684. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_prereqs.py +0 -0
  685. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_production_db_guard.py +0 -0
  686. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_progress.py +0 -0
  687. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_provider_seam.py +0 -0
  688. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_providers.py +0 -0
  689. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_providers_config_labels.py +0 -0
  690. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_providers_pty.py +0 -0
  691. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_quiet_hours.py +0 -0
  692. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_quiet_hours_store_2146.py +0 -0
  693. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reap_merged_sessions.py +0 -0
  694. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reap_stale_interactive_tick.py +0 -0
  695. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile.py +0 -0
  696. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_branch.py +0 -0
  697. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_completions.py +0 -0
  698. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_merges.py +0 -0
  699. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_no_agent_record.py +0 -0
  700. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_tick.py +0 -0
  701. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_usage_limit_done.py +0 -0
  702. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_refine_chat.py +0 -0
  703. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_cordon_2101.py +0 -0
  704. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  705. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_cordon_deadlock_2240.py +0 -0
  706. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_cordon_stuck_2490.py +0 -0
  707. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_propagate.py +0 -0
  708. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_roll_window_handoff.py +0 -0
  709. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_unified_1242.py +0 -0
  710. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_verify.py +0 -0
  711. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_window.py +0 -0
  712. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_remote_auto_prune.py +0 -0
  713. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_remote_interactive_reaper.py +0 -0
  714. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_repo_edit_2220.py +0 -0
  715. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_repo_graph_fleet_2237.py +0 -0
  716. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_repo_onboard_2220.py +0 -0
  717. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_report_result_push.py +0 -0
  718. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reports.py +0 -0
  719. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_retry.py +0 -0
  720. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_retry_advisory_1606.py +0 -0
  721. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_retry_type_1636.py +0 -0
  722. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_revalidate.py +0 -0
  723. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review.py +0 -0
  724. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_end_review_without_verdict.py +0 -0
  725. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_parse_failure_diagnostic.py +0 -0
  726. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_reaffirm.py +0 -0
  727. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_state.py +0 -0
  728. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_verdict_backstop.py +0 -0
  729. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_verdict_override_audit.py +0 -0
  730. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_verdict_relay.py +0 -0
  731. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_zero_commits.py +0 -0
  732. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_scoped_review_wiring.py +0 -0
  733. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_scorecard.py +0 -0
  734. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_self_health.py +0 -0
  735. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_serve.py +0 -0
  736. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_serve_app_board_trim.py +0 -0
  737. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_session.py +0 -0
  738. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_slice_issue_attribution.py +0 -0
  739. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_smoke.py +0 -0
  740. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_smoke_live_checkout_restore.py +0 -0
  741. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_smoke_workflow.py +0 -0
  742. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_spend_ceiling.py +0 -0
  743. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_spend_ceiling_coordinator.py +0 -0
  744. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_split.py +0 -0
  745. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_split_work.py +0 -0
  746. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_stage_projection.py +0 -0
  747. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_stalled_pipeline.py +0 -0
  748. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_state_review_findings_daemon.py +0 -0
  749. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_status_fleet_footer.py +0 -0
  750. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_stop_1567.py +0 -0
  751. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_stuck.py +0 -0
  752. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_terminal_command.py +0 -0
  753. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_author.py +0 -0
  754. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_chat.py +0 -0
  755. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_orchestrator.py +0 -0
  756. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_report.py +0 -0
  757. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_verdict_parsing.py +0 -0
  758. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_verdict_transcript_floor.py +0 -0
  759. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_thin_client_board_audit.py +0 -0
  760. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_thin_client_config_load_1080.py +0 -0
  761. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_thin_client_daemon_routing_906.py +0 -0
  762. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_tmux_host.py +0 -0
  763. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_tmux_session.py +0 -0
  764. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_transcript_floor.py +0 -0
  765. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_usage.py +0 -0
  766. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_usage_limits.py +0 -0
  767. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_usage_rollup.py +0 -0
  768. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_venv_live_install_2121.py +0 -0
  769. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_version_single_source.py +0 -0
  770. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_watch.py +0 -0
  771. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  772. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worker_events.py +0 -0
  773. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worker_image_pin_sync.py +0 -0
  774. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worker_safety.py +0 -0
  775. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worker_test_scoping.py +0 -0
  776. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worktree.py +0 -0
  777. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  778. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/Cargo.lock +0 -0
  779. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/Cargo.toml +0 -0
  780. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/cargo-config-local-quadraui.toml.example +0 -0
  781. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/approved.rs +0 -0
  782. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/audit.rs +0 -0
  783. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/chat.rs +0 -0
  784. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/data.rs +0 -0
  785. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/dialogs.rs +0 -0
  786. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/doc_tabs.rs +0 -0
  787. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/drive.rs +0 -0
  788. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/drive_queue.rs +0 -0
  789. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/escalation.rs +0 -0
  790. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/events.rs +0 -0
  791. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/fixtures.rs +0 -0
  792. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/fleet_health.rs +0 -0
  793. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/fleet_sessions.rs +0 -0
  794. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/fleet_terminals.rs +0 -0
  795. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/format.rs +0 -0
  796. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/milestone_dag.rs +0 -0
  797. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/mod.rs +0 -0
  798. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/msv.rs +0 -0
  799. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/pipeline.rs +0 -0
  800. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/plans.rs +0 -0
  801. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/render.rs +0 -0
  802. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/reports.rs +0 -0
  803. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/sessions.rs +0 -0
  804. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/settings_ui.rs +0 -0
  805. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/sidebar.rs +0 -0
  806. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/terminal.rs +0 -0
  807. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/tests.rs +0 -0
  808. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/types.rs +0 -0
  809. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/workspace.rs +0 -0
  810. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/bin/gtk.rs +0 -0
  811. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/commands.rs +0 -0
  812. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/lib.rs +0 -0
  813. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/main.rs +0 -0
  814. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/settings.rs +0 -0
  815. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/tests/acceptance.rs +0 -0
  816. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/tests/cli.rs +0 -0
  817. {code_coordinator-0.5.239 → code_coordinator-0.5.241}/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.239
3
+ Version: 0.5.241
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.239
3
+ Version: 0.5.241
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.239",
2
+ "tag": "0.5.241",
3
3
  "distance": 0,
4
- "node": "g6bf7406e8a26af4949bd4dac5a486ef69a92af43",
4
+ "node": "gf7a7056ba9c9f723298a0b5f62a8949e5c01bd1f",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-23"
@@ -22,16 +22,24 @@ row is best-effort observability on top of it.
22
22
 
23
23
  from __future__ import annotations
24
24
 
25
+ import atexit
25
26
  import json
26
27
  import logging
28
+ import sqlite3
29
+ import threading
27
30
  import time
28
31
  from typing import Any
29
32
 
30
- from coord.db import get_connection
33
+ from coord.db import get_connection, is_lock_contention_error, retry_on_locked
31
34
 
32
35
  _log = logging.getLogger(__name__)
33
36
 
34
- __all__ = ["record_audit", "query_audit_log"]
37
+ __all__ = [
38
+ "record_audit",
39
+ "query_audit_log",
40
+ "audit_lock_contention_losses",
41
+ "flush_lock_contention_summary",
42
+ ]
35
43
 
36
44
  # Valid values are documented in the issue but not enforced here — callers
37
45
  # are all internal (coord.state / coord.issue_store), and rejecting an
@@ -94,7 +102,19 @@ def record_audit(
94
102
  details=details,
95
103
  )
96
104
  except Exception as exc: # noqa: BLE001 — audit logging must never break the caller
97
- _log.warning("record_audit: best-effort write failed: %s", exc)
105
+ if is_lock_contention_error(exc):
106
+ # #2597: `_record_audit_unsafe` already retried this write
107
+ # several times (`retry_on_locked`) before this was reached —
108
+ # sustained contention, not a momentary collision. Still
109
+ # best-effort (never raises into the caller), but a WARNING per
110
+ # occurrence is exactly the flood #2597 measured (1,804/day on
111
+ # dellserver, one indistinguishable line each) — count it
112
+ # instead and let `_flush_lock_contention_summary` report the
113
+ # aggregate once per run.
114
+ _record_lock_contention_loss()
115
+ _log.debug("record_audit: write lost to lock contention: %s", exc)
116
+ else:
117
+ _log.warning("record_audit: best-effort write failed: %s", exc)
98
118
 
99
119
 
100
120
  def _record_audit_unsafe(
@@ -115,27 +135,139 @@ def _record_audit_unsafe(
115
135
  try/except wrapper is the ONLY thing between this and the caller —
116
136
  keeps the swallow-and-log behavior in one obvious place."""
117
137
  conn = get_connection()
118
- conn.execute(
119
- """INSERT INTO audit_log (
120
- ts, tier, category, event_type, actor,
121
- repo, issue, assignment_id, machine, summary, details_json
122
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
123
- (
124
- ts if ts is not None else time.time(),
125
- tier,
126
- category,
127
- event_type,
128
- actor,
129
- repo,
130
- issue,
131
- assignment_id,
132
- machine,
133
- summary,
134
- json.dumps(details) if details is not None else None,
135
- ),
136
- )
137
- conn.commit()
138
- _maybe_trim(conn)
138
+
139
+ def _write() -> None:
140
+ conn.execute(
141
+ """INSERT INTO audit_log (
142
+ ts, tier, category, event_type, actor,
143
+ repo, issue, assignment_id, machine, summary, details_json
144
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
145
+ (
146
+ ts if ts is not None else time.time(),
147
+ tier,
148
+ category,
149
+ event_type,
150
+ actor,
151
+ repo,
152
+ issue,
153
+ assignment_id,
154
+ machine,
155
+ summary,
156
+ json.dumps(details) if details is not None else None,
157
+ ),
158
+ )
159
+ conn.commit()
160
+
161
+ # #2597: this table is the coordinator's primary diagnostic surface —
162
+ # "coord audit" — and 1,804 rows/24h were measured lost to ordinary,
163
+ # momentary lock contention (a concurrent writer holding the DB for a
164
+ # beat) on dellserver, indistinguishable from a real gap in the trail.
165
+ # Give this write the same short, backed-off retry every other
166
+ # load-bearing write in this codebase already gets before falling
167
+ # through to record_audit's best-effort swallow.
168
+ retry_on_locked(_write)
169
+ # #2597-review: the trim below is opportunistic housekeeping over rows
170
+ # that are already durably committed above — isolate its own retry/
171
+ # failure from the insert's. Left unguarded, a `DELETE` that hits lock
172
+ # contention here would propagate out to `record_audit`'s except clause
173
+ # and get classified (by `is_lock_contention_error` alone, with no way
174
+ # to tell "the row itself didn't write" apart from "the row wrote fine
175
+ # but the trim afterward didn't run") as a *lost audit write* — over-
176
+ # counting genuine data loss for a row that made it into audit_log just
177
+ # fine. Give the trim the same retry budget as any other write, but
178
+ # keep a trim-only failure from ever touching that counter.
179
+ try:
180
+ retry_on_locked(lambda: _maybe_trim(conn))
181
+ except sqlite3.OperationalError as exc:
182
+ if not is_lock_contention_error(exc):
183
+ raise
184
+ _log.debug(
185
+ "record_audit: audit_log trim skipped due to lock contention "
186
+ "(row itself was already written): %s", exc,
187
+ )
188
+
189
+
190
+ # ── Lock-contention loss counter (#2597) ────────────────────────────────────
191
+ #
192
+ # `retry_on_locked` above turns most lock collisions into a successful write
193
+ # a few hundred milliseconds later, so a write reaching `record_audit`'s
194
+ # `except` clause with `is_lock_contention_error(exc)` true means sustained
195
+ # contention outlasted that whole retry budget — rare, but not impossible
196
+ # under a genuinely busy DB. Logging each occurrence at WARNING is exactly
197
+ # the flood #2597 measured (1,804 identical lines/day) — count them instead
198
+ # and report ONE aggregated warning per process (`atexit`, so it fires for a
199
+ # short-lived CLI invocation like `coord merge` and, if it ever shuts down
200
+ # cleanly, the long-running daemon too) rather than leaving the loss
201
+ # invisible or drowning the log in duplicates.
202
+
203
+ _lock_contention_losses = 0
204
+ _summary_flush_registered = False
205
+ # #2597-review: `coord serve` calls `record_audit` from multiple
206
+ # threads/greenlets (the tick loop's `run_in_threadpool` calls, concurrent
207
+ # request handlers) — a bare `+= 1` on a module global can lose increments
208
+ # under concurrent contention (read-modify-write race). The counter is
209
+ # purely diagnostic (never gates a decision), but the whole point of it is
210
+ # to make the loss rate trustworthy, so it should not itself be lossy.
211
+ _lock_contention_lock = threading.Lock()
212
+
213
+
214
+ def _record_lock_contention_loss() -> None:
215
+ """Bump the run-scoped lost-write counter and arrange for the aggregate
216
+ to be reported once this process exits (see
217
+ :func:`_flush_lock_contention_summary`)."""
218
+ global _lock_contention_losses, _summary_flush_registered
219
+ with _lock_contention_lock:
220
+ _lock_contention_losses += 1
221
+ register = not _summary_flush_registered
222
+ _summary_flush_registered = True
223
+ if register:
224
+ atexit.register(_flush_lock_contention_summary)
225
+
226
+
227
+ def _flush_lock_contention_summary() -> None:
228
+ """Emit ONE aggregated warning for this run's audit writes lost to
229
+ sustained lock contention, if any, and reset the counter.
230
+
231
+ Registered via :func:`atexit.register` the first time a write is lost
232
+ (see :func:`_record_lock_contention_loss`) rather than called from a
233
+ fixed call site, so it fires for every entry point — `coord merge`,
234
+ `coord notify`, the daemon — without each one needing its own hook.
235
+ Also callable directly (tests; a caller that wants to flush mid-run
236
+ without waiting for process exit).
237
+ """
238
+ global _lock_contention_losses
239
+ with _lock_contention_lock:
240
+ pending = _lock_contention_losses
241
+ _lock_contention_losses = 0
242
+ if pending:
243
+ _log.warning("audit: %d writes lost to lock contention", pending)
244
+
245
+
246
+ def audit_lock_contention_losses() -> int:
247
+ """Current count of audit writes lost to sustained lock contention this
248
+ run, not yet flushed by :func:`_flush_lock_contention_summary`.
249
+
250
+ Exposed for tests and diagnostics — advisory only, like the rest of the
251
+ audit log; nothing gates dispatch/review/merge decisions on this value.
252
+ """
253
+ with _lock_contention_lock:
254
+ return _lock_contention_losses
255
+
256
+
257
+ def flush_lock_contention_summary() -> None:
258
+ """Public entry point for :func:`_flush_lock_contention_summary`.
259
+
260
+ #2597-review: the `atexit` registration above is the right default for
261
+ a short-lived CLI invocation (`coord merge`, `coord notify`) — it always
262
+ fires exactly once, at exit. It is a much weaker guarantee for a
263
+ long-running process (`coord serve`), which the code's own comment
264
+ already conceded only flushes "if it ever shuts down cleanly" — for a
265
+ daemon that runs for days between restarts, losses can accumulate for
266
+ its entire uptime with zero visibility. Call this on a periodic cadence
267
+ (e.g. once per daemon tick) to close that gap; it is a no-op cost-wise
268
+ when there is nothing pending (see :func:`_flush_lock_contention_summary`).
269
+ """
270
+ _flush_lock_contention_summary()
139
271
 
140
272
 
141
273
  def _maybe_trim(conn) -> None:
@@ -42,6 +42,7 @@ from dataclasses import dataclass
42
42
  import httpx
43
43
 
44
44
  from coord.config import Config
45
+ from coord.db import is_lock_contention_error
45
46
  from coord.dispatch import AGENT_PORT
46
47
  from coord import github_ops
47
48
  from coord.models import SEALED_PATH_AUTHOR_TYPES, Assignment, Board
@@ -1228,7 +1229,7 @@ def _dispatch_fix(
1228
1229
  repo_github=repo.github,
1229
1230
  )
1230
1231
  except sqlite3.OperationalError as exc:
1231
- if "database is locked" not in str(exc).lower():
1232
+ if not is_lock_contention_error(exc):
1232
1233
  # Not the transient contention this guard exists for (#2538) —
1233
1234
  # a schema mismatch or malformed statement is a real bug and
1234
1235
  # must not be swallowed as an ordinary declined dispatch.
@@ -91,7 +91,9 @@ from coord.overlap_predict import (
91
91
  classify_outcome,
92
92
  collect_candidate_files,
93
93
  declared_footprints,
94
+ fanout_warnings,
94
95
  inflight_footprints,
96
+ parse_declared_files,
95
97
  predict_overlap,
96
98
  predictions_from_audit,
97
99
  tally,
@@ -296,9 +298,12 @@ def drive_queue_add(
296
298
  # yields an empty prediction and this add behaves exactly as it did before
297
299
  # the feature existed.
298
300
  prediction = Prediction()
301
+ staleness_note = ""
299
302
  auto_after: list[str] = []
300
303
  if not no_predict_overlap:
301
- prediction = _predict_overlap(config_path, repo, issue, existing_entries)
304
+ prediction, staleness_note = _predict_overlap(
305
+ config_path, repo, issue, existing_entries
306
+ )
302
307
  auto_after = _applicable_auto_after(
303
308
  existing_entries, repo, issue, after, prediction
304
309
  )
@@ -326,7 +331,17 @@ def drive_queue_add(
326
331
  gate += " (fleet-wide — nothing anywhere launches)"
327
332
  if resume_when:
328
333
  gate += f" (auto-resume when `{resume_when}` passes)"
329
- overlap_note = f"\n{prediction.reason}" if auto_after else ""
334
+ # #2601: the reason (if an edge was actually applied), any high-fanout
335
+ # directory-token warning (independent of whether the edge stuck — a
336
+ # cycle-dropped edge's token is just as worth narrowing), and a staleness
337
+ # note when the candidate's own body could only be read from cache.
338
+ overlap_notes: list[str] = []
339
+ if auto_after:
340
+ overlap_notes.append(prediction.reason)
341
+ overlap_notes.extend(fanout_warnings(prediction))
342
+ if staleness_note:
343
+ overlap_notes.append(staleness_note)
344
+ overlap_note = ("\n" + "\n".join(overlap_notes)) if overlap_notes else ""
330
345
  click.echo(
331
346
  f"queued {entry_key(repo, issue)}{pinned}{suffix}{gate}"
332
347
  f"{scope_downgrade_warning}{overlap_note}"
@@ -372,6 +387,121 @@ def _issue_body(repo_name: str, issue_number: int) -> str:
372
387
  return ""
373
388
 
374
389
 
390
+ def _live_issue_body(repo_github: str, issue_number: int) -> str | None:
391
+ """A live ``gh issue view`` body for the ONE entry actually being enqueued.
392
+
393
+ #2601: `_issue_body` above is a cache read by design — cheap, and correct
394
+ for the overwhelmingly common case (no ``## Files`` block at all) and for
395
+ every OTHER issue's declaration this module consults for a footprint. But
396
+ that same design let a `gh issue edit` made directly against the
397
+ tracker — bypassing `coord.state.edit_issue_content`'s cache mirror — go
398
+ unnoticed: the predictor kept citing the removed line forever, because
399
+ nothing had ever told the cache the edit happened.
400
+
401
+ Called ONLY for the candidate (see `_candidate_body`), and only when its
402
+ cached body already parses to a declaration — never on the common
403
+ empty-declaration path, so this does not reintroduce the per-``add``
404
+ GitHub round-trip the module was built to avoid.
405
+
406
+ Fails open like every other fetch here: ``None`` on any error, and the
407
+ caller falls back to the cached body.
408
+ """
409
+ if not repo_github:
410
+ return None
411
+ try:
412
+ from coord import github_ops # noqa: PLC0415
413
+
414
+ data = github_ops.get_issue(repo_github, int(issue_number))
415
+ except Exception: # noqa: BLE001 — see docstring
416
+ return None
417
+ if not data:
418
+ return None
419
+ return str(data.get("body") or "")
420
+
421
+
422
+ def _mirror_issue_body(repo_name: str, issue_number: int, body: str) -> None:
423
+ """Write a freshly live-fetched body back into the local cache (#2601).
424
+
425
+ Best-effort, mirroring `_edit_issue_content_local`'s own cache write: the
426
+ live fetch above is authoritative, this only makes the freshness outlive
427
+ the one predict call it was fetched for — a later `add` for a DIFFERENT
428
+ issue that compares declaration-to-declaration against this one, or
429
+ `overlap-report`, should see the same answer without a second round-trip.
430
+ """
431
+ try:
432
+ from coord.db import get_connection # noqa: PLC0415
433
+
434
+ conn = get_connection()
435
+ conn.execute(
436
+ "UPDATE issues SET body = ?, synced_at = ? "
437
+ "WHERE repo_name = ? AND number = ?",
438
+ (body, time.time(), repo_name, int(issue_number)),
439
+ )
440
+ conn.commit()
441
+ except Exception: # noqa: BLE001 — the cache write is advisory
442
+ pass
443
+
444
+
445
+ def _cached_body_age_note(repo_name: str, issue_number: int) -> str:
446
+ """#2601 point 1's fallback: when a live re-read wasn't possible, say how
447
+ old the cached body actually is, so a stale prediction is at least
448
+ visible instead of silently trusted.
449
+ """
450
+ row = None
451
+ try:
452
+ from coord.db import get_connection # noqa: PLC0415
453
+
454
+ row = get_connection().execute(
455
+ "SELECT synced_at FROM issues WHERE repo_name = ? AND number = ?",
456
+ (repo_name, int(issue_number)),
457
+ ).fetchone()
458
+ except Exception: # noqa: BLE001 — an unreadable age is still worth flagging
459
+ pass
460
+ synced_at = row["synced_at"] if row is not None else None
461
+ if not synced_at:
462
+ return (
463
+ "note: predicted from a cached issue body of unknown age "
464
+ "(live refresh failed) — the declaration may be stale"
465
+ )
466
+ age = _age_str(max(0.0, time.time() - float(synced_at)))
467
+ return (
468
+ f"note: predicted from a cached issue body synced {age} ago "
469
+ "(live refresh failed) — the declaration may be stale"
470
+ )
471
+
472
+
473
+ def _candidate_body(
474
+ repo_name: str, issue_number: int, repo_github: str,
475
+ ) -> tuple[str, str]:
476
+ """This entry's OWN body — refreshed live when staleness could matter (#2601).
477
+
478
+ The natural correction to a bad prediction is editing the issue's ``##
479
+ Files`` block and re-adding. That did nothing (#2601) because the
480
+ predictor always read `_issue_body`'s cache, which a direct
481
+ ``gh issue edit`` never invalidates.
482
+
483
+ So the candidate gets one extra check the rest of the module does not:
484
+ if its cached body already parses to a declaration, re-read it live and
485
+ mirror the answer back into the cache. A body with NO cached declaration
486
+ skips the live round-trip entirely — there is nothing to have gone
487
+ stale, and a declaration ADDED since the last sync just falls back to
488
+ today's "no prediction" (rule 3), exactly as an unreadable body would.
489
+
490
+ Returns ``(body, staleness_note)``: *body* is what prediction runs
491
+ against; *staleness_note* is non-empty only when a live re-read was
492
+ warranted but failed.
493
+ """
494
+ cached = _issue_body(repo_name, issue_number)
495
+ if not parse_declared_files(cached):
496
+ return cached, ""
497
+ fresh = _live_issue_body(repo_github, issue_number)
498
+ if fresh is None:
499
+ return cached, _cached_body_age_note(repo_name, issue_number)
500
+ if fresh != cached:
501
+ _mirror_issue_body(repo_name, issue_number, fresh)
502
+ return fresh, ""
503
+
504
+
375
505
  def _repo_coordinates(config_path: Path, repo: str) -> tuple[str, str] | None:
376
506
  """``(github slug, default branch)`` for *repo*, or ``None``."""
377
507
  try:
@@ -387,27 +517,38 @@ def _repo_coordinates(config_path: Path, repo: str) -> tuple[str, str] | None:
387
517
 
388
518
  def _predict_overlap(
389
519
  config_path: Path, repo: str, issue: int, existing_entries: list[QueueEntry],
390
- ) -> Prediction:
520
+ ) -> tuple[Prediction, str]:
391
521
  """Compare this issue's declared files against work already in flight.
392
522
 
393
523
  Same-repo only: two repos' paths cannot collide, and comparing them would
394
524
  manufacture overlaps out of a shared filename. In-flight branches are
395
525
  checked first (ground truth); a queued entry with no branch yet is
396
526
  compared declaration-to-declaration, and only when it has one.
527
+
528
+ Returns ``(prediction, staleness_note)`` — see `_candidate_body` for when
529
+ the note is non-empty. Every OTHER body this consults (an in-flight
530
+ branch's own declaration, an unrelated queued entry's) still comes from
531
+ the plain cache: re-reading fifteen bodies live on every `add` is exactly
532
+ the cost the module's docstring rejects, and #2601's own report is about
533
+ correcting THIS entry's declaration, not anyone else's.
397
534
  """
398
535
  coordinates = _repo_coordinates(config_path, repo)
399
536
  if coordinates is None:
400
- return Prediction()
537
+ return Prediction(), ""
401
538
  repo_github, base_branch = coordinates
402
539
 
540
+ candidate_body, staleness_note = _candidate_body(repo, issue, repo_github)
541
+
403
542
  def body_fetcher(repo_name: str, number: int) -> str:
543
+ if repo_name == repo and number == issue:
544
+ return candidate_body
404
545
  return _issue_body(repo_name, number)
405
546
 
406
547
  candidate = collect_candidate_files(repo, issue, body_fetcher)
407
548
  if not candidate:
408
549
  # Rule 3: no prediction is a valid answer. Nothing is fetched, nothing
409
550
  # is compared, and the add is byte-identical to the pre-#2247 one.
410
- return Prediction()
551
+ return Prediction(), ""
411
552
 
412
553
  key = entry_key(repo, issue)
413
554
  footprints = inflight_footprints(
@@ -422,7 +563,7 @@ def _predict_overlap(
422
563
  and e.state not in TERMINAL_QUEUE_STATES
423
564
  ]
424
565
  footprints.extend(declared_footprints(queued, body_fetcher, exclude_keys=covered))
425
- return predict_overlap(candidate, footprints, exclude_keys={key})
566
+ return predict_overlap(candidate, footprints, exclude_keys={key}), staleness_note
426
567
 
427
568
 
428
569
  def _applicable_auto_after(
@@ -4,6 +4,7 @@ coord/cli.py (#747)."""
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
+ import sqlite3
7
8
  import sys
8
9
  from pathlib import Path
9
10
 
@@ -11,6 +12,7 @@ import click
11
12
 
12
13
 
13
14
  from coord.commands._common import _CONFIG_OPTION, _load_config
15
+ from coord.db import is_lock_contention_error, retry_on_locked
14
16
  from coord.models import WORK_LIKE_TYPES, effective_issue_number
15
17
 
16
18
 
@@ -2128,6 +2130,14 @@ def merge(
2128
2130
  open_by_repo, known_by_repo = _load_issue_states()
2129
2131
 
2130
2132
  auto_enqueued: list[str] = []
2133
+ # #2597-review: assignments whose enqueue write is still locked after
2134
+ # `retry_on_locked` exhausts its budget. Collected here instead of
2135
+ # raised in place — one contended assignment must not abort the scan
2136
+ # for every other assignment still waiting in this batch (that's the
2137
+ # exact #1353 regression this file already fixed once, resurrected for
2138
+ # lock contention specifically). The whole run still fails loudly: once
2139
+ # every assignment has had its turn, a non-zero exit is raised below.
2140
+ lock_contention_failures: list[tuple[str, sqlite3.OperationalError]] = []
2131
2141
  # Per-repo cache of branches that still exist on origin. Lets us skip
2132
2142
  # re-enqueuing done-work whose branch was already merged-and-deleted — the
2133
2143
  # dominant merge-queue clog source. A done assignment for a closed issue
@@ -2273,11 +2283,17 @@ def merge(
2273
2283
  # longer matches. Dedup by (repo_github, branch) is
2274
2284
  # preserved — refresh_entry_assignment is a no-op when the
2275
2285
  # entry is already correctly keyed.
2276
- if mq.refresh_entry_assignment(
2286
+ # #2597: wrapped in retry_on_locked — this is a real DB write
2287
+ # (merge_queue.save_queue), and unlike the gh-round-trip
2288
+ # failures this try/except otherwise isolates (#1353), a
2289
+ # `database is locked` collision here is pure transient
2290
+ # contention with a concurrent writer, not a reason to give
2291
+ # up on this assignment.
2292
+ if retry_on_locked(lambda: mq.refresh_entry_assignment(
2277
2293
  a,
2278
2294
  repo_github=repo_cfg.github,
2279
2295
  target_branch=target_branch,
2280
- ):
2296
+ )):
2281
2297
  auto_enqueued.append(
2282
2298
  f" auto-enqueued: {a.repo_name} #{a.issue_number} "
2283
2299
  f"({a.branch} → {target_branch}){gate_note}"
@@ -2295,6 +2311,34 @@ def merge(
2295
2311
  f"{target_branch}) — "
2296
2312
  f"{mq.describe_merge_gate_failures(gate_failures)}"
2297
2313
  )
2314
+ except sqlite3.OperationalError as exc:
2315
+ if is_lock_contention_error(exc):
2316
+ # #2597: `retry_on_locked` above already gave the write
2317
+ # several backed-off attempts — reaching here means the
2318
+ # DB is still locked after that budget, i.e. sustained
2319
+ # contention, not a momentary collision. Dropping a
2320
+ # mergeable assignment out of the scan on that basis is
2321
+ # the exact correctness bug #2597 reported (a skipped
2322
+ # entry here is silent — nothing re-scans it until the
2323
+ # next `coord merge` invocation). This is a hard
2324
+ # failure, not the soft "skipped" outcome below — but
2325
+ # (per review) it must not abort the rest of the batch
2326
+ # either. Record it and keep scanning; a clearly-flagged
2327
+ # line goes into the summary and the run still fails
2328
+ # loudly (non-zero exit, real exception) once every
2329
+ # other assignment has had its turn.
2330
+ lock_contention_failures.append((a.assignment_id, exc))
2331
+ auto_enqueued.append(
2332
+ f" LOCK CONTENTION: {a.repo_name} #{a.issue_number} "
2333
+ f"(assignment {a.assignment_id}) — auto-enqueue write "
2334
+ f"still locked after exhausting retries: {exc!r}"
2335
+ )
2336
+ continue
2337
+ auto_enqueued.append(
2338
+ f" skipped: {a.repo_name} #{a.issue_number} "
2339
+ f"(assignment {a.assignment_id}) — auto-enqueue scan "
2340
+ f"failed, skipping this assignment: {exc!r}"
2341
+ )
2298
2342
  except Exception as e: # noqa: BLE001
2299
2343
  auto_enqueued.append(
2300
2344
  f" skipped: {a.repo_name} #{a.issue_number} "
@@ -2304,6 +2348,20 @@ def merge(
2304
2348
  for line in auto_enqueued:
2305
2349
  click.echo(line)
2306
2350
 
2351
+ if lock_contention_failures:
2352
+ # #2597-review: every assignment in the batch has now had its turn
2353
+ # — including the ones after the first contended write, and their
2354
+ # results (if any) are already printed above. Surface the
2355
+ # contention loudly now: a real `sqlite3.OperationalError`
2356
+ # propagating out of this command (not a swallowed summary line)
2357
+ # so `coord merge` exits non-zero and the failure is impossible to
2358
+ # miss, same as any other genuinely unrecoverable write failure.
2359
+ assignment_ids = ", ".join(aid for aid, _exc in lock_contention_failures)
2360
+ raise sqlite3.OperationalError(
2361
+ "database is locked — auto-enqueue write(s) still locked after "
2362
+ f"exhausting retries for assignment(s): {assignment_ids}"
2363
+ ) from lock_contention_failures[-1][1]
2364
+
2307
2365
  # #1477: re-test any parked CONFLICT entry against GitHub's own
2308
2366
  # mergeability computation before the pending scan below — a branch
2309
2367
  # repaired by a conflict-fix worker (or by hand) since the last tick
@@ -1127,6 +1127,7 @@ def milestone_dispatch_cmd(
1127
1127
  _predict_overlap,
1128
1128
  _record_overlap_prediction,
1129
1129
  )
1130
+ from coord.overlap_predict import fanout_warnings # noqa: PLC0415
1130
1131
  from coord.drive_queue import ( # noqa: PLC0415
1131
1132
  QueueError,
1132
1133
  entries_from_rows,
@@ -1150,7 +1151,7 @@ def milestone_dispatch_cmd(
1150
1151
  click.echo(f" {key}: not queued: {exc}", err=True)
1151
1152
  failures += 1
1152
1153
  continue
1153
- prediction = _predict_overlap(
1154
+ prediction, staleness_note = _predict_overlap(
1154
1155
  config_path, repo_entry.name, qe.issue_number, existing
1155
1156
  )
1156
1157
  auto_after = _applicable_auto_after(
@@ -1163,7 +1164,16 @@ def milestone_dispatch_cmd(
1163
1164
  repo_entry.name, qe.issue_number, prediction, auto_after
1164
1165
  )
1165
1166
  suffix = f" after {', '.join(after)}" if after else ""
1166
- overlap_note = f"\n {prediction.reason}" if auto_after else ""
1167
+ # #2601: same notes `drive-queue add` surfaces — the applied reason,
1168
+ # any high-fanout directory-token warning, and a staleness note when
1169
+ # this entry's own body could only be read from cache.
1170
+ notes = []
1171
+ if auto_after:
1172
+ notes.append(prediction.reason)
1173
+ notes.extend(fanout_warnings(prediction))
1174
+ if staleness_note:
1175
+ notes.append(staleness_note)
1176
+ overlap_note = ("\n " + "\n ".join(notes)) if notes else ""
1167
1177
  click.echo(f" queued {key}{suffix}{overlap_note}")
1168
1178
  queued += 1
1169
1179
 
@@ -113,6 +113,29 @@ _LOCK_RETRY_ATTEMPTS = 5
113
113
  _LOCK_RETRY_BASE_DELAY_S = 0.1
114
114
 
115
115
 
116
+ def is_lock_contention_error(exc: BaseException) -> bool:
117
+ """True when *exc* is transient SQLite lock/busy contention rather than
118
+ a real bug (#2597).
119
+
120
+ Centralizes a check that used to be duplicated — and drifting — between
121
+ this module's own :func:`retry_on_locked` and ``coord.auto_loop``'s
122
+ ``except`` block: only the ``"database is locked"`` substring was
123
+ matched anywhere, missing both SQLite's other lock-collision message
124
+ (``"database table is locked"``, raised for a table-level lock rather
125
+ than the whole-database one) and the underlying ``SQLITE_BUSY`` result
126
+ code, which a driver could in principle surface through a differently
127
+ worded message. Checking the code as well as the text means a future
128
+ SQLite/driver wording change can't silently turn this back into a
129
+ "raise instead of retry" bug the way the single-substring version could.
130
+ """
131
+ if not isinstance(exc, sqlite3.OperationalError):
132
+ return False
133
+ message = str(exc).lower()
134
+ if "database is locked" in message or "database table is locked" in message:
135
+ return True
136
+ return getattr(exc, "sqlite_errorcode", None) == sqlite3.SQLITE_BUSY
137
+
138
+
116
139
  def retry_on_locked(
117
140
  write: Callable[[], _T],
118
141
  *,
@@ -120,8 +143,8 @@ def retry_on_locked(
120
143
  base_delay: float = _LOCK_RETRY_BASE_DELAY_S,
121
144
  ) -> _T:
122
145
  """Run *write* (a zero-arg callable performing one or more SQLite writes),
123
- retrying with exponential backoff when SQLite raises ``database is
124
- locked`` (#2538).
146
+ retrying with exponential backoff when SQLite raises lock/busy
147
+ contention (:func:`is_lock_contention_error`, #2538/#2597).
125
148
 
126
149
  That error is transient contention — a concurrent writer holding the DB
127
150
  at the exact moment this call tries to write, not a real failure — and a
@@ -135,7 +158,7 @@ def retry_on_locked(
135
158
  Any other ``OperationalError`` (schema drift, a malformed statement, …)
136
159
  is re-raised immediately without retrying — those are not transient, and
137
160
  retrying would only delay surfacing a real bug. After *attempts*
138
- consecutive ``database is locked`` collisions, re-raises the last
161
+ consecutive lock-contention collisions, re-raises the last
139
162
  ``sqlite3.OperationalError`` so the caller can decide how to degrade
140
163
  (see ``coord.state._record_dispatched_assignment_local``, whose caller —
141
164
  ``coord.auto_loop._dispatch_fix`` — treats it as a declined dispatch
@@ -146,7 +169,7 @@ def retry_on_locked(
146
169
  try:
147
170
  return write()
148
171
  except sqlite3.OperationalError as exc:
149
- if "database is locked" not in str(exc).lower() or attempt >= attempts:
172
+ if not is_lock_contention_error(exc) or attempt >= attempts:
150
173
  raise
151
174
  time.sleep(delay)
152
175
  delay *= 2