code-coordinator 0.5.213__tar.gz → 0.5.215__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 (804) hide show
  1. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/auto_loop.py +32 -4
  5. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/merge.py +18 -4
  6. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/db.py +53 -0
  7. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notify.py +108 -7
  8. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/state.py +16 -5
  9. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_auto_loop.py +100 -0
  10. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_fix.py +24 -0
  11. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_db.py +79 -1
  12. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_stalled_pipeline.py +272 -0
  13. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_state.py +86 -0
  14. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.claude/commands/board.md +0 -0
  15. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.claude/commands/complete-session.md +0 -0
  16. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.claude/commands/coordinator.md +0 -0
  17. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.githooks/_lib.sh +0 -0
  18. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.githooks/post-checkout +0 -0
  19. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.githooks/post-commit +0 -0
  20. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.githooks/post-merge +0 -0
  21. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  22. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/coord-ci-acceptance.yml +0 -0
  23. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/auto-release.yml +0 -0
  24. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/cargo-test.yml +0 -0
  25. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/publish.yml +0 -0
  26. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/release-tui.yml +0 -0
  27. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/test.yml +0 -0
  28. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.gitignore +0 -0
  29. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/CLAUDE.md +0 -0
  30. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/GOAL.md +0 -0
  31. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/LICENSE +0 -0
  32. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/MANIFEST.in +0 -0
  33. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/README.md +0 -0
  34. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/SOURCES.txt +0 -0
  35. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/dependency_links.txt +0 -0
  36. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/entry_points.txt +0 -0
  37. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/requires.txt +0 -0
  38. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/scm_file_list.json +0 -0
  39. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/top_level.txt +0 -0
  40. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/__init__.py +0 -0
  41. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/_board_mapping.py +0 -0
  42. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/acceptance.py +0 -0
  43. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/acceptance_drivers.py +0 -0
  44. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agent.py +0 -0
  45. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agent_app.py +0 -0
  46. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agent_update.py +0 -0
  47. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agents/opencode/.gitignore +0 -0
  48. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agents/opencode/agents/work.md +0 -0
  49. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agents/opencode/routing.jsonc +0 -0
  50. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/audit.py +0 -0
  51. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/block_log.py +0 -0
  52. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/board_bool_guard.py +0 -0
  53. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/ci_fix.py +0 -0
  60. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/ci_gitlab.py +0 -0
  62. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/ci_store.py +0 -0
  63. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/client.py +0 -0
  66. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/chat.py +0 -0
  72. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/dispatch.py +0 -0
  73. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/dispatch_workers.py +0 -0
  74. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/portal.py +0 -0
  84. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/release.py +0 -0
  85. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/repo.py +0 -0
  86. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/report.py +0 -0
  87. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/review.py +0 -0
  88. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/scorecard.py +0 -0
  89. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/sessions.py +0 -0
  90. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/setup.py +0 -0
  91. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/status.py +0 -0
  92. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/terminal.py +0 -0
  93. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/test_gate.py +0 -0
  94. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/tui.py +0 -0
  95. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/comments.py +0 -0
  96. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/config.py +0 -0
  97. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/config_reload.py +0 -0
  98. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/confirm_test.py +0 -0
  99. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/conflict_fix.py +0 -0
  100. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dao.py +0 -0
  101. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/__init__.py +0 -0
  102. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/fixture.py +0 -0
  103. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/index.html +0 -0
  104. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/server.py +0 -0
  105. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/terminal.py +0 -0
  106. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dead_end.py +0 -0
  107. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/README.md +0 -0
  108. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-agent.service +0 -0
  109. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-db-backup.service +0 -0
  110. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-db-backup.sh +0 -0
  111. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-db-backup.timer +0 -0
  112. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-drive-queue.service +0 -0
  113. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-drive-queue.timer +0 -0
  114. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-notify.service +0 -0
  115. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-notify.timer +0 -0
  116. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-release-propagate.service +0 -0
  117. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-release-propagate.timer +0 -0
  118. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-release-window.service +0 -0
  119. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-release-window.timer +0 -0
  120. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-serve.service +0 -0
  121. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-web-dist-build.service +0 -0
  122. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-web-dist-build.timer +0 -0
  123. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-web.service +0 -0
  124. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy_manifest.py +0 -0
  125. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy_units.py +0 -0
  126. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deps.py +0 -0
  127. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/diagnose.py +0 -0
  128. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dispatch.py +0 -0
  129. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dist_name.py +0 -0
  130. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/drive.py +0 -0
  131. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/drive_queue.py +0 -0
  132. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/drive_state.py +0 -0
  133. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/events.py +0 -0
  134. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/failure_class.py +0 -0
  135. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/filelock.py +0 -0
  136. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/fleet_config_health.py +0 -0
  137. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/forge_availability.py +0 -0
  138. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/freshness.py +0 -0
  139. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/gate_a.py +0 -0
  140. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/gate_b.py +0 -0
  141. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/gate_snapshot.py +0 -0
  142. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/gates.py +0 -0
  143. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/github_ops.py +0 -0
  144. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/goal.py +0 -0
  145. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/graph_health.py +0 -0
  146. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/__init__.py +0 -0
  147. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/aggregate.py +0 -0
  148. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/__init__.py +0 -0
  149. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/agent_install.py +0 -0
  150. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/cargo_targets.py +0 -0
  151. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/claude_binary.py +0 -0
  152. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/coord_web_ci_pin.py +0 -0
  153. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/deploy_lane_facts.py +0 -0
  154. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/disk.py +0 -0
  155. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/fleet_board.py +0 -0
  156. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  157. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/fleet_phantom.py +0 -0
  158. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/fleet_unit_drift.py +0 -0
  159. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/graph.py +0 -0
  160. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/graphify_cli.py +0 -0
  161. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/index_lock.py +0 -0
  162. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/plan_usage.py +0 -0
  163. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/repo_state.py +0 -0
  164. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/spawned_coord.py +0 -0
  165. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/timer_active.py +0 -0
  166. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/toolchain.py +0 -0
  167. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/unit_drift.py +0 -0
  168. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/unit_enablement.py +0 -0
  169. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/worktrees.py +0 -0
  170. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/cli.py +0 -0
  171. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/context.py +0 -0
  172. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/fleet_snapshot.py +0 -0
  173. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/models.py +0 -0
  174. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/pypi.py +0 -0
  175. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/registry.py +0 -0
  176. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/render.py +0 -0
  177. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/units.py +0 -0
  178. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/hooks.py +0 -0
  179. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/housekeeping.py +0 -0
  180. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/interactive.py +0 -0
  181. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/issue_store.py +0 -0
  182. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/liveness_auditor.py +0 -0
  183. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/machine_pause.py +0 -0
  184. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/merge_queue.py +0 -0
  185. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/milestone_chat.py +0 -0
  186. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/milestone_dispatch.py +0 -0
  187. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/milestone_gate.py +0 -0
  188. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/milestone_order.py +0 -0
  189. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/mock_author.py +0 -0
  190. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/models.py +0 -0
  191. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/network.py +0 -0
  192. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/new_issue_chat.py +0 -0
  193. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/__init__.py +0 -0
  194. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/baseline.py +0 -0
  195. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/cli.py +0 -0
  196. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/collect.py +0 -0
  197. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/digest.py +0 -0
  198. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/models.py +0 -0
  199. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/predicate.py +0 -0
  200. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/service.py +0 -0
  201. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/store.py +0 -0
  202. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/transport.py +0 -0
  203. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/openapi.py +0 -0
  204. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/overlap_fence.py +0 -0
  205. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/overlap_predict.py +0 -0
  206. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/parentage.py +0 -0
  207. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/parentage_github.py +0 -0
  208. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/pipeline.py +0 -0
  209. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/plan_parser.py +0 -0
  210. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/plans.py +0 -0
  211. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/platform_paths.py +0 -0
  212. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/portal_bridge.py +0 -0
  213. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/portal_store.py +0 -0
  214. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/portal_sync.py +0 -0
  215. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/pr_body_lint.py +0 -0
  216. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/prereqs.py +0 -0
  217. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/progress.py +0 -0
  218. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/__init__.py +0 -0
  219. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/base.py +0 -0
  220. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/claude.py +0 -0
  221. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/claude_pty.py +0 -0
  222. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/opencode.py +0 -0
  223. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/queue_diagnose.py +0 -0
  224. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/reconcile.py +0 -0
  225. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/reconcile_tick.py +0 -0
  226. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/refine_chat.py +0 -0
  227. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/release_cordon.py +0 -0
  228. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/release_propagate.py +0 -0
  229. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/release_verify.py +0 -0
  230. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/release_window.py +0 -0
  231. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/repo_edit.py +0 -0
  232. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/repo_onboard.py +0 -0
  233. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/reports.py +0 -0
  234. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/revalidate.py +0 -0
  235. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/review.py +0 -0
  236. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/scorecard.py +0 -0
  237. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/self_health.py +0 -0
  238. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/serve_app.py +0 -0
  239. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  240. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  241. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  242. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  243. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  244. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/portal-followup/SKILL.md +0 -0
  245. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  246. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  247. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/update-issue/SKILL.md +0 -0
  248. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/smoke.py +0 -0
  249. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/spend_ceiling.py +0 -0
  250. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/split_work.py +0 -0
  251. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/stage_projection.py +0 -0
  252. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/test_author.py +0 -0
  253. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/test_chat.py +0 -0
  254. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/test_orchestrator.py +0 -0
  255. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/test_report.py +0 -0
  256. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/tui_release.py +0 -0
  257. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/usage.py +0 -0
  258. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/usage_limits.py +0 -0
  259. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/usage_rollup.py +0 -0
  260. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/worker_events.py +0 -0
  261. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coordinator.example.yml +0 -0
  262. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-agent.service +0 -0
  263. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-db-backup.service +0 -0
  264. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-db-backup.sh +0 -0
  265. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-db-backup.timer +0 -0
  266. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-drive-queue.service +0 -0
  267. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-drive-queue.timer +0 -0
  268. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-notify.service +0 -0
  269. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-notify.timer +0 -0
  270. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-release-propagate.service +0 -0
  271. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-release-propagate.timer +0 -0
  272. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-release-window.service +0 -0
  273. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-release-window.timer +0 -0
  274. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-serve.service +0 -0
  275. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web-dist-build.service +0 -0
  276. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web-dist-build.sh +0 -0
  277. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web-dist-build.timer +0 -0
  278. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web-rollback.sh +0 -0
  279. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web.service +0 -0
  280. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/node-shim.sh +0 -0
  281. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  282. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ADR_COORD_WEB_CI.md +0 -0
  283. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ADR_COORD_WEB_DIST.md +0 -0
  284. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/AGENT_OPERATIONS.md +0 -0
  285. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ARCHITECTURE.md +0 -0
  286. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ARCH_SECURITY_GATES.md +0 -0
  287. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/COCKPIT.md +0 -0
  288. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/CONTROL_CENTER.md +0 -0
  289. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/COST_DISCIPLINE.md +0 -0
  290. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/CROSS_PLATFORM.md +0 -0
  291. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/CUSTOMER_PORTAL.md +0 -0
  292. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/DRIVE_QUEUE.md +0 -0
  293. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/EPHEMERAL_WORKERS.md +0 -0
  294. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/FORGE_MIGRATION.md +0 -0
  295. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/GRAPHIFY_SETUP.md +0 -0
  296. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ISSUE_GUIDANCE.md +0 -0
  297. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/MAC_MINI.md +0 -0
  298. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  299. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/NOTIFIER.md +0 -0
  300. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/OPENCODE_VERIFICATION.md +0 -0
  301. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/OPERATING_GOTCHAS.md +0 -0
  302. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ORACLE_LOOP.md +0 -0
  303. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/PHONE_WEBAPP.md +0 -0
  304. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/PIPELINE_V2.md +0 -0
  305. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/PLATFORM_EVOLUTION.md +0 -0
  306. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/SECOND_BACKEND.md +0 -0
  307. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/STORE_SERVICE.md +0 -0
  308. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  309. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/WEB_CONTROL_CENTER.md +0 -0
  310. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/WSL_WINDOWS_WORKER.md +0 -0
  311. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/README.md +0 -0
  312. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/_tokens.css +0 -0
  313. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/issue-detail.html +0 -0
  314. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/pipeline-narrow.html +0 -0
  315. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/pipeline-wide.html +0 -0
  316. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/graphify-out/.gitignore +0 -0
  317. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/install-agent.sh +0 -0
  318. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/pyproject.toml +0 -0
  319. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/audit_review_verdict_overrides.py +0 -0
  320. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  321. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/build-worker-image.sh +0 -0
  322. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/coordinator-machine.py +0 -0
  323. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/epic-down.sh +0 -0
  324. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/epic-up.sh +0 -0
  325. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/preflight.sh +0 -0
  326. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/provision-worker.sh +0 -0
  327. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  328. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  329. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/verify-github-token.sh +0 -0
  330. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/check_gh_argv_containment.py +0 -0
  331. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/codegen.py +0 -0
  332. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/coord-test-runner.sh +0 -0
  333. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/drive-batch.sh +0 -0
  334. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/gen_board_fixture.py +0 -0
  335. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/gen_mock_index.py +0 -0
  336. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/next_release_tag.py +0 -0
  337. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/run_tests_in_populated_home.sh +0 -0
  338. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/run_tests_without_gh.sh +0 -0
  339. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/smoke_437_interactive.py +0 -0
  340. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/verify_878_review_capture.py +0 -0
  341. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/verify_release_published.py +0 -0
  342. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/verify_release_wheel.py +0 -0
  343. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/setup.cfg +0 -0
  344. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/SMOKE_SET.md +0 -0
  345. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/__init__.py +0 -0
  346. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  347. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/contract.md +0 -0
  348. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/manifest.yml +0 -0
  349. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  350. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  351. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  352. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  353. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/conftest.py +0 -0
  354. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/contract.md +0 -0
  355. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/manifest.yml +0 -0
  356. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  357. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  358. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/contract.md +0 -0
  359. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/manifest.yml +0 -0
  360. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  361. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  362. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  363. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  364. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  365. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  366. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  367. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  368. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  369. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  370. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/contract.md +0 -0
  371. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  372. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  373. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/manifest.yml +0 -0
  374. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  375. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/tsconfig.json +0 -0
  376. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  377. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  378. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  379. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/contract.md +0 -0
  380. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  381. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/manifest.yml +0 -0
  382. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  383. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  384. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  385. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  386. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  387. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  388. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  389. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  390. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  391. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  392. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  393. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/contract.md +0 -0
  394. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  395. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  396. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  397. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  398. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  399. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  400. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/conftest.py +0 -0
  401. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/board-pipeline-basic.json +0 -0
  402. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  403. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  404. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  405. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  406. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/all_pass.json +0 -0
  407. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  408. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/mixed_fail.json +0 -0
  409. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  410. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  411. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/skip.json +0 -0
  412. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/truncated.json +0 -0
  413. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  414. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  415. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  416. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  417. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  418. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  419. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  420. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  421. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_acceptance.py +0 -0
  422. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_acceptance_drivers.py +0 -0
  423. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent.py +0 -0
  424. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_api_error.py +0 -0
  425. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_app.py +0 -0
  426. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_branch_base.py +0 -0
  427. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_branch_capture.py +0 -0
  428. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_config_free_1712.py +0 -0
  429. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_deploy_units_endpoint.py +0 -0
  430. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_dirty_worktree.py +0 -0
  431. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  432. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_graph_self_heal.py +0 -0
  433. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_health_h3.py +0 -0
  434. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_idle_restart.py +0 -0
  435. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_push_failure.py +0 -0
  436. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_reap.py +0 -0
  437. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_repos_and_pull.py +0 -0
  438. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_restart_services_endpoint.py +0 -0
  439. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_skills_self_heal.py +0 -0
  440. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_startup_diagnostics.py +0 -0
  441. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_update.py +0 -0
  442. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_update_bluegreen.py +0 -0
  443. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_usage_limit.py +0 -0
  444. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_zero_commit.py +0 -0
  445. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ambient_home_isolation.py +0 -0
  446. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_approve_reject_plan.py +0 -0
  447. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_approve_usage_gate.py +0 -0
  448. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_assignment_already_recorded_daemon.py +0 -0
  449. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_audit_log.py +0 -0
  450. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_audit_outcome.py +0 -0
  451. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_audit_query.py +0 -0
  452. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_auto_release_publish_2035.py +0 -0
  453. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_base_checkout_restore.py +0 -0
  454. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_block_log.py +0 -0
  455. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_cap_762.py +0 -0
  456. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_fixture.py +0 -0
  457. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_read_path.py +0 -0
  458. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_service.py +0 -0
  459. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_state.py +0 -0
  460. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_wire.py +0 -0
  461. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_brain.py +0 -0
  462. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_branch_model.py +0 -0
  463. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_bug_intake.py +0 -0
  464. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_build_worker_image_env_update.py +0 -0
  465. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cargo_cache.py +0 -0
  466. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_check_gh_argv_containment.py +0 -0
  467. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_acceptance_gate_1950.py +0 -0
  468. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_gitlab.py +0 -0
  469. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_parity_2091.py +0 -0
  470. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_store.py +0 -0
  471. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_claim.py +0 -0
  472. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_acceptance.py +0 -0
  473. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign.py +0 -0
  474. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  475. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign_interactive_remote.py +0 -0
  476. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign_provider.py +0 -0
  477. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  478. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_audit.py +0 -0
  479. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_chat_continue.py +0 -0
  480. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_decide.py +0 -0
  481. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_diagnose_config_provenance.py +0 -0
  482. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_diagnose_forge_availability.py +0 -0
  483. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_diagnose_graph.py +0 -0
  484. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_diagnose_self.py +0 -0
  485. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_doctor.py +0 -0
  486. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_doctor_config_free_1801.py +0 -0
  487. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  488. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_drive.py +0 -0
  489. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_drive_queue.py +0 -0
  490. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_escalate.py +0 -0
  491. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_fix_headless_review.py +0 -0
  492. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_gate_a.py +0 -0
  493. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_install_drift.py +0 -0
  494. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_install_skills.py +0 -0
  495. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_issue_create_label.py +0 -0
  496. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_issue_reopen.py +0 -0
  497. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_merge.py +0 -0
  498. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_assign.py +0 -0
  499. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_capture.py +0 -0
  500. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_chat_add_child.py +0 -0
  501. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_dispatch.py +0 -0
  502. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_gate_b.py +0 -0
  503. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_gate_c.py +0 -0
  504. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_order.py +0 -0
  505. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  506. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_ship.py +0 -0
  507. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_network.py +0 -0
  508. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_new_issue_chat.py +0 -0
  509. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_plans.py +0 -0
  510. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_portal.py +0 -0
  511. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_pull_artifact.py +0 -0
  512. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_queue.py +0 -0
  513. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_reattach_sessions.py +0 -0
  514. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_refine_board.py +0 -0
  515. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_release_preflight.py +0 -0
  516. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_release_propagate.py +0 -0
  517. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_release_window.py +0 -0
  518. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_repo_2220.py +0 -0
  519. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_scorecard.py +0 -0
  520. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_set_review_findings.py +0 -0
  521. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_advisory_terminal.py +0 -0
  522. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_merge_queue.py +0 -0
  523. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_provider.py +0 -0
  524. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_review_finalizing.py +0 -0
  525. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_test_failed_tag.py +0 -0
  526. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_usage_limit.py +0 -0
  527. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_sync_comments_873.py +0 -0
  528. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_test_plan.py +0 -0
  529. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_track.py +0 -0
  530. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_tui_update.py +0 -0
  531. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_wait.py +0 -0
  532. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_client_base_install.py +0 -0
  533. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_comments.py +0 -0
  534. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_completion_summary.py +0 -0
  535. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config.py +0 -0
  536. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_acceptance.py +0 -0
  537. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_audit.py +0 -0
  538. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_pricing.py +0 -0
  539. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  540. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_usage_gate.py +0 -0
  541. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_confirm_test.py +0 -0
  542. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_conflict_fix.py +0 -0
  543. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_conflict_fix_semantic.py +0 -0
  544. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test.py +0 -0
  545. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test_runner_baseline.py +0 -0
  546. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test_runner_populated_home.py +0 -0
  547. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test_runner_routing.py +0 -0
  548. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test_runner_toolchain.py +0 -0
  549. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_web_sse_restart_live.py +0 -0
  550. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coordinator_machine.py +0 -0
  551. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cross_platform_imports.py +0 -0
  552. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dashboard.py +0 -0
  553. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dashboard_fixture.py +0 -0
  554. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dashboard_terminal.py +0 -0
  555. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dashboard_terminal_live.py +0 -0
  556. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dead_end.py +0 -0
  557. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_coord_db_backup.py +0 -0
  558. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_coord_web_dist.py +0 -0
  559. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_coord_web_rollback.py +0 -0
  560. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_drive_queue_unit.py +0 -0
  561. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_manifest.py +0 -0
  562. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_units_lane.py +0 -0
  563. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_web_unit.py +0 -0
  564. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deps.py +0 -0
  565. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_diagnose.py +0 -0
  566. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dispatch.py +0 -0
  567. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dispatch_target_validation.py +0 -0
  568. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dist_name.py +0 -0
  569. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_done_housekeeping.py +0 -0
  570. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_drive.py +0 -0
  571. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_drive_queue.py +0 -0
  572. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_drive_state.py +0 -0
  573. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_drive_tmux.py +0 -0
  574. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_epic_up_capability_detection.py +0 -0
  575. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  576. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_epic_up_image_provenance.py +0 -0
  577. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_errors.py +0 -0
  578. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_events.py +0 -0
  579. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_failure_class.py +0 -0
  580. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_filelock.py +0 -0
  581. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  582. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_fix_of_force_override.py +0 -0
  583. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_fleet_config_health.py +0 -0
  584. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_fleet_health_probes.py +0 -0
  585. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_fleet_health_snapshot.py +0 -0
  586. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_forge_availability.py +0 -0
  587. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_freshness.py +0 -0
  588. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gate_a.py +0 -0
  589. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gate_b.py +0 -0
  590. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gate_snapshot_staleness.py +0 -0
  591. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gates.py +0 -0
  592. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  593. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gen_mock_index.py +0 -0
  594. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_generated_types_fixture.py +0 -0
  595. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_github_ops.py +0 -0
  596. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_goal.py +0 -0
  597. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_graph_health.py +0 -0
  598. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_graph_selfheal_absent_2237.py +0 -0
  599. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_handoff.py +0 -0
  600. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_checks.py +0 -0
  601. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_cli.py +0 -0
  602. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_cli_graph.py +0 -0
  603. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_config.py +0 -0
  604. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_context.py +0 -0
  605. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_coord_web_ci_pin.py +0 -0
  606. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_deploy_lane_facts.py +0 -0
  607. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_incident_regression.py +0 -0
  608. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_pypi.py +0 -0
  609. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_registry.py +0 -0
  610. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_timer_active.py +0 -0
  611. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_toolchain.py +0 -0
  612. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_unit_drift.py +0 -0
  613. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_unit_enablement.py +0 -0
  614. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_hooks.py +0 -0
  615. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_human_attended_437.py +0 -0
  616. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_init.py +0 -0
  617. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_integration.py +0 -0
  618. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_briefing_echo.py +0 -0
  619. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_prefill_state.py +0 -0
  620. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_session_relaunch.py +0 -0
  621. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_test_verdict_backstop.py +0 -0
  622. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_token_attribution.py +0 -0
  623. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_worktree.py +0 -0
  624. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_issue_store_seam.py +0 -0
  625. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_liveness_auditor.py +0 -0
  626. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_liveness_notify.py +0 -0
  627. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_machine_pause.py +0 -0
  628. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_merge_queue.py +0 -0
  629. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_merge_verify.py +0 -0
  630. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_chat.py +0 -0
  631. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_dispatch.py +0 -0
  632. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_gate.py +0 -0
  633. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_order.py +0 -0
  634. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_seam.py +0 -0
  635. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_mock_author.py +0 -0
  636. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_model_tiering.py +0 -0
  637. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_models.py +0 -0
  638. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_models_config_labels.py +0 -0
  639. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_needs_attention.py +0 -0
  640. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_network.py +0 -0
  641. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_new_issue_chat.py +0 -0
  642. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_next_release_tag.py +0 -0
  643. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_node_shim.py +0 -0
  644. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_baseline.py +0 -0
  645. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_cli.py +0 -0
  646. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_collect.py +0 -0
  647. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_config.py +0 -0
  648. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_drive_seam.py +0 -0
  649. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_isolation.py +0 -0
  650. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_predicate.py +0 -0
  651. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_quiet_hours.py +0 -0
  652. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_service.py +0 -0
  653. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notify.py +0 -0
  654. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notify_drain.py +0 -0
  655. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_openapi.py +0 -0
  656. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_operational_defaults.py +0 -0
  657. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_overlap_fence.py +0 -0
  658. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_overlap_predict.py +0 -0
  659. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_packaged_deploy_units.py +0 -0
  660. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_parentage.py +0 -0
  661. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_paste_landed.py +0 -0
  662. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_pipeline.py +0 -0
  663. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_followup_approve_plan_command.py +0 -0
  664. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_followup_pr_command.py +0 -0
  665. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_followup_review_command.py +0 -0
  666. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_only.py +0 -0
  667. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_parser.py +0 -0
  668. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_platform_paths.py +0 -0
  669. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_portal_bridge.py +0 -0
  670. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_portal_config.py +0 -0
  671. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_portal_store.py +0 -0
  672. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_portal_sync.py +0 -0
  673. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_pr_body_lint.py +0 -0
  674. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_prereqs.py +0 -0
  675. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_production_db_guard.py +0 -0
  676. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_progress.py +0 -0
  677. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_provider_seam.py +0 -0
  678. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_providers.py +0 -0
  679. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_providers_config_labels.py +0 -0
  680. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_providers_pty.py +0 -0
  681. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_quiet_hours.py +0 -0
  682. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_quiet_hours_store_2146.py +0 -0
  683. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reap_merged_sessions.py +0 -0
  684. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reap_stale_interactive_tick.py +0 -0
  685. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile.py +0 -0
  686. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_branch.py +0 -0
  687. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_completions.py +0 -0
  688. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_merges.py +0 -0
  689. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_no_agent_record.py +0 -0
  690. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_tick.py +0 -0
  691. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_usage_limit_done.py +0 -0
  692. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_refine_chat.py +0 -0
  693. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_cordon_2101.py +0 -0
  694. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  695. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_cordon_deadlock_2240.py +0 -0
  696. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_cordon_stuck_2490.py +0 -0
  697. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_propagate.py +0 -0
  698. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_unified_1242.py +0 -0
  699. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_verify.py +0 -0
  700. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_window.py +0 -0
  701. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_remote_auto_prune.py +0 -0
  702. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_remote_interactive_reaper.py +0 -0
  703. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_repo_edit_2220.py +0 -0
  704. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_repo_graph_fleet_2237.py +0 -0
  705. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_repo_onboard_2220.py +0 -0
  706. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_report_result_push.py +0 -0
  707. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reports.py +0 -0
  708. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_retry.py +0 -0
  709. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_retry_advisory_1606.py +0 -0
  710. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_retry_type_1636.py +0 -0
  711. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_revalidate.py +0 -0
  712. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review.py +0 -0
  713. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_end_review_without_verdict.py +0 -0
  714. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_parse_failure_diagnostic.py +0 -0
  715. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_reaffirm.py +0 -0
  716. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_state.py +0 -0
  717. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_verdict_backstop.py +0 -0
  718. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_verdict_override_audit.py +0 -0
  719. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_verdict_relay.py +0 -0
  720. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_zero_commits.py +0 -0
  721. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_scoped_review_wiring.py +0 -0
  722. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_scorecard.py +0 -0
  723. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_self_health.py +0 -0
  724. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_serve.py +0 -0
  725. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_serve_app_board_trim.py +0 -0
  726. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_session.py +0 -0
  727. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_slice_issue_attribution.py +0 -0
  728. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_smoke.py +0 -0
  729. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_smoke_live_checkout_restore.py +0 -0
  730. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_smoke_workflow.py +0 -0
  731. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_spend_ceiling.py +0 -0
  732. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_spend_ceiling_coordinator.py +0 -0
  733. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_split.py +0 -0
  734. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_split_work.py +0 -0
  735. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_stage_projection.py +0 -0
  736. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_state_review_findings_daemon.py +0 -0
  737. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_status_fleet_footer.py +0 -0
  738. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_stop_1567.py +0 -0
  739. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_stuck.py +0 -0
  740. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_terminal_command.py +0 -0
  741. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_author.py +0 -0
  742. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_chat.py +0 -0
  743. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_orchestrator.py +0 -0
  744. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_report.py +0 -0
  745. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_verdict_parsing.py +0 -0
  746. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_verdict_transcript_floor.py +0 -0
  747. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_thin_client_board_audit.py +0 -0
  748. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_thin_client_config_load_1080.py +0 -0
  749. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_thin_client_daemon_routing_906.py +0 -0
  750. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_tmux_host.py +0 -0
  751. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_tmux_session.py +0 -0
  752. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_transcript_floor.py +0 -0
  753. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_usage.py +0 -0
  754. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_usage_limits.py +0 -0
  755. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_usage_rollup.py +0 -0
  756. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_venv_live_install_2121.py +0 -0
  757. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_version_single_source.py +0 -0
  758. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_watch.py +0 -0
  759. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  760. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worker_events.py +0 -0
  761. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worker_image_pin_sync.py +0 -0
  762. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worker_safety.py +0 -0
  763. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worker_test_scoping.py +0 -0
  764. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worktree.py +0 -0
  765. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  766. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/Cargo.lock +0 -0
  767. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/Cargo.toml +0 -0
  768. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/cargo-config-local-quadraui.toml.example +0 -0
  769. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/audit.rs +0 -0
  770. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/chat.rs +0 -0
  771. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/data.rs +0 -0
  772. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/dialogs.rs +0 -0
  773. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/doc_tabs.rs +0 -0
  774. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/drive.rs +0 -0
  775. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/drive_queue.rs +0 -0
  776. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/escalation.rs +0 -0
  777. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/events.rs +0 -0
  778. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/fixtures.rs +0 -0
  779. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/fleet_health.rs +0 -0
  780. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/fleet_sessions.rs +0 -0
  781. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/fleet_terminals.rs +0 -0
  782. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/format.rs +0 -0
  783. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/milestone_dag.rs +0 -0
  784. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/mod.rs +0 -0
  785. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/msv.rs +0 -0
  786. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/pipeline.rs +0 -0
  787. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/plans.rs +0 -0
  788. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/render.rs +0 -0
  789. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/reports.rs +0 -0
  790. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/sessions.rs +0 -0
  791. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/settings_ui.rs +0 -0
  792. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/sidebar.rs +0 -0
  793. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/terminal.rs +0 -0
  794. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/tests.rs +0 -0
  795. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/types.rs +0 -0
  796. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/workspace.rs +0 -0
  797. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/bin/gtk.rs +0 -0
  798. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/commands.rs +0 -0
  799. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/lib.rs +0 -0
  800. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/main.rs +0 -0
  801. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/settings.rs +0 -0
  802. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/tests/acceptance.rs +0 -0
  803. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/tests/cli.rs +0 -0
  804. {code_coordinator-0.5.213 → code_coordinator-0.5.215}/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.213
