code-coordinator 0.5.309__tar.gz → 0.5.311__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 (819) hide show
  1. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. code_coordinator-0.5.311/code_coordinator.egg-info/scm_version.json +8 -0
  4. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/dispatch.py +22 -0
  5. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/drive_queue.py +190 -31
  6. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/github_ops.py +102 -0
  7. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/wedged_drive_queue.py +37 -15
  8. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign.py +62 -0
  9. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_drive_queue.py +43 -0
  10. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue.py +256 -0
  11. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_wedged_drive_queue.py +49 -0
  12. code_coordinator-0.5.309/code_coordinator.egg-info/scm_version.json +0 -8
  13. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/.gitignore +0 -0
  26. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/GOAL.md +0 -0
  28. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/LICENSE +0 -0
  29. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/README.md +0 -0
  31. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/SOURCES.txt +0 -0
  32. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/dependency_links.txt +0 -0
  33. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/entry_points.txt +0 -0
  34. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/requires.txt +0 -0
  35. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/scm_file_list.json +0 -0
  36. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/approved_work.py +0 -0
  48. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/board_schema.py +0 -0
  52. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/ci_fix.py +0 -0
  59. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/ci_gitlab.py +0 -0
  61. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/cli.py +0 -0
  64. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/client.py +0 -0
  65. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/__init__.py +0 -0
  66. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/_common.py +0 -0
  67. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/acceptance.py +0 -0
  68. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/agent_ops.py +0 -0
  69. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/audit.py +0 -0
  70. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/dispatch_workers.py +0 -0
  72. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/drive.py +0 -0
  73. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/drive_queue.py +0 -0
  74. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/gate_a.py +0 -0
  75. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/gates.py +0 -0
  76. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/issues.py +0 -0
  77. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/lifecycle.py +0 -0
  78. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/machine.py +0 -0
  79. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/merge.py +0 -0
  80. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/portal.py +0 -0
  84. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/pr.py +0 -0
  85. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/release.py +0 -0
  86. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/repo.py +0 -0
  87. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/report.py +0 -0
  88. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/review.py +0 -0
  89. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/scorecard.py +0 -0
  90. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/sessions.py +0 -0
  91. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/setup.py +0 -0
  92. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/status.py +0 -0
  93. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/store_migrate.py +0 -0
  94. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/terminal.py +0 -0
  95. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/test_gate.py +0 -0
  96. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/commands/tui.py +0 -0
  97. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/comments.py +0 -0
  98. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/config.py +0 -0
  99. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/config_reload.py +0 -0
  100. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/confirm_test.py +0 -0
  101. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/conflict_fix.py +0 -0
  102. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dao.py +0 -0
  103. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/__init__.py +0 -0
  104. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/fixture.py +0 -0
  105. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/index.html +0 -0
  106. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/server.py +0 -0
  107. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dashboard/terminal.py +0 -0
  108. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/db.py +0 -0
  109. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dead_end.py +0 -0
  110. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/decomposition_chat.py +0 -0
  111. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/README.md +0 -0
  112. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-agent.service +0 -0
  113. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-db-backup.service +0 -0
  114. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-db-backup.sh +0 -0
  115. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-db-backup.timer +0 -0
  116. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-drive-queue.service +0 -0
  117. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-drive-queue.timer +0 -0
  118. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-failure-notify.service +0 -0
  119. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-fleet-watchdog.service +0 -0
  120. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  121. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-notify.service +0 -0
  122. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-notify.timer +0 -0
  123. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-release-propagate.service +0 -0
  124. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-release-propagate.timer +0 -0
  125. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-release-window.service +0 -0
  126. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-release-window.timer +0 -0
  127. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-serve.service +0 -0
  128. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-web-dist-build.service +0 -0
  129. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-web-dist-build.timer +0 -0
  130. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy/coord-web.service +0 -0
  131. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy_manifest.py +0 -0
  132. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deploy_units.py +0 -0
  133. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deprecation_telemetry.py +0 -0
  134. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/deps.py +0 -0
  135. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/diagnose.py +0 -0
  136. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dispatch.py +0 -0
  137. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/dist_name.py +0 -0
  138. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/drive.py +0 -0
  139. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/drive_state.py +0 -0
  140. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/events.py +0 -0
  141. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/failure_class.py +0 -0
  142. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/filelock.py +0 -0
  143. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/fleet_config_health.py +0 -0
  144. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/forge_availability.py +0 -0
  145. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/freshness.py +0 -0
  146. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/gate_a.py +0 -0
  147. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/gate_b.py +0 -0
  148. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/gate_snapshot.py +0 -0
  149. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/gates.py +0 -0
  150. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/github_throttle.py +0 -0
  151. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/goal.py +0 -0
  152. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/graph_health.py +0 -0
  153. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/__init__.py +0 -0
  154. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/aggregate.py +0 -0
  155. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/__init__.py +0 -0
  156. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/_ci_pin.py +0 -0
  157. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/agent_install.py +0 -0
  158. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/cargo_targets.py +0 -0
  159. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/claude_binary.py +0 -0
  160. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  161. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/coord_web_ci_pin.py +0 -0
  162. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/deploy_lane_facts.py +0 -0
  163. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/disk.py +0 -0
  164. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/fleet_board.py +0 -0
  165. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  166. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/fleet_phantom.py +0 -0
  167. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/fleet_unit_drift.py +0 -0
  168. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/graph.py +0 -0
  169. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/graphify_cli.py +0 -0
  170. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/index_lock.py +0 -0
  171. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/issues_sync_staleness.py +0 -0
  172. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/plan_usage.py +0 -0
  173. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/release_cordon.py +0 -0
  174. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/repo_state.py +0 -0
  175. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/spawned_coord.py +0 -0
  176. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/stalled_pipeline.py +0 -0
  177. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/timer_active.py +0 -0
  178. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/toolchain.py +0 -0
  179. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/unit_drift.py +0 -0
  180. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/unit_enablement.py +0 -0
  181. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/checks/worktrees.py +0 -0
  182. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/cli.py +0 -0
  183. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/context.py +0 -0
  184. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/fleet_snapshot.py +0 -0
  185. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/models.py +0 -0
  186. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/pypi.py +0 -0
  187. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/registry.py +0 -0
  188. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/render.py +0 -0
  189. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/health/units.py +0 -0
  190. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/hooks.py +0 -0
  191. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/housekeeping.py +0 -0
  192. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/interactive.py +0 -0
  193. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/issue_store.py +0 -0
  194. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/issues_sync_status.py +0 -0
  195. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/liveness_auditor.py +0 -0
  196. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/machine_onboard.py +0 -0
  197. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/machine_pause.py +0 -0
  198. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/merge_queue.py +0 -0
  199. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/milestone_chat.py +0 -0
  200. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/milestone_dispatch.py +0 -0
  201. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/milestone_gate.py +0 -0
  202. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/milestone_order.py +0 -0
  203. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/mock_author.py +0 -0
  204. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/models.py +0 -0
  205. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/network.py +0 -0
  206. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/new_issue_chat.py +0 -0
  207. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/__init__.py +0 -0
  208. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/baseline.py +0 -0
  209. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/cli.py +0 -0
  210. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/collect.py +0 -0
  211. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/digest.py +0 -0
  212. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/models.py +0 -0
  213. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/predicate.py +0 -0
  214. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/service.py +0 -0
  215. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/store.py +0 -0
  216. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notifier/transport.py +0 -0
  217. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/notify.py +0 -0
  218. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/openapi.py +0 -0
  219. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/overlap_fence.py +0 -0
  220. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/overlap_predict.py +0 -0
  221. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/parentage.py +0 -0
  222. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/parentage_github.py +0 -0
  223. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/pipeline.py +0 -0
  224. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/plan_parser.py +0 -0
  225. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/plans.py +0 -0
  226. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/platform_paths.py +0 -0
  227. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/portal_bridge.py +0 -0
  228. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/portal_store.py +0 -0
  229. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/portal_sync.py +0 -0
  230. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/pr_body_lint.py +0 -0
  231. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/prereqs.py +0 -0
  232. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/progress.py +0 -0
  233. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/__init__.py +0 -0
  234. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/base.py +0 -0
  235. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/claude.py +0 -0
  236. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/claude_pty.py +0 -0
  237. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/providers/opencode.py +0 -0
  238. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/queue_diagnose.py +0 -0
  239. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/reconcile.py +0 -0
  240. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/reconcile_tick.py +0 -0
  241. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/refine_chat.py +0 -0
  242. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/release_cordon.py +0 -0
  243. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/release_propagate.py +0 -0
  244. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/release_verify.py +0 -0
  245. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/release_window.py +0 -0
  246. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/repo_edit.py +0 -0
  247. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/repo_onboard.py +0 -0
  248. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/reports.py +0 -0
  249. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/rest_schema.py +0 -0
  250. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/revalidate.py +0 -0
  251. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/review.py +0 -0
  252. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/scorecard.py +0 -0
  253. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/self_health.py +0 -0
  254. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/serve_app.py +0 -0
  255. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  256. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  257. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  258. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  259. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/portal-followup/SKILL.md +0 -0
  261. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/release-now/SKILL.md +0 -0
  262. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  263. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  264. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/skills/update-issue/SKILL.md +0 -0
  265. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/smoke.py +0 -0
  266. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/spend_ceiling.py +0 -0
  267. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/split_work.py +0 -0
  268. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/sql.py +0 -0
  269. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/stage_projection.py +0 -0
  270. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/state.py +0 -0
  271. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/store_migrate.py +0 -0
  272. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/test_author.py +0 -0
  273. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/test_chat.py +0 -0
  274. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/test_orchestrator.py +0 -0
  275. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/test_report.py +0 -0
  276. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/tui_release.py +0 -0
  277. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/usage.py +0 -0
  278. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/usage_limits.py +0 -0
  279. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/usage_rollup.py +0 -0
  280. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coord/worker_events.py +0 -0
  281. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/coordinator.example.yml +0 -0
  282. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-agent.service +0 -0
  283. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-db-backup.service +0 -0
  284. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-db-backup.sh +0 -0
  285. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-db-backup.timer +0 -0
  286. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-drive-queue.service +0 -0
  287. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-drive-queue.timer +0 -0
  288. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-failure-notify.service +0 -0
  289. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-failure-notify.sh +0 -0
  290. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-fleet-watchdog.service +0 -0
  291. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-fleet-watchdog.timer +0 -0
  292. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-notify.service +0 -0
  293. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-notify.timer +0 -0
  294. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-release-propagate.service +0 -0
  295. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-release-propagate.timer +0 -0
  296. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-release-window.service +0 -0
  297. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-release-window.timer +0 -0
  298. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-serve.service +0 -0
  299. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web-dist-build.service +0 -0
  300. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web-dist-build.sh +0 -0
  301. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web-dist-build.timer +0 -0
  302. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web-rollback.sh +0 -0
  303. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/coord-web.service +0 -0
  304. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/deploy/node-shim.sh +0 -0
  305. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_COORD_TUI_CI.md +0 -0
  306. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  307. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_COORD_WEB_CI.md +0 -0
  308. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_COORD_WEB_DIST.md +0 -0
  309. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  310. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/AGENT_OPERATIONS.md +0 -0
  311. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ARCHITECTURE.md +0 -0
  312. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ARCH_SECURITY_GATES.md +0 -0
  313. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/COCKPIT.md +0 -0
  314. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/CONTROL_CENTER.md +0 -0
  315. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/COST_DISCIPLINE.md +0 -0
  316. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/CROSS_PLATFORM.md +0 -0
  317. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/CUSTOMER_FACING_APPS.md +0 -0
  318. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/CUSTOMER_PORTAL.md +0 -0
  319. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/DRIVE_QUEUE.md +0 -0
  320. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/EPHEMERAL_WORKERS.md +0 -0
  321. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/FORGE_MIGRATION.md +0 -0
  322. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/GRAPHIFY_SETUP.md +0 -0
  323. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ISSUE_GUIDANCE.md +0 -0
  324. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/MAC_MINI.md +0 -0
  325. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  326. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/NOTIFIER.md +0 -0
  327. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/OPENCODE_VERIFICATION.md +0 -0
  328. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/OPERATING_GOTCHAS.md +0 -0
  329. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/OPERATOR_GUIDES.md +0 -0
  330. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/ORACLE_LOOP.md +0 -0
  331. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/PHONE_WEBAPP.md +0 -0
  332. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/PIPELINE_V2.md +0 -0
  333. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/PLATFORM_EVOLUTION.md +0 -0
  334. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/SECOND_BACKEND.md +0 -0
  335. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/STORE_SERVICE.md +0 -0
  336. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  337. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/WEB_CONTROL_CENTER.md +0 -0
  338. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/WSL_WINDOWS_WORKER.md +0 -0
  339. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/README.md +0 -0
  340. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/_tokens.css +0 -0
  341. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/issue-detail.html +0 -0
  342. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/pipeline-narrow.html +0 -0
  343. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/docs/mocks/web/pipeline-wide.html +0 -0
  344. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/graphify-out/.gitignore +0 -0
  345. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/install-agent.sh +0 -0
  346. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/pyproject.toml +0 -0
  347. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/audit_review_verdict_overrides.py +0 -0
  348. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  349. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/build-worker-image.sh +0 -0
  350. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/coordinator-machine.py +0 -0
  351. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/epic-down.sh +0 -0
  352. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/epic-up.sh +0 -0
  353. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/preflight.sh +0 -0
  354. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/provision-worker.sh +0 -0
  355. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  356. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  357. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/azure-workers/verify-github-token.sh +0 -0
  358. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/check_gh_argv_containment.py +0 -0
  359. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/codegen.py +0 -0
  360. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-test-runner.sh +0 -0
  361. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  362. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  363. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  364. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  365. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/coord-venv-rollback.sh +0 -0
  366. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/drive-batch.sh +0 -0
  367. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/extract-coord-tui.sh +0 -0
  368. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/fleet_watchdog.py +0 -0
  369. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/gen_board_fixture.py +0 -0
  370. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/gen_mock_index.py +0 -0
  371. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/next_release_tag.py +0 -0
  372. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/run_tests_in_populated_home.sh +0 -0
  373. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/run_tests_without_gh.sh +0 -0
  374. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/smoke_437_interactive.py +0 -0
  375. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/verify_878_review_capture.py +0 -0
  376. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/verify_release_published.py +0 -0
  377. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/scripts/verify_release_wheel.py +0 -0
  378. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/setup.cfg +0 -0
  379. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/SMOKE_SET.md +0 -0
  380. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/__init__.py +0 -0
  381. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/conftest.py +0 -0
  382. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/contract.md +0 -0
  383. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/manifest.yml +0 -0
  384. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  385. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  386. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/contract.md +0 -0
  387. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  388. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  389. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/manifest.yml +0 -0
  390. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  391. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-51/tsconfig.json +0 -0
  392. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  393. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/backends.py +0 -0
  394. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/conftest.py +0 -0
  395. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/board-pipeline-basic.json +0 -0
  396. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  397. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  398. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  399. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  400. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/all_pass.json +0 -0
  401. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  402. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/mixed_fail.json +0 -0
  403. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  404. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  405. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/skip.json +0 -0
  406. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/playwright/truncated.json +0 -0
  407. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  408. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  409. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  410. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  411. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  412. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  413. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  414. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  415. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_acceptance.py +0 -0
  416. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_acceptance_drivers.py +0 -0
  417. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent.py +0 -0
  418. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_api_error.py +0 -0
  419. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_app.py +0 -0
  420. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_branch_base.py +0 -0
  421. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_branch_capture.py +0 -0
  422. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_config_free_1712.py +0 -0
  423. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_deploy_units_endpoint.py +0 -0
  424. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_dirty_worktree.py +0 -0
  425. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  426. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_graph_self_heal.py +0 -0
  427. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_health_h3.py +0 -0
  428. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_idle_restart.py +0 -0
  429. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_push_failure.py +0 -0
  430. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_reap.py +0 -0
  431. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_repos_and_pull.py +0 -0
  432. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_restart_services_endpoint.py +0 -0
  433. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_skills_self_heal.py +0 -0
  434. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_startup_diagnostics.py +0 -0
  435. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_update.py +0 -0
  436. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_update_bluegreen.py +0 -0
  437. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_usage_limit.py +0 -0
  438. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_agent_zero_commit.py +0 -0
  439. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ambient_home_isolation.py +0 -0
  440. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_approve_dependency_busy_2804.py +0 -0
  441. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_approve_reject_plan.py +0 -0
  442. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_approve_usage_gate.py +0 -0
  443. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_approved_work_2532.py +0 -0
  444. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_assignment_already_recorded_daemon.py +0 -0
  445. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_audit_log.py +0 -0
  446. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_audit_outcome.py +0 -0
  447. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_audit_query.py +0 -0
  448. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_auto_loop.py +0 -0
  449. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_auto_release_publish_2035.py +0 -0
  450. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_backend_selection.py +0 -0
  451. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_base_checkout_restore.py +0 -0
  452. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_block_log.py +0 -0
  453. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_cap_762.py +0 -0
  454. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_fixture.py +0 -0
  455. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_read_path.py +0 -0
  456. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_schema.py +0 -0
  457. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_service.py +0 -0
  458. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_state.py +0 -0
  459. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_board_wire.py +0 -0
  460. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_brain.py +0 -0
  461. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_branch_model.py +0 -0
  462. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_bug_intake.py +0 -0
  463. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_build_worker_image_env_update.py +0 -0
  464. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cargo_cache.py +0 -0
  465. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_check_gh_argv_containment.py +0 -0
  466. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_acceptance_gate_1950.py +0 -0
  467. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_fix.py +0 -0
  468. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_gitlab.py +0 -0
  469. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_parity_2091.py +0 -0
  470. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_ci_store.py +0 -0
  471. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_claim.py +0 -0
  472. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_claude_md_budget.py +0 -0
  473. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_acceptance.py +0 -0
  474. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  475. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign_interactive_remote.py +0 -0
  476. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign_provider.py +0 -0
  477. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  478. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_audit.py +0 -0
  479. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_chat_continue.py +0 -0
  480. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_decide.py +0 -0
  481. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_capability_rules.py +0 -0
  482. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_config_provenance.py +0 -0
  483. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_forge_availability.py +0 -0
  484. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_graph.py +0 -0
  485. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_self.py +0 -0
  486. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_diagnose_test_coverage.py +0 -0
  487. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_doctor.py +0 -0
  488. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_doctor_config_free_1801.py +0 -0
  489. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  490. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_drive.py +0 -0
  491. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_escalate.py +0 -0
  492. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_fix_headless_review.py +0 -0
  493. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_gate_a.py +0 -0
  494. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_install_drift.py +0 -0
  495. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_install_skills.py +0 -0
  496. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_issue_comment.py +0 -0
  497. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_issue_create_label.py +0 -0
  498. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_issue_reopen.py +0 -0
  499. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_issue_view_list.py +0 -0
  500. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_merge.py +0 -0
  501. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_assign.py +0 -0
  502. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_capture.py +0 -0
  503. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_chat_add_child.py +0 -0
  504. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_dispatch.py +0 -0
  505. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_gate_b.py +0 -0
  506. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_gate_c.py +0 -0
  507. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_order.py +0 -0
  508. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  509. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_milestone_ship.py +0 -0
  510. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_network.py +0 -0
  511. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_new_issue_chat.py +0 -0
  512. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_plans.py +0 -0
  513. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_portal.py +0 -0
  514. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_pr.py +0 -0
  515. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_pull_artifact.py +0 -0
  516. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_queue.py +0 -0
  517. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_reattach_sessions.py +0 -0
  518. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_refine_board.py +0 -0
  519. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_release_preflight.py +0 -0
  520. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_release_propagate.py +0 -0
  521. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_release_window.py +0 -0
  522. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_repo_2220.py +0 -0
  523. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  524. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_scorecard.py +0 -0
  525. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_set_review_findings.py +0 -0
  526. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_advisory_terminal.py +0 -0
  527. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_contested_tag.py +0 -0
  528. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_merge_queue.py +0 -0
  529. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_provider.py +0 -0
  530. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_review_finalizing.py +0 -0
  531. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_test_failed_tag.py +0 -0
  532. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_status_usage_limit.py +0 -0
  533. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_sync_comments_873.py +0 -0
  534. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_test_plan.py +0 -0
  535. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_track.py +0 -0
  536. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_tui_update.py +0 -0
  537. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cli_wait.py +0 -0
  538. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_client_base_install.py +0 -0
  539. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_client_resource_migration_1946.py +0 -0
  540. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_commands_common.py +0 -0
  541. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_comments.py +0 -0
  542. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_completion_summary.py +0 -0
  543. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config.py +0 -0
  544. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_acceptance.py +0 -0
  545. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_audit.py +0 -0
  546. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_pricing.py +0 -0
  547. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  548. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_config_usage_gate.py +0 -0
  549. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_confirm_test.py +0 -0
  550. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_conflict_fix.py +0 -0
  551. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_conflict_fix_semantic.py +0 -0
  552. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  553. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test.py +0 -0
  554. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  555. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_baseline.py +0 -0
  556. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_populated_home.py +0 -0
  557. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_routing.py +0 -0
  558. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_test_runner_toolchain.py +0 -0
  559. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_uat.py +0 -0
  560. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coord_web_sse_restart_live.py +0 -0
  561. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_coordinator_machine.py +0 -0
  562. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_cross_platform_imports.py +0 -0
  563. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dao.py +0 -0
  564. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dashboard.py +0 -0
  565. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dashboard_fixture.py +0 -0
  566. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dashboard_terminal.py +0 -0
  567. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dashboard_terminal_live.py +0 -0
  568. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_db.py +0 -0
  569. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dead_end.py +0 -0
  570. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_decomposition_chat.py +0 -0
  571. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_coord_db_backup.py +0 -0
  572. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_coord_web_dist.py +0 -0
  573. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_coord_web_rollback.py +0 -0
  574. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_drive_queue_unit.py +0 -0
  575. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_failure_notify_unit.py +0 -0
  576. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_manifest.py +0 -0
  577. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_notify_unit.py +0 -0
  578. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_units_lane.py +0 -0
  579. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deploy_web_unit.py +0 -0
  580. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deprecation_telemetry.py +0 -0
  581. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_deps.py +0 -0
  582. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_diagnose.py +0 -0
  583. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dispatch.py +0 -0
  584. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dispatch_target_validation.py +0 -0
  585. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_dist_name.py +0 -0
  586. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_done_housekeeping.py +0 -0
  587. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive.py +0 -0
  588. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_blocked_rendering.py +0 -0
  589. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_launch_argv.py +0 -0
  590. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  591. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_roll_pending.py +0 -0
  592. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  593. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_state.py +0 -0
  594. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_drive_tmux.py +0 -0
  595. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_epic_up_capability_detection.py +0 -0
  596. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  597. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_epic_up_image_provenance.py +0 -0
  598. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_errors.py +0 -0
  599. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_events.py +0 -0
  600. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_failure_class.py +0 -0
  601. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_filelock.py +0 -0
  602. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  603. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fix_of_force_override.py +0 -0
  604. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fleet_config_health.py +0 -0
  605. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fleet_health_probes.py +0 -0
  606. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fleet_health_snapshot.py +0 -0
  607. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_fleet_watchdog.py +0 -0
  608. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_forge_availability.py +0 -0
  609. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_freshness.py +0 -0
  610. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gate_a.py +0 -0
  611. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gate_b.py +0 -0
  612. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gate_snapshot_staleness.py +0 -0
  613. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gates.py +0 -0
  614. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  615. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_gen_mock_index.py +0 -0
  616. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_generated_rust_fixture.py +0 -0
  617. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_generated_rust_requests.py +0 -0
  618. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_generated_types_fixture.py +0 -0
  619. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_github_ops.py +0 -0
  620. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_github_throttle.py +0 -0
  621. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_goal.py +0 -0
  622. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_graph_health.py +0 -0
  623. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_graph_selfheal_absent_2237.py +0 -0
  624. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_handoff.py +0 -0
  625. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_checks.py +0 -0
  626. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_cli.py +0 -0
  627. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_cli_graph.py +0 -0
  628. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_config.py +0 -0
  629. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_context.py +0 -0
  630. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_coord_tui_ci_pin.py +0 -0
  631. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_coord_web_ci_pin.py +0 -0
  632. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_deploy_lane_facts.py +0 -0
  633. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_fix.py +0 -0
  634. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_incident_regression.py +0 -0
  635. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_issues_sync_staleness.py +0 -0
  636. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_pypi.py +0 -0
  637. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_registry.py +0 -0
  638. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_release_cordon_probe.py +0 -0
  639. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_timer_active.py +0 -0
  640. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_toolchain.py +0 -0
  641. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_unit_drift.py +0 -0
  642. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_health_unit_enablement.py +0 -0
  643. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_hooks.py +0 -0
  644. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_human_attended_437.py +0 -0
  645. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_init.py +0 -0
  646. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_install_agent_venv_2911.py +0 -0
  647. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_integration.py +0 -0
  648. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_briefing_echo.py +0 -0
  649. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_pane_log_2541.py +0 -0
  650. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_prefill_state.py +0 -0
  651. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_session_relaunch.py +0 -0
  652. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_test_verdict_backstop.py +0 -0
  653. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_token_attribution.py +0 -0
  654. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_interactive_worktree.py +0 -0
  655. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_issue_store_seam.py +0 -0
  656. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_issues_sync_status.py +0 -0
  657. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_liveness_auditor.py +0 -0
  658. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_liveness_notify.py +0 -0
  659. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_lock_contention_ratchet.py +0 -0
  660. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_machine_onboard.py +0 -0
  661. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_machine_pause.py +0 -0
  662. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_merge_queue.py +0 -0
  663. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_merge_verify.py +0 -0
  664. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_chat.py +0 -0
  665. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_dispatch.py +0 -0
  666. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_gate.py +0 -0
  667. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_order.py +0 -0
  668. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_milestone_seam.py +0 -0
  669. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_mock_author.py +0 -0
  670. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_model_tiering.py +0 -0
  671. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_models.py +0 -0
  672. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_models_config_labels.py +0 -0
  673. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_needs_attention.py +0 -0
  674. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_network.py +0 -0
  675. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_new_issue_chat.py +0 -0
  676. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_next_release_tag.py +0 -0
  677. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_node_shim.py +0 -0
  678. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_baseline.py +0 -0
  679. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_cli.py +0 -0
  680. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_collect.py +0 -0
  681. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_config.py +0 -0
  682. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_drive_seam.py +0 -0
  683. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_isolation.py +0 -0
  684. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_predicate.py +0 -0
  685. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_quiet_hours.py +0 -0
  686. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notifier_service.py +0 -0
  687. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notify.py +0 -0
  688. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_notify_drain.py +0 -0
  689. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_openapi.py +0 -0
  690. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_operational_defaults.py +0 -0
  691. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_overlap_fence.py +0 -0
  692. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_overlap_predict.py +0 -0
  693. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_packaged_deploy_units.py +0 -0
  694. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_parentage.py +0 -0
  695. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_paste_landed.py +0 -0
  696. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  697. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_pipeline.py +0 -0
  698. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_followup_approve_plan_command.py +0 -0
  699. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_followup_pr_command.py +0 -0
  700. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_followup_review_command.py +0 -0
  701. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_only.py +0 -0
  702. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_plan_parser.py +0 -0
  703. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_platform_paths.py +0 -0
  704. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_portal_bridge.py +0 -0
  705. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_portal_config.py +0 -0
  706. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_portal_store.py +0 -0
  707. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_portal_sync.py +0 -0
  708. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_pr_body_lint.py +0 -0
  709. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_prereqs.py +0 -0
  710. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_production_db_guard.py +0 -0
  711. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_progress.py +0 -0
  712. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_provider_seam.py +0 -0
  713. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_providers.py +0 -0
  714. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_providers_config_labels.py +0 -0
  715. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_providers_pty.py +0 -0
  716. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_py_rust_mirror_inventory.py +0 -0
  717. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_quiet_hours.py +0 -0
  718. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_quiet_hours_store_2146.py +0 -0
  719. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reap_merged_sessions.py +0 -0
  720. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reap_stale_interactive_tick.py +0 -0
  721. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile.py +0 -0
  722. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_branch.py +0 -0
  723. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_completions.py +0 -0
  724. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  725. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_merges.py +0 -0
  726. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_no_agent_record.py +0 -0
  727. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_tick.py +0 -0
  728. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reconcile_usage_limit_done.py +0 -0
  729. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_refine_chat.py +0 -0
  730. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_cordon_2101.py +0 -0
  731. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  732. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_cordon_deadlock_2240.py +0 -0
  733. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_cordon_stuck_2490.py +0 -0
  734. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_propagate.py +0 -0
  735. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_propagate_threshold.py +0 -0
  736. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_roll_between_legs_2854.py +0 -0
  737. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_roll_window_handoff.py +0 -0
  738. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_unified_1242.py +0 -0
  739. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_verify.py +0 -0
  740. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_release_window.py +0 -0
  741. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_remote_auto_prune.py +0 -0
  742. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_remote_interactive_reaper.py +0 -0
  743. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_repo_add.py +0 -0
  744. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_repo_edit_2220.py +0 -0
  745. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_repo_graph_fleet_2237.py +0 -0
  746. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_repo_onboard_2220.py +0 -0
  747. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_report_result_push.py +0 -0
  748. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_reports.py +0 -0
  749. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_retry.py +0 -0
  750. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_retry_advisory_1606.py +0 -0
  751. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_retry_type_1636.py +0 -0
  752. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_revalidate.py +0 -0
  753. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review.py +0 -0
  754. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_end_review_without_verdict.py +0 -0
  755. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_parse_failure_diagnostic.py +0 -0
  756. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_reaffirm.py +0 -0
  757. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_state.py +0 -0
  758. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_verdict_backstop.py +0 -0
  759. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_verdict_override_audit.py +0 -0
  760. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_verdict_relay.py +0 -0
  761. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_review_zero_commits.py +0 -0
  762. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_scoped_review_wiring.py +0 -0
  763. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_scorecard.py +0 -0
  764. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_self_health.py +0 -0
  765. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_serve.py +0 -0
  766. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_serve_app_board_trim.py +0 -0
  767. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_serve_rest_routes.py +0 -0
  768. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_session.py +0 -0
  769. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_slice_issue_attribution.py +0 -0
  770. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_smoke.py +0 -0
  771. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_smoke_live_checkout_restore.py +0 -0
  772. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_smoke_workflow.py +0 -0
  773. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_spend_ceiling.py +0 -0
  774. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_spend_ceiling_coordinator.py +0 -0
  775. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_split.py +0 -0
  776. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_split_work.py +0 -0
  777. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_sql_dialect.py +0 -0
  778. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_sqlite_connect_ratchet.py +0 -0
  779. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stage_projection.py +0 -0
  780. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stale_busy_reviewer_697.py +0 -0
  781. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stalled_pipeline.py +0 -0
  782. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_state.py +0 -0
  783. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_state_review_findings_daemon.py +0 -0
  784. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_status_fleet_footer.py +0 -0
  785. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stop_1567.py +0 -0
  786. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_store_contract.py +0 -0
  787. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_store_migrate.py +0 -0
  788. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stuck.py +0 -0
  789. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  790. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_terminal_command.py +0 -0
  791. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_author.py +0 -0
  792. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_chat.py +0 -0
  793. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_orchestrator.py +0 -0
  794. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_report.py +0 -0
  795. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_verdict_parsing.py +0 -0
  796. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_test_verdict_transcript_floor.py +0 -0
  797. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_text_io_encoding_audit.py +0 -0
  798. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_thin_client_board_audit.py +0 -0
  799. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_thin_client_config_load_1080.py +0 -0
  800. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_thin_client_daemon_routing_906.py +0 -0
  801. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_tmux_host.py +0 -0
  802. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_tmux_session.py +0 -0
  803. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_transcript_floor.py +0 -0
  804. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_usage.py +0 -0
  805. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_usage_limits.py +0 -0
  806. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_usage_rollup.py +0 -0
  807. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_venv_live_install_2121.py +0 -0
  808. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_version_single_source.py +0 -0
  809. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_watch.py +0 -0
  810. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  811. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_env_venv_isolation.py +0 -0
  812. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_events.py +0 -0
  813. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_image_pin_sync.py +0 -0
  814. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_safety.py +0 -0
  815. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worker_test_scoping.py +0 -0
  816. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worktree.py +0 -0
  817. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  818. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/tests/test_write_parity.py +0 -0
  819. {code_coordinator-0.5.309 → code_coordinator-0.5.311}/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.309
