code-coordinator 0.5.323__tar.gz → 0.5.325__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.323 → code_coordinator-0.5.325}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agent.py +4 -3
  5. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/ci_fix.py +84 -0
  6. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/client.py +30 -0
  7. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/merge.py +108 -1
  8. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/portal.py +175 -32
  9. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/db.py +24 -2
  10. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/merge_queue.py +36 -2
  11. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/portal_store.py +29 -4
  12. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/portal_sync.py +132 -26
  13. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/serve_app.py +262 -0
  14. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_fix.py +312 -0
  15. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_portal.py +317 -2
  16. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_db.py +1 -1
  17. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_portal_store.py +191 -0
  18. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_sqlite_connect_ratchet.py +14 -2
  19. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.claude/commands/board.md +0 -0
  20. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.claude/commands/complete-session.md +0 -0
  21. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.claude/commands/coordinator.md +0 -0
  22. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.githooks/_lib.sh +0 -0
  23. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.githooks/post-checkout +0 -0
  24. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.githooks/post-commit +0 -0
  25. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.githooks/post-merge +0 -0
  26. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/coord-ci-acceptance.yml +0 -0
  28. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/workflows/auto-release.yml +0 -0
  29. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/workflows/publish.yml +0 -0
  30. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.github/workflows/test.yml +0 -0
  31. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/.gitignore +0 -0
  32. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/CLAUDE.md +0 -0
  33. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/GOAL.md +0 -0
  34. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/LICENSE +0 -0
  35. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/MANIFEST.in +0 -0
  36. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/README.md +0 -0
  37. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/SOURCES.txt +0 -0
  38. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/dependency_links.txt +0 -0
  39. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/entry_points.txt +0 -0
  40. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/requires.txt +0 -0
  41. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/scm_file_list.json +0 -0
  42. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agent_app.py +0 -0
  48. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agent_update.py +0 -0
  49. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agents/opencode/.gitignore +0 -0
  50. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agents/opencode/agents/work.md +0 -0
  51. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/agents/opencode/routing.jsonc +0 -0
  52. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/approved_work.py +0 -0
  53. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/audit.py +0 -0
  54. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/auto_loop.py +0 -0
  55. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/block_log.py +0 -0
  56. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/board_schema.py +0 -0
  57. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/board_service.py +0 -0
  58. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/board_wire.py +0 -0
  59. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/brain.py +0 -0
  60. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/branch_model.py +0 -0
  61. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/bug_intake.py +0 -0
  62. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/cargo_cache.py +0 -0
  63. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/ci_github.py +0 -0
  64. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/ci_gitlab.py +0 -0
  65. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/ci_store.py +0 -0
  66. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/claim.py +0 -0
  67. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/cli.py +0 -0
  68. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/_common.py +0 -0
  70. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/acceptance.py +0 -0
  71. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/agent_ops.py +0 -0
  72. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/audit.py +0 -0
  73. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/dispatch.py +0 -0
  75. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/dispatch_workers.py +0 -0
  76. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/drive.py +0 -0
  77. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/drive_queue.py +0 -0
  78. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/gate_a.py +0 -0
  79. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/gates.py +0 -0
  80. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/issues.py +0 -0
  81. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/lifecycle.py +0 -0
  82. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/machine.py +0 -0
  83. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/milestone.py +0 -0
  84. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/pr.py +0 -0
  87. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/release.py +0 -0
  88. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/repo.py +0 -0
  89. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/report.py +0 -0
  90. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/review.py +0 -0
  91. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/scorecard.py +0 -0
  92. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/sessions.py +0 -0
  93. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/setup.py +0 -0
  94. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/status.py +0 -0
  95. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/store_migrate.py +0 -0
  96. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/terminal.py +0 -0
  97. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/test_gate.py +0 -0
  98. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/commands/tui.py +0 -0
  99. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/comments.py +0 -0
  100. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/config.py +0 -0
  101. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/config_reload.py +0 -0
  102. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/confirm_test.py +0 -0
  103. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/conflict_fix.py +0 -0
  104. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dao.py +0 -0
  105. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/__init__.py +0 -0
  106. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/fixture.py +0 -0
  107. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/index.html +0 -0
  108. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/server.py +0 -0
  109. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dashboard/terminal.py +0 -0
  110. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dead_end.py +0 -0
  111. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/decomposition_chat.py +0 -0
  112. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/README.md +0 -0
  113. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-agent.service +0 -0
  114. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-db-backup.service +0 -0
  115. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-db-backup.sh +0 -0
  116. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-db-backup.timer +0 -0
  117. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-drive-queue.service +0 -0
  118. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-drive-queue.timer +0 -0
  119. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-failure-notify.service +0 -0
  120. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-fleet-watchdog.service +0 -0
  121. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  122. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-notify.service +0 -0
  123. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-notify.timer +0 -0
  124. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-release-propagate.service +0 -0
  125. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-release-propagate.timer +0 -0
  126. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-release-window.service +0 -0
  127. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-release-window.timer +0 -0
  128. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-serve.service +0 -0
  129. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-web-dist-build.service +0 -0
  130. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-web-dist-build.timer +0 -0
  131. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy/coord-web.service +0 -0
  132. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy_manifest.py +0 -0
  133. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deploy_units.py +0 -0
  134. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deprecation_telemetry.py +0 -0
  135. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/deps.py +0 -0
  136. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/diagnose.py +0 -0
  137. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dispatch.py +0 -0
  138. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/dist_name.py +0 -0
  139. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/drive.py +0 -0
  140. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/drive_queue.py +0 -0
  141. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/drive_state.py +0 -0
  142. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/events.py +0 -0
  143. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/failure_class.py +0 -0
  144. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/filelock.py +0 -0
  145. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/fleet_config_health.py +0 -0
  146. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/forge_availability.py +0 -0
  147. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/freshness.py +0 -0
  148. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/gate_a.py +0 -0
  149. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/gate_b.py +0 -0
  150. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/gate_snapshot.py +0 -0
  151. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/gates.py +0 -0
  152. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/github_ops.py +0 -0
  153. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/github_throttle.py +0 -0
  154. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/goal.py +0 -0
  155. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/graph_health.py +0 -0
  156. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/__init__.py +0 -0
  157. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/aggregate.py +0 -0
  158. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/__init__.py +0 -0
  159. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/_ci_pin.py +0 -0
  160. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/agent_install.py +0 -0
  161. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/cargo_targets.py +0 -0
  162. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/claude_binary.py +0 -0
  163. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  164. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/coord_web_ci_pin.py +0 -0
  165. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/deploy_lane_facts.py +0 -0
  166. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/disk.py +0 -0
  167. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/fleet_board.py +0 -0
  168. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  169. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/fleet_phantom.py +0 -0
  170. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/fleet_unit_drift.py +0 -0
  171. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/graph.py +0 -0
  172. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/graphify_cli.py +0 -0
  173. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/index_lock.py +0 -0
  174. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/issues_sync_staleness.py +0 -0
  175. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/plan_usage.py +0 -0
  176. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/release_cordon.py +0 -0
  177. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/repo_state.py +0 -0
  178. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/spawned_coord.py +0 -0
  179. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/stalled_pipeline.py +0 -0
  180. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/timer_active.py +0 -0
  181. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/toolchain.py +0 -0
  182. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/unit_drift.py +0 -0
  183. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/unit_enablement.py +0 -0
  184. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/wedged_drive_queue.py +0 -0
  185. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/checks/worktrees.py +0 -0
  186. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/cli.py +0 -0
  187. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/context.py +0 -0
  188. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/fleet_snapshot.py +0 -0
  189. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/models.py +0 -0
  190. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/pypi.py +0 -0
  191. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/registry.py +0 -0
  192. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/render.py +0 -0
  193. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/health/units.py +0 -0
  194. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/hooks.py +0 -0
  195. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/housekeeping.py +0 -0
  196. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/interactive.py +0 -0
  197. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/issue_store.py +0 -0
  198. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/issues_sync_status.py +0 -0
  199. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/liveness_auditor.py +0 -0
  200. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/machine_onboard.py +0 -0
  201. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/machine_pause.py +0 -0
  202. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/milestone_chat.py +0 -0
  203. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/milestone_dispatch.py +0 -0
  204. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/milestone_gate.py +0 -0
  205. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/milestone_order.py +0 -0
  206. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/mock_author.py +0 -0
  207. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/models.py +0 -0
  208. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/network.py +0 -0
  209. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/new_issue_chat.py +0 -0
  210. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/__init__.py +0 -0
  211. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/baseline.py +0 -0
  212. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/cli.py +0 -0
  213. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/collect.py +0 -0
  214. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/digest.py +0 -0
  215. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/models.py +0 -0
  216. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/predicate.py +0 -0
  217. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/service.py +0 -0
  218. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/store.py +0 -0
  219. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notifier/transport.py +0 -0
  220. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/notify.py +0 -0
  221. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/openapi.py +0 -0
  222. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/overlap_fence.py +0 -0
  223. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/overlap_predict.py +0 -0
  224. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/parentage.py +0 -0
  225. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/parentage_github.py +0 -0
  226. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/pipeline.py +0 -0
  227. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/plan_parser.py +0 -0
  228. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/plans.py +0 -0
  229. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/platform_paths.py +0 -0
  230. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/portal_bridge.py +0 -0
  231. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/pr_body_lint.py +0 -0
  232. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/prereqs.py +0 -0
  233. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/progress.py +0 -0
  234. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/__init__.py +0 -0
  235. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/base.py +0 -0
  236. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/claude.py +0 -0
  237. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/claude_pty.py +0 -0
  238. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/providers/opencode.py +0 -0
  239. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/queue_diagnose.py +0 -0
  240. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/reconcile.py +0 -0
  241. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/reconcile_tick.py +0 -0
  242. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/refine_chat.py +0 -0
  243. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/release_cordon.py +0 -0
  244. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/release_propagate.py +0 -0
  245. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/release_verify.py +0 -0
  246. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/release_window.py +0 -0
  247. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/repo_dormancy.py +0 -0
  248. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/repo_edit.py +0 -0
  249. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/repo_onboard.py +0 -0
  250. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/reports.py +0 -0
  251. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/rest_schema.py +0 -0
  252. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/revalidate.py +0 -0
  253. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/review.py +0 -0
  254. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/scorecard.py +0 -0
  255. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/self_health.py +0 -0
  256. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  257. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  258. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  259. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  261. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/portal-followup/SKILL.md +0 -0
  262. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/release-now/SKILL.md +0 -0
  263. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  264. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  265. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/skills/update-issue/SKILL.md +0 -0
  266. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/smoke.py +0 -0
  267. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/spend_ceiling.py +0 -0
  268. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/split_work.py +0 -0
  269. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/sql.py +0 -0
  270. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/stage_projection.py +0 -0
  271. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/state.py +0 -0
  272. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/store_migrate.py +0 -0
  273. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/test_author.py +0 -0
  274. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/test_chat.py +0 -0
  275. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/test_orchestrator.py +0 -0
  276. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/test_report.py +0 -0
  277. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/tui_release.py +0 -0
  278. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/usage.py +0 -0
  279. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/usage_limits.py +0 -0
  280. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/usage_rollup.py +0 -0
  281. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coord/worker_events.py +0 -0
  282. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/coordinator.example.yml +0 -0
  283. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-agent.service +0 -0
  284. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-db-backup.service +0 -0
  285. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-db-backup.sh +0 -0
  286. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-db-backup.timer +0 -0
  287. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-drive-queue.service +0 -0
  288. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-drive-queue.timer +0 -0
  289. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-failure-notify.service +0 -0
  290. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-failure-notify.sh +0 -0
  291. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-fleet-watchdog.service +0 -0
  292. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-fleet-watchdog.timer +0 -0
  293. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-notify.service +0 -0
  294. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-notify.timer +0 -0
  295. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-release-propagate.service +0 -0
  296. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-release-propagate.timer +0 -0
  297. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-release-window.service +0 -0
  298. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-release-window.timer +0 -0
  299. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-serve.service +0 -0
  300. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web-dist-build.service +0 -0
  301. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web-dist-build.sh +0 -0
  302. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web-dist-build.timer +0 -0
  303. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web-rollback.sh +0 -0
  304. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/coord-web.service +0 -0
  305. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/deploy/node-shim.sh +0 -0
  306. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_COORD_TUI_CI.md +0 -0
  307. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  308. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_COORD_WEB_CI.md +0 -0
  309. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_COORD_WEB_DIST.md +0 -0
  310. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  311. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/AGENT_OPERATIONS.md +0 -0
  312. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ARCHITECTURE.md +0 -0
  313. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ARCH_SECURITY_GATES.md +0 -0
  314. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/COCKPIT.md +0 -0
  315. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/CONTROL_CENTER.md +0 -0
  316. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/COST_DISCIPLINE.md +0 -0
  317. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/CROSS_PLATFORM.md +0 -0
  318. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/CUSTOMER_FACING_APPS.md +0 -0
  319. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/CUSTOMER_PORTAL.md +0 -0
  320. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/DRIVE_QUEUE.md +0 -0
  321. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/EPHEMERAL_WORKERS.md +0 -0
  322. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/FORGE_MIGRATION.md +0 -0
  323. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/GRAPHIFY_SETUP.md +0 -0
  324. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ISSUE_GUIDANCE.md +0 -0
  325. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/MAC_MINI.md +0 -0
  326. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  327. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/NOTIFIER.md +0 -0
  328. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/OPENCODE_VERIFICATION.md +0 -0
  329. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/OPERATING_GOTCHAS.md +0 -0
  330. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/OPERATOR_GUIDES.md +0 -0
  331. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/ORACLE_LOOP.md +0 -0
  332. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/PHONE_WEBAPP.md +0 -0
  333. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/PIPELINE_V2.md +0 -0
  334. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/PLATFORM_EVOLUTION.md +0 -0
  335. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/SECOND_BACKEND.md +0 -0
  336. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/STORE_SERVICE.md +0 -0
  337. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  338. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/WEB_CONTROL_CENTER.md +0 -0
  339. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/WSL_WINDOWS_WORKER.md +0 -0
  340. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/README.md +0 -0
  341. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/_tokens.css +0 -0
  342. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/issue-detail.html +0 -0
  343. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/pipeline-narrow.html +0 -0
  344. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/docs/mocks/web/pipeline-wide.html +0 -0
  345. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/graphify-out/.gitignore +0 -0
  346. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/install-agent.sh +0 -0
  347. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/pyproject.toml +0 -0
  348. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/audit_review_verdict_overrides.py +0 -0
  349. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  350. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/build-worker-image.sh +0 -0
  351. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/coordinator-machine.py +0 -0
  352. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/epic-down.sh +0 -0
  353. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/epic-up.sh +0 -0
  354. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/preflight.sh +0 -0
  355. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/provision-worker.sh +0 -0
  356. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  357. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  358. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/azure-workers/verify-github-token.sh +0 -0
  359. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/check_gh_argv_containment.py +0 -0
  360. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/codegen.py +0 -0
  361. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-test-runner.sh +0 -0
  362. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  363. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  364. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  365. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  366. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/coord-venv-rollback.sh +0 -0
  367. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/drive-batch.sh +0 -0
  368. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/extract-coord-tui.sh +0 -0
  369. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/fleet_watchdog.py +0 -0
  370. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/gen_board_fixture.py +0 -0
  371. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/gen_mock_index.py +0 -0
  372. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/next_release_tag.py +0 -0
  373. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/run_tests_in_populated_home.sh +0 -0
  374. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/run_tests_without_gh.sh +0 -0
  375. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/smoke_437_interactive.py +0 -0
  376. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/verify_878_review_capture.py +0 -0
  377. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/verify_release_published.py +0 -0
  378. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/scripts/verify_release_wheel.py +0 -0
  379. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/setup.cfg +0 -0
  380. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/SMOKE_SET.md +0 -0
  381. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/__init__.py +0 -0
  382. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/conftest.py +0 -0
  383. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/contract.md +0 -0
  384. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/manifest.yml +0 -0
  385. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  386. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  387. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/contract.md +0 -0
  388. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  389. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  390. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/manifest.yml +0 -0
  391. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  392. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-51/tsconfig.json +0 -0
  393. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  394. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/backends.py +0 -0
  395. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/conftest.py +0 -0
  396. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/board-pipeline-basic.json +0 -0
  397. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  398. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  399. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  400. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  401. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/all_pass.json +0 -0
  402. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  403. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/mixed_fail.json +0 -0
  404. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  405. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  406. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/skip.json +0 -0
  407. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/playwright/truncated.json +0 -0
  408. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  409. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  410. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  411. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  412. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  413. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  414. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  415. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  416. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_acceptance.py +0 -0
  417. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_acceptance_drivers.py +0 -0
  418. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent.py +0 -0
  419. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_api_error.py +0 -0
  420. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_app.py +0 -0
  421. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_branch_base.py +0 -0
  422. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_branch_capture.py +0 -0
  423. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_config_free_1712.py +0 -0
  424. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_deploy_units_endpoint.py +0 -0
  425. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_dirty_worktree.py +0 -0
  426. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  427. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_graph_self_heal.py +0 -0
  428. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_health_h3.py +0 -0
  429. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_idle_restart.py +0 -0
  430. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_push_failure.py +0 -0
  431. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_reap.py +0 -0
  432. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_repos_and_pull.py +0 -0
  433. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_restart_services_endpoint.py +0 -0
  434. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_skills_self_heal.py +0 -0
  435. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_startup_diagnostics.py +0 -0
  436. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_update.py +0 -0
  437. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_update_bluegreen.py +0 -0
  438. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_usage_limit.py +0 -0
  439. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_agent_zero_commit.py +0 -0
  440. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ambient_home_isolation.py +0 -0
  441. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approve_dependency_busy_2804.py +0 -0
  442. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approve_reject_plan.py +0 -0
  443. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approve_usage_gate.py +0 -0
  444. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approved_work_2532.py +0 -0
  445. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_approved_work_2996.py +0 -0
  446. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_assignment_already_recorded_daemon.py +0 -0
  447. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_audit_log.py +0 -0
  448. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_audit_outcome.py +0 -0
  449. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_audit_query.py +0 -0
  450. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_auto_loop.py +0 -0
  451. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_auto_release_publish_2035.py +0 -0
  452. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_backend_selection.py +0 -0
  453. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_base_checkout_restore.py +0 -0
  454. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_block_log.py +0 -0
  455. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_cap_762.py +0 -0
  456. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_fixture.py +0 -0
  457. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_read_path.py +0 -0
  458. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_schema.py +0 -0
  459. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_service.py +0 -0
  460. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_state.py +0 -0
  461. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_board_wire.py +0 -0
  462. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_brain.py +0 -0
  463. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_branch_model.py +0 -0
  464. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_bug_intake.py +0 -0
  465. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_build_worker_image_env_update.py +0 -0
  466. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cargo_cache.py +0 -0
  467. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_check_gh_argv_containment.py +0 -0
  468. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_acceptance_gate_1950.py +0 -0
  469. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_gitlab.py +0 -0
  470. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_parity_2091.py +0 -0
  471. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_ci_store.py +0 -0
  472. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_claim.py +0 -0
  473. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_claude_md_budget.py +0 -0
  474. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_acceptance.py +0 -0
  475. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign.py +0 -0
  476. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  477. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign_interactive_remote.py +0 -0
  478. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign_provider.py +0 -0
  479. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  480. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_audit.py +0 -0
  481. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_chat_continue.py +0 -0
  482. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_decide.py +0 -0
  483. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_capability_rules.py +0 -0
  484. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_config_provenance.py +0 -0
  485. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_forge_availability.py +0 -0
  486. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_graph.py +0 -0
  487. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_self.py +0 -0
  488. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_diagnose_test_coverage.py +0 -0
  489. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_doctor.py +0 -0
  490. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_doctor_config_free_1801.py +0 -0
  491. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  492. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_drive.py +0 -0
  493. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_drive_queue.py +0 -0
  494. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_escalate.py +0 -0
  495. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_fix_headless_review.py +0 -0
  496. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_gate_a.py +0 -0
  497. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_install_drift.py +0 -0
  498. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_install_skills.py +0 -0
  499. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_issue_comment.py +0 -0
  500. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_issue_create_label.py +0 -0
  501. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_issue_reopen.py +0 -0
  502. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_issue_view_list.py +0 -0
  503. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_merge.py +0 -0
  504. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_assign.py +0 -0
  505. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_capture.py +0 -0
  506. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_chat_add_child.py +0 -0
  507. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_dispatch.py +0 -0
  508. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_gate_b.py +0 -0
  509. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_gate_c.py +0 -0
  510. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_order.py +0 -0
  511. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  512. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_milestone_ship.py +0 -0
  513. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_network.py +0 -0
  514. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_new_issue_chat.py +0 -0
  515. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_plans.py +0 -0
  516. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_pr.py +0 -0
  517. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_pull_artifact.py +0 -0
  518. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_queue.py +0 -0
  519. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_reattach_sessions.py +0 -0
  520. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_refine_board.py +0 -0
  521. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_release_preflight.py +0 -0
  522. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_release_propagate.py +0 -0
  523. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_release_window.py +0 -0
  524. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_repo_2220.py +0 -0
  525. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  526. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_scorecard.py +0 -0
  527. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_set_review_findings.py +0 -0
  528. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_advisory_terminal.py +0 -0
  529. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_contested_tag.py +0 -0
  530. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_merge_queue.py +0 -0
  531. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_provider.py +0 -0
  532. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_review_finalizing.py +0 -0
  533. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_test_failed_tag.py +0 -0
  534. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_status_usage_limit.py +0 -0
  535. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_sync_comments_873.py +0 -0
  536. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_test_plan.py +0 -0
  537. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_track.py +0 -0
  538. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_tui_update.py +0 -0
  539. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cli_wait.py +0 -0
  540. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_client_base_install.py +0 -0
  541. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_client_resource_migration_1946.py +0 -0
  542. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_commands_common.py +0 -0
  543. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_comments.py +0 -0
  544. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_completion_summary.py +0 -0
  545. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config.py +0 -0
  546. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_acceptance.py +0 -0
  547. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_audit.py +0 -0
  548. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_pricing.py +0 -0
  549. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  550. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_config_usage_gate.py +0 -0
  551. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_confirm_test.py +0 -0
  552. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_conflict_fix.py +0 -0
  553. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_conflict_fix_semantic.py +0 -0
  554. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  555. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test.py +0 -0
  556. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  557. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_baseline.py +0 -0
  558. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_populated_home.py +0 -0
  559. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_routing.py +0 -0
  560. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_test_runner_toolchain.py +0 -0
  561. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_uat.py +0 -0
  562. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coord_web_sse_restart_live.py +0 -0
  563. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_coordinator_machine.py +0 -0
  564. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_cross_platform_imports.py +0 -0
  565. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dao.py +0 -0
  566. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard.py +0 -0
  567. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard_api.py +0 -0
  568. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard_fixture.py +0 -0
  569. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard_terminal.py +0 -0
  570. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dashboard_terminal_live.py +0 -0
  571. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dead_end.py +0 -0
  572. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_decomposition_chat.py +0 -0
  573. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_coord_db_backup.py +0 -0
  574. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_coord_web_dist.py +0 -0
  575. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_coord_web_rollback.py +0 -0
  576. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_drive_queue_unit.py +0 -0
  577. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_failure_notify_unit.py +0 -0
  578. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_manifest.py +0 -0
  579. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_notify_unit.py +0 -0
  580. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_units_lane.py +0 -0
  581. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deploy_web_unit.py +0 -0
  582. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deprecation_telemetry.py +0 -0
  583. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_deps.py +0 -0
  584. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_diagnose.py +0 -0
  585. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dispatch.py +0 -0
  586. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dispatch_target_validation.py +0 -0
  587. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_dist_name.py +0 -0
  588. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_done_housekeeping.py +0 -0
  589. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive.py +0 -0
  590. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue.py +0 -0
  591. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_blocked_rendering.py +0 -0
  592. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_launch_argv.py +0 -0
  593. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  594. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_roll_pending.py +0 -0
  595. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  596. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_state.py +0 -0
  597. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_drive_tmux.py +0 -0
  598. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_epic_up_capability_detection.py +0 -0
  599. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  600. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_epic_up_image_provenance.py +0 -0
  601. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_errors.py +0 -0
  602. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_events.py +0 -0
  603. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_failure_class.py +0 -0
  604. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_filelock.py +0 -0
  605. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  606. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fix_of_force_override.py +0 -0
  607. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fleet_config_health.py +0 -0
  608. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fleet_health_probes.py +0 -0
  609. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fleet_health_snapshot.py +0 -0
  610. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_fleet_watchdog.py +0 -0
  611. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_forge_availability.py +0 -0
  612. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_freshness.py +0 -0
  613. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gate_a.py +0 -0
  614. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gate_b.py +0 -0
  615. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gate_snapshot_staleness.py +0 -0
  616. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gates.py +0 -0
  617. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  618. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_gen_mock_index.py +0 -0
  619. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_generated_rust_fixture.py +0 -0
  620. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_generated_rust_requests.py +0 -0
  621. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_generated_types_fixture.py +0 -0
  622. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_github_ops.py +0 -0
  623. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_github_throttle.py +0 -0
  624. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_goal.py +0 -0
  625. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_graph_health.py +0 -0
  626. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_graph_selfheal_absent_2237.py +0 -0
  627. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_handoff.py +0 -0
  628. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_checks.py +0 -0
  629. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_cli.py +0 -0
  630. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_cli_graph.py +0 -0
  631. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_config.py +0 -0
  632. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_context.py +0 -0
  633. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_coord_tui_ci_pin.py +0 -0
  634. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_coord_web_ci_pin.py +0 -0
  635. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_deploy_lane_facts.py +0 -0
  636. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_fix.py +0 -0
  637. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_incident_regression.py +0 -0
  638. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_issues_sync_staleness.py +0 -0
  639. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_pypi.py +0 -0
  640. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_registry.py +0 -0
  641. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_release_cordon_probe.py +0 -0
  642. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_timer_active.py +0 -0
  643. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_toolchain.py +0 -0
  644. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_unit_drift.py +0 -0
  645. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_unit_enablement.py +0 -0
  646. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_health_wedged_drive_queue.py +0 -0
  647. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_hooks.py +0 -0
  648. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_human_attended_437.py +0 -0
  649. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_init.py +0 -0
  650. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_install_agent_venv_2911.py +0 -0
  651. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_integration.py +0 -0
  652. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_briefing_echo.py +0 -0
  653. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_pane_log_2541.py +0 -0
  654. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_prefill_state.py +0 -0
  655. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_session_relaunch.py +0 -0
  656. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_test_verdict_backstop.py +0 -0
  657. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_token_attribution.py +0 -0
  658. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_interactive_worktree.py +0 -0
  659. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_issue_store_seam.py +0 -0
  660. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_issues_sync_status.py +0 -0
  661. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_liveness_auditor.py +0 -0
  662. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_liveness_notify.py +0 -0
  663. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_lock_contention_ratchet.py +0 -0
  664. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_machine_onboard.py +0 -0
  665. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_machine_pause.py +0 -0
  666. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_merge_queue.py +0 -0
  667. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_merge_verify.py +0 -0
  668. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_chat.py +0 -0
  669. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_dispatch.py +0 -0
  670. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_gate.py +0 -0
  671. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_order.py +0 -0
  672. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_milestone_seam.py +0 -0
  673. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_mock_author.py +0 -0
  674. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_model_tiering.py +0 -0
  675. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_models.py +0 -0
  676. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_models_config_labels.py +0 -0
  677. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_needs_attention.py +0 -0
  678. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_network.py +0 -0
  679. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_new_issue_chat.py +0 -0
  680. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_next_release_tag.py +0 -0
  681. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_node_shim.py +0 -0
  682. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_baseline.py +0 -0
  683. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_cli.py +0 -0
  684. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_collect.py +0 -0
  685. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_config.py +0 -0
  686. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_drive_seam.py +0 -0
  687. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_isolation.py +0 -0
  688. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_predicate.py +0 -0
  689. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_quiet_hours.py +0 -0
  690. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notifier_service.py +0 -0
  691. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notify.py +0 -0
  692. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_notify_drain.py +0 -0
  693. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_openapi.py +0 -0
  694. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_operational_defaults.py +0 -0
  695. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_overlap_fence.py +0 -0
  696. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_overlap_predict.py +0 -0
  697. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_packaged_deploy_units.py +0 -0
  698. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_parentage.py +0 -0
  699. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_paste_landed.py +0 -0
  700. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  701. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_pipeline.py +0 -0
  702. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_followup_approve_plan_command.py +0 -0
  703. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_followup_pr_command.py +0 -0
  704. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_followup_review_command.py +0 -0
  705. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_only.py +0 -0
  706. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_plan_parser.py +0 -0
  707. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_platform_paths.py +0 -0
  708. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_portal_bridge.py +0 -0
  709. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_portal_config.py +0 -0
  710. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_portal_sync.py +0 -0
  711. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_pr_body_lint.py +0 -0
  712. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_prereqs.py +0 -0
  713. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_production_db_guard.py +0 -0
  714. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_progress.py +0 -0
  715. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_provider_seam.py +0 -0
  716. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_providers.py +0 -0
  717. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_providers_config_labels.py +0 -0
  718. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_providers_pty.py +0 -0
  719. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_py_rust_mirror_inventory.py +0 -0
  720. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_quiet_hours.py +0 -0
  721. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_quiet_hours_store_2146.py +0 -0
  722. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reap_merged_sessions.py +0 -0
  723. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reap_stale_interactive_tick.py +0 -0
  724. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile.py +0 -0
  725. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_branch.py +0 -0
  726. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_completions.py +0 -0
  727. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  728. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_merges.py +0 -0
  729. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_no_agent_record.py +0 -0
  730. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_tick.py +0 -0
  731. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reconcile_usage_limit_done.py +0 -0
  732. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_refine_chat.py +0 -0
  733. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_cordon_2101.py +0 -0
  734. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  735. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_cordon_deadlock_2240.py +0 -0
  736. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_cordon_stuck_2490.py +0 -0
  737. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_propagate.py +0 -0
  738. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_propagate_threshold.py +0 -0
  739. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_roll_between_legs_2854.py +0 -0
  740. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_roll_window_handoff.py +0 -0
  741. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_unified_1242.py +0 -0
  742. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_verify.py +0 -0
  743. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_release_window.py +0 -0
  744. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_remote_auto_prune.py +0 -0
  745. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_remote_interactive_reaper.py +0 -0
  746. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_add.py +0 -0
  747. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_dormancy.py +0 -0
  748. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_edit_2220.py +0 -0
  749. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_graph_fleet_2237.py +0 -0
  750. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_repo_onboard_2220.py +0 -0
  751. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_report_result_push.py +0 -0
  752. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_reports.py +0 -0
  753. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_retry.py +0 -0
  754. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_retry_advisory_1606.py +0 -0
  755. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_retry_type_1636.py +0 -0
  756. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_revalidate.py +0 -0
  757. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review.py +0 -0
  758. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_end_review_without_verdict.py +0 -0
  759. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_parse_failure_diagnostic.py +0 -0
  760. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_reaffirm.py +0 -0
  761. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_state.py +0 -0
  762. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_verdict_backstop.py +0 -0
  763. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_verdict_override_audit.py +0 -0
  764. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_verdict_relay.py +0 -0
  765. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_review_zero_commits.py +0 -0
  766. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_scoped_review_wiring.py +0 -0
  767. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_scorecard.py +0 -0
  768. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_self_health.py +0 -0
  769. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_serve.py +0 -0
  770. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_serve_app_board_trim.py +0 -0
  771. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_serve_rest_routes.py +0 -0
  772. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_session.py +0 -0
  773. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_slice_issue_attribution.py +0 -0
  774. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_smoke.py +0 -0
  775. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_smoke_live_checkout_restore.py +0 -0
  776. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_smoke_workflow.py +0 -0
  777. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_spend_ceiling.py +0 -0
  778. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_spend_ceiling_coordinator.py +0 -0
  779. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_split.py +0 -0
  780. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_split_work.py +0 -0
  781. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_sql_dialect.py +0 -0
  782. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stage_projection.py +0 -0
  783. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stale_busy_reviewer_697.py +0 -0
  784. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stalled_pipeline.py +0 -0
  785. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_state.py +0 -0
  786. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_state_review_findings_daemon.py +0 -0
  787. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_status_fleet_footer.py +0 -0
  788. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stop_1567.py +0 -0
  789. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_store_contract.py +0 -0
  790. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_store_migrate.py +0 -0
  791. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stuck.py +0 -0
  792. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  793. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_terminal_command.py +0 -0
  794. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_author.py +0 -0
  795. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_chat.py +0 -0
  796. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_orchestrator.py +0 -0
  797. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_report.py +0 -0
  798. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_verdict_parsing.py +0 -0
  799. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_test_verdict_transcript_floor.py +0 -0
  800. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_text_io_encoding_audit.py +0 -0
  801. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_thin_client_board_audit.py +0 -0
  802. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_thin_client_config_load_1080.py +0 -0
  803. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_thin_client_daemon_routing_906.py +0 -0
  804. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_tmux_host.py +0 -0
  805. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_tmux_session.py +0 -0
  806. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_transcript_floor.py +0 -0
  807. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_usage.py +0 -0
  808. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_usage_limits.py +0 -0
  809. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_usage_rollup.py +0 -0
  810. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_venv_live_install_2121.py +0 -0
  811. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_version_single_source.py +0 -0
  812. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_watch.py +0 -0
  813. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  814. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_env_venv_isolation.py +0 -0
  815. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_events.py +0 -0
  816. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_image_pin_sync.py +0 -0
  817. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_safety.py +0 -0
  818. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worker_test_scoping.py +0 -0
  819. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worktree.py +0 -0
  820. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  821. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/tests/test_write_parity.py +0 -0
  822. {code_coordinator-0.5.323 → code_coordinator-0.5.325}/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.323