3
+ Version: 0.5.215
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.213
3
+ Version: 0.5.215
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.213",
2
+ "tag": "0.5.215",
3
3
  "distance": 0,
4
- "node": "ga9e3937295f13339509408e4a07ca7e7028b9987",
4
+ "node": "g43e59d754122e055c18ab64170d43a1f2d7a4afd",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-21"
@@ -34,6 +34,7 @@ Data model:
34
34
  from __future__ import annotations
35
35
 
36
36
  import logging
37
+ import sqlite3
37
38
  import time
38
39
  import uuid
39
40
  from dataclasses import dataclass
@@ -1221,10 +1222,37 @@ def _dispatch_fix(
1221
1222
  )
1222
1223
  board.active.append(fix_assignment)
1223
1224
 
1224
- record_dispatched_assignment(
1225
- assignment=fix_assignment,
1226
- repo_github=repo.github,
1227
- )
1225
+ try:
1226
+ record_dispatched_assignment(
1227
+ assignment=fix_assignment,
1228
+ repo_github=repo.github,
1229
+ )
1230
+ except sqlite3.OperationalError as exc:
1231
+ if "database is locked" not in str(exc).lower():
1232
+ # Not the transient contention this guard exists for (#2538) —
1233
+ # a schema mismatch or malformed statement is a real bug and
1234
+ # must not be swallowed as an ordinary declined dispatch.
1235
+ raise
1236
+ # `record_dispatched_assignment` already retries transient
1237
+ # "database is locked" contention itself (coord.db.retry_on_locked,
1238
+ # via coord._record_dispatched_assignment_local) — this is only
1239
+ # reached once that bounded retry budget is exhausted. The fix
1240
+ # worker has already been POSTed to the agent above and is really
1241
+ # running; only the durable board-DB row failed to write. Treat it
1242
+ # the same as any other declined dispatch (no machine, agent
1243
+ # unreachable, …) rather than letting a transient lock crash the
1244
+ # whole caller (`coord merge`'s CI-fix queue, the review auto-loop,
1245
+ # …) — undo the in-memory append so a saved board never carries a
1246
+ # row this call never durably recorded, and let the caller's
1247
+ # existing "dispatch declined" handling take it from here.
1248
+ board.active.remove(fix_assignment)
1249
+ log.warning(
1250
+ "auto_loop: fix dispatch for %s hit persistent DB contention "
1251
+ "recording assignment %s (%s) — treating as not dispatched; "
1252
+ "will retry next run",
1253
+ work.assignment_id, fix_assignment.assignment_id, exc,
1254
+ )
1255
+ return None
1228
1256
  return fix_assignment