3
+ Version: 0.5.311
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.309
3
+ Version: 0.5.311
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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.311",
3
+ "distance": 0,
4
+ "node": "g8003167b7c6ac292c1b0e3a06e71cc4dd08761b2",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-31"
8
+ }
@@ -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,
@@ -2301,12 +2302,20 @@ class UnreachableWait:
2301
2302
  evidence a genuine transient wouldn't have, and `last_reason` is
2302
2303
  whatever the last sweep to touch this row recorded — useful context,
2303
2304
  never re-interpreted here.
2305
+
2306
+ `dependents` (#2978) is the count of OTHER queue entries whose `after=`
2307
+ names this one — computed against the full entry set the caller passed
2308
+ to :func:`detect_unreachable_waits`, not just the flagged subset, so it
2309
+ is accurate even though those dependents themselves never appear in the
2310
+ result (see the predicate's own docstring for why). `0` for an entry
2311
+ nothing is chained behind.
2304
2312
  """
2305
2313
 
2306
2314
  key: str
2307
2315
  state: str
2308
2316
  deferrals: int
2309
2317
  last_reason: str
2318
+ dependents: int = 0
2310
2319
 
2311
2320
 
2312
2321
  def detect_unreachable_waits(
@@ -2316,35 +2325,73 @@ def detect_unreachable_waits(
2316
2325
  ) -> list[UnreachableWait]:
2317
2326
  """Entries sitting in the #2944 guaranteed-false wait.
2318
2327
 
2319
- ``state in (blocked, parked) AND attempts == 0 AND deferrals >
2320
- min_deferrals`` — see the module comment above this function for why
2321
- that combination can never resolve itself. Pure and cheap (a predicate
2322
- over already-loaded rows, no clock, no I/O), so the same function backs
2323
- both `coord drive-queue status`'s `alert:` line
2324
- (`coord.commands.drive_queue._queue_alert`) and the `coord doctor` WARN
2325
- (`coord.health.checks.wedged_drive_queue`) — one definition of "wedged",
2326
- not two that could drift apart.
2327
-
2328
- An entry with ``attempts > 0`` is excluded unconditionally, however long
2329
- it has sat: it WAS dispatched at least once, so it has (or had) a real
2330
- branch/PR/merge-queue row for a sweep to have a genuine opinion about —
2331
- that is a legitimate wait, not an unreachable one.
2328
+ Two independent shapes, either of which qualifies a `blocked`/`parked`
2329
+ entry — both provably have no branch/PR/merge-queue row for any sweep to
2330
+ ever form an opinion about, which is the actual invariant this predicate
2331
+ is checking, not "attempts == 0" as a proxy for it (#2978 found the proxy
2332
+ wrong for the second shape):
2333
+
2334
+ * ``attempts == 0`` and ``deferrals > min_deferrals`` — never dispatched
2335
+ at all. The original #2944 shape.
2336
+ * ``attempts > 0``, ``state == blocked``, and the entry's own
2337
+ `last_reason` carries #2273's "no assignment was ever created for this
2338
+ run" marker (:func:`_is_dispatch_failure_reason`) — every dispatch
2339
+ attempt died before `coord assign` produced a board-visible row, and
2340
+ the entry has now exhausted its retry budget (the only way to reach
2341
+ `blocked` with that reason: see `_reconcile_running`'s `exhausted`
2342
+ branch). Exhaustion is its own grace period — there is no next attempt
2343
+ left to wait out — so `min_deferrals` is not applied here.
2344
+
2345
+ A `blocked`/`parked` entry whose `last_reason` is instead one of
2346
+ `_resolve_prereqs`'s unsatisfiable-`after=` verdict shapes
2347
+ (:func:`_is_unsatisfiable_prereq_reason`) is excluded UNCONDITIONALLY,
2348
+ regardless of attempts/deferrals — #2978: that shape is
2349
+ :func:`_reconcile_blocked_after`'s to resolve (#2362, widened #2756),
2350
+ not an operator's, and flagging it here directly contradicts that
2351
+ function's own documented behaviour. This is what keeps a chain's
2352
+ dependents (each blocked with "pre-req X is queued but blocked — it will
2353
+ never satisfy") out of the result entirely, leaving only the root that
2354
+ actually needs a human.
2355
+
2356
+ Pure and cheap (a predicate over already-loaded rows, no clock, no I/O),
2357
+ so the same function backs both `coord drive-queue status`'s `alert:`
2358
+ line (`coord.commands.drive_queue._queue_alert`) and the `coord doctor`
2359
+ WARN (`coord.health.checks.wedged_drive_queue`) — one definition of
2360
+ "wedged", not two that could drift apart.
2332
2361
  """
2333
- return [
2334
- UnreachableWait(
2335
- key=e.key, state=e.state, deferrals=e.deferrals, last_reason=e.last_reason
2362
+ entries = list(entries)
2363
+ dependents_of: dict[str, int] = {}
2364
+ for e in entries:
2365
+ for dep in e.after:
2366
+ dependents_of[dep] = dependents_of.get(dep, 0) + 1
2367
+
2368
+ waits: list[UnreachableWait] = []
2369
+ for e in entries:
2370
+ if e.state not in (STATE_BLOCKED, STATE_PARKED):
2371
+ continue
2372
+ if _is_unsatisfiable_prereq_reason(e.last_reason):
2373
+ continue
2374
+ if e.attempts == 0:
2375
+ if e.deferrals <= min_deferrals:
2376
+ continue
2377
+ elif not (e.state == STATE_BLOCKED and _is_dispatch_failure_reason(e.last_reason)):
2378
+ continue
2379
+ waits.append(
2380
+ UnreachableWait(
2381
+ key=e.key,
2382
+ state=e.state,
2383
+ deferrals=e.deferrals,
2384
+ last_reason=e.last_reason,
2385
+ dependents=dependents_of.get(e.key, 0),
2386
+ )
2336
2387
  )
2337
- for e in entries
2338
- if e.state in (STATE_BLOCKED, STATE_PARKED)
2339
- and e.attempts == 0
2340
- and e.deferrals > min_deferrals
2341
- ]
2388
+ return waits
2342
2389
 
2343
2390
 
2344
2391
  def unreachable_wait_alert(waits: Sequence[UnreachableWait]) -> QueueAlert:
2345
2392
  """The queue-level record #2944's predicate raises, in :func:`_hold_alert`'s
2346
- shape — a message naming the entry (or entries), the deferral count that
2347
- is the evidence, and the ONE remedy that actually clears it.
2393
+ shape — a message naming the entry (or entries), the evidence that
2394
+ qualified it, and the ONE remedy that actually clears it.
2348
2395
 
2349
2396
  ``add`` alone does not clear ``blocked`` (the queue list already
2350
2397
  documents this as a footgun elsewhere) — only ``remove`` then ``add``
@@ -2356,29 +2403,52 @@ def unreachable_wait_alert(waits: Sequence[UnreachableWait]) -> QueueAlert:
2356
2403
  ``gate_readings``/``details`` lines are printed) so the remedy is visible
2357
2404
  wherever this alert's ``reason`` is, not just to a caller that also reads
2358
2405
  the structured field.
2406
+
2407
+ #2978: each name also carries its `dependents` count when non-zero — the
2408
+ entries chained behind a flagged root never appear in `waits` (see
2409
+ `detect_unreachable_waits`), so without this an operator has no way to
2410
+ know a fix to the one row named here will also resolve N others they
2411
+ never see mentioned. Explicitly says those dependents need no remedy of
2412
+ their own, since #2944's original wording ("for each entry named above")
2413
+ read, on a real incident, as an instruction to `remove`+`add` entries
2414
+ that were never named — but easy to mis-generalize to "the dependents
2415
+ too" by an operator who does not already know #2756 self-heals them.
2359
2416
  """
2360
- names = ", ".join(
2361
- f"{w.key} ({w.state}, {w.deferrals} deferrals)" for w in waits[:5]
2362
- )
2417
+ def _name(w: UnreachableWait) -> str:
2418
+ base = f"{w.key} ({w.state}, {w.deferrals} deferrals)"
2419
+ if w.dependents:
2420
+ plural = "ies" if w.dependents != 1 else "y"
2421
+ base += (
2422
+ f" — {w.dependents} dependent entr{plural} chained behind it "
2423
+ "will self-heal automatically once this clears (#2756), no "
2424
+ "remedy needed on them"
2425
+ )
2426
+ return base
2427
+
2428
+ names = ", ".join(_name(w) for w in waits[:5])
2363
2429
  more = ", ..." if len(waits) > 5 else ""
2364
2430
  plural = len(waits) != 1
2365
2431
  return QueueAlert(
2366
2432
  reason=(
2367
2433
  f"{len(waits)} queue entr{'ies' if plural else 'y'} stuck in a "
2368
- "guaranteed-false wait — never dispatched (attempts=0) yet "
2369
- f"blocked/parked past {UNREACHABLE_WAIT_MIN_DEFERRALS} deferrals; "
2434
+ "guaranteed-false wait — blocked/parked with no branch/PR/"
2435
+ "merge-queue row any sweep could ever act on (never dispatched, "
2436
+ "or every dispatch attempt died before creating an assignment); "
2370
2437
  f"no sweep can ever clear this on its own: {names}{more}. Fix: "
2371
2438
  "coord drive-queue remove <repo> <issue> && "
2372
- "coord drive-queue add <repo> <issue> for each entry named above."
2439
+ "coord drive-queue add <repo> <issue> for each ROOT entry named "
2440
+ "above — never on a dependent chained behind one."
2373
2441
  ),
2374
2442
  details=tuple(
2375
2443
  f"{w.key}: {w.state}, {w.deferrals} deferrals, "
2376
- f"last_reason={w.last_reason!r}"
2444
+ f"dependents={w.dependents}, last_reason={w.last_reason!r}"
2377
2445
  for w in waits
2378
2446
  ),
2379
2447
  command=(
2380
2448
  "coord drive-queue remove <repo> <issue> && "
2381
- "coord drive-queue add <repo> <issue> — for each entry named above"
2449
+ "coord drive-queue add <repo> <issue> — for each ROOT entry "
2450
+ "named above; any dependents chained behind it self-heal on "
2451
+ "their own (#2756)"
2382
2452
  ),
2383
2453
  )
2384
2454
 
@@ -3425,6 +3495,42 @@ def _reconcile_running(
3425
3495
  None,
3426
3496
  )
3427
3497
 
3498
+ # #2977: `coord assign` exited because `_gh`'s pre-call guard found a
3499
+ # shared GitHub rate-limit backoff already active and skipped the call
3500
+ # entirely (`GhRateLimitError(from_cache=True)`) — no `gh` call was ever
3501
+ # attempted for this launch. That is neither a permanent refusal (the
3502
+ # `is_policy_refusal_reason`/`is_gate_a_refusal_reason` shapes above —
3503
+ # nothing about the ISSUE was rejected) nor a genuine dispatch failure
3504
+ # (the generic `_dispatch_produced_nothing` note below, which would
3505
+ # spend an attempt): it is a fleet-wide, known-duration condition this
3506
+ # entry had nothing to do with. Parks WITHOUT spending an attempt
3507
+ # (`Reconcile.updates` carries no `attempts` key, same as every other
3508
+ # park above) — the wall-clock `until=` timestamp
3509
+ # `github_ops.format_throttle_skip_reason` embedded in `own_reason` is
3510
+ # what lets `plan_tick`'s parked-entry sweep resume it the moment the
3511
+ # backoff clears, with no live re-check and no operator action, unlike
3512
+ # the gate_a/policy parks just above which need one.
3513
+ if own_reason and is_throttle_skip_reason(own_reason):
3514
+ reason = (
3515
+ f"{own_reason} — parking without spending an attempt; the queue "
3516
+ "resumes it automatically once the backoff clears, no operator "
3517
+ "needed (#2977)"
3518
+ )
3519
+ return (
3520
+ Reconcile(
3521
+ entry.key,
3522
+ "parked",
3523
+ reason,
3524
+ occupies=False,
3525
+ updates={
3526
+ "state": STATE_PARKED,
3527
+ "last_reason": reason,
3528
+ "session_name": None,
3529
+ },
3530
+ ),
3531
+ None,
3532
+ )
3533
+
3428
3534
  permanent: tuple[str, str] | None = None
3429
3535
  if own_reason and (exit_refused or {}).get(entry.key):
3430
3536
  permanent = (
@@ -5008,6 +5114,59 @@ def plan_tick(
5008
5114
  # clears it (`coord drive-queue remove`, same as `blocked`).
5009
5115
  if is_policy_refusal_reason(entry.last_reason):
5010
5116
  continue
5117
+ # #2977: a throttle-skip park (`github_ops.is_throttle_skip_reason`)
5118
+ # carries its OWN known wall-clock expiry (`until=<epoch>`, embedded
5119
+ # by `github_ops.format_throttle_skip_reason` at park time) — unlike
5120
+ # the CI-park default below, which needs a live re-check because it
5121
+ # has no way to know in advance when checks will report, this park
5122
+ # can resume on a plain clock comparison, no I/O at all. `now is
5123
+ # None` (a pure-logic caller with no clock) degrades to "never
5124
+ # resume this tick", same posture #1794's grace window uses for the
5125
+ # same input. An unparseable `until` (should not happen for text
5126
+ # this module itself wrote) or a wait that has run well past
5127
+ # `PARK_STALE_SECONDS` — far longer than any real backoff
5128
+ # (`coord.github_throttle.MAX_BACKOFF_S` is 900s) — resumes anyway
5129
+ # rather than parking indefinitely on a reading nothing can refresh,
5130
+ # the same finite-wait guarantee #2158 already gives the CI park.
5131
+ if is_throttle_skip_reason(entry.last_reason):
5132
+ if now is None:
5133
+ continue
5134
+ until = parse_throttle_skip_until(entry.last_reason)
5135
+ age = now - entry.reason_at if entry.reason_at is not None else None
5136
+ cleared = until is not None and now >= until
5137
+ stale = until is None or (age is not None and age > PARK_STALE_SECONDS)
5138
+ if not cleared and not stale:
5139
+ continue
5140
+ reason = (
5141
+ (
5142
+ f"the GitHub rate-limit backoff that parked {entry.key} "
5143
+ "has cleared — resuming without spending an attempt "
5144
+ "(#2977)"
5145
+ )
5146
+ if cleared
5147
+ else (
5148
+ f"{entry.last_reason} — this throttle-skip park has run "
5149
+ f"{PARK_STALE_SECONDS / 60:.0f}m+ with no refreshable "
5150
+ "expiry left to trust — resuming rather than parking "
5151
+ "indefinitely (#2977)"
5152
+ )
5153
+ )
5154
+ reconciles.append(
5155
+ Reconcile(
5156
+ entry.key,
5157
+ "resumed",
5158
+ reason,
5159
+ occupies=False,
5160
+ updates={
5161
+ "state": STATE_WAITING,
5162
+ "attempts": 0,
5163
+ "last_reason": reason,
5164
+ },
5165
+ )
5166
+ )
5167
+ states[entry.key] = STATE_WAITING
5168
+ effective_attempts[entry.key] = 0
5169
+ continue
5011
5170
  if park_expired is not None:
5012
5171
  # Deliberately does NOT claim CI has reported — nothing here knows
5013
5172
  # 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
@@ -19,6 +19,15 @@ so this check and that line can never say different things) — this probe
19
19
  just re-derives it, live, from ``drive_queue`` state every time ``coord
20
20
  doctor`` runs, independent of whatever the last tick happened to report.
21
21
 
22
+ #2978: the predicate also flags an ``attempts > 0`` entry that exhausted its
23
+ retry budget without ever getting a #2273 dispatch-layer death past `coord
24
+ assign` (same "no branch/PR ever existed" invariant, just reached a
25
+ different way) — and excludes an entry blocked solely on an unsatisfiable
26
+ ``after=`` pre-req, since that one is ``_reconcile_blocked_after``'s to
27
+ self-heal (#2362/#2756), not an operator's. See
28
+ ``coord.drive_queue.detect_unreachable_waits`` for the exact predicate; this
29
+ probe does not duplicate it, only renders its result.
30
+
22
31
  This is deliberately independent of #2935 (which fixes the specific sweep
23
32
  that produced the #2900/#2907 incident) and #2230 (the sweep's origin): both
24
33
  are about *why* a row gets wedged this way; this check is about the row
@@ -51,16 +60,19 @@ from coord.health.registry import COST_NETWORK, check
51
60
  cost=COST_NETWORK,
52
61
  description=(
53
62
  "Drive-queue rows in `coord.drive_queue`'s #2944 guaranteed-false "
54
- "wait: `blocked`/`parked`, `attempts == 0` (never dispatched — no "
55
- "branch, no PR, no merge-queue row ever existed or ever can), "
56
- "sitting past a few ticks of grace. Reads via `coord.state."
57
- "list_drive_queue`, which — per its own docstring — routes to the "
58
- "daemon over HTTP when `board_service` is set (the common case on a "
59
- "thin-client fleet machine, see `release_cordon.py`) and only reads "
60
- "the local DB directly otherwise; `cost=network` so `--no-network`/"
61
- "timer runs and the automatic per-agent health poll skip it exactly "
62
- "like the other network-costed checks, same precedent as "
63
- "`release_cordon`."
63
+ "wait: `blocked`/`parked` with no branch/PR/merge-queue row any "
64
+ "sweep could ever act on — either `attempts == 0` (never dispatched) "
65
+ "past a few ticks of grace, or `attempts > 0` with an exhausted "
66
+ "#2273 dispatch-layer death (#2978). Excludes an entry blocked "
67
+ "solely on an unsatisfiable `after=` pre-req — that one is "
68
+ "`_reconcile_blocked_after`'s to self-heal (#2756), not an "
69
+ "operator's. Reads via `coord.state.list_drive_queue`, which — per "
70
+ "its own docstring — routes to the daemon over HTTP when "
71
+ "`board_service` is set (the common case on a thin-client fleet "
72
+ "machine, see `release_cordon.py`) and only reads the local DB "
73
+ "directly otherwise; `cost=network` so `--no-network`/timer runs "
74
+ "and the automatic per-agent health poll skip it exactly like the "
75
+ "other network-costed checks, same precedent as `release_cordon`."
64
76
  ),
65
77
  )
66
78
  def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
@@ -92,7 +104,10 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
92
104
  )
93
105
 
94
106
  sample = ", ".join(
95
- f"{w.key} ({w.state}, {w.deferrals} deferrals)" for w in waits[:5]
107
+ f"{w.key} ({w.state}, {w.deferrals} deferrals"
108
+ + (f", {w.dependents} dependents self-heal (#2756)" if w.dependents else "")
109
+ + ")"
110
+ for w in waits[:5]
96
111
  )
97
112
  return CheckResult(
98
113
  check_id="wedged_drive_queue",
@@ -104,11 +119,17 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
104
119
  ),
105
120
  detail=(
106
121
  f"e.g. {sample}" + (", ..." if len(waits) > 5 else "")
107
- + " — never dispatched (attempts=0), cannot clear on its own; "
108
- "fix: coord drive-queue remove <repo> <issue> && "
109
- "coord drive-queue add <repo> <issue>"
122
+ + " — no branch/PR/merge-queue row any sweep could ever act on "
123
+ "(never dispatched, or every dispatch attempt died before "
124
+ "creating an assignment); cannot clear on its own. fix (root "
125
+ "only — any dependents self-heal, #2756): coord drive-queue "
126
+ "remove <repo> <issue> && coord drive-queue add <repo> <issue>"
127
+ ),
128
+ threshold=(
129
+ "warn when any entry is blocked/parked with no branch/PR a sweep "
130
+ "could ever act on: attempts=0 past a few ticks of grace, or "
131
+ "attempts>0 with an exhausted #2273 dispatch-layer death"
110
132
  ),
111
- threshold="warn when any entry is blocked/parked, attempts=0, past a few ticks of grace",
112
133
  values={
113
134
  "count": len(waits),
114
135
  "entries": [
@@ -116,6 +137,7 @@ def probe_wedged_drive_queue(ctx: HealthContext) -> CheckResult:
116
137
  "key": w.key,
117
138
  "state": w.state,
118
139
  "deferrals": w.deferrals,
140
+ "dependents": w.dependents,
119
141
  "last_reason": w.last_reason,
120
142
  }
121
143
  for w in waits
@@ -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: