code-coordinator 0.5.308__tar.gz → 0.5.310__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 (818) hide show
  1. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/dispatch.py +22 -0
  5. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/drive_queue.py +90 -0
  6. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/github_ops.py +102 -0
  7. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/milestone_chat.py +22 -9
  8. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/mock_author.py +7 -1
  9. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_assign.py +62 -0
  10. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_drive_queue.py +159 -0
  11. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_milestone_chat.py +12 -0
  12. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_mock_author.py +33 -0
  13. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/.gitignore +0 -0
  26. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/GOAL.md +0 -0
  28. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/LICENSE +0 -0
  29. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/README.md +0 -0
  31. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/code_coordinator.egg-info/SOURCES.txt +0 -0
  32. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/code_coordinator.egg-info/dependency_links.txt +0 -0
  33. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/code_coordinator.egg-info/entry_points.txt +0 -0
  34. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/code_coordinator.egg-info/requires.txt +0 -0
  35. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/code_coordinator.egg-info/scm_file_list.json +0 -0
  36. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/approved_work.py +0 -0
  48. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/board_schema.py +0 -0
  52. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/ci_fix.py +0 -0
  59. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/ci_gitlab.py +0 -0
  61. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/cli.py +0 -0
  64. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/client.py +0 -0
  65. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/__init__.py +0 -0
  66. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/_common.py +0 -0
  67. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/acceptance.py +0 -0
  68. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/agent_ops.py +0 -0
  69. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/audit.py +0 -0
  70. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/dispatch_workers.py +0 -0
  72. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/drive.py +0 -0
  73. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/drive_queue.py +0 -0
  74. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/gate_a.py +0 -0
  75. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/gates.py +0 -0
  76. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/issues.py +0 -0
  77. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/lifecycle.py +0 -0
  78. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/machine.py +0 -0
  79. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/merge.py +0 -0
  80. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/portal.py +0 -0
  84. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/pr.py +0 -0
  85. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/release.py +0 -0
  86. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/repo.py +0 -0
  87. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/report.py +0 -0
  88. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/review.py +0 -0
  89. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/scorecard.py +0 -0
  90. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/sessions.py +0 -0
  91. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/setup.py +0 -0
  92. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/status.py +0 -0
  93. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/store_migrate.py +0 -0
  94. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/terminal.py +0 -0
  95. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/test_gate.py +0 -0
  96. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/commands/tui.py +0 -0
  97. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/comments.py +0 -0
  98. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/config.py +0 -0
  99. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/config_reload.py +0 -0
  100. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/confirm_test.py +0 -0
  101. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/conflict_fix.py +0 -0
  102. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/dao.py +0 -0
  103. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/dashboard/__init__.py +0 -0
  104. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/dashboard/fixture.py +0 -0
  105. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/dashboard/index.html +0 -0
  106. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/dashboard/server.py +0 -0
  107. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/dashboard/terminal.py +0 -0
  108. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/db.py +0 -0
  109. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/dead_end.py +0 -0
  110. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/decomposition_chat.py +0 -0
  111. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/README.md +0 -0
  112. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-agent.service +0 -0
  113. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-db-backup.service +0 -0
  114. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-db-backup.sh +0 -0
  115. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-db-backup.timer +0 -0
  116. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-drive-queue.service +0 -0
  117. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-drive-queue.timer +0 -0
  118. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-failure-notify.service +0 -0
  119. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-fleet-watchdog.service +0 -0
  120. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  121. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-notify.service +0 -0
  122. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-notify.timer +0 -0
  123. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-release-propagate.service +0 -0
  124. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-release-propagate.timer +0 -0
  125. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-release-window.service +0 -0
  126. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-release-window.timer +0 -0
  127. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-serve.service +0 -0
  128. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-web-dist-build.service +0 -0
  129. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-web-dist-build.timer +0 -0
  130. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy/coord-web.service +0 -0
  131. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy_manifest.py +0 -0
  132. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deploy_units.py +0 -0
  133. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deprecation_telemetry.py +0 -0
  134. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/deps.py +0 -0
  135. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/diagnose.py +0 -0
  136. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/dispatch.py +0 -0
  137. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/dist_name.py +0 -0
  138. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/drive.py +0 -0
  139. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/drive_state.py +0 -0
  140. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/events.py +0 -0
  141. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/failure_class.py +0 -0
  142. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/filelock.py +0 -0
  143. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/fleet_config_health.py +0 -0
  144. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/forge_availability.py +0 -0
  145. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/freshness.py +0 -0
  146. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/gate_a.py +0 -0
  147. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/gate_b.py +0 -0
  148. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/gate_snapshot.py +0 -0
  149. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/gates.py +0 -0
  150. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/github_throttle.py +0 -0
  151. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/goal.py +0 -0
  152. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/graph_health.py +0 -0
  153. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/__init__.py +0 -0
  154. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/aggregate.py +0 -0
  155. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/__init__.py +0 -0
  156. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/_ci_pin.py +0 -0
  157. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/agent_install.py +0 -0
  158. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/cargo_targets.py +0 -0
  159. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/claude_binary.py +0 -0
  160. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  161. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/coord_web_ci_pin.py +0 -0
  162. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/deploy_lane_facts.py +0 -0
  163. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/disk.py +0 -0
  164. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/fleet_board.py +0 -0
  165. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  166. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/fleet_phantom.py +0 -0
  167. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/fleet_unit_drift.py +0 -0
  168. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/graph.py +0 -0
  169. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/graphify_cli.py +0 -0
  170. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/index_lock.py +0 -0
  171. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/issues_sync_staleness.py +0 -0
  172. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/plan_usage.py +0 -0
  173. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/release_cordon.py +0 -0
  174. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/repo_state.py +0 -0
  175. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/spawned_coord.py +0 -0
  176. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/stalled_pipeline.py +0 -0
  177. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/timer_active.py +0 -0
  178. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/toolchain.py +0 -0
  179. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/unit_drift.py +0 -0
  180. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/unit_enablement.py +0 -0
  181. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/wedged_drive_queue.py +0 -0
  182. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/checks/worktrees.py +0 -0
  183. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/cli.py +0 -0
  184. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/context.py +0 -0
  185. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/fleet_snapshot.py +0 -0
  186. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/models.py +0 -0
  187. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/pypi.py +0 -0
  188. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/registry.py +0 -0
  189. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/render.py +0 -0
  190. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/health/units.py +0 -0
  191. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/hooks.py +0 -0
  192. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/housekeeping.py +0 -0
  193. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/interactive.py +0 -0
  194. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/issue_store.py +0 -0
  195. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/issues_sync_status.py +0 -0
  196. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/liveness_auditor.py +0 -0
  197. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/machine_onboard.py +0 -0
  198. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/machine_pause.py +0 -0
  199. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/merge_queue.py +0 -0
  200. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/milestone_dispatch.py +0 -0
  201. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/milestone_gate.py +0 -0
  202. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/milestone_order.py +0 -0
  203. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/models.py +0 -0
  204. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/network.py +0 -0
  205. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/new_issue_chat.py +0 -0
  206. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/__init__.py +0 -0
  207. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/baseline.py +0 -0
  208. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/cli.py +0 -0
  209. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/collect.py +0 -0
  210. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/digest.py +0 -0
  211. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/models.py +0 -0
  212. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/predicate.py +0 -0
  213. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/service.py +0 -0
  214. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/store.py +0 -0
  215. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notifier/transport.py +0 -0
  216. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/notify.py +0 -0
  217. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/openapi.py +0 -0
  218. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/overlap_fence.py +0 -0
  219. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/overlap_predict.py +0 -0
  220. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/parentage.py +0 -0
  221. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/parentage_github.py +0 -0
  222. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/pipeline.py +0 -0
  223. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/plan_parser.py +0 -0
  224. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/plans.py +0 -0
  225. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/platform_paths.py +0 -0
  226. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/portal_bridge.py +0 -0
  227. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/portal_store.py +0 -0
  228. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/portal_sync.py +0 -0
  229. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/pr_body_lint.py +0 -0
  230. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/prereqs.py +0 -0
  231. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/progress.py +0 -0
  232. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/providers/__init__.py +0 -0
  233. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/providers/base.py +0 -0
  234. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/providers/claude.py +0 -0
  235. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/providers/claude_pty.py +0 -0
  236. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/providers/opencode.py +0 -0
  237. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/queue_diagnose.py +0 -0
  238. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/reconcile.py +0 -0
  239. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/reconcile_tick.py +0 -0
  240. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/refine_chat.py +0 -0
  241. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/release_cordon.py +0 -0
  242. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/release_propagate.py +0 -0
  243. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/release_verify.py +0 -0
  244. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/release_window.py +0 -0
  245. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/repo_edit.py +0 -0
  246. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/repo_onboard.py +0 -0
  247. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/reports.py +0 -0
  248. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/rest_schema.py +0 -0
  249. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/revalidate.py +0 -0
  250. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/review.py +0 -0
  251. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/scorecard.py +0 -0
  252. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/self_health.py +0 -0
  253. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/serve_app.py +0 -0
  254. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  255. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  256. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  257. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  258. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  259. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/portal-followup/SKILL.md +0 -0
  260. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/release-now/SKILL.md +0 -0
  261. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  262. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  263. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/skills/update-issue/SKILL.md +0 -0
  264. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/smoke.py +0 -0
  265. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/spend_ceiling.py +0 -0
  266. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/split_work.py +0 -0
  267. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/sql.py +0 -0
  268. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/stage_projection.py +0 -0
  269. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/state.py +0 -0
  270. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/store_migrate.py +0 -0
  271. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/test_author.py +0 -0
  272. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/test_chat.py +0 -0
  273. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/test_orchestrator.py +0 -0
  274. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/test_report.py +0 -0
  275. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/tui_release.py +0 -0
  276. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/usage.py +0 -0
  277. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/usage_limits.py +0 -0
  278. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/usage_rollup.py +0 -0
  279. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coord/worker_events.py +0 -0
  280. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/coordinator.example.yml +0 -0
  281. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-agent.service +0 -0
  282. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-db-backup.service +0 -0
  283. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-db-backup.sh +0 -0
  284. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-db-backup.timer +0 -0
  285. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-drive-queue.service +0 -0
  286. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-drive-queue.timer +0 -0
  287. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-failure-notify.service +0 -0
  288. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-failure-notify.sh +0 -0
  289. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-fleet-watchdog.service +0 -0
  290. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-fleet-watchdog.timer +0 -0
  291. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-notify.service +0 -0
  292. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-notify.timer +0 -0
  293. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-release-propagate.service +0 -0
  294. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-release-propagate.timer +0 -0
  295. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-release-window.service +0 -0
  296. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-release-window.timer +0 -0
  297. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-serve.service +0 -0
  298. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-web-dist-build.service +0 -0
  299. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-web-dist-build.sh +0 -0
  300. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-web-dist-build.timer +0 -0
  301. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-web-rollback.sh +0 -0
  302. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/coord-web.service +0 -0
  303. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/deploy/node-shim.sh +0 -0
  304. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/ADR_COORD_TUI_CI.md +0 -0
  305. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  306. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/ADR_COORD_WEB_CI.md +0 -0
  307. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/ADR_COORD_WEB_DIST.md +0 -0
  308. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  309. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/AGENT_OPERATIONS.md +0 -0
  310. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/ARCHITECTURE.md +0 -0
  311. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/ARCH_SECURITY_GATES.md +0 -0
  312. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/COCKPIT.md +0 -0
  313. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/CONTROL_CENTER.md +0 -0
  314. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/COST_DISCIPLINE.md +0 -0
  315. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/CROSS_PLATFORM.md +0 -0
  316. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/CUSTOMER_FACING_APPS.md +0 -0
  317. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/CUSTOMER_PORTAL.md +0 -0
  318. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/DRIVE_QUEUE.md +0 -0
  319. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/EPHEMERAL_WORKERS.md +0 -0
  320. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/FORGE_MIGRATION.md +0 -0
  321. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/GRAPHIFY_SETUP.md +0 -0
  322. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/ISSUE_GUIDANCE.md +0 -0
  323. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/MAC_MINI.md +0 -0
  324. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  325. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/NOTIFIER.md +0 -0
  326. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/OPENCODE_VERIFICATION.md +0 -0
  327. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/OPERATING_GOTCHAS.md +0 -0
  328. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/OPERATOR_GUIDES.md +0 -0
  329. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/ORACLE_LOOP.md +0 -0
  330. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/PHONE_WEBAPP.md +0 -0
  331. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/PIPELINE_V2.md +0 -0
  332. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/PLATFORM_EVOLUTION.md +0 -0
  333. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/SECOND_BACKEND.md +0 -0
  334. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/STORE_SERVICE.md +0 -0
  335. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  336. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/WEB_CONTROL_CENTER.md +0 -0
  337. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/WSL_WINDOWS_WORKER.md +0 -0
  338. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/mocks/web/README.md +0 -0
  339. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/mocks/web/_tokens.css +0 -0
  340. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/mocks/web/issue-detail.html +0 -0
  341. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/mocks/web/pipeline-narrow.html +0 -0
  342. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/docs/mocks/web/pipeline-wide.html +0 -0
  343. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/graphify-out/.gitignore +0 -0
  344. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/install-agent.sh +0 -0
  345. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/pyproject.toml +0 -0
  346. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/audit_review_verdict_overrides.py +0 -0
  347. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  348. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/build-worker-image.sh +0 -0
  349. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/coordinator-machine.py +0 -0
  350. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/epic-down.sh +0 -0
  351. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/epic-up.sh +0 -0
  352. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/preflight.sh +0 -0
  353. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/provision-worker.sh +0 -0
  354. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  355. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  356. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/azure-workers/verify-github-token.sh +0 -0
  357. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/check_gh_argv_containment.py +0 -0
  358. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/codegen.py +0 -0
  359. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/coord-test-runner.sh +0 -0
  360. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  361. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  362. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  363. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  364. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/coord-venv-rollback.sh +0 -0
  365. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/drive-batch.sh +0 -0
  366. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/extract-coord-tui.sh +0 -0
  367. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/fleet_watchdog.py +0 -0
  368. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/gen_board_fixture.py +0 -0
  369. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/gen_mock_index.py +0 -0
  370. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/next_release_tag.py +0 -0
  371. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/run_tests_in_populated_home.sh +0 -0
  372. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/run_tests_without_gh.sh +0 -0
  373. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/smoke_437_interactive.py +0 -0
  374. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/verify_878_review_capture.py +0 -0
  375. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/verify_release_published.py +0 -0
  376. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/scripts/verify_release_wheel.py +0 -0
  377. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/setup.cfg +0 -0
  378. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/SMOKE_SET.md +0 -0
  379. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/__init__.py +0 -0
  380. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-37/conftest.py +0 -0
  381. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-37/contract.md +0 -0
  382. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-37/manifest.yml +0 -0
  383. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  384. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  385. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-51/contract.md +0 -0
  386. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  387. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  388. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-51/manifest.yml +0 -0
  389. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  390. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-51/tsconfig.json +0 -0
  391. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  392. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/backends.py +0 -0
  393. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/conftest.py +0 -0
  394. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/board-pipeline-basic.json +0 -0
  395. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  396. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  397. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  398. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  399. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/playwright/all_pass.json +0 -0
  400. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  401. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/playwright/mixed_fail.json +0 -0
  402. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  403. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  404. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/playwright/skip.json +0 -0
  405. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/playwright/truncated.json +0 -0
  406. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  407. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  408. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  409. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  410. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  411. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  412. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  413. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  414. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_acceptance.py +0 -0
  415. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_acceptance_drivers.py +0 -0
  416. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent.py +0 -0
  417. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_api_error.py +0 -0
  418. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_app.py +0 -0
  419. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_branch_base.py +0 -0
  420. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_branch_capture.py +0 -0
  421. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_config_free_1712.py +0 -0
  422. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_deploy_units_endpoint.py +0 -0
  423. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_dirty_worktree.py +0 -0
  424. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  425. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_graph_self_heal.py +0 -0
  426. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_health_h3.py +0 -0
  427. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_idle_restart.py +0 -0
  428. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_push_failure.py +0 -0
  429. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_reap.py +0 -0
  430. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_repos_and_pull.py +0 -0
  431. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_restart_services_endpoint.py +0 -0
  432. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_skills_self_heal.py +0 -0
  433. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_startup_diagnostics.py +0 -0
  434. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_update.py +0 -0
  435. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_update_bluegreen.py +0 -0
  436. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_usage_limit.py +0 -0
  437. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_agent_zero_commit.py +0 -0
  438. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_ambient_home_isolation.py +0 -0
  439. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_approve_dependency_busy_2804.py +0 -0
  440. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_approve_reject_plan.py +0 -0
  441. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_approve_usage_gate.py +0 -0
  442. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_approved_work_2532.py +0 -0
  443. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_assignment_already_recorded_daemon.py +0 -0
  444. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_audit_log.py +0 -0
  445. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_audit_outcome.py +0 -0
  446. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_audit_query.py +0 -0
  447. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_auto_loop.py +0 -0
  448. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_auto_release_publish_2035.py +0 -0
  449. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_backend_selection.py +0 -0
  450. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_base_checkout_restore.py +0 -0
  451. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_block_log.py +0 -0
  452. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_board_cap_762.py +0 -0
  453. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_board_fixture.py +0 -0
  454. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_board_read_path.py +0 -0
  455. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_board_schema.py +0 -0
  456. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_board_service.py +0 -0
  457. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_board_state.py +0 -0
  458. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_board_wire.py +0 -0
  459. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_brain.py +0 -0
  460. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_branch_model.py +0 -0
  461. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_bug_intake.py +0 -0
  462. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_build_worker_image_env_update.py +0 -0
  463. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cargo_cache.py +0 -0
  464. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_check_gh_argv_containment.py +0 -0
  465. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_ci_acceptance_gate_1950.py +0 -0
  466. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_ci_fix.py +0 -0
  467. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_ci_gitlab.py +0 -0
  468. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_ci_parity_2091.py +0 -0
  469. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_ci_store.py +0 -0
  470. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_claim.py +0 -0
  471. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_claude_md_budget.py +0 -0
  472. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_acceptance.py +0 -0
  473. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  474. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_assign_interactive_remote.py +0 -0
  475. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_assign_provider.py +0 -0
  476. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  477. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_audit.py +0 -0
  478. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_chat_continue.py +0 -0
  479. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_decide.py +0 -0
  480. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_diagnose_capability_rules.py +0 -0
  481. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_diagnose_config_provenance.py +0 -0
  482. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_diagnose_forge_availability.py +0 -0
  483. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_diagnose_graph.py +0 -0
  484. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_diagnose_self.py +0 -0
  485. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_diagnose_test_coverage.py +0 -0
  486. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_doctor.py +0 -0
  487. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_doctor_config_free_1801.py +0 -0
  488. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  489. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_drive.py +0 -0
  490. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_drive_queue.py +0 -0
  491. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_escalate.py +0 -0
  492. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_fix_headless_review.py +0 -0
  493. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_gate_a.py +0 -0
  494. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_install_drift.py +0 -0
  495. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_install_skills.py +0 -0
  496. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_issue_comment.py +0 -0
  497. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_issue_create_label.py +0 -0
  498. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_issue_reopen.py +0 -0
  499. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_issue_view_list.py +0 -0
  500. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_merge.py +0 -0
  501. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_milestone_assign.py +0 -0
  502. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_milestone_capture.py +0 -0
  503. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_milestone_chat_add_child.py +0 -0
  504. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_milestone_dispatch.py +0 -0
  505. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_milestone_gate_b.py +0 -0
  506. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_milestone_gate_c.py +0 -0
  507. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_milestone_order.py +0 -0
  508. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  509. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_milestone_ship.py +0 -0
  510. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_network.py +0 -0
  511. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_new_issue_chat.py +0 -0
  512. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_plans.py +0 -0
  513. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_portal.py +0 -0
  514. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_pr.py +0 -0
  515. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_pull_artifact.py +0 -0
  516. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_queue.py +0 -0
  517. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_reattach_sessions.py +0 -0
  518. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_refine_board.py +0 -0
  519. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_release_preflight.py +0 -0
  520. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_release_propagate.py +0 -0
  521. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_release_window.py +0 -0
  522. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_repo_2220.py +0 -0
  523. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  524. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_scorecard.py +0 -0
  525. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_set_review_findings.py +0 -0
  526. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_status_advisory_terminal.py +0 -0
  527. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_status_contested_tag.py +0 -0
  528. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_status_merge_queue.py +0 -0
  529. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_status_provider.py +0 -0
  530. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_status_review_finalizing.py +0 -0
  531. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_status_test_failed_tag.py +0 -0
  532. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_status_usage_limit.py +0 -0
  533. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_sync_comments_873.py +0 -0
  534. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_test_plan.py +0 -0
  535. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_track.py +0 -0
  536. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_tui_update.py +0 -0
  537. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cli_wait.py +0 -0
  538. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_client_base_install.py +0 -0
  539. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_client_resource_migration_1946.py +0 -0
  540. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_commands_common.py +0 -0
  541. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_comments.py +0 -0
  542. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_completion_summary.py +0 -0
  543. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_config.py +0 -0
  544. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_config_acceptance.py +0 -0
  545. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_config_audit.py +0 -0
  546. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_config_pricing.py +0 -0
  547. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  548. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_config_usage_gate.py +0 -0
  549. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_confirm_test.py +0 -0
  550. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_conflict_fix.py +0 -0
  551. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_conflict_fix_semantic.py +0 -0
  552. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  553. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coord_test.py +0 -0
  554. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  555. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coord_test_runner_baseline.py +0 -0
  556. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coord_test_runner_populated_home.py +0 -0
  557. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coord_test_runner_routing.py +0 -0
  558. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coord_test_runner_toolchain.py +0 -0
  559. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coord_uat.py +0 -0
  560. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coord_web_sse_restart_live.py +0 -0
  561. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_coordinator_machine.py +0 -0
  562. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_cross_platform_imports.py +0 -0
  563. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_dao.py +0 -0
  564. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_dashboard.py +0 -0
  565. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_dashboard_fixture.py +0 -0
  566. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_dashboard_terminal.py +0 -0
  567. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_dashboard_terminal_live.py +0 -0
  568. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_db.py +0 -0
  569. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_dead_end.py +0 -0
  570. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_decomposition_chat.py +0 -0
  571. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deploy_coord_db_backup.py +0 -0
  572. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deploy_coord_web_dist.py +0 -0
  573. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deploy_coord_web_rollback.py +0 -0
  574. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deploy_drive_queue_unit.py +0 -0
  575. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deploy_failure_notify_unit.py +0 -0
  576. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deploy_manifest.py +0 -0
  577. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deploy_notify_unit.py +0 -0
  578. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deploy_units_lane.py +0 -0
  579. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deploy_web_unit.py +0 -0
  580. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deprecation_telemetry.py +0 -0
  581. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_deps.py +0 -0
  582. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_diagnose.py +0 -0
  583. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_dispatch.py +0 -0
  584. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_dispatch_target_validation.py +0 -0
  585. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_dist_name.py +0 -0
  586. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_done_housekeeping.py +0 -0
  587. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_drive.py +0 -0
  588. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_drive_queue_blocked_rendering.py +0 -0
  589. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_drive_queue_launch_argv.py +0 -0
  590. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  591. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_drive_queue_roll_pending.py +0 -0
  592. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  593. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_drive_state.py +0 -0
  594. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_drive_tmux.py +0 -0
  595. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_epic_up_capability_detection.py +0 -0
  596. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  597. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_epic_up_image_provenance.py +0 -0
  598. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_errors.py +0 -0
  599. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_events.py +0 -0
  600. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_failure_class.py +0 -0
  601. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_filelock.py +0 -0
  602. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  603. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_fix_of_force_override.py +0 -0
  604. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_fleet_config_health.py +0 -0
  605. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_fleet_health_probes.py +0 -0
  606. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_fleet_health_snapshot.py +0 -0
  607. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_fleet_watchdog.py +0 -0
  608. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_forge_availability.py +0 -0
  609. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_freshness.py +0 -0
  610. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_gate_a.py +0 -0
  611. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_gate_b.py +0 -0
  612. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_gate_snapshot_staleness.py +0 -0
  613. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_gates.py +0 -0
  614. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  615. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_gen_mock_index.py +0 -0
  616. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_generated_rust_fixture.py +0 -0
  617. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_generated_rust_requests.py +0 -0
  618. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_generated_types_fixture.py +0 -0
  619. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_github_ops.py +0 -0
  620. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_github_throttle.py +0 -0
  621. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_goal.py +0 -0
  622. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_graph_health.py +0 -0
  623. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_graph_selfheal_absent_2237.py +0 -0
  624. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_handoff.py +0 -0
  625. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_checks.py +0 -0
  626. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_cli.py +0 -0
  627. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_cli_graph.py +0 -0
  628. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_config.py +0 -0
  629. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_context.py +0 -0
  630. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_coord_tui_ci_pin.py +0 -0
  631. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_coord_web_ci_pin.py +0 -0
  632. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_deploy_lane_facts.py +0 -0
  633. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_fix.py +0 -0
  634. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_incident_regression.py +0 -0
  635. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_issues_sync_staleness.py +0 -0
  636. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_pypi.py +0 -0
  637. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_registry.py +0 -0
  638. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_release_cordon_probe.py +0 -0
  639. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_timer_active.py +0 -0
  640. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_toolchain.py +0 -0
  641. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_unit_drift.py +0 -0
  642. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_unit_enablement.py +0 -0
  643. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_health_wedged_drive_queue.py +0 -0
  644. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_hooks.py +0 -0
  645. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_human_attended_437.py +0 -0
  646. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_init.py +0 -0
  647. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_install_agent_venv_2911.py +0 -0
  648. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_integration.py +0 -0
  649. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_interactive_briefing_echo.py +0 -0
  650. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_interactive_pane_log_2541.py +0 -0
  651. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_interactive_prefill_state.py +0 -0
  652. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_interactive_session_relaunch.py +0 -0
  653. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_interactive_test_verdict_backstop.py +0 -0
  654. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_interactive_token_attribution.py +0 -0
  655. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_interactive_worktree.py +0 -0
  656. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_issue_store_seam.py +0 -0
  657. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_issues_sync_status.py +0 -0
  658. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_liveness_auditor.py +0 -0
  659. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_liveness_notify.py +0 -0
  660. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_lock_contention_ratchet.py +0 -0
  661. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_machine_onboard.py +0 -0
  662. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_machine_pause.py +0 -0
  663. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_merge_queue.py +0 -0
  664. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_merge_verify.py +0 -0
  665. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_milestone_dispatch.py +0 -0
  666. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_milestone_gate.py +0 -0
  667. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_milestone_order.py +0 -0
  668. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_milestone_seam.py +0 -0
  669. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_model_tiering.py +0 -0
  670. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_models.py +0 -0
  671. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_models_config_labels.py +0 -0
  672. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_needs_attention.py +0 -0
  673. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_network.py +0 -0
  674. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_new_issue_chat.py +0 -0
  675. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_next_release_tag.py +0 -0
  676. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_node_shim.py +0 -0
  677. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notifier_baseline.py +0 -0
  678. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notifier_cli.py +0 -0
  679. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notifier_collect.py +0 -0
  680. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notifier_config.py +0 -0
  681. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notifier_drive_seam.py +0 -0
  682. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notifier_isolation.py +0 -0
  683. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notifier_predicate.py +0 -0
  684. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notifier_quiet_hours.py +0 -0
  685. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notifier_service.py +0 -0
  686. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notify.py +0 -0
  687. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_notify_drain.py +0 -0
  688. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_openapi.py +0 -0
  689. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_operational_defaults.py +0 -0
  690. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_overlap_fence.py +0 -0
  691. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_overlap_predict.py +0 -0
  692. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_packaged_deploy_units.py +0 -0
  693. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_parentage.py +0 -0
  694. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_paste_landed.py +0 -0
  695. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  696. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_pipeline.py +0 -0
  697. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_plan_followup_approve_plan_command.py +0 -0
  698. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_plan_followup_pr_command.py +0 -0
  699. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_plan_followup_review_command.py +0 -0
  700. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_plan_only.py +0 -0
  701. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_plan_parser.py +0 -0
  702. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_platform_paths.py +0 -0
  703. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_portal_bridge.py +0 -0
  704. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_portal_config.py +0 -0
  705. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_portal_store.py +0 -0
  706. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_portal_sync.py +0 -0
  707. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_pr_body_lint.py +0 -0
  708. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_prereqs.py +0 -0
  709. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_production_db_guard.py +0 -0
  710. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_progress.py +0 -0
  711. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_provider_seam.py +0 -0
  712. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_providers.py +0 -0
  713. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_providers_config_labels.py +0 -0
  714. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_providers_pty.py +0 -0
  715. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_py_rust_mirror_inventory.py +0 -0
  716. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_quiet_hours.py +0 -0
  717. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_quiet_hours_store_2146.py +0 -0
  718. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reap_merged_sessions.py +0 -0
  719. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reap_stale_interactive_tick.py +0 -0
  720. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reconcile.py +0 -0
  721. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reconcile_branch.py +0 -0
  722. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reconcile_completions.py +0 -0
  723. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  724. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reconcile_merges.py +0 -0
  725. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reconcile_no_agent_record.py +0 -0
  726. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reconcile_tick.py +0 -0
  727. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reconcile_usage_limit_done.py +0 -0
  728. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_refine_chat.py +0 -0
  729. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_cordon_2101.py +0 -0
  730. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  731. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_cordon_deadlock_2240.py +0 -0
  732. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_cordon_stuck_2490.py +0 -0
  733. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_propagate.py +0 -0
  734. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_propagate_threshold.py +0 -0
  735. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_roll_between_legs_2854.py +0 -0
  736. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_roll_window_handoff.py +0 -0
  737. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_unified_1242.py +0 -0
  738. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_verify.py +0 -0
  739. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_release_window.py +0 -0
  740. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_remote_auto_prune.py +0 -0
  741. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_remote_interactive_reaper.py +0 -0
  742. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_repo_add.py +0 -0
  743. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_repo_edit_2220.py +0 -0
  744. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_repo_graph_fleet_2237.py +0 -0
  745. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_repo_onboard_2220.py +0 -0
  746. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_report_result_push.py +0 -0
  747. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_reports.py +0 -0
  748. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_retry.py +0 -0
  749. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_retry_advisory_1606.py +0 -0
  750. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_retry_type_1636.py +0 -0
  751. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_revalidate.py +0 -0
  752. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_review.py +0 -0
  753. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_review_end_review_without_verdict.py +0 -0
  754. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_review_parse_failure_diagnostic.py +0 -0
  755. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_review_reaffirm.py +0 -0
  756. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_review_state.py +0 -0
  757. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_review_verdict_backstop.py +0 -0
  758. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_review_verdict_override_audit.py +0 -0
  759. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_review_verdict_relay.py +0 -0
  760. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_review_zero_commits.py +0 -0
  761. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_scoped_review_wiring.py +0 -0
  762. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_scorecard.py +0 -0
  763. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_self_health.py +0 -0
  764. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_serve.py +0 -0
  765. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_serve_app_board_trim.py +0 -0
  766. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_serve_rest_routes.py +0 -0
  767. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_session.py +0 -0
  768. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_slice_issue_attribution.py +0 -0
  769. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_smoke.py +0 -0
  770. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_smoke_live_checkout_restore.py +0 -0
  771. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_smoke_workflow.py +0 -0
  772. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_spend_ceiling.py +0 -0
  773. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_spend_ceiling_coordinator.py +0 -0
  774. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_split.py +0 -0
  775. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_split_work.py +0 -0
  776. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_sql_dialect.py +0 -0
  777. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_sqlite_connect_ratchet.py +0 -0
  778. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_stage_projection.py +0 -0
  779. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_stale_busy_reviewer_697.py +0 -0
  780. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_stalled_pipeline.py +0 -0
  781. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_state.py +0 -0
  782. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_state_review_findings_daemon.py +0 -0
  783. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_status_fleet_footer.py +0 -0
  784. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_stop_1567.py +0 -0
  785. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_store_contract.py +0 -0
  786. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_store_migrate.py +0 -0
  787. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_stuck.py +0 -0
  788. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  789. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_terminal_command.py +0 -0
  790. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_test_author.py +0 -0
  791. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_test_chat.py +0 -0
  792. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_test_orchestrator.py +0 -0
  793. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_test_report.py +0 -0
  794. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_test_verdict_parsing.py +0 -0
  795. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_test_verdict_transcript_floor.py +0 -0
  796. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_text_io_encoding_audit.py +0 -0
  797. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_thin_client_board_audit.py +0 -0
  798. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_thin_client_config_load_1080.py +0 -0
  799. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_thin_client_daemon_routing_906.py +0 -0
  800. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_tmux_host.py +0 -0
  801. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_tmux_session.py +0 -0
  802. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_transcript_floor.py +0 -0
  803. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_usage.py +0 -0
  804. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_usage_limits.py +0 -0
  805. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_usage_rollup.py +0 -0
  806. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_venv_live_install_2121.py +0 -0
  807. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_version_single_source.py +0 -0
  808. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_watch.py +0 -0
  809. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  810. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_worker_env_venv_isolation.py +0 -0
  811. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_worker_events.py +0 -0
  812. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_worker_image_pin_sync.py +0 -0
  813. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_worker_safety.py +0 -0
  814. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_worker_test_scoping.py +0 -0
  815. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_worktree.py +0 -0
  816. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  817. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/tests/test_write_parity.py +0 -0
  818. {code_coordinator-0.5.308 → code_coordinator-0.5.310}/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.308