3
+ Version: 0.5.325
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.323
3
+ Version: 0.5.325
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.323",
2
+ "tag": "0.5.325",
3
3
  "distance": 0,
4
- "node": "g6d62d0b99d361f200c0329792182a2f8918b2864",
4
+ "node": "ge5cc30ddda55f8f402bf6ce19c05a479a58ec944",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -4178,9 +4178,10 @@ never this session's own.
4178
4178
  - Do NOT run `git push`, `git commit`, or any command that writes to a repo \
4179
4179
  checkout — this session files issues and queues work, it does not touch code.
4180
4180
  - If an `enqueue-question`/`enqueue-status`/`decision` command refuses with \
4181
- a thin-client error (this machine isn't the daemon host and isn't routed \
4182
- yet — #2751), say so explicitly to the operator rather than silently \
4183
- dropping the Ask/Propose; do not retry it as some other command.
4181
+ a thin-client error (this machine does not claim every repo the submission \
4182
+ maps to — #2995/#2751; it should not happen, since you were only dispatched \
4183
+ here because it does), say so explicitly to the operator rather than \
4184
+ silently dropping the Ask/Propose; do not retry it as some other command.
4184
4185
  - Keep the operator informed: summarize your plan before writing anything, \
4185
4186
  and report back what you asked/proposed/filed/queued/linked (and any gap) \
4186
4187
  when done.\
@@ -50,6 +50,18 @@ _log = logging.getLogger(__name__)
50
50
  # same exhausted budget the way an unbounded conflict-fix retry would.
51
51
  MAX_CI_FIX_DISPATCHES = 2
52
52
 
53
+ # #3011: a ci-fix leg that finishes with the branch HEAD unchanged (see
54
+ # `dispatch_was_noop`) is refunded and does NOT count toward
55
+ # MAX_CI_FIX_DISPATCHES above — but that refund must itself be bounded, or
56
+ # two workers that keep (correctly) declining could cycle forever without
57
+ # ever reaching a verdict. Same magnitude as MAX_CI_FIX_DISPATCHES for the
58
+ # same "a couple of genuine signals is enough" reasoning: once this many
59
+ # CONSECUTIVE legs come back having pushed nothing, that itself is the
60
+ # verdict — the failure is not attributable to this branch — and
61
+ # `coord.commands.merge._dispatch_ci_fixes` escalates to HUMAN_REQUIRED
62
+ # with a reason that says so, distinct from the generic retry-cap message.
63
+ MAX_CI_FIX_NOOP_STREAK = 2
64
+
53
65
  # Prefix on the dispatched fix worker's issue_title — mirrors
54
66
  # `conflict_fix.SEMANTIC_FIX_TITLE_PREFIX`'s visibility purpose: the TUI
55
67
  # Pipeline row and the fix briefing itself both make it obvious WHY this
@@ -123,6 +135,47 @@ def _has_active_fix(board: Board, entry: QueuedMerge) -> bool:
123
135
  return False
124
136
 
125
137
 
138
+ def dispatch_was_noop(entry: QueuedMerge) -> bool:
139
+ """True when the LAST ci-fix dispatch for *entry* completed with the
140
+ branch HEAD unchanged — the worker correctly concluded the CI failure
141
+ wasn't its to fix and pushed no commit, rather than genuinely attempting
142
+ a fix. Compares the live, per-tick-refreshed ``entry.branch_head_sha``
143
+ (see ``coord.merge_queue.process``'s freshness-anchor refresh, which
144
+ runs before a ``checks_failed`` event is ever emitted) against
145
+ ``entry.ci_fix_head_sha``, the sha :func:`dispatch_ci_fix` snapshotted
146
+ at the moment of that dispatch.
147
+
148
+ Both empty (no ci-fix ever dispatched for this streak, or a probe
149
+ failure left the current SHA unknown) reads as ``False`` — fails
150
+ closed, same as every other SHA-staleness check in this codebase
151
+ (#821): "we can't tell" must never be treated as "we can tell it
152
+ didn't move".
153
+ """
154
+ return (
155
+ bool(entry.ci_fix_head_sha)
156
+ and bool(entry.branch_head_sha)
157
+ and entry.ci_fix_head_sha == entry.branch_head_sha
158
+ )
159
+
160
+
161
+ def refund_noop_ci_fix(entry: QueuedMerge) -> None:
162
+ """Undo the attempt :func:`dispatch_ci_fix` speculatively spent for a
163
+ leg that turned out to be a no-op (:func:`dispatch_was_noop` is
164
+ ``True``), and track the no-op streak separately so it cannot cycle
165
+ forever without ever reaching a verdict — see
166
+ :data:`MAX_CI_FIX_NOOP_STREAK`.
167
+
168
+ Called by ``coord.commands.merge._dispatch_ci_fixes`` BEFORE it decides
169
+ whether to dispatch again for this entry's event; the caller is
170
+ responsible for checking ``entry.ci_fix_noop_streak`` against the cap
171
+ afterwards and escalating/persisting as needed, same division of
172
+ responsibility as :func:`dispatch_ci_fix` itself.
173
+ """
174
+ entry.ci_fix_dispatches = max(0, entry.ci_fix_dispatches - 1)
175
+ entry.ci_fix_noop_streak += 1
176
+ entry.ci_fix_head_sha = ""
177
+
178
+
126
179
  def dispatch_ci_fix(
127
180
  entry: QueuedMerge,
128
181
  board: Board,
@@ -146,6 +199,14 @@ def dispatch_ci_fix(
146
199
  only a successful dispatch spends the budget, mirroring how
147
200
  ``ci_infra_reruns``/``ci_flaky_reruns`` are only bumped when their
148
201
  respective remedy actually fired.
202
+
203
+ #3011: a successful dispatch also snapshots ``entry.branch_head_sha``
204
+ into ``entry.ci_fix_head_sha`` so a later tick can tell whether this
205
+ leg actually moved the branch — see ``dispatch_was_noop``/
206
+ ``refund_noop_ci_fix``. Callers are expected to check
207
+ ``dispatch_was_noop(entry)`` and route through ``refund_noop_ci_fix``
208
+ BEFORE calling this function again for the same entry, so a worker
209
+ that pushed nothing doesn't silently spend a second real attempt.
149
210
  """
150
211
  if entry.ci_fix_dispatches >= MAX_CI_FIX_DISPATCHES:
151
212
  return None
@@ -181,6 +242,29 @@ def dispatch_ci_fix(
181
242
  # purpose as conflict_fix's SEMANTIC_FIX_TITLE_PREFIX.
182
243
  fix.issue_title = f"{CI_FIX_TITLE_PREFIX} {work.issue_title}"
183
244
 
245
+ # #3011: if a PRIOR dispatch's snapshot is still on the entry and the
246
+ # branch has since moved past it, that prior leg was a genuine attempt
247
+ # (not a no-op) — clear any no-op streak it may have left behind so it
248
+ # doesn't linger into this fresh attempt. (When the branch has NOT
249
+ # moved, the caller — `coord.commands.merge._dispatch_ci_fixes` — is
250
+ # expected to have already routed through `dispatch_was_noop`/
251
+ # `refund_noop_ci_fix` instead of reaching here; this is a harmless
252
+ # no-op in that case too, since `entry.ci_fix_noop_streak` would already
253
+ # be 0 for a caller that follows the intended sequencing.)
254
+ if (
255
+ entry.ci_fix_head_sha
256
+ and entry.branch_head_sha
257
+ and entry.ci_fix_head_sha != entry.branch_head_sha
258
+ ):
259
+ entry.ci_fix_noop_streak = 0
260
+
261
+ # Snapshot the current branch HEAD so a later tick can tell whether
262
+ # THIS dispatch's leg actually moved the branch (see
263
+ # `dispatch_was_noop`). `branch_head_sha` may itself be None (a probe
264
+ # failure) — falls back to "" so an unknown SHA never spuriously reads
265
+ # as "no ci-fix dispatch pending" on the next comparison.
266
+ entry.ci_fix_head_sha = entry.branch_head_sha or ""
267
+
184
268
  entry.ci_fix_dispatches += 1
185
269
 
186
270
  from coord.audit import record_audit # noqa: PLC0415
@@ -835,6 +835,36 @@ def fetch_portal_link(
835
835
  return link if isinstance(link, dict) else None
836
836
 
837
837
 
838
+ def fetch_portal_link_by_submission(
839
+ svc: ServiceConfig, submission_id: str, *, timeout: float = _DEFAULT_TIMEOUT
840
+ ) -> dict | None:
841
+ """GET the portal link for *submission_id* by reverse lookup (#2995) —
842
+ the submission-keyed counterpart to :func:`fetch_portal_link`'s
843
+ ``(repo_name, milestone_number/issue_number)``-keyed one.
844
+
845
+ Backs :func:`coord.portal_store.get_link_by_submission` on a thin
846
+ client — needed once ``coord portal enqueue-status``'s #2996 "no link on
847
+ file" warning became reachable from one. Fail-soft to ``None`` on any
848
+ transport/HTTP/decode error, same reasoning as :func:`fetch_portal_link`:
849
+ a daemon hiccup degrades to the same "not linked" a genuinely unlinked
850
+ submission would show, rather than a traceback, for a read that only
851
+ ever gates a warning.
852
+ """
853
+ try:
854
+ resp = httpx.get(
855
+ f"{svc.url}/portal-link-by-submission",
856
+ params={"submission_id": submission_id},
857
+ headers=_headers(svc),
858
+ timeout=timeout,
859
+ )
860
+ resp.raise_for_status()
861
+ data = resp.json()
862
+ except (httpx.HTTPError, ValueError):
863
+ return None
864
+ link = data.get("link") if isinstance(data, dict) else None
865
+ return link if isinstance(link, dict) else None
866
+
867
+
838
868
  def fetch_portal_ledger(
839
869
  svc: ServiceConfig, submission_id: str, *, timeout: float = _DEFAULT_TIMEOUT
840
870
  ) -> dict:
@@ -569,13 +569,43 @@ def _dispatch_ci_fixes(events, config, *, dry_run: bool) -> None:
569
569
  is never reprocessed by a later ``process()`` call (it only acts on
570
570
  ``PENDING`` entries) so whichever caller sees the event first must also
571
571
  be the one to act on it.
572
+
573
+ #3011: before dispatching again, checks whether the entry's LAST ci-fix
574
+ leg was a no-op — the branch HEAD is unchanged from
575
+ ``entry.ci_fix_head_sha``, the snapshot ``dispatch_ci_fix`` took when it
576
+ dispatched that leg. A no-op means a fresh worker looked at this
577
+ failure and pushed no commit — evidence the failure isn't attributable
578
+ to this branch, not evidence a fix attempt failed — so it is refunded
579
+ (``coord.ci_fix.refund_noop_ci_fix``) rather than counted toward
580
+ ``MAX_CI_FIX_DISPATCHES``. Consecutive no-ops are bounded separately by
581
+ ``MAX_CI_FIX_NOOP_STREAK``, escalating to ``HUMAN_REQUIRED`` with a
582
+ distinct reason once THAT cap is hit — the goal being that a human is
583
+ called in because a worker genuinely tried and failed, or because the
584
+ failure is provably not this branch's, never because two correct
585
+ declines were miscounted as two failed attempts.
586
+
587
+ Before trusting ``dispatch_was_noop`` at all, first checks ``coord.
588
+ ci_fix._has_active_fix`` — the SHA comparison alone cannot distinguish
589
+ "the fix worker finished and declined to push" from "the fix worker is
590
+ still running and just hasn't pushed yet" (a dispatched leg stays
591
+ PENDING for its whole lifetime, so the very next tick after dispatch
592
+ would otherwise read as a noop). While a fix is still active, the entry
593
+ is left untouched — no refund, no streak bump, no new dispatch — for
594
+ the next tick to re-check.
572
595
  """
573
596
  ci_events = [ev for ev in events if ev.kind == "checks_failed"]
574
597
  if not ci_events or dry_run:
575
598
  return
576
599
 
577
600
  from coord.audit import record_audit # noqa: PLC0415
578
- from coord.ci_fix import MAX_CI_FIX_DISPATCHES, dispatch_ci_fix # noqa: PLC0415
601
+ from coord.ci_fix import ( # noqa: PLC0415
602
+ MAX_CI_FIX_DISPATCHES,
603
+ MAX_CI_FIX_NOOP_STREAK,
604
+ _has_active_fix,
605
+ dispatch_ci_fix,
606
+ dispatch_was_noop,
607
+ refund_noop_ci_fix,
608
+ )
579
609
  from coord.merge_queue import HUMAN_REQUIRED # noqa: PLC0415
580
610
  from coord.state import load_board, save_board # noqa: PLC0415
581
611
 
@@ -585,6 +615,83 @@ def _dispatch_ci_fixes(events, config, *, dry_run: bool) -> None:
585
615
  dispatched_any = False
586
616
  for ev in ci_events:
587
617
  entry = ev.entry
618
+ # #3011 follow-up: `dispatch_was_noop` only compares the SHA
619
+ # snapshotted at dispatch time against the current branch head — it
620
+ # cannot tell "the fix worker finished and declined to push" apart
621
+ # from "the fix worker is still running and just hasn't pushed yet".
622
+ # A dispatched leg stays PENDING for its whole lifetime (`process()`
623
+ # never mutates entry.state for this path), so on the very next tick
624
+ # after dispatch the SHA still matches and `dispatch_was_noop` would
625
+ # read `True` for a leg that hasn't even had a chance to push.
626
+ # `_has_active_fix` is the same in-flight guard `dispatch_ci_fix`
627
+ # itself checks before dispatching — treat "still running" as "still
628
+ # pending" here too: skip the noop/refund accounting entirely and
629
+ # leave the entry untouched for the next tick, exactly like the
630
+ # generic "already in flight" decline below.
631
+ if _has_active_fix(fix_board, entry):
632
+ click.echo(
633
+ f" {entry.repo_name} #{entry.issue_number}: "
634
+ "ci-fix already in flight — will re-check next run"
635
+ )
636
+ continue
637
+ if dispatch_was_noop(entry):
638
+ refund_noop_ci_fix(entry)
639
+ dispatched_any = True
640
+ if entry.ci_fix_noop_streak >= MAX_CI_FIX_NOOP_STREAK:
641
+ entry.state = HUMAN_REQUIRED
642
+ click.echo(
643
+ f" {entry.repo_name} #{entry.issue_number}: "
644
+ f"{entry.ci_fix_noop_streak} consecutive ci-fix workers "
645
+ "pushed no commit — not attributable to this branch, "
646
+ "manual resolution required"
647
+ )
648
+ record_audit(
649
+ tier="operational",
650
+ category="merge",
651
+ event_type="ci_fix_not_attributable",
652
+ actor="daemon",
653
+ summary=(
654
+ f"ci-fix not attributable to branch: "
655
+ f"{entry.repo_name}#{entry.issue_number} — "
656
+ f"{entry.ci_fix_noop_streak} consecutive fix "
657
+ "workers pushed no commit; manual resolution "
658
+ "required"
659
+ ),
660
+ repo=entry.repo_name,
661
+ issue=entry.issue_number,
662
+ assignment_id=entry.assignment_id,
663
+ details={
664
+ "reason": "ci_fix_noop_streak",
665
+ "ci_fix_noop_streak": entry.ci_fix_noop_streak,
666
+ "error": entry.error,
667
+ },
668
+ )
669
+ else:
670
+ click.echo(
671
+ f" {entry.repo_name} #{entry.issue_number}: "
672
+ "ci-fix leg pushed no commit — refunding attempt "
673
+ f"({entry.ci_fix_dispatches}/{MAX_CI_FIX_DISPATCHES} "
674
+ "real attempts spent), will retry next run"
675
+ )
676
+ record_audit(
677
+ tier="operational",
678
+ category="merge",
679
+ event_type="ci_fix_noop_refunded",
680
+ actor="daemon",
681
+ summary=(
682
+ f"ci-fix leg was a no-op (branch head unchanged): "
683
+ f"{entry.repo_name}#{entry.issue_number} — attempt "
684
+ "refunded, not counted toward the retry cap"
685
+ ),
686
+ repo=entry.repo_name,
687
+ issue=entry.issue_number,
688
+ assignment_id=entry.assignment_id,
689
+ details={
690
+ "ci_fix_dispatches": entry.ci_fix_dispatches,
691
+ "ci_fix_noop_streak": entry.ci_fix_noop_streak,
692
+ },
693
+ )
694
+ continue
588
695
  fix = dispatch_ci_fix(entry, fix_board, config, checks_summary=ev.message)
589
696
  if fix is not None:
590
697
  click.echo(
@@ -64,6 +64,23 @@ exactly like an inbound ``question.answered`` event does, flags it relayed
64
64
  so it never reads as the client's own words, and folds the submission off
65
65
  ``needs-input``. Same daemon-routed shape (``POST /portal-note`` /
66
66
  ``POST /portal-answer``) and the same reason.
67
+
68
+ **``enqueue-question`` and ``enqueue-status`` are the last two, and the odd
69
+ ones out (#2995).** Every exception above routes unconditionally — any
70
+ machine in the fleet may be where the operator is typing. These two widen
71
+ the routed set instead of dropping the guard: ``coord portal decompose-chat
72
+ --interactive`` is dispatched only to a machine that claims the
73
+ submission's mapped repo(s) (#2750), and the Ask move — the one exit that
74
+ session could not take from a thin client, the gap this issue closes — is
75
+ exactly what these two commands queue. So they route through the daemon
76
+ (``POST /portal-enqueue-question`` / ``POST /portal-enqueue-status``) only
77
+ when :func:`_refuse_unless_claiming_machine` confirms the calling machine
78
+ claims every mapped repo; a non-claiming thin client still refuses, same as
79
+ every command at the top of this file. ``enqueue-question`` queues two rows
80
+ (the question and its ``needs-input`` announcement, #2901) — the daemon
81
+ applies both in the ONE request, so a partial application can never leave a
82
+ question with no status row behind it (the mute-question failure #2901
83
+ exists to prevent).
67
84
  """
68
85
 
69
86
  from __future__ import annotations
@@ -98,10 +115,11 @@ def _actor() -> str:
98
115
  def _refuse_if_thin_client(cmd_name: str) -> None:
99
116
  """Refuse *cmd_name* when this machine isn't the daemon host (#2336).
100
117
 
101
- ``sync``/``outbox``/``events``/``enqueue-*``/``requeue`` read and write
102
- the daemon's own ``~/.coord/coord.db`` directly — there is no daemon
103
- proxy for portal state yet (unlike ``coord status``/``coord log``/etc,
104
- which already route through ``board_service`` when it's configured; see
118
+ ``sync``/``outbox``/``events``/``enqueue-design-round``/
119
+ ``enqueue-preview``/``requeue`` read and write the daemon's own
120
+ ``~/.coord/coord.db`` directly — there is no daemon proxy for portal
121
+ state yet (unlike ``coord status``/``coord log``/etc, which already
122
+ route through ``board_service`` when it's configured; see
105
123
  ``coord/client.py``'s module docstring for the bootstrap contract). Run
106
124
  on a machine that has ``board_service`` set in ``~/.coord/client.toml``
107
125
  (a thin client, by definition — every other machine in the fleet that
@@ -111,6 +129,10 @@ def _refuse_if_thin_client(cmd_name: str) -> None:
111
129
  unnoticed on the daemon host for over an hour because every portal
112
130
  command run from a thin client reported nothing pending).
113
131
 
132
+ ``enqueue-question``/``enqueue-status`` used to be in that list too —
133
+ see :func:`_refuse_unless_claiming_machine` below (#2995) for why they
134
+ no longer call this at all.
135
+
114
136
  Mirrors the guard already used for the same reason in
115
137
  ``coord.commands.drive_queue``'s ``diagnose`` command (#615/#906), which
116
138
  refuses rather than "diagnose an empty queue" on a thin client. The
@@ -137,6 +159,101 @@ def _refuse_if_thin_client(cmd_name: str) -> None:
137
159
  )
138
160
 
139
161
 
162
+ def _missing_claimed_repos(machine, repos: list[str]) -> list[str]:
163
+ """Repos in REPOS that MACHINE does not claim — the "does this machine
164
+ claim every repo this submission maps to" predicate, in exactly one
165
+ place (#2995 review, #2085/#2096 "one question, one answer").
166
+
167
+ ``machine is None`` (this box isn't a configured machine in
168
+ ``coordinator.yml`` at all) counts every repo as unclaimed — an
169
+ unconfigured machine claims nothing. Shared by
170
+ :func:`_refuse_unless_claiming_machine` (above) and
171
+ ``_run_decompose_chat_interactive`` (further down this module): both
172
+ ask this exact question before letting a thin/local client touch a
173
+ submission's mapped repo(s), and before this helper existed they asked
174
+ it with two independently-written comprehensions that happened to agree
175
+ only because they were written together in the same commit — nothing
176
+ kept them in sync if either changed later. Callers keep their own
177
+ branching for the ``machine is None`` case where they want a distinct
178
+ message/exit path (``_run_decompose_chat_interactive`` does); this only
179
+ answers "which repos are missing," never how to report it.
180
+ """
181
+ if machine is None:
182
+ return list(repos)
183
+ return [r for r in repos if not machine.can_work_on(r)]
184
+
185
+
186
+ def _refuse_unless_claiming_machine(cfg, submission_id: str, cmd_name: str) -> None:
187
+ """Refuse *cmd_name* on a thin client that does not claim every repo
188
+ SUBMISSION_ID maps to (#2995). A no-op on the daemon host itself.
189
+
190
+ ``enqueue-question``/``enqueue-status`` are the Ask move's exit — the
191
+ one thing `coord portal decompose-chat --interactive` could not do from
192
+ a thin client that claims the submission's repo(s), even though that
193
+ session is explicitly allowed to run there (#2750). Unlike ``note``/
194
+ ``decision``/``link``/``answer`` (#2751/#2867/#2986), which route
195
+ unconditionally — any machine in the fleet may be where the operator is
196
+ typing — this widens the refused set rather than dropping it: a
197
+ ``type="decomposition-chat"`` session is never dispatched to a machine
198
+ that doesn't claim the submission's repo(s) in the first place
199
+ (:func:`coord.decomposition_chat.pick_decomposition_chat_machine`), so a
200
+ caller invoking these commands directly from one that *doesn't* claim
201
+ them is either a mistake or a machine that has no business writing
202
+ against this submission's outbox — that machine still refuses, exactly
203
+ like every other state-touching command in this file.
204
+
205
+ Repos are resolved the same thin-client-safe way
206
+ ``_run_decompose_chat_interactive`` already does before ever launching a
207
+ session (see that function, further down in this module), and for the
208
+ identical reason:
209
+ :func:`coord.decomposition_chat.resolve_approved_submission`, itself
210
+ routed through the daemon's ``GET /board``. A submission that isn't
211
+ currently a recorded ``approved`` sign-off — the only shape that
212
+ projection carries — cannot be claim-checked from here at all, and this
213
+ refuses rather than guess at a repo list it cannot verify.
214
+ """
215
+ from coord.board_service import resolve # noqa: PLC0415
216
+
217
+ svc = resolve()
218
+ if svc is None:
219
+ return
220
+ from urllib.parse import urlparse # noqa: PLC0415
221
+
222
+ from coord.decomposition_chat import resolve_approved_submission # noqa: PLC0415
223
+ from coord.test_orchestrator import local_machine # noqa: PLC0415
224
+
225
+ host = urlparse(svc.url).hostname or svc.url
226
+ submission = resolve_approved_submission(cfg, submission_id)
227
+ if submission is None:
228
+ raise click.ClickException(
229
+ f"coord portal {cmd_name} refuses: submission {submission_id!r} is "
230
+ "not a currently-approved portal submission, so its mapped "
231
+ "repo(s) cannot be resolved from this thin client to verify a "
232
+ "claim. Run it over `ssh` on the daemon host "
233
+ f"({host}) instead. See coord/skills/portal-followup/SKILL.md."
234
+ )
235
+ repos: list[str] = submission.get("repos") or []
236
+ machine = local_machine(cfg)
237
+ missing = _missing_claimed_repos(machine, repos)
238
+ if not repos or missing:
239
+ reason = (
240
+ f"submission {submission_id!r} has no mapped repo (portal."
241
+ "project_repos in coordinator.yml)"
242
+ if not repos
243
+ else (
244
+ f"this machine ({machine.name if machine is not None else 'unconfigured'}) "
245
+ f"does not claim repo(s) {', '.join(missing)} that submission "
246
+ f"{submission_id!r} maps to ({', '.join(repos)})"
247
+ )
248
+ )
249
+ raise click.ClickException(
250
+ f"coord portal {cmd_name} refuses: {reason}. Run it over `ssh` on "
251
+ f"the daemon host ({host}) instead, or from a machine that claims "
252
+ "every repo the submission maps to. See "
253
+ "coord/skills/portal-followup/SKILL.md."
254
+ )
255
+
256
+
140
257
  @click.group("portal")
141
258
  def portal_group() -> None:
142
259
  """coord-portal sync bridge — status, manual push, heartbeat (#2179)."""
@@ -439,11 +556,11 @@ def portal_link(
439
556
  "headless dispatch. Local-only for now (Track B / #486 is remote): "
440
557
  "refuses when this machine does not claim every repo SUBMISSION_ID "
441
558
  "maps to. On a thin client (this machine has `board_service` "
442
- "configured), `coord portal decision`/`ledger`/`link` route through "
443
- "the daemon (#2751) but `enqueue-question`/`enqueue-status` do not "
444
- "yet — an Ask-shaped iteration will refuse loudly mid-conversation "
445
- "on those; ssh to the daemon host instead for that case. Mutually "
446
- "exclusive with --wait/--machine/--timeout/--interval."
559
+ "configured), `coord portal decision`/`ledger`/`link`/`note`/"
560
+ "`answer` and (#2995) `enqueue-question`/`enqueue-status` — "
561
+ "including the Ask move — all route through the daemon, so every "
562
+ "exit an iteration can take works from here. Mutually exclusive "
563
+ "with --wait/--machine/--timeout/--interval."
447
564
  ),
448
565
  )
449
566
  @click.option(
@@ -657,7 +774,7 @@ def _run_decompose_chat_interactive(
657
774
  err=True,
658
775
  )
659
776
  raise SystemExit(2)
660
- missing = [r for r in repos if not machine.can_work_on(r)]
777
+ missing = _missing_claimed_repos(machine, repos)
661
778
  if missing:
662
779
  click.echo(
663
780
  f"error: --interactive is local-only for now (Track B / #486 is "
@@ -669,19 +786,12 @@ def _run_decompose_chat_interactive(
669
786
  )
670
787
  raise SystemExit(2)
671
788
 
672
- from coord import board_service as _board_service # noqa: PLC0415
673
-
674
- if _board_service.resolve() is not None:
675
- click.secho(
676
- "note: this machine is a thin client — `coord portal decision`/"
677
- "`ledger`/`link`/`note` route through the daemon (#2751/#2867), "
678
- "but `coord "
679
- "portal enqueue-question`/`enqueue-status` (the Ask move) do "
680
- "not yet and will refuse loudly if this iteration needs them. "
681
- "ssh to the daemon host for that case (#2750's own stated "
682
- "limit).",
683
- fg="yellow",
684
- )
789
+ # #2995: no thin-client caveat left to print here — `decision`/`ledger`/
790
+ # `link`/`note`/`answer` (#2751/#2867/#2986) and now `enqueue-question`/
791
+ # `enqueue-status` (the Ask move's exit) all route through the daemon
792
+ # from exactly this machine, which the claim check above just verified
793
+ # claims every repo SUBMISSION_ID maps to. A prior revision warned here
794
+ # that the Ask move would "refuse loudly" — no longer true.
685
795
 
686
796
  topology_context = repo_topology_context(cfg, repos)
687
797
  discuss_mode, discuss_reason = select_discuss_mode(cfg, submission, discuss_override=discuss)
@@ -1335,9 +1445,10 @@ def _echo_enqueued(row: "OutboxRow", label: str) -> None:
1335
1445
 
1336
1446
 
1337
1447
  @portal_group.command("enqueue-status")
1448
+ @_CONFIG_OPTION
1338
1449
  @click.argument("submission_id")
1339
1450
  @click.argument("status", type=click.Choice(SUBMISSION_STATUSES))
1340
- def portal_enqueue_status(submission_id: str, status: str) -> None:
1451
+ def portal_enqueue_status(config_path, submission_id: str, status: str) -> None:
1341
1452
  """Queue an up-mapped status for SUBMISSION_ID (sent on the next sync).
1342
1453
 
1343
1454
  Unlike `push`, this allocates the revision for you and refuses a status
@@ -1359,8 +1470,15 @@ def portal_enqueue_status(submission_id: str, status: str) -> None:
1359
1470
  sends the push regardless — there are legitimate reasons to set any of
1360
1471
  these by hand (a correction, a re-sync, an out-of-band delivery) — it
1361
1472
  only makes the consequence visible first.
1473
+
1474
+ **#2995: routes through the daemon on a thin client that claims
1475
+ SUBMISSION_ID's mapped repo(s)**, instead of refusing outright like
1476
+ every other state-touching ``enqueue-*`` command — see
1477
+ :func:`_refuse_unless_claiming_machine`. This is the ``enqueue-status``
1478
+ half of the Ask move's exit; ``enqueue-question`` below is the other.
1362
1479
  """
1363
- _refuse_if_thin_client("enqueue-status")
1480
+ cfg = _load_config(config_path)
1481
+ _refuse_unless_claiming_machine(cfg, submission_id, "enqueue-status")
1364
1482
 
1365
1483
  from coord.approved_work import is_pulled_status # noqa: PLC0415
1366
1484
  from coord.portal_sync import PortalSyncError, enqueue_status # noqa: PLC0415
@@ -1385,9 +1503,19 @@ def portal_enqueue_status(submission_id: str, status: str) -> None:
1385
1503
  fg="yellow",
1386
1504
  )
1387
1505
 
1506
+ import httpx # noqa: PLC0415
1507
+
1388
1508
  try:
1389
- row = enqueue_status(submission_id, status)
1390
- except PortalSyncError as exc:
1509
+ row = enqueue_status(submission_id, status, config=cfg)
1510
+ except (PortalSyncError, httpx.HTTPStatusError) as exc:
1511
+ # #2995 fix-round: routed through the daemon (see
1512
+ # `_refuse_unless_claiming_machine` above), a rejection comes back
1513
+ # as `httpx.HTTPStatusError` (`board_service.route_write` →
1514
+ # `client.post_record`), not `PortalSyncError` — the daemon-host
1515
+ # path's identical rejection (e.g. an announcing status with
1516
+ # nothing queued) never reaches `post_record` at all. Without this,
1517
+ # a thin-client caller saw a raw traceback where a daemon-host
1518
+ # caller got this same clean red message.
1391
1519
  click.secho(str(exc), fg="red")
1392
1520
  raise SystemExit(1) from exc
1393
1521
  _echo_enqueued(row, f"status={status}")
@@ -1444,23 +1572,38 @@ def portal_enqueue_preview(submission_id: str, preview_url: str) -> None:
1444
1572
 
1445
1573
 
1446
1574
  @portal_group.command("enqueue-question")
1575
+ @_CONFIG_OPTION
1447
1576
  @click.argument("submission_id")
1448
1577
  @click.argument("question")
1449
- def portal_enqueue_question(submission_id: str, question: str) -> None:
1578
+ def portal_enqueue_question(config_path, submission_id: str, question: str) -> None:
1450
1579
  """Queue an open question for SUBMISSION_ID (sent on the next sync).
1451
1580
 
1452
1581
  Also queues the `needs-input` status that announces it (#2901) — a
1453
1582
  question with no status row behind it sends no email, so this command
1454
1583
  always queues both rows in one call rather than leaving the second one
1455
- to a caller who might forget it.
1584
+ to a caller who might forget it. When routed through the daemon (see
1585
+ below), both rows are applied in that one request, so a crash or a
1586
+ dropped response can never leave the question queued without its
1587
+ announcement.
1588
+
1589
+ **#2995: routes through the daemon on a thin client that claims
1590
+ SUBMISSION_ID's mapped repo(s)**, instead of refusing outright — see
1591
+ :func:`_refuse_unless_claiming_machine`. This is the Ask move's other
1592
+ half; ``enqueue-status`` above is the one a plain status push uses.
1456
1593
  """
1457
- _refuse_if_thin_client("enqueue-question")
1594
+ cfg = _load_config(config_path)
1595
+ _refuse_unless_claiming_machine(cfg, submission_id, "enqueue-question")
1458
1596
 
1459
1597
  from coord.portal_sync import PortalSyncError, enqueue_question # noqa: PLC0415
1460
1598
 
1599
+ import httpx # noqa: PLC0415
1600
+
1461
1601
  try:
1462
- question_row, status_row = enqueue_question(submission_id, question)
1463
- except PortalSyncError as exc:
1602
+ question_row, status_row = enqueue_question(submission_id, question, config=cfg)
1603
+ except (PortalSyncError, httpx.HTTPStatusError) as exc:
1604
+ # #2995 fix-round: see the matching comment in `portal_enqueue_status`
1605
+ # above — a routed rejection surfaces as `httpx.HTTPStatusError`, not
1606
+ # `PortalSyncError`.
1464
1607
  click.secho(str(exc), fg="red")
1465
1608
  raise SystemExit(1) from exc
1466
1609
  _echo_enqueued(question_row, "question")