1229
1257
 
1230
1258
 
@@ -610,10 +610,24 @@ def _dispatch_ci_fixes(events, config, *, dry_run: bool) -> None:
610
610
  details={"reason": "ci_fix_retry_cap", "error": entry.error},
611
611
  )
612
612
  dispatched_any = True # the HUMAN_REQUIRED mutation needs saving
613
- # else: budget remains but dispatch declined for another reason (no
614
- # machine, an unrelated fix already in flight, agent unreachable) —
615
- # leave the entry PENDING for the next tick to retry, exactly like a
616
- # declined conflict-fix dispatch does.
613
+ else:
614
+ # Budget remains but dispatch declined for another reason (no
615
+ # machine, an unrelated fix already in flight, agent
616
+ # unreachable, or — #2538 — `_dispatch_fix` hit persistent
617
+ # "database is locked" contention recording the assignment
618
+ # after its own bounded retry budget was exhausted) — leave the
619
+ # entry PENDING for the next tick to retry, exactly like a
620
+ # declined conflict-fix dispatch does. Echoed (matching
621
+ # `_dispatch_conflict_fixes`'s equivalent branch) so an
622
+ # operator watching `coord merge` isn't left wondering why
623
+ # nothing happened for this entry — and so a transient DB lock
624
+ # collision on ONE entry is visibly a retry, not a silent drop,
625
+ # while every other entry keeps processing normally.
626
+ click.echo(
627
+ f" {entry.repo_name} #{entry.issue_number}: "
628
+ "ci-fix not dispatched (no machine / already in flight / "
629
+ "transient DB contention — will retry next run)"
630
+ )
617
631
  if dispatched_any:
