code-coordinator 0.5.326__tar.gz → 0.5.327__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 (822) hide show
  1. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/dao.py +11 -1
  5. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/db.py +132 -1
  6. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/merge_queue.py +14 -2
  7. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/state.py +44 -7
  8. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dao.py +82 -0
  9. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_db.py +403 -33
  10. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_merge_queue.py +95 -0
  11. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_state.py +143 -0
  12. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.github/workflows/publish.yml +0 -0
  23. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.github/workflows/test.yml +0 -0
  24. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/.gitignore +0 -0
  25. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/CLAUDE.md +0 -0
  26. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/GOAL.md +0 -0
  27. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/LICENSE +0 -0
  28. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/MANIFEST.in +0 -0
  29. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/README.md +0 -0
  30. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/code_coordinator.egg-info/SOURCES.txt +0 -0
  31. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/code_coordinator.egg-info/scm_file_list.json +0 -0
  35. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/code_coordinator.egg-info/top_level.txt +0 -0
  36. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/__init__.py +0 -0
  37. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/_board_mapping.py +0 -0
  38. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/acceptance.py +0 -0
  39. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/acceptance_drivers.py +0 -0
  40. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/agent.py +0 -0
  41. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/agent_app.py +0 -0
  42. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/agent_update.py +0 -0
  43. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/agents/opencode/.gitignore +0 -0
  44. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/agents/opencode/agents/work.md +0 -0
  45. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/agents/opencode/routing.jsonc +0 -0
  46. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/approved_work.py +0 -0
  47. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/audit.py +0 -0
  48. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/auto_loop.py +0 -0
  49. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/block_log.py +0 -0
  50. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/board_schema.py +0 -0
  51. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/cargo_cache.py +0 -0
  57. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/ci_fix.py +0 -0
  58. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/ci_gitlab.py +0 -0
  60. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/ci_store.py +0 -0
  61. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/claim.py +0 -0
  62. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/cli.py +0 -0
  63. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/client.py +0 -0
  64. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/chat.py +0 -0
  70. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/dispatch.py +0 -0
  71. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/dispatch_workers.py +0 -0
  72. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/drive.py +0 -0
  73. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/drive_queue.py +0 -0
  74. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/gate_a.py +0 -0
  75. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/gates.py +0 -0
  76. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/issues.py +0 -0
  77. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/lifecycle.py +0 -0
  78. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/machine.py +0 -0
  79. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/merge.py +0 -0
  80. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/portal.py +0 -0
  84. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/pr.py +0 -0
  85. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/release.py +0 -0
  86. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/repo.py +0 -0
  87. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/report.py +0 -0
  88. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/review.py +0 -0
  89. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/scorecard.py +0 -0
  90. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/sessions.py +0 -0
  91. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/setup.py +0 -0
  92. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/status.py +0 -0
  93. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/store_migrate.py +0 -0
  94. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/terminal.py +0 -0
  95. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/test_gate.py +0 -0
  96. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/commands/tui.py +0 -0
  97. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/comments.py +0 -0
  98. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/config.py +0 -0
  99. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/config_reload.py +0 -0
  100. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/confirm_test.py +0 -0
  101. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/conflict_fix.py +0 -0
  102. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/dashboard/__init__.py +0 -0
  103. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/dashboard/fixture.py +0 -0
  104. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/dashboard/index.html +0 -0
  105. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/dashboard/server.py +0 -0
  106. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/dashboard/terminal.py +0 -0
  107. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/dead_end.py +0 -0
  108. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/decomposition_chat.py +0 -0
  109. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/README.md +0 -0
  110. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-agent.service +0 -0
  111. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-db-backup.service +0 -0
  112. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-db-backup.sh +0 -0
  113. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-db-backup.timer +0 -0
  114. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-drive-queue.service +0 -0
  115. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-drive-queue.timer +0 -0
  116. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-failure-notify.service +0 -0
  117. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-fleet-watchdog.service +0 -0
  118. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  119. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-notify.service +0 -0
  120. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-notify.timer +0 -0
  121. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-release-propagate.service +0 -0
  122. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-release-propagate.timer +0 -0
  123. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-release-window.service +0 -0
  124. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-release-window.timer +0 -0
  125. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-serve.service +0 -0
  126. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-web-dist-build.service +0 -0
  127. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-web-dist-build.timer +0 -0
  128. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy/coord-web.service +0 -0
  129. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy_manifest.py +0 -0
  130. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deploy_units.py +0 -0
  131. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deprecation_telemetry.py +0 -0
  132. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/deps.py +0 -0
  133. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/diagnose.py +0 -0
  134. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/dispatch.py +0 -0
  135. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/dist_name.py +0 -0
  136. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/drive.py +0 -0
  137. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/drive_queue.py +0 -0
  138. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/drive_state.py +0 -0
  139. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/events.py +0 -0
  140. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/failure_class.py +0 -0
  141. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/filelock.py +0 -0
  142. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/fleet_config_health.py +0 -0
  143. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/forge_availability.py +0 -0
  144. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/freshness.py +0 -0
  145. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/gate_a.py +0 -0
  146. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/gate_b.py +0 -0
  147. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/gate_snapshot.py +0 -0
  148. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/gates.py +0 -0
  149. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/github_ops.py +0 -0
  150. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/github_throttle.py +0 -0
  151. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/goal.py +0 -0
  152. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/graph_health.py +0 -0
  153. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/__init__.py +0 -0
  154. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/aggregate.py +0 -0
  155. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/__init__.py +0 -0
  156. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/_ci_pin.py +0 -0
  157. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/agent_install.py +0 -0
  158. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/cargo_targets.py +0 -0
  159. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/claude_binary.py +0 -0
  160. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  161. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/coord_web_ci_pin.py +0 -0
  162. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/deploy_lane_facts.py +0 -0
  163. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/disk.py +0 -0
  164. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/fleet_board.py +0 -0
  165. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  166. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/fleet_phantom.py +0 -0
  167. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/fleet_unit_drift.py +0 -0
  168. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/graph.py +0 -0
  169. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/graphify_cli.py +0 -0
  170. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/index_lock.py +0 -0
  171. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/issues_sync_staleness.py +0 -0
  172. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/plan_usage.py +0 -0
  173. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/release_cordon.py +0 -0
  174. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/repo_state.py +0 -0
  175. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/spawned_coord.py +0 -0
  176. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/stalled_pipeline.py +0 -0
  177. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/timer_active.py +0 -0
  178. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/toolchain.py +0 -0
  179. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/unit_drift.py +0 -0
  180. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/unit_enablement.py +0 -0
  181. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/wedged_drive_queue.py +0 -0
  182. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/checks/worktrees.py +0 -0
  183. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/cli.py +0 -0
  184. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/context.py +0 -0
  185. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/fleet_snapshot.py +0 -0
  186. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/models.py +0 -0
  187. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/pypi.py +0 -0
  188. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/registry.py +0 -0
  189. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/render.py +0 -0
  190. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/health/units.py +0 -0
  191. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/hooks.py +0 -0
  192. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/housekeeping.py +0 -0
  193. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/interactive.py +0 -0
  194. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/issue_store.py +0 -0
  195. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/issues_sync_status.py +0 -0
  196. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/liveness_auditor.py +0 -0
  197. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/machine_onboard.py +0 -0
  198. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/machine_pause.py +0 -0
  199. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/milestone_chat.py +0 -0
  200. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/milestone_dispatch.py +0 -0
  201. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/milestone_gate.py +0 -0
  202. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/milestone_order.py +0 -0
  203. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/mock_author.py +0 -0
  204. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/models.py +0 -0
  205. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/network.py +0 -0
  206. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/new_issue_chat.py +0 -0
  207. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/__init__.py +0 -0
  208. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/baseline.py +0 -0
  209. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/cli.py +0 -0
  210. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/collect.py +0 -0
  211. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/digest.py +0 -0
  212. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/models.py +0 -0
  213. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/predicate.py +0 -0
  214. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/service.py +0 -0
  215. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/store.py +0 -0
  216. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notifier/transport.py +0 -0
  217. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/notify.py +0 -0
  218. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/openapi.py +0 -0
  219. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/overlap_fence.py +0 -0
  220. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/overlap_predict.py +0 -0
  221. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/parentage.py +0 -0
  222. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/parentage_github.py +0 -0
  223. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/pipeline.py +0 -0
  224. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/plan_parser.py +0 -0
  225. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/plans.py +0 -0
  226. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/platform_paths.py +0 -0
  227. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/portal_bridge.py +0 -0
  228. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/portal_store.py +0 -0
  229. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/portal_sync.py +0 -0
  230. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/pr_body_lint.py +0 -0
  231. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/prereqs.py +0 -0
  232. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/progress.py +0 -0
  233. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/providers/__init__.py +0 -0
  234. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/providers/base.py +0 -0
  235. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/providers/claude.py +0 -0
  236. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/providers/claude_pty.py +0 -0
  237. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/providers/opencode.py +0 -0
  238. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/queue_diagnose.py +0 -0
  239. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/reconcile.py +0 -0
  240. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/reconcile_tick.py +0 -0
  241. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/refine_chat.py +0 -0
  242. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/release_cordon.py +0 -0
  243. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/release_propagate.py +0 -0
  244. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/release_verify.py +0 -0
  245. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/release_window.py +0 -0
  246. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/repo_dormancy.py +0 -0
  247. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/repo_edit.py +0 -0
  248. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/repo_onboard.py +0 -0
  249. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/reports.py +0 -0
  250. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/rest_schema.py +0 -0
  251. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/revalidate.py +0 -0
  252. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/review.py +0 -0
  253. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/scorecard.py +0 -0
  254. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/self_health.py +0 -0
  255. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/serve_app.py +0 -0
  256. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  257. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  258. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  259. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  261. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/portal-followup/SKILL.md +0 -0
  262. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/release-now/SKILL.md +0 -0
  263. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  264. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  265. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/skills/update-issue/SKILL.md +0 -0
  266. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/smoke.py +0 -0
  267. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/spend_ceiling.py +0 -0
  268. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/split_work.py +0 -0
  269. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/sql.py +0 -0
  270. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/stage_projection.py +0 -0
  271. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/store_migrate.py +0 -0
  272. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/test_author.py +0 -0
  273. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/test_chat.py +0 -0
  274. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/test_orchestrator.py +0 -0
  275. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/test_report.py +0 -0
  276. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/tui_release.py +0 -0
  277. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/usage.py +0 -0
  278. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/usage_limits.py +0 -0
  279. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/usage_rollup.py +0 -0
  280. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coord/worker_events.py +0 -0
  281. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/coordinator.example.yml +0 -0
  282. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-agent.service +0 -0
  283. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-db-backup.service +0 -0
  284. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-db-backup.sh +0 -0
  285. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-db-backup.timer +0 -0
  286. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-drive-queue.service +0 -0
  287. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-drive-queue.timer +0 -0
  288. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-failure-notify.service +0 -0
  289. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-failure-notify.sh +0 -0
  290. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-fleet-watchdog.service +0 -0
  291. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-fleet-watchdog.timer +0 -0
  292. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-notify.service +0 -0
  293. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-notify.timer +0 -0
  294. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-release-propagate.service +0 -0
  295. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-release-propagate.timer +0 -0
  296. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-release-window.service +0 -0
  297. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-release-window.timer +0 -0
  298. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-serve.service +0 -0
  299. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-web-dist-build.service +0 -0
  300. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-web-dist-build.sh +0 -0
  301. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-web-dist-build.timer +0 -0
  302. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-web-rollback.sh +0 -0
  303. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/coord-web.service +0 -0
  304. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/deploy/node-shim.sh +0 -0
  305. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/ADR_COORD_TUI_CI.md +0 -0
  306. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  307. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/ADR_COORD_WEB_CI.md +0 -0
  308. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/ADR_COORD_WEB_DIST.md +0 -0
  309. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  310. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/AGENT_OPERATIONS.md +0 -0
  311. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/ARCHITECTURE.md +0 -0
  312. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/ARCH_SECURITY_GATES.md +0 -0
  313. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/COCKPIT.md +0 -0
  314. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/CONTROL_CENTER.md +0 -0
  315. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/COST_DISCIPLINE.md +0 -0
  316. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/CROSS_PLATFORM.md +0 -0
  317. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/CUSTOMER_FACING_APPS.md +0 -0
  318. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/CUSTOMER_PORTAL.md +0 -0
  319. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/DRIVE_QUEUE.md +0 -0
  320. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/EPHEMERAL_WORKERS.md +0 -0
  321. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/FORGE_MIGRATION.md +0 -0
  322. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/GRAPHIFY_SETUP.md +0 -0
  323. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/ISSUE_GUIDANCE.md +0 -0
  324. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/MAC_MINI.md +0 -0
  325. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  326. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/NOTIFIER.md +0 -0
  327. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/OPENCODE_VERIFICATION.md +0 -0
  328. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/OPERATING_GOTCHAS.md +0 -0
  329. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/OPERATOR_GUIDES.md +0 -0
  330. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/ORACLE_LOOP.md +0 -0
  331. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/PHONE_WEBAPP.md +0 -0
  332. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/PIPELINE_V2.md +0 -0
  333. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/PLATFORM_EVOLUTION.md +0 -0
  334. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/SECOND_BACKEND.md +0 -0
  335. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/STORE_SERVICE.md +0 -0
  336. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  337. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/WEB_CONTROL_CENTER.md +0 -0
  338. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/WSL_WINDOWS_WORKER.md +0 -0
  339. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/mocks/web/README.md +0 -0
  340. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/mocks/web/_tokens.css +0 -0
  341. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/mocks/web/issue-detail.html +0 -0
  342. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/mocks/web/pipeline-narrow.html +0 -0
  343. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/docs/mocks/web/pipeline-wide.html +0 -0
  344. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/graphify-out/.gitignore +0 -0
  345. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/install-agent.sh +0 -0
  346. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/pyproject.toml +0 -0
  347. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/audit_review_verdict_overrides.py +0 -0
  348. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  349. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/build-worker-image.sh +0 -0
  350. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/coordinator-machine.py +0 -0
  351. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/epic-down.sh +0 -0
  352. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/epic-up.sh +0 -0
  353. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/preflight.sh +0 -0
  354. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/provision-worker.sh +0 -0
  355. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  356. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  357. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/azure-workers/verify-github-token.sh +0 -0
  358. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/check_gh_argv_containment.py +0 -0
  359. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/codegen.py +0 -0
  360. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/coord-test-runner.sh +0 -0
  361. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  362. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  363. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  364. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  365. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/coord-venv-rollback.sh +0 -0
  366. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/drive-batch.sh +0 -0
  367. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/extract-coord-tui.sh +0 -0
  368. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/fleet_watchdog.py +0 -0
  369. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/gen_board_fixture.py +0 -0
  370. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/gen_mock_index.py +0 -0
  371. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/next_release_tag.py +0 -0
  372. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/run_tests_in_populated_home.sh +0 -0
  373. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/run_tests_without_gh.sh +0 -0
  374. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/smoke_437_interactive.py +0 -0
  375. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/verify_878_review_capture.py +0 -0
  376. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/verify_release_published.py +0 -0
  377. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/scripts/verify_release_wheel.py +0 -0
  378. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/setup.cfg +0 -0
  379. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/SMOKE_SET.md +0 -0
  380. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/__init__.py +0 -0
  381. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-37/conftest.py +0 -0
  382. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-37/contract.md +0 -0
  383. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-37/manifest.yml +0 -0
  384. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  385. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  386. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-51/contract.md +0 -0
  387. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  388. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  389. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-51/manifest.yml +0 -0
  390. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  391. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-51/tsconfig.json +0 -0
  392. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  393. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/backends.py +0 -0
  394. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/conftest.py +0 -0
  395. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/board-pipeline-basic.json +0 -0
  396. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  397. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  398. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  399. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  400. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/playwright/all_pass.json +0 -0
  401. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  402. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/playwright/mixed_fail.json +0 -0
  403. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  404. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  405. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/playwright/skip.json +0 -0
  406. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/playwright/truncated.json +0 -0
  407. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  408. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  409. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  410. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  411. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  412. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  413. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  414. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  415. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_acceptance.py +0 -0
  416. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_acceptance_drivers.py +0 -0
  417. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent.py +0 -0
  418. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_api_error.py +0 -0
  419. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_app.py +0 -0
  420. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_branch_base.py +0 -0
  421. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_branch_capture.py +0 -0
  422. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_config_free_1712.py +0 -0
  423. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_deploy_units_endpoint.py +0 -0
  424. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_dirty_worktree.py +0 -0
  425. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  426. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_graph_self_heal.py +0 -0
  427. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_health_h3.py +0 -0
  428. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_idle_restart.py +0 -0
  429. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_push_failure.py +0 -0
  430. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_reap.py +0 -0
  431. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_repos_and_pull.py +0 -0
  432. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_restart_services_endpoint.py +0 -0
  433. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_skills_self_heal.py +0 -0
  434. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_startup_diagnostics.py +0 -0
  435. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_update.py +0 -0
  436. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_update_bluegreen.py +0 -0
  437. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_usage_limit.py +0 -0
  438. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_agent_zero_commit.py +0 -0
  439. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_ambient_home_isolation.py +0 -0
  440. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_approve_dependency_busy_2804.py +0 -0
  441. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_approve_reject_plan.py +0 -0
  442. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_approve_usage_gate.py +0 -0
  443. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_approved_work_2532.py +0 -0
  444. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_approved_work_2996.py +0 -0
  445. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_assignment_already_recorded_daemon.py +0 -0
  446. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_audit_log.py +0 -0
  447. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_audit_outcome.py +0 -0
  448. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_audit_query.py +0 -0
  449. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_auto_loop.py +0 -0
  450. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_auto_release_publish_2035.py +0 -0
  451. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_backend_selection.py +0 -0
  452. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_base_checkout_restore.py +0 -0
  453. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_block_log.py +0 -0
  454. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_board_cap_762.py +0 -0
  455. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_board_fixture.py +0 -0
  456. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_board_read_path.py +0 -0
  457. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_board_schema.py +0 -0
  458. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_board_service.py +0 -0
  459. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_board_state.py +0 -0
  460. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_board_wire.py +0 -0
  461. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_brain.py +0 -0
  462. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_branch_model.py +0 -0
  463. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_bug_intake.py +0 -0
  464. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_build_worker_image_env_update.py +0 -0
  465. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cargo_cache.py +0 -0
  466. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_check_gh_argv_containment.py +0 -0
  467. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_ci_acceptance_gate_1950.py +0 -0
  468. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_ci_fix.py +0 -0
  469. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_ci_gitlab.py +0 -0
  470. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_ci_parity_2091.py +0 -0
  471. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_ci_store.py +0 -0
  472. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_claim.py +0 -0
  473. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_claude_md_budget.py +0 -0
  474. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_acceptance.py +0 -0
  475. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_assign.py +0 -0
  476. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  477. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_assign_interactive_remote.py +0 -0
  478. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_assign_provider.py +0 -0
  479. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  480. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_audit.py +0 -0
  481. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_chat_continue.py +0 -0
  482. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_decide.py +0 -0
  483. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_diagnose_capability_rules.py +0 -0
  484. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_diagnose_config_provenance.py +0 -0
  485. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_diagnose_forge_availability.py +0 -0
  486. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_diagnose_graph.py +0 -0
  487. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_diagnose_self.py +0 -0
  488. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_diagnose_test_coverage.py +0 -0
  489. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_doctor.py +0 -0
  490. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_doctor_config_free_1801.py +0 -0
  491. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  492. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_drive.py +0 -0
  493. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_drive_queue.py +0 -0
  494. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_escalate.py +0 -0
  495. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_fix_headless_review.py +0 -0
  496. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_gate_a.py +0 -0
  497. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_install_drift.py +0 -0
  498. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_install_skills.py +0 -0
  499. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_issue_comment.py +0 -0
  500. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_issue_create_label.py +0 -0
  501. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_issue_reopen.py +0 -0
  502. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_issue_view_list.py +0 -0
  503. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_merge.py +0 -0
  504. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_milestone_assign.py +0 -0
  505. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_milestone_capture.py +0 -0
  506. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_milestone_chat_add_child.py +0 -0
  507. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_milestone_dispatch.py +0 -0
  508. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_milestone_gate_b.py +0 -0
  509. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_milestone_gate_c.py +0 -0
  510. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_milestone_order.py +0 -0
  511. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  512. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_milestone_ship.py +0 -0
  513. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_network.py +0 -0
  514. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_new_issue_chat.py +0 -0
  515. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_plans.py +0 -0
  516. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_portal.py +0 -0
  517. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_pr.py +0 -0
  518. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_pull_artifact.py +0 -0
  519. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_queue.py +0 -0
  520. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_reattach_sessions.py +0 -0
  521. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_refine_board.py +0 -0
  522. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_release_preflight.py +0 -0
  523. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_release_propagate.py +0 -0
  524. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_release_window.py +0 -0
  525. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_repo_2220.py +0 -0
  526. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  527. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_scorecard.py +0 -0
  528. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_set_review_findings.py +0 -0
  529. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_status_advisory_terminal.py +0 -0
  530. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_status_contested_tag.py +0 -0
  531. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_status_merge_queue.py +0 -0
  532. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_status_provider.py +0 -0
  533. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_status_review_finalizing.py +0 -0
  534. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_status_test_failed_tag.py +0 -0
  535. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_status_usage_limit.py +0 -0
  536. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_sync_comments_873.py +0 -0
  537. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_test_plan.py +0 -0
  538. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_track.py +0 -0
  539. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_tui_update.py +0 -0
  540. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cli_wait.py +0 -0
  541. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_client_base_install.py +0 -0
  542. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_client_resource_migration_1946.py +0 -0
  543. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_commands_common.py +0 -0
  544. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_comments.py +0 -0
  545. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_completion_summary.py +0 -0
  546. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_config.py +0 -0
  547. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_config_acceptance.py +0 -0
  548. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_config_audit.py +0 -0
  549. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_config_pricing.py +0 -0
  550. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  551. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_config_usage_gate.py +0 -0
  552. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_confirm_test.py +0 -0
  553. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_conflict_fix.py +0 -0
  554. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_conflict_fix_semantic.py +0 -0
  555. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  556. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coord_test.py +0 -0
  557. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  558. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coord_test_runner_baseline.py +0 -0
  559. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coord_test_runner_populated_home.py +0 -0
  560. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coord_test_runner_routing.py +0 -0
  561. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coord_test_runner_toolchain.py +0 -0
  562. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coord_uat.py +0 -0
  563. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coord_web_sse_restart_live.py +0 -0
  564. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_coordinator_machine.py +0 -0
  565. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_cross_platform_imports.py +0 -0
  566. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dashboard.py +0 -0
  567. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dashboard_api.py +0 -0
  568. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dashboard_fixture.py +0 -0
  569. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dashboard_terminal.py +0 -0
  570. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dashboard_terminal_live.py +0 -0
  571. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dead_end.py +0 -0
  572. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_decomposition_chat.py +0 -0
  573. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deploy_coord_db_backup.py +0 -0
  574. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deploy_coord_web_dist.py +0 -0
  575. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deploy_coord_web_rollback.py +0 -0
  576. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deploy_drive_queue_unit.py +0 -0
  577. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deploy_failure_notify_unit.py +0 -0
  578. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deploy_manifest.py +0 -0
  579. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deploy_notify_unit.py +0 -0
  580. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deploy_units_lane.py +0 -0
  581. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deploy_web_unit.py +0 -0
  582. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deprecation_telemetry.py +0 -0
  583. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_deps.py +0 -0
  584. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_diagnose.py +0 -0
  585. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dispatch.py +0 -0
  586. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dispatch_target_validation.py +0 -0
  587. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_dist_name.py +0 -0
  588. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_done_housekeeping.py +0 -0
  589. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_drive.py +0 -0
  590. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_drive_queue.py +0 -0
  591. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_drive_queue_blocked_rendering.py +0 -0
  592. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_drive_queue_launch_argv.py +0 -0
  593. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  594. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_drive_queue_roll_pending.py +0 -0
  595. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  596. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_drive_state.py +0 -0
  597. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_drive_tmux.py +0 -0
  598. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_epic_up_capability_detection.py +0 -0
  599. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  600. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_epic_up_image_provenance.py +0 -0
  601. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_errors.py +0 -0
  602. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_events.py +0 -0
  603. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_failure_class.py +0 -0
  604. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_filelock.py +0 -0
  605. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  606. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_fix_of_force_override.py +0 -0
  607. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_fleet_config_health.py +0 -0
  608. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_fleet_health_probes.py +0 -0
  609. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_fleet_health_snapshot.py +0 -0
  610. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_fleet_watchdog.py +0 -0
  611. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_forge_availability.py +0 -0
  612. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_freshness.py +0 -0
  613. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_gate_a.py +0 -0
  614. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_gate_b.py +0 -0
  615. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_gate_snapshot_staleness.py +0 -0
  616. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_gates.py +0 -0
  617. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  618. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_gen_mock_index.py +0 -0
  619. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_generated_rust_fixture.py +0 -0
  620. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_generated_rust_requests.py +0 -0
  621. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_generated_types_fixture.py +0 -0
  622. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_github_ops.py +0 -0
  623. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_github_throttle.py +0 -0
  624. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_goal.py +0 -0
  625. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_graph_health.py +0 -0
  626. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_graph_selfheal_absent_2237.py +0 -0
  627. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_handoff.py +0 -0
  628. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_checks.py +0 -0
  629. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_cli.py +0 -0
  630. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_cli_graph.py +0 -0
  631. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_config.py +0 -0
  632. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_context.py +0 -0
  633. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_coord_tui_ci_pin.py +0 -0
  634. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_coord_web_ci_pin.py +0 -0
  635. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_deploy_lane_facts.py +0 -0
  636. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_fix.py +0 -0
  637. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_incident_regression.py +0 -0
  638. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_issues_sync_staleness.py +0 -0
  639. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_pypi.py +0 -0
  640. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_registry.py +0 -0
  641. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_release_cordon_probe.py +0 -0
  642. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_timer_active.py +0 -0
  643. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_toolchain.py +0 -0
  644. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_unit_drift.py +0 -0
  645. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_unit_enablement.py +0 -0
  646. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_health_wedged_drive_queue.py +0 -0
  647. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_hooks.py +0 -0
  648. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_human_attended_437.py +0 -0
  649. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_init.py +0 -0
  650. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_install_agent_venv_2911.py +0 -0
  651. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_integration.py +0 -0
  652. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_interactive_briefing_echo.py +0 -0
  653. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_interactive_pane_log_2541.py +0 -0
  654. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_interactive_prefill_state.py +0 -0
  655. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_interactive_session_relaunch.py +0 -0
  656. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_interactive_test_verdict_backstop.py +0 -0
  657. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_interactive_token_attribution.py +0 -0
  658. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_interactive_worktree.py +0 -0
  659. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_issue_store_seam.py +0 -0
  660. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_issues_sync_status.py +0 -0
  661. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_liveness_auditor.py +0 -0
  662. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_liveness_notify.py +0 -0
  663. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_lock_contention_ratchet.py +0 -0
  664. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_machine_onboard.py +0 -0
  665. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_machine_pause.py +0 -0
  666. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_merge_verify.py +0 -0
  667. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_milestone_chat.py +0 -0
  668. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_milestone_dispatch.py +0 -0
  669. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_milestone_gate.py +0 -0
  670. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_milestone_order.py +0 -0
  671. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_milestone_seam.py +0 -0
  672. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_mock_author.py +0 -0
  673. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_model_tiering.py +0 -0
  674. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_models.py +0 -0
  675. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_models_config_labels.py +0 -0
  676. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_needs_attention.py +0 -0
  677. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_network.py +0 -0
  678. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_new_issue_chat.py +0 -0
  679. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_next_release_tag.py +0 -0
  680. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_node_shim.py +0 -0
  681. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notifier_baseline.py +0 -0
  682. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notifier_cli.py +0 -0
  683. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notifier_collect.py +0 -0
  684. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notifier_config.py +0 -0
  685. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notifier_drive_seam.py +0 -0
  686. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notifier_isolation.py +0 -0
  687. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notifier_predicate.py +0 -0
  688. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notifier_quiet_hours.py +0 -0
  689. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notifier_service.py +0 -0
  690. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notify.py +0 -0
  691. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_notify_drain.py +0 -0
  692. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_openapi.py +0 -0
  693. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_operational_defaults.py +0 -0
  694. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_overlap_fence.py +0 -0
  695. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_overlap_predict.py +0 -0
  696. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_packaged_deploy_units.py +0 -0
  697. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_parentage.py +0 -0
  698. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_paste_landed.py +0 -0
  699. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  700. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_pipeline.py +0 -0
  701. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_plan_followup_approve_plan_command.py +0 -0
  702. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_plan_followup_pr_command.py +0 -0
  703. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_plan_followup_review_command.py +0 -0
  704. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_plan_only.py +0 -0
  705. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_plan_parser.py +0 -0
  706. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_platform_paths.py +0 -0
  707. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_portal_bridge.py +0 -0
  708. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_portal_config.py +0 -0
  709. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_portal_store.py +0 -0
  710. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_portal_sync.py +0 -0
  711. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_pr_body_lint.py +0 -0
  712. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_prereqs.py +0 -0
  713. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_production_db_guard.py +0 -0
  714. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_progress.py +0 -0
  715. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_provider_seam.py +0 -0
  716. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_providers.py +0 -0
  717. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_providers_config_labels.py +0 -0
  718. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_providers_pty.py +0 -0
  719. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_py_rust_mirror_inventory.py +0 -0
  720. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_quiet_hours.py +0 -0
  721. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_quiet_hours_store_2146.py +0 -0
  722. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reap_merged_sessions.py +0 -0
  723. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reap_stale_interactive_tick.py +0 -0
  724. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reconcile.py +0 -0
  725. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reconcile_branch.py +0 -0
  726. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reconcile_completions.py +0 -0
  727. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  728. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reconcile_merges.py +0 -0
  729. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reconcile_no_agent_record.py +0 -0
  730. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reconcile_tick.py +0 -0
  731. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reconcile_usage_limit_done.py +0 -0
  732. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_refine_chat.py +0 -0
  733. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_cordon_2101.py +0 -0
  734. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  735. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_cordon_deadlock_2240.py +0 -0
  736. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_cordon_stuck_2490.py +0 -0
  737. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_propagate.py +0 -0
  738. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_propagate_threshold.py +0 -0
  739. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_roll_between_legs_2854.py +0 -0
  740. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_roll_window_handoff.py +0 -0
  741. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_unified_1242.py +0 -0
  742. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_verify.py +0 -0
  743. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_release_window.py +0 -0
  744. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_remote_auto_prune.py +0 -0
  745. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_remote_interactive_reaper.py +0 -0
  746. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_repo_add.py +0 -0
  747. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_repo_dormancy.py +0 -0
  748. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_repo_edit_2220.py +0 -0
  749. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_repo_graph_fleet_2237.py +0 -0
  750. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_repo_onboard_2220.py +0 -0
  751. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_report_result_push.py +0 -0
  752. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_reports.py +0 -0
  753. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_retry.py +0 -0
  754. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_retry_advisory_1606.py +0 -0
  755. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_retry_type_1636.py +0 -0
  756. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_revalidate.py +0 -0
  757. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_review.py +0 -0
  758. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_review_end_review_without_verdict.py +0 -0
  759. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_review_parse_failure_diagnostic.py +0 -0
  760. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_review_reaffirm.py +0 -0
  761. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_review_state.py +0 -0
  762. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_review_verdict_backstop.py +0 -0
  763. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_review_verdict_override_audit.py +0 -0
  764. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_review_verdict_relay.py +0 -0
  765. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_review_zero_commits.py +0 -0
  766. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_scoped_review_wiring.py +0 -0
  767. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_scorecard.py +0 -0
  768. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_self_health.py +0 -0
  769. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_serve.py +0 -0
  770. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_serve_app_board_trim.py +0 -0
  771. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_serve_rest_routes.py +0 -0
  772. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_session.py +0 -0
  773. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_slice_issue_attribution.py +0 -0
  774. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_smoke.py +0 -0
  775. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_smoke_live_checkout_restore.py +0 -0
  776. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_smoke_workflow.py +0 -0
  777. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_spend_ceiling.py +0 -0
  778. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_spend_ceiling_coordinator.py +0 -0
  779. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_split.py +0 -0
  780. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_split_work.py +0 -0
  781. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_sql_dialect.py +0 -0
  782. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_sqlite_connect_ratchet.py +0 -0
  783. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_stage_projection.py +0 -0
  784. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_stale_busy_reviewer_697.py +0 -0
  785. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_stalled_pipeline.py +0 -0
  786. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_state_review_findings_daemon.py +0 -0
  787. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_status_fleet_footer.py +0 -0
  788. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_stop_1567.py +0 -0
  789. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_store_contract.py +0 -0
  790. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_store_migrate.py +0 -0
  791. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_stuck.py +0 -0
  792. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  793. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_terminal_command.py +0 -0
  794. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_test_author.py +0 -0
  795. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_test_chat.py +0 -0
  796. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_test_orchestrator.py +0 -0
  797. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_test_report.py +0 -0
  798. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_test_verdict_parsing.py +0 -0
  799. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_test_verdict_transcript_floor.py +0 -0
  800. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_text_io_encoding_audit.py +0 -0
  801. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_thin_client_board_audit.py +0 -0
  802. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_thin_client_config_load_1080.py +0 -0
  803. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_thin_client_daemon_routing_906.py +0 -0
  804. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_tmux_host.py +0 -0
  805. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_tmux_session.py +0 -0
  806. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_transcript_floor.py +0 -0
  807. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_usage.py +0 -0
  808. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_usage_limits.py +0 -0
  809. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_usage_rollup.py +0 -0
  810. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_venv_live_install_2121.py +0 -0
  811. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_version_single_source.py +0 -0
  812. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_watch.py +0 -0
  813. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  814. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_worker_env_venv_isolation.py +0 -0
  815. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_worker_events.py +0 -0
  816. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_worker_image_pin_sync.py +0 -0
  817. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_worker_safety.py +0 -0
  818. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_worker_test_scoping.py +0 -0
  819. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_worktree.py +0 -0
  820. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  821. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/test_write_parity.py +0 -0
  822. {code_coordinator-0.5.326 → code_coordinator-0.5.327}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.326