3
+ Version: 0.5.310
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.308
3
+ Version: 0.5.310
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.308",
2
+ "tag": "0.5.310",
3
3
  "distance": 0,
4
- "node": "gde30a174fcc1e82cb10b2f750bbe379e349de5e4",
4
+ "node": "ga706a8d9e5cc804e73c38968328d2a67cd807eca",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-30"
@@ -1172,6 +1172,28 @@ def assign(
1172
1172
  # Fetch the issue title from GitHub
1173
1173
  try:
1174
1174
  issue_data = github_ops.get_issue(repo_cfg.github, issue)
1175
+ except github_ops.GhRateLimitError as e:
1176
+ if e.from_cache:
1177
+ # #2977: `_gh`'s pre-call guard refused this WITHOUT ever making
1178
+ # a network call — a shared rate-limit backoff
1179
+ # (`coord.github_throttle`) was already known active. That is
1180
+ # categorically different from a real failure: nothing about
1181
+ # this dispatch attempt was wrong, and the exact moment it would
1182
+ # succeed is already known. Exit `EX_TEMPFAIL` (not the generic
1183
+ # `1` below) and embed that moment in the message itself — see
1184
+ # `github_ops.format_throttle_skip_reason` — so
1185
+ # `coord/drive_queue.py`'s tick can park this launch without
1186
+ # spending one of its two attempts, instead of treating a
1187
+ # skipped call as indistinguishable from a genuine dispatch
1188
+ # failure (the `coord-portal#161` incident this closes).
1189
+ click.echo(
1190
+ f"error: could not fetch issue #{issue}: "
1191
+ f"{github_ops.format_throttle_skip_reason(e)}",
1192
+ err=True,
1193
+ )
1194
+ sys.exit(github_ops.EX_TEMPFAIL)
1195
+ click.echo(f"error: could not fetch issue #{issue}: {e}", err=True)
1196
+ sys.exit(1)
1175
1197
  except RuntimeError as e:
1176
1198
  click.echo(f"error: could not fetch issue #{issue}: {e}", err=True)
1177
1199
  sys.exit(1)
@@ -91,6 +91,7 @@ from typing import Any, Iterable, Mapping, Sequence
91
91
 
92
92
  from coord.drive_state import TERMINAL_STATUSES, WORK_LIKE
93
93
  from coord.gate_a import is_gate_a_refusal_reason
94
+ from coord.github_ops import is_throttle_skip_reason, parse_throttle_skip_until
94
95
  from coord.issues_sync_status import STALENESS_WARN_SECONDS as ISSUE_CACHE_STALE_CEILING_S
95
96
  from coord.merge_queue import (
96
97
  PLAN_READY,
@@ -3425,6 +3426,42 @@ def _reconcile_running(
3425
3426
  None,
3426
3427
  )
3427
3428
 
3429
+ # #2977: `coord assign` exited because `_gh`'s pre-call guard found a
3430
+ # shared GitHub rate-limit backoff already active and skipped the call
3431
+ # entirely (`GhRateLimitError(from_cache=True)`) — no `gh` call was ever
3432
+ # attempted for this launch. That is neither a permanent refusal (the
3433
+ # `is_policy_refusal_reason`/`is_gate_a_refusal_reason` shapes above —
3434
+ # nothing about the ISSUE was rejected) nor a genuine dispatch failure
3435
+ # (the generic `_dispatch_produced_nothing` note below, which would
3436
+ # spend an attempt): it is a fleet-wide, known-duration condition this
3437
+ # entry had nothing to do with. Parks WITHOUT spending an attempt
3438
+ # (`Reconcile.updates` carries no `attempts` key, same as every other
3439
+ # park above) — the wall-clock `until=` timestamp
3440
+ # `github_ops.format_throttle_skip_reason` embedded in `own_reason` is
3441
+ # what lets `plan_tick`'s parked-entry sweep resume it the moment the
3442
+ # backoff clears, with no live re-check and no operator action, unlike
3443
+ # the gate_a/policy parks just above which need one.
3444
+ if own_reason and is_throttle_skip_reason(own_reason):
3445
+ reason = (
3446
+ f"{own_reason} — parking without spending an attempt; the queue "
3447
+ "resumes it automatically once the backoff clears, no operator "
3448
+ "needed (#2977)"
3449
+ )
3450
+ return (
3451
+ Reconcile(
3452
+ entry.key,
3453
+ "parked",
3454
+ reason,
3455
+ occupies=False,
3456
+ updates={
3457
+ "state": STATE_PARKED,
3458
+ "last_reason": reason,
3459
+ "session_name": None,
3460
+ },
3461
+ ),
3462
+ None,
3463
+ )
3464
+
3428
3465
  permanent: tuple[str, str] | None = None
3429
3466
  if own_reason and (exit_refused or {}).get(entry.key):
3430
3467
  permanent = (
@@ -5008,6 +5045,59 @@ def plan_tick(
5008
5045
  # clears it (`coord drive-queue remove`, same as `blocked`).
5009
5046
  if is_policy_refusal_reason(entry.last_reason):
5010
5047
  continue
5048
+ # #2977: a throttle-skip park (`github_ops.is_throttle_skip_reason`)
5049
+ # carries its OWN known wall-clock expiry (`until=<epoch>`, embedded
5050
+ # by `github_ops.format_throttle_skip_reason` at park time) — unlike
5051
+ # the CI-park default below, which needs a live re-check because it
5052
+ # has no way to know in advance when checks will report, this park
5053
+ # can resume on a plain clock comparison, no I/O at all. `now is
5054
+ # None` (a pure-logic caller with no clock) degrades to "never
5055
+ # resume this tick", same posture #1794's grace window uses for the
5056
+ # same input. An unparseable `until` (should not happen for text
5057
+ # this module itself wrote) or a wait that has run well past
5058
+ # `PARK_STALE_SECONDS` — far longer than any real backoff
5059
+ # (`coord.github_throttle.MAX_BACKOFF_S` is 900s) — resumes anyway
5060
+ # rather than parking indefinitely on a reading nothing can refresh,
5061
+ # the same finite-wait guarantee #2158 already gives the CI park.
5062
+ if is_throttle_skip_reason(entry.last_reason):
5063
+ if now is None:
5064
+ continue
5065
+ until = parse_throttle_skip_until(entry.last_reason)
5066
+ age = now - entry.reason_at if entry.reason_at is not None else None
5067
+ cleared = until is not None and now >= until
5068
+ stale = until is None or (age is not None and age > PARK_STALE_SECONDS)
5069
+ if not cleared and not stale:
5070
+ continue
5071
+ reason = (
5072
+ (
5073
+ f"the GitHub rate-limit backoff that parked {entry.key} "
5074
+ "has cleared — resuming without spending an attempt "
5075
+ "(#2977)"
5076
+ )
5077
+ if cleared
5078
+ else (
5079
+ f"{entry.last_reason} — this throttle-skip park has run "
5080
+ f"{PARK_STALE_SECONDS / 60:.0f}m+ with no refreshable "
5081
+ "expiry left to trust — resuming rather than parking "
5082
+ "indefinitely (#2977)"
5083
+ )
5084
+ )
5085
+ reconciles.append(
5086
+ Reconcile(
5087
+ entry.key,
5088
+ "resumed",
5089
+ reason,
5090
+ occupies=False,
5091
+ updates={
5092
+ "state": STATE_WAITING,
5093
+ "attempts": 0,
5094
+ "last_reason": reason,
5095
+ },
5096
+ )
5097
+ )
5098
+ states[entry.key] = STATE_WAITING
5099
+ effective_attempts[entry.key] = 0
5100
+ continue
5011
5101
  if park_expired is not None:
5012
5102
  # Deliberately does NOT claim CI has reported — nothing here knows
5013
5103
  # that. It says only that the reading this park rests on has no
@@ -100,6 +100,108 @@ class GhRateLimitError(GhTransientError):
100
100
  self.from_cache = from_cache
101
101
 
102
102
 
103
+ # ── #2977: coord-assign-side signal for a throttle-SKIPPED gh call ─────────
104
+ #
105
+ # `_gh`'s pre-call guard above raises `GhRateLimitError(from_cache=True)`
106
+ # WITHOUT ever making a network call, whenever a shared backoff
107
+ # (:mod:`coord.github_throttle`) is already known active — see that raise's
108
+ # own comment. Before this, that distinction was lost the moment it crossed
109
+ # the `coord assign` subprocess boundary: the caller (`coord/drive.py`)
110
+ # just saw a bare non-zero exit and folded it into the same generic "drive
111
+ # died" bucket as a real infrastructure failure, so `coord/drive_queue.py`'s
112
+ # tick spent one of the entry's two launch attempts on a call that never
113
+ # even reached GitHub (the 2026-08-30 `coord-portal#161` incident this
114
+ # closes — see the issue for the full trace).
115
+ #
116
+ # `EX_TEMPFAIL` is the conventional (sysexits.h) code for "temporary
117
+ # failure, retry later" — used by :mod:`coord.commands.dispatch`'s `assign`
118
+ # command to give this ONE failure shape a distinct exit status. That is
119
+ # necessary but not sufficient for `coord/drive_queue.py`'s pure tick logic
120
+ # to act on: the exit code alone carries no expiry, and by the time a
121
+ # `drive_exited` audit row is read back the file that raised the original
122
+ # `GhRateLimitError` is long gone, so there is nothing left to re-consult.
123
+ # `format_throttle_skip_reason` instead embeds everything the tick needs —
124
+ # the marker, and an absolute `until=<epoch>` wall-clock timestamp — directly
125
+ # in the human-readable reason text that already survives the subprocess
126
+ # boundary unmodified (`coord.drive.Driver._spawn` captures the child's
127
+ # stdout+stderr verbatim into `_last_run_output`, which flows straight into
128
+ # the `drive_exited` audit summary `coord/commands/drive_queue.py`'s
129
+ # `_fetch_exit_reasons` reads back as `own_reason` — no protocol change
130
+ # needed on that path at all). `is_throttle_skip_reason`/
131
+ # `parse_throttle_skip_until` are `coord/drive_queue.py`'s read side: pure
132
+ # text parsing, no I/O, so `_reconcile_running`'s park (and its wall-clock
133
+ # resume, no live re-check needed) stay exactly as pure as every other
134
+ # branch in that module.
135
+ THROTTLE_SKIP_MARKER = "[gh-throttle-skipped #2977]"
136
+
137
+ #: The conventional sysexits.h "temporary failure, please try again" code —
138
+ #: distinct from every other exit status `coord assign` uses (see
139
+ #: `coord.drive.EXIT_DISPATCH_REFUSED`/`EXIT_DEAD_END` for the other two
140
+ #: exit codes a downstream reader must be able to tell apart from "died").
141
+ EX_TEMPFAIL = 75
142
+
143
+ _THROTTLE_SKIP_UNTIL_RE = re.compile(r"until=([0-9]+(?:\.[0-9]+)?)")
144
+
145
+
146
+ def format_throttle_skip_reason(exc: GhRateLimitError, *, now: float | None = None) -> str:
147
+ """Canonical, parseable text for a ``coord assign`` refusal caused by a
148
+ throttle-SKIPPED ``gh`` call (``exc.from_cache`` — see
149
+ :class:`GhRateLimitError`'s docstring). Wraps ``str(exc)`` (already
150
+ carries the reason/status/request-id `_gh` recovered) with
151
+ :data:`THROTTLE_SKIP_MARKER` and an absolute ``until=`` epoch timestamp
152
+ that :func:`parse_throttle_skip_until` recovers later, with no clock of
153
+ its own and no access to :mod:`coord.github_throttle` needed.
154
+
155
+ ``exc.retry_after_s`` is "seconds remaining AT THE MOMENT ``_gh`` raised"
156
+ — a value that goes stale the instant it's read back, which is exactly
157
+ why an absolute timestamp is embedded here (computed once, at the one
158
+ point in this whole path that has both a fresh clock and the exception)
159
+ rather than a duration re-derived downstream. Falls back to
160
+ :data:`coord.github_throttle.DEFAULT_BACKOFF_S` when ``retry_after_s``
161
+ is ``None`` (the pre-call guard's own fallback wording already reads
162
+ "GitHub's guidance" in that case, so this mirrors it rather than
163
+ inventing a shorter window with no evidence behind it).
164
+ """
165
+ now = now if now is not None else time.time()
166
+ retry_after = (
167
+ exc.retry_after_s if exc.retry_after_s is not None else github_throttle.DEFAULT_BACKOFF_S
168
+ )
169
+ until = now + max(0.0, retry_after)
170
+ return (
171
+ f"{THROTTLE_SKIP_MARKER} {exc} — no gh call was made for this launch "
172
+ f"attempt, so it should not spend one (#2977); until={until:.3f}"
173
+ )
174
+
175
+
176
+ def is_throttle_skip_reason(text: str | None) -> bool:
177
+ """``True`` when *text* is (or contains) a :func:`format_throttle_skip_reason`
178
+ result — the same marker-based convention as
179
+ ``coord.models.is_policy_refusal_reason``/``coord.gate_a.
180
+ is_gate_a_refusal_reason``, so ``coord/drive_queue.py`` can recognise this
181
+ park from plain reason text with no I/O.
182
+ """
183
+ return bool(text) and THROTTLE_SKIP_MARKER in text
184
+
185
+
186
+ def parse_throttle_skip_until(text: str | None) -> float | None:
187
+ """The absolute epoch ``until=`` timestamp embedded by
188
+ :func:`format_throttle_skip_reason`, or ``None`` when *text* doesn't
189
+ carry the marker at all, or carries it without a parseable timestamp
190
+ (defensive — should not happen for text this module itself wrote, but a
191
+ hand-edited row or a future format change must degrade to "unknown",
192
+ never a wrong resume time).
193
+ """
194
+ if not is_throttle_skip_reason(text):
195
+ return None
196
+ m = _THROTTLE_SKIP_UNTIL_RE.search(text)
197
+ if not m:
198
+ return None
199
+ try:
200
+ return float(m.group(1))
201
+ except ValueError:
202
+ return None
203
+
204
+
103
205
  class GhTooOldForJsonChecks(GhError):
104
206
  """Raised when the installed ``gh`` doesn't support ``gh pr checks --json``
105
207
  *at all* (#1564 Addendum 2), as opposed to supporting ``--json`` but
@@ -57,15 +57,28 @@ def pick_milestone_chat_machine(cfg: Config, repo: str) -> Machine | None:
57
57
  return pick_refinement_machine(cfg, repo)
58
58
 
59
59
 
60
- def _fetch_milestone_issues(slug: str, milestone_number: int) -> list[dict]:
60
+ def _fetch_milestone_issues(
61
+ slug: str,
62
+ milestone_number: int,
63
+ *,
64
+ max_body_chars: int | None = MAX_ISSUE_BODY_CHARS,
65
+ ) -> list[dict]:
61
66
  """Best-effort fetch of open issues under *milestone_number*.
62
67
 
63
- Returns a list of ``{"number", "title", "body"}`` dicts (bodies
64
- truncated to ``MAX_ISSUE_BODY_CHARS`` so cohort/dependency inference has
65
- signal without blowing the prompt budget), capped at ``MAX_ISSUES``.
66
- Returns an empty list on any failure so the seed briefing still works
67
- without issue context — the operator can still chat, just with less to
68
- go on.
68
+ Returns a list of ``{"number", "title", "body"}`` dicts, capped at
69
+ ``MAX_ISSUES``. Returns an empty list on any failure so the seed
70
+ briefing still works without issue context — the operator can still
71
+ chat, just with less to go on.
72
+
73
+ *max_body_chars* defaults to ``MAX_ISSUE_BODY_CHARS`` (bodies truncated
74
+ so cohort/dependency inference has signal without blowing the prompt
75
+ budget) — that trade is right for *this* module's job, a chat session
76
+ inferring dependencies from a digest. It is wrong for a caller whose
77
+ entire output is derived from the body text itself: #2969 found Gate A's
78
+ mock-author (`coord/mock_author.py`) reusing this same cap, silently
79
+ handing it 36-82% of each issue's spec and leaving it to notice and flag
80
+ the gap in its own contract. Pass ``max_body_chars=None`` for callers
81
+ like that, where a body must arrive in full or not at all.
69
82
  """
70
83
  try:
71
84
  issues = github_ops.get_open_issues(slug)
@@ -78,8 +91,8 @@ def _fetch_milestone_issues(slug: str, milestone_number: int) -> list[dict]:
78
91
  out: list[dict] = []
79
92
  for issue in under_milestone[:MAX_ISSUES]:
80
93
  body = (issue.get("body") or "").strip()
81
- if len(body) > MAX_ISSUE_BODY_CHARS:
82
- body = body[:MAX_ISSUE_BODY_CHARS] + "\n...(truncated)"
94
+ if max_body_chars is not None and len(body) > max_body_chars:
95
+ body = body[:max_body_chars] + "\n...(truncated)"
83
96
  out.append({
84
97
  "number": issue.get("number"),
85
98
  "title": issue.get("title") or "",
@@ -323,7 +323,13 @@ def dispatch_acceptance_mock(
323
323
  required_gates=list(config.pipeline.default_gates),
324
324
  )
325
325
  else:
326
- issues = _fetch_milestone_issues(repo_cfg.github, milestone_number)
326
+ # #2969: Gate A's contract IS the spec — anything truncated here
327
+ # becomes silent guesswork in `contract.md`. Unlike milestone-chat's
328
+ # own cohort/dependency-inference use of this fetcher, hand the
329
+ # mock-author every body in full (no `max_body_chars` cap).
330
+ issues = _fetch_milestone_issues(
331
+ repo_cfg.github, milestone_number, max_body_chars=None
332
+ )
327
333
 
328
334
  briefing = build_mock_author_briefing(
329
335
  repo_slug=repo_cfg.github,
@@ -495,6 +495,68 @@ class TestAssignDispatch:
495
495
  assert result.exit_code == 1
496
496
  assert "could not fetch issue" in result.output
497
497
 
498
+ def test_issue_fetch_throttle_skip_exits_distinctly(
499
+ self, config_file: Path, coord_dir: Path
500
+ ) -> None:
501
+ """#2977: a `GhRateLimitError(from_cache=True)` — `_gh`'s pre-call
502
+ guard skipped this `gh issue view` call WITHOUT making a network
503
+ call because a shared rate-limit backoff was already known active
504
+ — is a categorically different failure from an ordinary fetch error
505
+ (the generic `RuntimeError` case just above, still exit `1`). It
506
+ must exit `github_ops.EX_TEMPFAIL`, and the printed message must
507
+ carry `THROTTLE_SKIP_MARKER` plus an absolute `until=` timestamp, so
508
+ `coord drive-queue`'s tick (`coord/drive_queue.py`'s
509
+ `is_throttle_skip_reason`/`parse_throttle_skip_until`) can park this
510
+ launch without spending one of its two attempts instead of treating
511
+ it like a genuine dispatch failure (the `coord-portal#161`
512
+ incident)."""
513
+ from coord.github_ops import EX_TEMPFAIL, GhRateLimitError, THROTTLE_SKIP_MARKER
514
+
515
+ with patch(
516
+ "coord.github_ops.get_issue",
517
+ side_effect=GhRateLimitError(
518
+ "gh issue view 999 --repo acme/api --json ... skipped: GitHub "
519
+ "secondary_rate_limit backoff active for 59s more "
520
+ "(status=403, request_id=abc123)",
521
+ status_code=403, request_id="abc123", retry_after_s=59.0,
522
+ secondary=True, from_cache=True,
523
+ ),
524
+ ):
525
+ result = CliRunner().invoke(
526
+ main,
527
+ ["assign", "laptop", "api", "999", "--config", str(config_file)],
528
+ )
529
+ assert result.exit_code == EX_TEMPFAIL
530
+ assert result.exit_code != 1
531
+ assert "could not fetch issue" in result.output
532
+ assert THROTTLE_SKIP_MARKER in result.output
533
+ assert "until=" in result.output
534
+
535
+ def test_issue_fetch_real_rate_limit_hit_keeps_the_generic_exit(
536
+ self, config_file: Path, coord_dir: Path
537
+ ) -> None:
538
+ """The counterpart: a `GhRateLimitError` from an ACTUAL network call
539
+ (`from_cache=False`) is a genuine observation, not a skip — it must
540
+ keep exiting the generic `1` the `RuntimeError` case above does, not
541
+ `EX_TEMPFAIL`, so it is never mistaken for the zero-attempt-cost
542
+ skip class this issue fixes."""
543
+ from coord.github_ops import GhRateLimitError
544
+
545
+ with patch(
546
+ "coord.github_ops.get_issue",
547
+ side_effect=GhRateLimitError(
548
+ "gh issue view 999 --repo acme/api --json ... failed: API "
549
+ "rate limit exceeded",
550
+ status_code=403, retry_after_s=60.0, from_cache=False,
551
+ ),
552
+ ):
553
+ result = CliRunner().invoke(
554
+ main,
555
+ ["assign", "laptop", "api", "999", "--config", str(config_file)],
556
+ )
557
+ assert result.exit_code == 1
558
+ assert "could not fetch issue" in result.output
559
+
498
560
  def test_briefing_post_failure_is_nonfatal(
499
561
  self, config_file: Path, coord_dir: Path
500
562
  ) -> None:
@@ -2852,6 +2852,165 @@ def test_a_policy_refusal_still_reconciles_to_done_if_it_lands_by_hand():
2852
2852
  assert reconcile.updates["state"] == STATE_DONE
2853
2853
 
2854
2854
 
2855
+ # ═══════════════════════════════════════════════════════════════════════════
2856
+ # #2977: a throttle-SKIPPED `gh` call — `_gh`'s pre-call guard found a shared
2857
+ # GitHub rate-limit backoff (coord.github_throttle) already active and
2858
+ # raised `GhRateLimitError(from_cache=True)` WITHOUT ever making a network
2859
+ # call — must not be charged like a real dispatch failure. It parks (like
2860
+ # Gate-A/policy above) rather than blocking, spends no attempt, AND —
2861
+ # unlike Gate-A/policy, which wait on an external verdict — resumes itself
2862
+ # the instant the embedded wall-clock `until=` timestamp passes, no live
2863
+ # re-check and no operator action needed. coord-portal#161, 2026-08-30: two
2864
+ # such skips in a row parked the keystone of a 9-entry milestone.
2865
+ # ═══════════════════════════════════════════════════════════════════════════
2866
+
2867
+
2868
+ def _throttle_skip_reason(*, now: float, retry_after_s: float = 59.0) -> str:
2869
+ """A realistic `own_reason` string for a `running` entry whose launch
2870
+ died on a throttle-skipped `coord assign` — i.e. exactly what
2871
+ `coord/commands/drive_queue.py`'s `_fetch_exit_reasons` would read back
2872
+ from the `drive_exited` audit row once `coord.drive.Driver._spawn`
2873
+ folds the child's stderr (built by `coord/commands/dispatch.py`'s
2874
+ `assign` command from `github_ops.format_throttle_skip_reason`) into
2875
+ the summary — see this module's own #2977 comment for the full chain.
2876
+ """
2877
+ from coord.github_ops import GhRateLimitError, format_throttle_skip_reason
2878
+
2879
+ exc = GhRateLimitError(
2880
+ "gh issue view 161 --repo JDonaghy/coord-portal --json "
2881
+ "number,title,body,state,milestone,labels skipped: GitHub "
2882
+ "secondary_rate_limit backoff active for "
2883
+ f"{retry_after_s:.0f}s more (status=403, "
2884
+ "request_id=A654:2496C0:1E674B6:66A49BB:6A94A599)",
2885
+ status_code=403,
2886
+ request_id="A654:2496C0:1E674B6:66A49BB:6A94A599",
2887
+ retry_after_s=retry_after_s,
2888
+ secondary=True,
2889
+ from_cache=True,
2890
+ )
2891
+ skip_reason = format_throttle_skip_reason(exc, now=now)
2892
+ return (
2893
+ f"drive exited for {REPO}#161 (exit_code=75): coord assign precision "
2894
+ f"{REPO} 161 --driven-by drive:{REPO}#161 exited 75\n output: "
2895
+ f"error: could not fetch issue #161: {skip_reason}"
2896
+ )
2897
+
2898
+
2899
+ def test_format_and_parse_throttle_skip_reason_round_trip():
2900
+ """The seam `coord/drive_queue.py` actually depends on: the marker and
2901
+ the absolute `until=` timestamp `format_throttle_skip_reason` embeds
2902
+ must survive being read back by `is_throttle_skip_reason`/
2903
+ `parse_throttle_skip_until` with no clock and no I/O."""
2904
+ from coord.github_ops import (
2905
+ GhRateLimitError,
2906
+ format_throttle_skip_reason,
2907
+ is_throttle_skip_reason,
2908
+ parse_throttle_skip_until,
2909
+ )
2910
+
2911
+ exc = GhRateLimitError(
2912
+ "gh ... skipped: GitHub secondary_rate_limit backoff active for "
2913
+ "10s more (status=403, request_id=abc)",
2914
+ retry_after_s=10.0, secondary=True, from_cache=True,
2915
+ )
2916
+ reason = format_throttle_skip_reason(exc, now=NOW)
2917
+ assert is_throttle_skip_reason(reason)
2918
+ assert parse_throttle_skip_until(reason) == pytest.approx(NOW + 10.0)
2919
+ assert not is_throttle_skip_reason("an ordinary death, nothing to do with gh")
2920
+ assert parse_throttle_skip_until("an ordinary death") is None
2921
+
2922
+
2923
+ def test_a_throttle_skipped_gh_call_parks_without_spending_an_attempt():
2924
+ reason = _throttle_skip_reason(now=NOW)
2925
+ entries = [entry(161, position=3, state=STATE_RUNNING, attempts=0)]
2926
+ plan = plan_tick(
2927
+ entries, board(), capacity=1, now=NOW,
2928
+ exit_reasons={entry_key(REPO, 161): reason},
2929
+ )
2930
+ reconcile = plan.reconciles[0]
2931
+ assert reconcile.outcome == "parked"
2932
+ assert reconcile.updates["state"] == STATE_PARKED
2933
+ assert "attempts" not in reconcile.updates
2934
+ assert plan.blocked == () # NOT terminal `blocked`
2935
+ assert plan.launch is None
2936
+
2937
+
2938
+ def test_a_throttle_skipped_gh_call_deep_into_the_attempt_budget_still_spends_none():
2939
+ reason = _throttle_skip_reason(now=NOW)
2940
+ entries = [entry(161, state=STATE_RUNNING, attempts=DEFAULT_MAX_ATTEMPTS - 1)]
2941
+ plan = plan_tick(
2942
+ entries, board(), capacity=1, now=NOW,
2943
+ exit_reasons={entry_key(REPO, 161): reason},
2944
+ )
2945
+ assert plan.reconciles[0].outcome == "parked" # not "exhausted"
2946
+ assert plan.blocked == ()
2947
+
2948
+
2949
+ def test_a_parked_throttle_skip_stays_parked_before_the_backoff_clears():
2950
+ reason = _throttle_skip_reason(now=NOW, retry_after_s=120.0)
2951
+ entries = [
2952
+ entry(161, position=3, state="parked", attempts=0,
2953
+ last_reason=reason, reason_at=NOW)
2954
+ ]
2955
+ plan = plan_tick(entries, board(), capacity=1, now=NOW + 30.0)
2956
+ assert plan.reconciles == () # still parked — backoff has not cleared yet
2957
+ assert plan.launch is None
2958
+
2959
+
2960
+ def test_a_parked_throttle_skip_resumes_the_instant_the_backoff_clears():
2961
+ """The acceptance criterion: no operator action, no `remove`+`add` — the
2962
+ entry wakes itself exactly when `Backoff.until` passes."""
2963
+ reason = _throttle_skip_reason(now=NOW, retry_after_s=59.0)
2964
+ entries = [
2965
+ entry(161, position=3, state="parked", attempts=1,
2966
+ last_reason=reason, reason_at=NOW)
2967
+ ]
2968
+ plan = plan_tick(entries, board(), capacity=1, now=NOW + 60.0)
2969
+ reconcile = plan.reconciles[0]
2970
+ assert reconcile.outcome == "resumed"
2971
+ assert reconcile.updates["state"] == STATE_WAITING
2972
+ assert reconcile.updates["attempts"] == 0
2973
+
2974
+
2975
+ def test_a_parked_throttle_skip_with_no_clock_never_resumes():
2976
+ """`now=None` (a pure-logic caller) must never guess a resume — same
2977
+ fail-closed posture #1794's grace window uses for the same input."""
2978
+ reason = _throttle_skip_reason(now=NOW, retry_after_s=1.0)
2979
+ entries = [
2980
+ entry(161, position=3, state="parked", attempts=0, last_reason=reason)
2981
+ ]
2982
+ plan = plan_tick(entries, board(), capacity=1)
2983
+ assert plan.reconciles == ()
2984
+
2985
+
2986
+ def test_a_parked_throttle_skip_with_unparseable_until_resumes_past_the_2158_ceiling():
2987
+ """Defensive: text carrying the marker with no parseable `until=` (a
2988
+ hand-edited row, or a future format change) must still be FINITE — never
2989
+ a silent infinite park — bounded by the same `PARK_STALE_SECONDS`
2990
+ ceiling #2158 already gives the CI park."""
2991
+ from coord.github_ops import THROTTLE_SKIP_MARKER
2992
+
2993
+ reason = f"drive exited: {THROTTLE_SKIP_MARKER} gh skipped, no until recorded"
2994
+ entries = [
2995
+ entry(161, position=3, state="parked", attempts=0,
2996
+ last_reason=reason, reason_at=NOW - PARK_STALE_SECONDS - 60)
2997
+ ]
2998
+ plan = plan_tick(entries, board(), capacity=1, now=NOW)
2999
+ reconcile = plan.reconciles[0]
3000
+ assert reconcile.outcome == "resumed"
3001
+ assert reconcile.updates["state"] == STATE_WAITING
3002
+
3003
+
3004
+ def test_a_throttle_skip_still_reconciles_to_done_if_it_lands_by_hand():
3005
+ reason = _throttle_skip_reason(now=NOW)
3006
+ entries = [entry(161, position=3, state="parked", attempts=0,
3007
+ last_reason=reason)]
3008
+ plan = plan_tick(entries, board(merged=(161,)), capacity=1)
3009
+ reconcile = plan.reconciles[0]
3010
+ assert reconcile.outcome == "done"
3011
+ assert reconcile.updates["state"] == STATE_DONE
3012
+
3013
+
2855
3014
  # ═══════════════════════════════════════════════════════════════════════════
2856
3015
  # #2850: a drive that exits 0 having MERGED must reconcile straight to
2857
3016
  # `done`, never `retry` — before this fix, `own_reason` carried the drive's
@@ -223,6 +223,18 @@ def test_fetch_milestone_issues_returns_empty_on_failure():
223
223
  assert out == []
224
224
 
225
225
 
226
+ def test_fetch_milestone_issues_max_body_chars_none_disables_truncation():
227
+ """#2969: Gate A's mock-author passes `max_body_chars=None` so it sees
228
+ every issue body in full — the cap below is this module's own default,
229
+ not a hard-coded floor other callers are stuck with."""
230
+ long_body = "x" * (milestone_chat.MAX_ISSUE_BODY_CHARS + 500)
231
+ issues = [{"number": 1, "title": "T", "body": long_body, "milestone": {"number": 9}}]
232
+ with patch("coord.github_ops.get_open_issues", return_value=issues):
233
+ out = milestone_chat._fetch_milestone_issues("acme/api", 9, max_body_chars=None)
234
+ assert out[0]["body"] == long_body
235
+ assert "(truncated)" not in out[0]["body"]
236
+
237
+
226
238
  # ── pick_milestone_chat_machine ──────────────────────────────────────────────
227
239
 
228
240
 
@@ -352,6 +352,39 @@ def test_dispatch_success_records_assignment(tmp_path):
352
352
  mock_record.assert_called_once()
353
353
 
354
354
 
355
+ def test_dispatch_briefs_full_issue_bodies_uncapped(tmp_path):
356
+ """#2969: Gate A's contract is authored straight from these bodies —
357
+ reusing milestone_chat's 1500-char cohort-inference cap here silently
358
+ fed the mock-author 36-82% of each issue's spec. The dispatched
359
+ briefing must carry every body in full, past that cap."""
360
+ from coord.models import Board
361
+
362
+ long_body = "y" * (2000) + " END-OF-BODY-MARKER"
363
+ cfg = _cfg_with_driver(tmp_path)
364
+ issue_data = {
365
+ "number": 100, "title": "Milestone tracker", "body": "",
366
+ "milestone": {"number": 9, "title": "Q3"},
367
+ }
368
+ open_issues = [
369
+ {
370
+ "number": 5, "title": "Child", "body": long_body,
371
+ "milestone": {"number": 9},
372
+ },
373
+ ]
374
+ with patch("coord.github_ops.get_issue", return_value=issue_data), \
375
+ patch("coord.github_ops.get_open_issues", return_value=open_issues), \
376
+ patch("coord.board_service.read_board", return_value=Board()), \
377
+ patch("coord.dispatch.dispatch_with_retry", return_value={"id": "asg-xyz"}) as mock_dispatch, \
378
+ patch("coord.dispatch.post_briefing"), \
379
+ patch("coord.state.record_dispatched"):
380
+ mock_author.dispatch_acceptance_mock("api", 100, cfg)
381
+
382
+ proposal = mock_dispatch.call_args[0][0]
383
+ assert len(long_body) > 1500 # sanity: this reproduces only past the old cap
384
+ assert long_body in proposal.briefing
385
+ assert "(truncated)" not in proposal.briefing
386
+
387
+
355
388
  # ── build_mock_author_amend_briefing / --amend dispatch (#1315) ─────────────
356
389
 
357
390