618
632
  save_board(fix_board)
619
633
 
@@ -15,7 +15,9 @@ from __future__ import annotations
15
15
  import json
16
16
  import os
17
17
  import sqlite3
18
+ import time
18
19
  from pathlib import Path
20
+ from typing import Callable, TypeVar
19
21
 
20
22
  from coord.platform_paths import default_coord_dir
21
23
 
@@ -88,6 +90,57 @@ def close() -> None:
88
90
  _conn = None
89
91
 
90
92
 
93
+ _T = TypeVar("_T")
94
+
95
+ # #2538: a handful of consecutive short retries — long enough to ride out a
96
+ # concurrent writer (the daemon's own passive tick, another `coord merge`/
97
+ # `coord notify` invocation) that only holds the DB for a moment, short
98
+ # enough that a genuinely stuck lock still fails fast rather than hanging
99
+ # `coord merge` for a long time.
100
+ _LOCK_RETRY_ATTEMPTS = 5
101
+ _LOCK_RETRY_BASE_DELAY_S = 0.1
102
+
103
+
104
+ def retry_on_locked(
105
+ write: Callable[[], _T],
106
+ *,
107
+ attempts: int = _LOCK_RETRY_ATTEMPTS,
108
+ base_delay: float = _LOCK_RETRY_BASE_DELAY_S,
109
+ ) -> _T:
110
+ """Run *write* (a zero-arg callable performing one or more SQLite writes),
111
+ retrying with exponential backoff when SQLite raises ``database is
112
+ locked`` (#2538).
113
+
114
+ That error is transient contention — a concurrent writer holding the DB
115
+ at the exact moment this call tries to write, not a real failure — and a
116
+ short wait is very likely to let it clear. ``PRAGMA busy_timeout``
117
+ (set on every connection in :func:`_open`) already makes SQLite itself
118
+ wait before raising, but under sustained contention (several writers in
119
+ a tight loop) that single wait can still be exhausted; this adds a few
120
+ more short, backed-off attempts on top rather than failing on the first
121
+ collision.
122
+
123
+ Any other ``OperationalError`` (schema drift, a malformed statement, …)
124
+ is re-raised immediately without retrying — those are not transient, and
125
+ retrying would only delay surfacing a real bug. After *attempts*
126
+ consecutive ``database is locked`` collisions, re-raises the last
127
+ ``sqlite3.OperationalError`` so the caller can decide how to degrade
128
+ (see ``coord.state._record_dispatched_assignment_local``, whose caller —
129
+ ``coord.auto_loop._dispatch_fix`` — treats it as a declined dispatch
130
+ rather than letting it crash the whole run).
131
+ """
132
+ delay = base_delay
133
+ for attempt in range(1, attempts + 1):
134
+ try:
135
+ return write()
136
+ except sqlite3.OperationalError as exc:
137
+ if "database is locked" not in str(exc).lower() or attempt >= attempts:
138
+ raise
139
+ time.sleep(delay)
140
+ delay *= 2
141
+ raise AssertionError("unreachable") # loop above always returns or raises
142
+
143
+
91
144
  # ── Schema ────────────────────────────────────────────────────────────────────