3
+ Version: 0.5.327
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.326
3
+ Version: 0.5.327
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.326",
2
+ "tag": "0.5.327",
3
3
  "distance": 0,
4
- "node": "g4f5acb0a5caf92650d4867c894085c97109eebc7",
4
+ "node": "g33af929d66cfc03789a677518e08ff5c0b6d4000",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -393,6 +393,15 @@ class SqliteStore:
393
393
  forward-compatible stand-in the issue asks for (#1039 can replace the
394
394
  semantics without a wire-shape change — it's still one integer).
395
395
  Fail-open to 0 so a missing/pre-migration table never 503s the board.
396
+
397
+ #2983: that fail-open needs a rollback to actually be fail-open on
398
+ Postgres. This runs inside a caller's ``with closing(self._connect())``
399
+ block alongside many other reads (``_board_meta``, ``_round_number``,
400
+ every ``_table`` call in ``board_projection``), and Postgres aborts the
401
+ whole transaction on a failed statement — so a missing ``audit_log``
402
+ took out every *sibling* read on that connection too, producing
403
+ precisely the 503 this guard exists to prevent. Nothing uncommitted
404
+ can be lost: ``SqliteStore``'s connections are opened read-only.
396
405
  """
397
406
  try:
398
407
  cutoff = time.time() - _AUDIT_RECENT_WINDOW_SECONDS
@@ -400,7 +409,8 @@ class SqliteStore:
400
409
  conn, "SELECT COUNT(*) AS n FROM audit_log WHERE ts >= ?", (cutoff,)
401
410
  ).fetchone()
402
411
  return int(row["n"]) if row else 0
403
- except sql.driver_error(conn):
412
+ except sql.driver_error(conn) as exc:
413
+ db_mod.rollback_after_driver_error(conn, exc) # #2983: caller reuses `conn`
404
414
  return 0
405
415
 
406
416
  # ── public reads ────────────────────────────────────────────────────────────
@@ -429,6 +429,79 @@ def close() -> None:
429
429
 
430
430
  _T = TypeVar("_T")
431
431
 
432
+
433
+ # ── Recovering a connection after a swallowed driver error (#2983) ──────────
434
+
435
+
436
+ def _board_connection_if_open() -> Any | None:
437
+ """This process's already-open board connection, or ``None`` (#2983).
438
+
439
+ Deliberately NOT :func:`get_connection`: this is called from inside a
440
+ driver-error handler, where *opening* a connection that wasn't open
441
+ before would be a surprising side effect (and, on the SQLite path,
442
+ would create the database file). It only ever hands back a connection
443
+ something else already opened — the ``override_connection()``/SQLite
444
+ singleton, else THIS thread's Postgres connection, mirroring
445
+ :func:`get_connection`'s own precedence order.
446
+ """
447
+ if _conn is not None:
448
+ return _conn
449
+ return getattr(_pg_thread_local, "conn", None)
450
+
451
+
452
+ def rollback_after_driver_error(conn: Any | None, exc: BaseException) -> None:
453
+ """Clear the aborted transaction *exc* left behind on *conn*, so a
454
+ handler that swallowed *exc* and keeps using the same connection still
455
+ has a usable one (#2983).
456
+
457
+ **The rule this implements.** After catching a driver error through the
458
+ dialect seam (``except sql.driver_error(conn):`` /
459
+ ``except sql.driver_errors():``), a handler that intends to CONTINUE on
460
+ the same connection must roll back first. A handler that re-raises need
461
+ not. Postgres aborts the *whole* transaction on any failed statement,
462
+ so without this every statement issued afterwards on that connection —
463
+ for the rest of the process, since ``coord.db``'s connection is a
464
+ process-/thread-lived singleton — raises
465
+ ``psycopg.errors.InFailedSqlTransaction``. That is what made the whole
466
+ #2597/#2689/#2784 degrade-gracefully layer inert or actively harmful on
467
+ the second backend: guards written to *prevent* a crash caused one.
468
+ SQLite has no such concept — a failed statement there leaves the
469
+ connection perfectly usable — which is exactly why every one of these
470
+ 21 handler sites read as correct for years.
471
+
472
+ **Gated on the exception, not on the connection's dialect.** *exc* is a
473
+ Postgres driver error iff it carries a SQLSTATE (``psycopg3``'s
474
+ ``.sqlstate``, ``psycopg2``'s ``.pgcode`` — the same pair
475
+ :func:`is_lock_contention_error` dispatches on, for the same #2719
476
+ reason: no config flag, no driver import). Keying off that rather than
477
+ ``sql.detect_dialect(conn)`` makes "SQLite behaviour is byte-identical
478
+ to before #2983" true *by construction* rather than by argument: a
479
+ ``sqlite3.Error`` has no SQLSTATE, so this returns without touching the
480
+ connection and no SQLite caller can lose uncommitted work it expected
481
+ to survive into the next statement (``retry_on_locked``'s multi-
482
+ statement writers being the case where that would actually be
483
+ observable). #2982's sibling fix in ``_migrate_add_columns`` predates
484
+ this helper and rolls back unconditionally; it is correct there (the
485
+ only uncommitted statement at that point is the one that just failed)
486
+ and is deliberately left as-is.
487
+
488
+ A ``None`` *conn* is a no-op — see :func:`_board_connection_if_open`,
489
+ which may legitimately have nothing to hand over. A failure of the
490
+ rollback itself is suppressed: this runs inside an ``except`` block
491
+ whose original exception is the interesting one, and masking it with a
492
+ secondary error from the recovery attempt would be strictly worse than
493
+ leaving the connection unrecovered.
494
+ """
495
+ if conn is None:
496
+ return
497
+ if getattr(exc, "sqlstate", None) is None and getattr(exc, "pgcode", None) is None:
498
+ return # not a Postgres driver error — nothing was aborted
499
+ try:
500
+ conn.rollback()
501
+ except Exception: # noqa: BLE001 — never mask the caught driver error
502
+ pass
503
+
504
+
432
505
  # #2538: a handful of consecutive short retries — long enough to ride out a
433
506
  # concurrent writer (the daemon's own passive tick, another `coord merge`/
434
507
  # `coord notify` invocation) that only holds the DB for a moment, short
@@ -517,6 +590,7 @@ def is_lock_contention_error(exc: BaseException) -> bool:
517
590
  def retry_on_locked(
518
591
  write: Callable[[], _T],
519
592
  *,
593
+ conn: Any | None = None,
520
594
  attempts: int = _LOCK_RETRY_ATTEMPTS,
521
595
  base_delay: float = _LOCK_RETRY_BASE_DELAY_S,
522
596
  ) -> _T:
@@ -547,12 +621,58 @@ def retry_on_locked(
547
621
  ``coord.state._record_dispatched_assignment_local``, whose caller —
548
622
  ``coord.auto_loop._dispatch_fix`` — treats it as a declined dispatch
549
623
  rather than letting it crash the whole run).
624
+
625
+ Transaction recovery, and whether "retry" means anything on Postgres
626
+ (#2983)
627
+ ------------------------------------------------------------------
628
+ SQLite's ``SQLITE_BUSY`` retry model is "the statement never ran; the
629
+ lock is held elsewhere; the transaction is untouched" — so re-running
630
+ *write* verbatim is exactly the right move, and has been since #2538.
631
+ Postgres's three contention SQLSTATEs
632
+ (:data:`_POSTGRES_LOCK_CONTENTION_SQLSTATES`) are contention-shaped in
633
+ the same way, but they ALSO abort the whole transaction. That makes the
634
+ retry loop *worse than useless* on Postgres without recovery: attempt 2
635
+ onwards raises ``InFailedSqlTransaction`` instead of re-attempting the
636
+ write, ``is_lock_contention_error`` reads False for it, and the loop
637
+ bails out on attempt 2 re-raising the wrong error — the #2597/#2689
638
+ retry budget silently reduced to a single attempt.
639
+
640
+ So the answer to "does SQLite's retry model have a Postgres analogue at
641
+ all, or should the retry just be a no-op there?" is: it has one, and it
642
+ is the standard Postgres idiom — **roll back, then re-run the whole
643
+ transaction.** Every *write* callable in this tree is already a
644
+ self-contained transaction (its own statements followed by its own
645
+ ``conn.commit()``), which is precisely what makes re-running it after a
646
+ rollback correct rather than a partial replay. Hence
647
+ :func:`rollback_after_driver_error` before both the retry and the final
648
+ re-raise: after the re-raise the connection must still be usable too,
649
+ because ~13 of this tree's callers catch that exception and *swallow*
650
+ it (a cache mirror whose upstream GitHub write already landed must not
651
+ turn into a 503), then keep using the same singleton connection.
652
+ Recovering here rather than in each of those handlers is what keeps the
653
+ guarantee in one place: **when this function returns OR raises, it has
654
+ not left an aborted transaction behind.**
655
+
656
+ *conn* is the connection *write* writes through, needed only for that
657
+ rollback. It defaults to :func:`_board_connection_if_open` because
658
+ every call site in this tree writes through ``get_connection()``
659
+ (``coord.state``, ``coord.merge_queue``, ``coord.audit``,
660
+ ``coord.commands.merge``), so the default is correct for all of them
661
+ and none had to be churned; pass it explicitly if you ever write
662
+ through a different connection. Rolling back an innocent already-
663
+ committed connection would be a no-op anyway — every writer here
664
+ commits immediately — and the rollback is skipped entirely unless the
665
+ caught exception carries a Postgres SQLSTATE, so the SQLite path is
666
+ byte-identical to before #2983.
550
667
  """
551
668
  delay = base_delay
552
669
  for attempt in range(1, attempts + 1):
553
670
  try:
554
671
  return write()
555
672
  except sql.driver_errors() as exc:
673
+ rollback_after_driver_error(
674
+ conn if conn is not None else _board_connection_if_open(), exc
675
+ )
556
676
  if not is_lock_contention_error(exc) or attempt >= attempts:
557
677
  raise
558
678
  time.sleep(delay)
@@ -619,10 +739,21 @@ def _read_schema_version(conn: sqlite3.Connection) -> int:
619
739
  the current ``_DB_SCHEMA_VERSION`` and skips the write path entirely —
620
740
  until the next bump (#2675: that skip is exactly what silently dropped
621
741
  two `_migrate_add_columns` entries when they landed without one).
742
+
743
+ #2983: the "table doesn't exist yet" swallow below needs its own
744
+ rollback — #2982's fix is one layer downstream and does not cover this.
745
+ On a fresh Postgres database this is the FIRST statement `_open_postgres`
746
+ -> `_migrate_if_needed` runs, it errors (`UndefinedTable`), and that
747
+ aborts the transaction; the caller then continues on the same connection
748
+ straight into `_fix_schema_version_table`'s `CREATE TABLE IF NOT
749
+ EXISTS`, which raises `InFailedSqlTransaction`. So on Postgres the
750
+ brand-new-database path — the one case this guard exists for — could
751
+ never get past its own first statement.
622
752
  """
623
753
  try:
624
754
  row = sql.execute(conn, "SELECT MAX(version) FROM schema_version").fetchone()
625
- except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
755
+ except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
756
+ rollback_after_driver_error(conn, exc) # #2983: caller keeps using `conn`
626
757
  return 0 # table doesn't exist yet
627
758
  if row is None or row[0] is None:
628
759
  return 0
@@ -42,7 +42,7 @@ from coord.ci_store import (
42
42
  summarize,
43
43
  summarize_counts,
44
44
  )
45
- from coord.db import get_connection, retry_on_locked
45
+ from coord.db import get_connection, retry_on_locked, rollback_after_driver_error
46
46
  from coord.forge_availability import MERGE_GATE_REFUSAL_KINDS, record_merge_gate_refusal
47
47
  from coord.models import (
48
48
  CLOSES_ISSUE_TYPES,
@@ -3812,11 +3812,23 @@ def _archived_merged_issue_keys(conn: sqlite3.Connection) -> set[tuple[str, int]
3812
3812
  "SELECT repo_name, issue_number FROM merge_queue_archive WHERE state = ?",
3813
3813
  (MERGED,),
3814
3814
  ).fetchall()
3815
- except sql.driver_errors(): # #2784: not just sqlite3.OperationalError
3815
+ except sql.driver_errors() as exc: # #2784: not just sqlite3.OperationalError
3816
3816
  # "no such table" surfaces as a *different* driver-named exception
3817
3817
  # per backend (sqlite3.OperationalError vs psycopg.errors.
3818
3818
  # UndefinedTable), so this must go through the dialect seam or the
3819
3819
  # not-yet-archived case becomes an uncaught crash on Postgres.
3820
+ #
3821
+ # #2983: and catching it is only half the job. `conn` here is the
3822
+ # process-lived `get_connection()` singleton, which the caller
3823
+ # (`merged_issue_keys`, and in turn `enqueue_approved_work` /
3824
+ # `staging_items`) keeps writing and reading through long after this
3825
+ # returns — on Postgres the swallowed UndefinedTable aborts that
3826
+ # connection's transaction, so the "archive doesn't exist yet"
3827
+ # degrade turned every subsequent statement into
3828
+ # InFailedSqlTransaction. Nothing uncommitted is at risk: this
3829
+ # function only reads, and on Postgres the abort had already
3830
+ # discarded anything pending regardless.
3831
+ rollback_after_driver_error(conn, exc)
3820
3832
  return set()
3821
3833
  return {(r["repo_name"], r["issue_number"]) for r in rows}
3822
3834
 
@@ -46,7 +46,12 @@ from coord.board_service import route_assignment_patch as _route_assignment_patc
46
46
  from coord.board_service import route_issue_comment as _route_issue_comment
47
47
  from coord.board_service import route_issue_patch as _route_issue_patch
48
48
  from coord.board_service import route_write as _route_write
49
- from coord.db import get_connection, is_lock_contention_error, retry_on_locked
49
+ from coord.db import (
50
+ get_connection,
51
+ is_lock_contention_error,
52
+ retry_on_locked,
53
+ rollback_after_driver_error,
54
+ )
50
55
  from coord.models import (
51
56
  WORK_LIKE_TYPES,
52
57
  Assignment,
@@ -3137,6 +3142,13 @@ def _update_assignment_tokens_local(
3137
3142
  # and now also covers a lock that outlasts the retry budget.
3138
3143
  retry_on_locked(_write)
3139
3144
  except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
3145
+ # #2983 audit: safe to swallow without a rollback here, unlike the
3146
+ # sibling handlers below — `retry_on_locked` guarantees it has not
3147
+ # left an aborted transaction behind when it returns OR raises (see
3148
+ # its "Transaction recovery" docstring section), so every handler
3149
+ # whose `try` body is a `retry_on_locked(...)` call inherits the fix
3150
+ # for free. Adding a second rollback here would be redundant, not
3151
+ # safer.
3140
3152
  pass
3141
3153
 
3142
3154
 
@@ -3184,9 +3196,17 @@ def _update_assignment_stop_reason_local(assignment_id: str, stop_reason: str) -
3184
3196
  (stop_reason, assignment_id),
3185
3197
  )
3186
3198
  conn.commit()
3187
- except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
3199
+ except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
3188
3200
  # Column may not exist yet (pre-migration DB or test fixtures).
3189
- pass
3201
+ #
3202
+ # #2983: `conn` is the process-/thread-lived `get_connection()`
3203
+ # singleton, so on Postgres swallowing this without a rollback
3204
+ # leaves the transaction aborted for every LATER caller of
3205
+ # `get_connection()` in this process, not just for the rest of this
3206
+ # function. Nothing uncommitted is lost: the only statement in the
3207
+ # transaction is the UPDATE that just failed (the `commit()` above
3208
+ # is the last thing in the block).
3209
+ rollback_after_driver_error(conn, exc)
3190
3210
 
3191
3211
 
3192
3212
  def mark_assignment_interactive(assignment_id: str) -> None:
@@ -3221,9 +3241,12 @@ def _mark_assignment_interactive_local(assignment_id: str) -> None:
3221
3241
  (assignment_id,),
3222
3242
  )
3223
3243
  conn.commit()
3224
- except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
3244
+ except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
3225
3245
  # Column may not exist on a pre-migration DB.
3226
- pass
3246
+ # #2983: same shared-singleton reasoning as
3247
+ # `_update_assignment_stop_reason_local` above — swallow, but leave
3248
+ # the connection usable for the next `get_connection()` caller.
3249
+ rollback_after_driver_error(conn, exc)
3227
3250
 
3228
3251
 
3229
3252
  def set_test_plan(
@@ -3392,8 +3415,14 @@ def _set_assignment_failure_reason_local(assignment_id: str, reason: str) -> Non
3392
3415
  (reason[:512], now, assignment_id), # cap at 512 chars — one-liner
3393
3416
  )
3394
3417
  conn.commit()
3395
- except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
3418
+ except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
3396
3419
  # Column may not exist on a pre-migration DB — best-effort.
3420
+ # #2983: the `return` ends this function but NOT the connection's
3421
+ # life — it is the shared `get_connection()` singleton, so an
3422
+ # un-rolled-back abort here would take out every later statement in
3423
+ # the process on Postgres (including this same daemon request's
3424
+ # audit write below).
3425
+ rollback_after_driver_error(conn, exc)
3397
3426
  return
3398
3427
  # #1036 fix review finding 2: no matching row (bad/stale assignment_id)
3399
3428
  # means the UPDATE above touched nothing — don't audit a transition that
@@ -5982,7 +6011,15 @@ def _list_issue_numbers_with_assignments_local(repo_name: str) -> set[int]:
5982
6011
  f"SELECT DISTINCT issue_number FROM {table} WHERE repo_name = ?", # noqa: S608
5983
6012
  (repo_name,),
5984
6013
  ).fetchall()
5985
- except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
6014
+ except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
6015
+ # #2983: `continue` goes straight back round the loop on the SAME
6016
+ # connection, so on Postgres a missing `assignments_archive` (the
6017
+ # exact case named below) aborted the transaction and the NEXT
6018
+ # iteration — plus everything else this process later ran through
6019
+ # `get_connection()` — raised InFailedSqlTransaction uncaught.
6020
+ # Read-only loop, so the rollback can only discard the SELECT
6021
+ # that just failed.
6022
+ rollback_after_driver_error(conn, exc)
5986
6023
  continue # assignments_archive may not exist yet (housekeeping never ran)
5987
6024
  numbers.update(r[0] for r in rows if r[0] is not None)
5988
6025
  return numbers
@@ -21,6 +21,12 @@ from coord import db as db_mod
21
21
  from coord import sql
22
22
  from coord.dao import CoordStore, SqliteStore
23
23
  from coord.db import _ensure_schema
24
+ from tests import backends
25
+ from tests.test_db import (
26
+ AbortOnErrorConn,
27
+ abort_simulating_connection,
28
+ schema_migrated_sqlite_connection,
29
+ )
24
30
 
25
31
 
26
32
  @pytest.fixture
@@ -262,3 +268,79 @@ class TestConnectDialectRouting:
262
268
  store = SqliteStore(read_db)
263
269
  with pytest.raises(db_mod.ProductionDatabaseGuardError):
264
270
  store._connect()
271
+
272
+
273
+ # ── #2983: a swallowed driver error must not poison the read connection ─────
274
+ #
275
+ # `_audit_recent_count` is documented as failing "open to 0 so a
276
+ # missing/pre-migration table never 503s the board". On Postgres a failed
277
+ # statement aborts the whole transaction, so before #2983 the swallow took
278
+ # out every *sibling* read sharing that `with closing(self._connect())`
279
+ # block -- `escalations` and `drive_queue` are evaluated after it in
280
+ # `board_projection`'s dict literal -- producing precisely the 503 the guard
281
+ # exists to prevent.
282
+
283
+
284
+ class TestAuditRecentCountRollsBackOnDriverError:
285
+ """Drives the regression with the shared abort-simulating stub, so it is
286
+ meaningful on a SQLite-only dev machine with no Postgres server."""
287
+
288
+ def _store_with_missing_audit_log(
289
+ self, monkeypatch: pytest.MonkeyPatch
290
+ ) -> tuple[SqliteStore, AbortOnErrorConn]:
291
+ conn = abort_simulating_connection(
292
+ monkeypatch, schema_migrated_sqlite_connection(drop=("audit_log",))
293
+ )
294
+ monkeypatch.setattr(SqliteStore, "_connect", lambda self: conn)
295
+ return SqliteStore(Path("unused-the-connection-is-injected.db")), conn
296
+
297
+ def test_returns_zero_and_leaves_the_connection_usable(
298
+ self, monkeypatch: pytest.MonkeyPatch
299
+ ) -> None:
300
+ store, conn = self._store_with_missing_audit_log(monkeypatch)
301
+
302
+ assert store._audit_recent_count(conn) == 0
303
+ assert conn.rollbacks == 1
304
+ # The "further operation on the same connection" acceptance
305
+ # criterion -- pre-fix this raises "current transaction is aborted".
306
+ assert sql.execute(conn, "SELECT 1 AS ok").fetchone()["ok"] == 1
307
+
308
+ def test_board_projection_still_serves_the_reads_after_the_swallow(
309
+ self, monkeypatch: pytest.MonkeyPatch
310
+ ) -> None:
311
+ """The user-visible shape: a missing `audit_log` must degrade to
312
+ `audit_recent_count: 0`, not 503 the whole board. `escalations` and
313
+ `drive_queue` are read *after* `_audit_recent_count` in
314
+ `board_projection`'s dict literal, so they are what actually broke."""
315
+ store, conn = self._store_with_missing_audit_log(monkeypatch)
316
+
317
+ payload = store.board_projection()
318
+
319
+ assert payload["audit_recent_count"] == 0
320
+ assert payload["escalations"] == []
321
+ assert payload["drive_queue"] == []
322
+ assert payload["assignments"] == []
323
+
324
+
325
+ class TestAuditRecentCountRollsBackOnRealPostgres:
326
+ """The same regression against an actual Postgres server, when one is
327
+ reachable -- `psycopg.errors.UndefinedTable` followed by
328
+ `InFailedSqlTransaction`, the real shapes the stub above simulates."""
329
+
330
+ def test_sibling_reads_survive_a_missing_audit_log(self) -> None:
331
+ unavailable = backends.postgres_available()
332
+ if unavailable:
333
+ pytest.skip(f"no Postgres backend available: {unavailable}")
334
+
335
+ session = backends.open_named_session(backends.BACKEND_POSTGRES)
336
+ try:
337
+ _ensure_schema(session.conn)
338
+ sql.execute(session.conn, "DROP TABLE audit_log")
339
+ session.conn.commit()
340
+ store = SqliteStore(Path("unused-the-connection-is-injected.db"))
341
+
342
+ assert store._audit_recent_count(session.conn) == 0
343
+ # Pre-fix: psycopg.errors.InFailedSqlTransaction.
344
+ assert sql.execute(session.conn, "SELECT 1 AS ok").fetchone()["ok"] == 1
345
+ finally:
346
+ session.close()