92
145
 
93
146
  def _ensure_schema(conn: sqlite3.Connection) -> None:
@@ -11,6 +11,7 @@ from typing import TYPE_CHECKING
11
11
  import httpx
12
12
 
13
13
  if TYPE_CHECKING:
14
+ from coord.merge_queue import QueuedMerge
14
15
  from coord.models import Assignment, Board
15
16
  from coord.progress import SmokeVerdict
16
17
 
@@ -991,6 +992,14 @@ class StalledDispatchAction:
991
992
  (#602).
992
993
  - ``"skipped_human_required"`` — the conflict-fix retry cap was already
993
994
  hit; surfacing to a human, not auto-retrying.
995
+ - ``"skipped_sealed_conflict"`` (#2537) — ``merge_conflict_unresolved``
996
+ on a :data:`coord.models.SEALED_PATH_AUTHOR_TYPES` row whose conflict
997
+ was confirmed (:func:`_conflict_confined_to_sealed_paths`) to be
998
+ confined to the repo's sealed acceptance-oracle paths — a
999
+ conflict-fix worker is guaranteed to self-restrict and push nothing
1000
+ there, so the dispatch was skipped rather than spending a worker
1001
+ session on a known no-op; needs a sealed-path-aware rebase dispatcher
1002
+ (a follow-up issue, not yet implemented).
994
1003
  - ``"disabled"`` — ``pipeline.auto_dispatch_stalled`` is
995
1004
  off; detection/narration still happened, dispatch did not.
996
1005
  """
@@ -1044,6 +1053,50 @@ def _stalled_row_has_live_session(board: "Board", work: "Assignment") -> bool:
1044
1053
  return False
1045
1054
 
1046
1055
 
1056
+ def _conflict_confined_to_sealed_paths(
1057
+ entry: "QueuedMerge", config: Config,
1058
+ ) -> list[str] | None:
1059
+ """#2537: best-effort check for whether *entry*'s merge conflict can
1060
+ ONLY be within the repo's sealed acceptance-oracle paths
1061
+ (:meth:`coord.config.AcceptanceConfig.sealed_paths`).
1062
+
1063
+ Returns the entry branch's changed-file list when every file it touches
1064
+ (the three-dot compare of *entry.target_branch*...*entry.branch*, via
1065
+ :func:`coord.github_ops.get_compare_files` — the SAME GitHub-API-only,
1066
+ no-local-checkout seam #1720's dispatch-time overlap fence already uses)
1067
+ falls under a sealed path. GitHub's conflicting-file set is necessarily
1068
+ a SUBSET of this branch's own changed files — a file can only conflict
1069
+ if *this* branch touches it too — so confining the WHOLE branch diff to
1070
+ sealed paths is sufficient to guarantee the conflict is, without needing
1071
+ a local checkout or a `git merge-tree` call.
1072
+
1073
+ Returns ``None`` — "can't confirm confinement, don't skip the ordinary
1074
+ dispatch" — when: the repo has no acceptance driver configured (nothing
1075
+ is sealed); the compare API call fails or reports no files; or anything
1076
+ is touched outside every sealed path. This is a pure availability
1077
+ signal, never a hard "not confined" claim — a caller that gets ``None``
1078
+ falls back to :func:`coord.conflict_fix.dispatch_conflict_fix` exactly
1079
+ as before, which is always safe: a genuinely sealed-confined conflict
1080
+ just makes that dispatch a no-op (the conflict-fix worker self-restricts
1081
+ per CLAUDE.md's own sealed-path rule), so the only cost of a missed
1082
+ detection here is one wasted worker session, never an incorrect action.
1083
+ """
1084
+ sealed = config.acceptance.sealed_paths(entry.repo_name)
1085
+ if not sealed:
1086
+ return None
1087
+ from coord import github_ops # noqa: PLC0415
1088
+ from coord.review import _path_is_sealed # noqa: PLC0415
1089
+
1090
+ files = github_ops.get_compare_files(
1091
+ entry.repo_github, entry.target_branch, entry.branch,
1092
+ )
1093
+ if not files:
1094
+ return None
1095
+ if all(any(_path_is_sealed(f, s) for s in sealed) for f in files):
1096
+ return files
1097
+ return None
1098
+
1099
+
1047
1100
  def dispatch_stalled_pipeline_action(
1048
1101
  detection: StalledDetection,
1049
1102
  work: "Assignment",
@@ -1058,11 +1111,12 @@ def dispatch_stalled_pipeline_action(
1058
1111
  Gated by ``config.pipeline.auto_dispatch_stalled`` (default ``False`` —
1059
1112
  detection/narration via :func:`post_stalled_pipeline` is unconditional;
1060
1113
  this is the opt-in action half) — EXCEPT for a ``review_request_changes_
1061
- no_fix`` stall on a :data:`coord.models.SEALED_PATH_AUTHOR_TYPES` row
1062
- (``test-author``/``mock-author``), which dispatches regardless of the
1063
- flag: no loop owns that row (#2302), so the flag would only leave it
1064
- stalled forever with no alternative dispatcher to race. ``work`` rows
1065
- under the same reason keep the opt-in gate — ``coord drive`` owns those.
1114
+ no_fix`` OR (#2537) ``merge_conflict_unresolved`` stall on a
1115
+ :data:`coord.models.SEALED_PATH_AUTHOR_TYPES` row (``test-author``/
1116
+ ``mock-author``), which dispatches regardless of the flag: no loop owns
1117
+ that row (#2302), so the flag would only leave it stalled forever with
1118
+ no alternative dispatcher to race. ``work`` rows under the same reasons
1119
+ keep the opt-in gate — ``coord drive`` owns those.
1066
1120
  Mutates *board* in place exactly like
1067
1121
  the auto-loop / review-dispatch helpers it delegates to — the caller is
1068
1122
  responsible for persisting it.
@@ -1091,7 +1145,15 @@ def dispatch_stalled_pipeline_action(
1091
1145
  the same bulk gate-checked enqueue the daemon passive tick already
1092
1146
  runs on every interval.
1093
1147
  - ``merge_conflict_unresolved`` → :func:`coord.conflict_fix.dispatch_conflict_fix`,
1094
- the #1474 ``_dispatch_conflict_fixes`` path.
1148
+ the #1474 ``_dispatch_conflict_fixes`` path — UNLESS (#2537) *work* is a
1149
+ :data:`coord.models.SEALED_PATH_AUTHOR_TYPES` row AND the conflict can
1150
+ be confirmed (via :func:`_conflict_confined_to_sealed_paths`, a
1151
+ compare-API-only check) to be confined to the repo's sealed
1152
+ acceptance-oracle paths — a conflict-fix worker is REQUIRED by
1153
+ CLAUDE.md's own sealed-path rule to self-restrict from editing those,
1154
+ so it is guaranteed to push nothing; that case returns
1155
+ ``"skipped_sealed_conflict"`` instead of spending a worker session on
1156
+ a known no-op.
1095
1157
  - ``review_failed_no_verdict`` (#1584) → :func:`coord.review.dispatch_review`
1096
1158
  again, the SAME call as ``done_no_review`` — the failed review left no
1097
1159
  verdict behind, so recovery is identical to "no review was ever
@@ -1116,10 +1178,20 @@ def dispatch_stalled_pipeline_action(
1116
1178
  # no drive run over it at all (see #2289). So this one reason+type
1117
1179
  # combination bypasses the flag — every other reason, and `work` rows
1118
1180
  # under this same reason, keep the opt-in gate unchanged.
1181
+ #
1182
+ # #2537: a `merge_conflict_unresolved` stall on the SAME row types is the
1183
+ # identical shape — `coord drive` has no conflict-fix arm for
1184
+ # test-author/mock-author rows either (it `_die()`s on them before ever
1185
+ # reaching a merge), and the passive tick only re-enqueues, never
1186
+ # dispatches a conflict-fix. Without this, the row bounces
1187
+ # PENDING → CONFLICT → parked forever with nobody attempting a fix
1188
+ # (observed live: coord-portal#132). So this reason joins the bypass for
1189
+ # these row types too — every other reason, and `work` rows under either
1190
+ # reason, keep the opt-in gate unchanged.
1119
1191
  from coord.models import SEALED_PATH_AUTHOR_TYPES # noqa: PLC0415
1120
1192
 
1121
1193
  sealed_author_stall = (
1122
- detection.reason == "review_request_changes_no_fix"
1194
+ detection.reason in ("review_request_changes_no_fix", "merge_conflict_unresolved")
1123
1195
  and work.type in SEALED_PATH_AUTHOR_TYPES
1124
1196
  )
1125
1197
  if not config.pipeline.auto_dispatch_stalled and not sealed_author_stall:
@@ -1423,6 +1495,35 @@ def dispatch_stalled_pipeline_action(
1423
1495
  kind="skipped_human_required",
1424
1496
  detail="conflict-fix already active or its retry cap was already hit",
1425
1497
  )
1498
+ # #2537: dispatch_conflict_fix is guaranteed to no-op on a conflict
1499
+ # confined to the repo's sealed acceptance-oracle paths — the
1500
+ # conflict-fix worker is REQUIRED by CLAUDE.md's own sealed-path
1501
+ # rule to self-restrict from editing them (the additive carve-out
1502
+ # applies only to test-author/mock-author dispatches, never
1503
+ # conflict-fix), so it pushes nothing and the entry just re-stalls
1504
+ # next tick. Confirmed live on coord-portal#132/#135: a manually
1505
+ # forced dispatch_conflict_fix restored its worktree clean and
1506
+ # pushed nothing. Skip the known-wasted dispatch when we can
1507
+ # confirm confinement in advance; resolving it for real needs a
1508
+ # sealed-path-aware re-dispatch (tracked as a follow-up issue, not
1509
+ # yet implemented) — dispatch_conflict_fix stays the fallback for
1510
+ # every other case (can't confirm confinement, or genuinely not
1511
+ # confined).
1512
+ if work.type in SEALED_PATH_AUTHOR_TYPES:
1513
+ sealed_files = _conflict_confined_to_sealed_paths(entry, config)
1514
+ if sealed_files is not None:
1515
+ return StalledDispatchAction(
1516
+ kind="skipped_sealed_conflict",
1517
+ detail=(
1518
+ "conflict is confined to sealed acceptance paths ("
1519
+ + ", ".join(sealed_files)
1520
+ + ") — a conflict-fix worker is required to "
1521
+ "self-restrict from editing them (CLAUDE.md's "
1522
+ "sealed-path rule) and would push nothing; needs a "
1523
+ "sealed-path-aware rebase dispatcher (follow-up "
1524
+ "issue), not dispatch_conflict_fix"
1525
+ ),
1526
+ )
1426
1527
  fix = dispatch_conflict_fix(entry, board, config, prefer_machine=work.machine_name)
1427
1528
  if fix is None:
1428
1529
  return StalledDispatchAction(
@@ -37,7 +37,7 @@ from coord._board_mapping import (
37
37
  from coord.audit import record_audit as _record_audit
38
38
  from coord.board_service import resolve as _board_service_resolve
39
39
  from coord.board_service import route_write as _route_write
40
- from coord.db import get_connection
40
+ from coord.db import get_connection, retry_on_locked
41
41
  from coord.models import (
42
42
  WORK_LIKE_TYPES,
43
43
  Assignment,
@@ -1018,8 +1018,17 @@ def _record_dispatched_assignment_local(
1018
1018
  )
1019
1019
 
1020
1020
  conn = get_connection()
1021
- conn.execute(
1022
- """INSERT INTO assignments (
1021
+
1022
+ # #2538: this INSERT/commit is the one write in this function that's
1023
+ # actually load-bearing (unlike the best-effort `_record_audit` call
1024
+ # below it) — a concurrent writer (the daemon's own passive tick,
1025
+ # another `coord merge`/`coord notify` invocation) holding the DB for a
1026
+ # moment must not crash the caller. The statement is safe to retry
1027
+ # as-is: `assignment_id` is the primary key and the `ON CONFLICT ...
1028
+ # DO UPDATE` makes a re-attempted write idempotent.
1029
+ def _write() -> None:
1030
+ conn.execute(
1031
+ """INSERT INTO assignments (
1023
1032
  assignment_id, machine_name, repo_name, repo_github,
1024
1033
  issue_number, issue_title, status, type, briefing,
1025
1034
  files_allowed, model, dispatched_at, review_of_assignment_id,
@@ -1101,8 +1110,10 @@ def _record_dispatched_assignment_local(
1101
1110
  assignment.driven_by,
1102
1111
  assignment.dispatched_by_assignment_id,
1103
1112
  ),
1104
- )
1105
- conn.commit()
1113
+ )
1114
+ conn.commit()
1115
+
1116
+ retry_on_locked(_write)
1106
1117
  _record_audit(
1107
1118
  tier="business",
1108
1119
  category="dispatch",
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import sqlite3
5
6
  import uuid
6
7
  from dataclasses import replace
7
8
  from typing import Any
@@ -2402,6 +2403,105 @@ class TestDispatchFixRemoteBranchGuard:
2402
2403
  assert result.machine_name == "server"
2403
2404
 
2404
2405
 
2406
+ # ── #2538: persistent "database is locked" must decline, not crash ─────────
2407
+
2408
+
2409
+ class TestDispatchFixDbContention:
2410
+ """coord-portal#2538: a concurrent writer (the daemon's own passive
2411
+ tick, another `coord merge`/`coord notify` invocation) can hold the DB
2412
+ at the exact moment `record_dispatched_assignment` tries to record a
2413
+ dispatched fix. `coord.state`'s own bounded retry
2414
+ (`coord.db.retry_on_locked`) already rides out a short collision; this
2415
+ covers what happens once that retry budget is well and truly exhausted
2416
+ — `_dispatch_fix` must degrade to its documented "None on failure"
2417
+ contract instead of letting the raw `sqlite3.OperationalError` crash
2418
+ the caller (`coord merge`'s CI-fix queue, the review auto-loop, …)."""
2419
+
2420
+ def _work(self, machine: str = "laptop") -> Assignment:
2421
+ return Assignment(
2422
+ machine_name=machine,
2423
+ repo_name="api",
2424
+ issue_number=5,
2425
+ issue_title="Fix thing",
2426
+ briefing="Original briefing.",
2427
+ assignment_id="work-2538",
2428
+ status="done",
2429
+ branch="issue-5-fix-thing",
2430
+ dispatched_at=0.0,
2431
+ finished_at=1.0,
2432
+ type="work",
2433
+ )
2434
+
2435
+ def test_persistent_lock_contention_returns_none_without_crashing(
2436
+ self,
2437
+ ) -> None:
2438
+ cfg = _two_machine_config()
2439
+ work = self._work()
2440
+ board = Board(completed=[work])
2441
+ mock_http = MagicMock()
2442
+ mock_http.post.return_value.json.return_value = {"id": "fix-2538-a"}
2443
+ mock_http.post.return_value.raise_for_status = MagicMock()
2444
+
2445
+ with patch(
2446
+ "coord.auto_loop.record_dispatched_assignment",
2447
+ side_effect=sqlite3.OperationalError("database is locked"),
2448
+ ):
2449
+ result = _dispatch_fix(
2450
+ work, "Fix briefing.", board, cfg, iteration=1,
2451
+ http_client=mock_http,
2452
+ )
2453
+
2454
+ assert result is None
2455
+
2456
+ def test_persistent_lock_contention_rolls_back_the_board_append(
2457
+ self,
2458
+ ) -> None:
2459
+ """The fix assignment is appended to `board.active` before the DB
2460
+ write is attempted (so a fully successful dispatch needs no extra
2461
+ round trip) — a failed write must undo that append, or a later
2462
+ `save_board` call (triggered by some OTHER entry succeeding in the
2463
+ same `coord merge` tick) would persist a phantom row that was never
2464
+ actually recorded."""
2465
+ cfg = _two_machine_config()
2466
+ work = self._work()
2467
+ board = Board(completed=[work])
2468
+ mock_http = MagicMock()
2469
+ mock_http.post.return_value.json.return_value = {"id": "fix-2538-b"}
2470
+ mock_http.post.return_value.raise_for_status = MagicMock()
2471
+
2472
+ with patch(
2473
+ "coord.auto_loop.record_dispatched_assignment",
2474
+ side_effect=sqlite3.OperationalError("database is locked"),
2475
+ ):
2476
+ _dispatch_fix(
2477
+ work, "Fix briefing.", board, cfg, iteration=1,
2478
+ http_client=mock_http,
2479
+ )
2480
+
2481
+ assert board.active == []
2482
+
2483
+ def test_unrelated_operational_error_still_propagates(self) -> None:
2484
+ """A genuine bug (schema drift, a malformed statement) must not be
2485
+ swallowed as if it were routine transient contention — only the
2486
+ specific `database is locked` message is treated as declinable."""
2487
+ cfg = _two_machine_config()
2488
+ work = self._work()
2489
+ board = Board(completed=[work])
2490
+ mock_http = MagicMock()
2491
+ mock_http.post.return_value.json.return_value = {"id": "fix-2538-c"}
2492
+ mock_http.post.return_value.raise_for_status = MagicMock()
2493
+
2494
+ with patch(
2495
+ "coord.auto_loop.record_dispatched_assignment",
2496
+ side_effect=sqlite3.OperationalError("no such column: bogus"),
2497
+ ):
2498
+ with pytest.raises(sqlite3.OperationalError, match="no such column"):
2499
+ _dispatch_fix(
2500
+ work, "Fix briefing.", board, cfg, iteration=1,
2501
+ http_client=mock_http,
2502
+ )
2503
+
2504
+
2405
2505
  # ── #1176: test-author bounce gets a type="test-author" fix, not "work" ─────
2406
2506
 
2407
2507
 
@@ -333,3 +333,27 @@ class TestDispatchCiFixesWrapper:
333
333
  merge_cmd._dispatch_ci_fixes(events, two_machine_config, dry_run=False)
334
334
 
335
335
  assert entry.state == PENDING
336
+
337
+ def test_declined_dispatch_under_budget_is_echoed(
338
+ self, two_machine_config: Config, coord_db, capsys,
339
+ ) -> None:
340
+ """#2538: a declined dispatch (including `_dispatch_fix` hitting
341
+ persistent DB-lock contention, which surfaces exactly like any
342
+ other decline — see coord.auto_loop._dispatch_fix) must be visible
343
+ in `coord merge` output, not silently dropped — otherwise an
344
+ operator watching the run has no idea this entry didn't advance."""
345
+ from coord.commands import merge as merge_cmd
346
+ from coord.state import save_board
347
+
348
+ board = Board()
349
+ save_board(board)
350
+
351
+ entry = _entry()
352
+ events = [self._checks_failed_event(entry)]
353
+
354
+ with patch("coord.ci_fix.dispatch_ci_fix", return_value=None):
355
+ merge_cmd._dispatch_ci_fixes(events, two_machine_config, dry_run=False)
356
+
357
+ out = capsys.readouterr().out
358
+ assert "ci-fix not dispatched" in out
359
+ assert f"#{entry.issue_number}" in out
@@ -9,7 +9,13 @@ from pathlib import Path
9
9
  import pytest
10
10
 
11
11
  from coord import db as db_mod
12
- from coord.db import _ensure_schema, override_connection, close, _migrate_gate_order
12
+ from coord.db import (
13
+ _ensure_schema,
14
+ override_connection,
15
+ close,
16
+ _migrate_gate_order,
17
+ retry_on_locked,
18
+ )
13
19
 
14
20
 
15
21
  # ── Fixtures ──────────────────────────────────────────────────────────────────
@@ -724,6 +730,78 @@ class TestMergeQueueCiFixDispatchesColumn:
724
730
  conn.close()
725
731
 
726
732
 
733
+ # ── retry_on_locked (#2538) ─────────────────────────────────────────────────
734
+
735
+
736
+ class TestRetryOnLocked:
737
+ """#2538: `coord merge` crashed the whole run on a transient
738
+ `sqlite3.OperationalError: database is locked` raised while recording a
739
+ dispatched CI-fix assignment. `retry_on_locked` gives a momentary
740
+ collision (the daemon's own passive tick, another `coord merge`/`coord
741
+ notify` invocation holding the DB) a few short, backed-off attempts to
742
+ clear before it becomes the caller's problem.
743
+ """
744
+
745
+ def test_succeeds_immediately_when_no_contention(self) -> None:
746
+ calls = []
747
+
748
+ def _write() -> str:
749
+ calls.append(1)
750
+ return "ok"
751
+
752
+ assert retry_on_locked(_write) == "ok"
753
+ assert len(calls) == 1
754
+
755
+ def test_retries_through_transient_lock_then_succeeds(
756
+ self, monkeypatch: pytest.MonkeyPatch
757
+ ) -> None:
758
+ sleeps: list[float] = []
759
+ monkeypatch.setattr(db_mod.time, "sleep", lambda s: sleeps.append(s))
760
+
761
+ attempts = {"n": 0}
762
+
763
+ def _write() -> str:
764
+ attempts["n"] += 1
765
+ if attempts["n"] < 3:
766
+ raise sqlite3.OperationalError("database is locked")
767
+ return "ok"
768
+
769
+ result = retry_on_locked(_write)
770
+
771
+ assert result == "ok"
772
+ assert attempts["n"] == 3
773
+ # Two collisions before the third, successful attempt — backed off
774
+ # (each wait longer than the last), never a busy-loop.
775
+ assert len(sleeps) == 2
776
+ assert sleeps[1] > sleeps[0]
777
+
778
+ def test_raises_after_exhausting_the_retry_budget(
779
+ self, monkeypatch: pytest.MonkeyPatch
780
+ ) -> None:
781
+ monkeypatch.setattr(db_mod.time, "sleep", lambda s: None)
782
+
783
+ def _write() -> None:
784
+ raise sqlite3.OperationalError("database is locked")
785
+
786
+ with pytest.raises(sqlite3.OperationalError, match="database is locked"):
787
+ retry_on_locked(_write, attempts=3, base_delay=0.0)
788
+
789
+ def test_unrelated_operational_error_is_not_retried(self) -> None:
790
+ """A schema/statement bug is a real failure, not transient
791
+ contention — it must surface on the very first attempt rather than
792
+ being retried (and delayed) as if it were lock contention."""
793
+ calls = []
794
+
795
+ def _write() -> None:
796
+ calls.append(1)
797
+ raise sqlite3.OperationalError("no such table: bogus")
798
+
799
+ with pytest.raises(sqlite3.OperationalError, match="no such table"):
800
+ retry_on_locked(_write)
801
+
802
+ assert len(calls) == 1
803
+
804
+
727
805
  # ── override_connection ────────────────────────────────────────────────────────
728
806
 
729
807
  class TestOverrideConnection: