code-coordinator 0.5.317__tar.gz → 0.5.318__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 (820) hide show
  1. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/confirm_test.py +171 -2
  5. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notify.py +132 -22
  6. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_confirm_test.py +193 -0
  7. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notify_drain.py +78 -4
  8. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_roll_window_handoff.py +11 -4
  9. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stuck_test_state_watchdog_2803.py +18 -2
  10. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.claude/commands/board.md +0 -0
  11. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.claude/commands/complete-session.md +0 -0
  12. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.claude/commands/coordinator.md +0 -0
  13. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.githooks/_lib.sh +0 -0
  14. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.githooks/post-checkout +0 -0
  15. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.githooks/post-commit +0 -0
  16. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.githooks/post-merge +0 -0
  17. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  18. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/coord-ci-acceptance.yml +0 -0
  19. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/workflows/auto-release.yml +0 -0
  20. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/workflows/publish.yml +0 -0
  21. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/workflows/test.yml +0 -0
  22. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.gitignore +0 -0
  23. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/CLAUDE.md +0 -0
  24. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/GOAL.md +0 -0
  25. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/LICENSE +0 -0
  26. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/MANIFEST.in +0 -0
  27. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/README.md +0 -0
  28. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/SOURCES.txt +0 -0
  29. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/dependency_links.txt +0 -0
  30. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/entry_points.txt +0 -0
  31. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/requires.txt +0 -0
  32. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/scm_file_list.json +0 -0
  33. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/top_level.txt +0 -0
  34. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/__init__.py +0 -0
  35. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/_board_mapping.py +0 -0
  36. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/acceptance.py +0 -0
  37. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/acceptance_drivers.py +0 -0
  38. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agent.py +0 -0
  39. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agent_app.py +0 -0
  40. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agent_update.py +0 -0
  41. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agents/opencode/.gitignore +0 -0
  42. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agents/opencode/agents/work.md +0 -0
  43. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agents/opencode/routing.jsonc +0 -0
  44. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/approved_work.py +0 -0
  45. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/audit.py +0 -0
  46. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/auto_loop.py +0 -0
  47. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/block_log.py +0 -0
  48. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/board_schema.py +0 -0
  49. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/board_service.py +0 -0
  50. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/board_wire.py +0 -0
  51. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/brain.py +0 -0
  52. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/branch_model.py +0 -0
  53. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/bug_intake.py +0 -0
  54. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/cargo_cache.py +0 -0
  55. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/ci_fix.py +0 -0
  56. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/ci_gitlab.py +0 -0
  58. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/ci_store.py +0 -0
  59. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/claim.py +0 -0
  60. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/cli.py +0 -0
  61. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/client.py +0 -0
  62. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/__init__.py +0 -0
  63. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/_common.py +0 -0
  64. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/acceptance.py +0 -0
  65. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/agent_ops.py +0 -0
  66. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/audit.py +0 -0
  67. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/chat.py +0 -0
  68. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/dispatch.py +0 -0
  69. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/dispatch_workers.py +0 -0
  70. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/drive.py +0 -0
  71. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/drive_queue.py +0 -0
  72. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/gate_a.py +0 -0
  73. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/gates.py +0 -0
  74. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/issues.py +0 -0
  75. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/lifecycle.py +0 -0
  76. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/machine.py +0 -0
  77. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/merge.py +0 -0
  78. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/milestone.py +0 -0
  79. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/plan_followup.py +0 -0
  80. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/plans.py +0 -0
  81. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/portal.py +0 -0
  82. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/pr.py +0 -0
  83. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/release.py +0 -0
  84. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/repo.py +0 -0
  85. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/report.py +0 -0
  86. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/review.py +0 -0
  87. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/scorecard.py +0 -0
  88. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/sessions.py +0 -0
  89. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/setup.py +0 -0
  90. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/status.py +0 -0
  91. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/store_migrate.py +0 -0
  92. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/terminal.py +0 -0
  93. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/test_gate.py +0 -0
  94. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/tui.py +0 -0
  95. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/comments.py +0 -0
  96. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/config.py +0 -0
  97. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/config_reload.py +0 -0
  98. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/conflict_fix.py +0 -0
  99. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dao.py +0 -0
  100. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/__init__.py +0 -0
  101. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/fixture.py +0 -0
  102. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/index.html +0 -0
  103. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/server.py +0 -0
  104. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/terminal.py +0 -0
  105. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/db.py +0 -0
  106. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dead_end.py +0 -0
  107. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/decomposition_chat.py +0 -0
  108. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/README.md +0 -0
  109. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-agent.service +0 -0
  110. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.service +0 -0
  111. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.sh +0 -0
  112. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.timer +0 -0
  113. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-drive-queue.service +0 -0
  114. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-drive-queue.timer +0 -0
  115. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-failure-notify.service +0 -0
  116. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-fleet-watchdog.service +0 -0
  117. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  118. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-notify.service +0 -0
  119. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-notify.timer +0 -0
  120. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-release-propagate.service +0 -0
  121. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-release-propagate.timer +0 -0
  122. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-release-window.service +0 -0
  123. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-release-window.timer +0 -0
  124. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-serve.service +0 -0
  125. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-web-dist-build.service +0 -0
  126. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-web-dist-build.timer +0 -0
  127. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-web.service +0 -0
  128. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy_manifest.py +0 -0
  129. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy_units.py +0 -0
  130. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deprecation_telemetry.py +0 -0
  131. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deps.py +0 -0
  132. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/diagnose.py +0 -0
  133. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dispatch.py +0 -0
  134. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dist_name.py +0 -0
  135. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/drive.py +0 -0
  136. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/drive_queue.py +0 -0
  137. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/drive_state.py +0 -0
  138. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/events.py +0 -0
  139. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/failure_class.py +0 -0
  140. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/filelock.py +0 -0
  141. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/fleet_config_health.py +0 -0
  142. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/forge_availability.py +0 -0
  143. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/freshness.py +0 -0
  144. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/gate_a.py +0 -0
  145. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/gate_b.py +0 -0
  146. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/gate_snapshot.py +0 -0
  147. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/gates.py +0 -0
  148. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/github_ops.py +0 -0
  149. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/github_throttle.py +0 -0
  150. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/goal.py +0 -0
  151. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/graph_health.py +0 -0
  152. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/__init__.py +0 -0
  153. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/aggregate.py +0 -0
  154. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/__init__.py +0 -0
  155. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/_ci_pin.py +0 -0
  156. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/agent_install.py +0 -0
  157. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/cargo_targets.py +0 -0
  158. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/claude_binary.py +0 -0
  159. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  160. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/coord_web_ci_pin.py +0 -0
  161. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/deploy_lane_facts.py +0 -0
  162. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/disk.py +0 -0
  163. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/fleet_board.py +0 -0
  164. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  165. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/fleet_phantom.py +0 -0
  166. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/fleet_unit_drift.py +0 -0
  167. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/graph.py +0 -0
  168. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/graphify_cli.py +0 -0
  169. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/index_lock.py +0 -0
  170. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/issues_sync_staleness.py +0 -0
  171. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/plan_usage.py +0 -0
  172. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/release_cordon.py +0 -0
  173. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/repo_state.py +0 -0
  174. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/spawned_coord.py +0 -0
  175. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/stalled_pipeline.py +0 -0
  176. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/timer_active.py +0 -0
  177. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/toolchain.py +0 -0
  178. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/unit_drift.py +0 -0
  179. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/unit_enablement.py +0 -0
  180. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/wedged_drive_queue.py +0 -0
  181. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/worktrees.py +0 -0
  182. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/cli.py +0 -0
  183. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/context.py +0 -0
  184. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/fleet_snapshot.py +0 -0
  185. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/models.py +0 -0
  186. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/pypi.py +0 -0
  187. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/registry.py +0 -0
  188. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/render.py +0 -0
  189. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/units.py +0 -0
  190. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/hooks.py +0 -0
  191. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/housekeeping.py +0 -0
  192. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/interactive.py +0 -0
  193. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/issue_store.py +0 -0
  194. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/issues_sync_status.py +0 -0
  195. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/liveness_auditor.py +0 -0
  196. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/machine_onboard.py +0 -0
  197. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/machine_pause.py +0 -0
  198. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/merge_queue.py +0 -0
  199. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/milestone_chat.py +0 -0
  200. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/milestone_dispatch.py +0 -0
  201. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/milestone_gate.py +0 -0
  202. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/milestone_order.py +0 -0
  203. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/mock_author.py +0 -0
  204. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/models.py +0 -0
  205. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/network.py +0 -0
  206. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/new_issue_chat.py +0 -0
  207. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/__init__.py +0 -0
  208. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/baseline.py +0 -0
  209. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/cli.py +0 -0
  210. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/collect.py +0 -0
  211. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/digest.py +0 -0
  212. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/models.py +0 -0
  213. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/predicate.py +0 -0
  214. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/service.py +0 -0
  215. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/store.py +0 -0
  216. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/transport.py +0 -0
  217. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/openapi.py +0 -0
  218. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/overlap_fence.py +0 -0
  219. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/overlap_predict.py +0 -0
  220. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/parentage.py +0 -0
  221. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/parentage_github.py +0 -0
  222. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/pipeline.py +0 -0
  223. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/plan_parser.py +0 -0
  224. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/plans.py +0 -0
  225. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/platform_paths.py +0 -0
  226. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/portal_bridge.py +0 -0
  227. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/portal_store.py +0 -0
  228. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/portal_sync.py +0 -0
  229. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/pr_body_lint.py +0 -0
  230. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/prereqs.py +0 -0
  231. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/progress.py +0 -0
  232. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/__init__.py +0 -0
  233. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/base.py +0 -0
  234. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/claude.py +0 -0
  235. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/claude_pty.py +0 -0
  236. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/opencode.py +0 -0
  237. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/queue_diagnose.py +0 -0
  238. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/reconcile.py +0 -0
  239. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/reconcile_tick.py +0 -0
  240. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/refine_chat.py +0 -0
  241. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/release_cordon.py +0 -0
  242. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/release_propagate.py +0 -0
  243. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/release_verify.py +0 -0
  244. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/release_window.py +0 -0
  245. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/repo_dormancy.py +0 -0
  246. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/repo_edit.py +0 -0
  247. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/repo_onboard.py +0 -0
  248. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/reports.py +0 -0
  249. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/rest_schema.py +0 -0
  250. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/revalidate.py +0 -0
  251. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/review.py +0 -0
  252. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/scorecard.py +0 -0
  253. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/self_health.py +0 -0
  254. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/serve_app.py +0 -0
  255. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  256. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  257. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  258. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  259. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/portal-followup/SKILL.md +0 -0
  261. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/release-now/SKILL.md +0 -0
  262. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  263. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  264. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/update-issue/SKILL.md +0 -0
  265. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/smoke.py +0 -0
  266. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/spend_ceiling.py +0 -0
  267. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/split_work.py +0 -0
  268. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/sql.py +0 -0
  269. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/stage_projection.py +0 -0
  270. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/state.py +0 -0
  271. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/store_migrate.py +0 -0
  272. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/test_author.py +0 -0
  273. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/test_chat.py +0 -0
  274. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/test_orchestrator.py +0 -0
  275. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/test_report.py +0 -0
  276. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/tui_release.py +0 -0
  277. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/usage.py +0 -0
  278. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/usage_limits.py +0 -0
  279. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/usage_rollup.py +0 -0
  280. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/worker_events.py +0 -0
  281. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coordinator.example.yml +0 -0
  282. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-agent.service +0 -0
  283. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-db-backup.service +0 -0
  284. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-db-backup.sh +0 -0
  285. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-db-backup.timer +0 -0
  286. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-drive-queue.service +0 -0
  287. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-drive-queue.timer +0 -0
  288. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-failure-notify.service +0 -0
  289. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-failure-notify.sh +0 -0
  290. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-fleet-watchdog.service +0 -0
  291. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-fleet-watchdog.timer +0 -0
  292. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-notify.service +0 -0
  293. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-notify.timer +0 -0
  294. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-release-propagate.service +0 -0
  295. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-release-propagate.timer +0 -0
  296. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-release-window.service +0 -0
  297. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-release-window.timer +0 -0
  298. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-serve.service +0 -0
  299. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.service +0 -0
  300. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.sh +0 -0
  301. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.timer +0 -0
  302. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web-rollback.sh +0 -0
  303. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web.service +0 -0
  304. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/node-shim.sh +0 -0
  305. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_COORD_TUI_CI.md +0 -0
  306. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  307. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_CI.md +0 -0
  308. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_DIST.md +0 -0
  309. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  310. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/AGENT_OPERATIONS.md +0 -0
  311. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ARCHITECTURE.md +0 -0
  312. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ARCH_SECURITY_GATES.md +0 -0
  313. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/COCKPIT.md +0 -0
  314. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/CONTROL_CENTER.md +0 -0
  315. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/COST_DISCIPLINE.md +0 -0
  316. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/CROSS_PLATFORM.md +0 -0
  317. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/CUSTOMER_FACING_APPS.md +0 -0
  318. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/CUSTOMER_PORTAL.md +0 -0
  319. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/DRIVE_QUEUE.md +0 -0
  320. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/EPHEMERAL_WORKERS.md +0 -0
  321. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/FORGE_MIGRATION.md +0 -0
  322. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/GRAPHIFY_SETUP.md +0 -0
  323. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ISSUE_GUIDANCE.md +0 -0
  324. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/MAC_MINI.md +0 -0
  325. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  326. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/NOTIFIER.md +0 -0
  327. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/OPENCODE_VERIFICATION.md +0 -0
  328. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/OPERATING_GOTCHAS.md +0 -0
  329. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/OPERATOR_GUIDES.md +0 -0
  330. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ORACLE_LOOP.md +0 -0
  331. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/PHONE_WEBAPP.md +0 -0
  332. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/PIPELINE_V2.md +0 -0
  333. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/PLATFORM_EVOLUTION.md +0 -0
  334. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/SECOND_BACKEND.md +0 -0
  335. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/STORE_SERVICE.md +0 -0
  336. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  337. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/WEB_CONTROL_CENTER.md +0 -0
  338. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/WSL_WINDOWS_WORKER.md +0 -0
  339. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/README.md +0 -0
  340. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/_tokens.css +0 -0
  341. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/issue-detail.html +0 -0
  342. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/pipeline-narrow.html +0 -0
  343. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/pipeline-wide.html +0 -0
  344. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/graphify-out/.gitignore +0 -0
  345. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/install-agent.sh +0 -0
  346. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/pyproject.toml +0 -0
  347. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/audit_review_verdict_overrides.py +0 -0
  348. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  349. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/build-worker-image.sh +0 -0
  350. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/coordinator-machine.py +0 -0
  351. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/epic-down.sh +0 -0
  352. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/epic-up.sh +0 -0
  353. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/preflight.sh +0 -0
  354. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/provision-worker.sh +0 -0
  355. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  356. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  357. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/verify-github-token.sh +0 -0
  358. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/check_gh_argv_containment.py +0 -0
  359. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/codegen.py +0 -0
  360. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-test-runner.sh +0 -0
  361. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  362. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  363. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  364. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  365. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-venv-rollback.sh +0 -0
  366. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/drive-batch.sh +0 -0
  367. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/extract-coord-tui.sh +0 -0
  368. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/fleet_watchdog.py +0 -0
  369. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/gen_board_fixture.py +0 -0
  370. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/gen_mock_index.py +0 -0
  371. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/next_release_tag.py +0 -0
  372. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/run_tests_in_populated_home.sh +0 -0
  373. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/run_tests_without_gh.sh +0 -0
  374. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/smoke_437_interactive.py +0 -0
  375. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/verify_878_review_capture.py +0 -0
  376. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/verify_release_published.py +0 -0
  377. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/verify_release_wheel.py +0 -0
  378. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/setup.cfg +0 -0
  379. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/SMOKE_SET.md +0 -0
  380. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/__init__.py +0 -0
  381. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/conftest.py +0 -0
  382. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/contract.md +0 -0
  383. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/manifest.yml +0 -0
  384. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  385. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  386. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/contract.md +0 -0
  387. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  388. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  389. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/manifest.yml +0 -0
  390. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  391. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/tsconfig.json +0 -0
  392. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  393. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/backends.py +0 -0
  394. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/conftest.py +0 -0
  395. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/board-pipeline-basic.json +0 -0
  396. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  397. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  398. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  399. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  400. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/all_pass.json +0 -0
  401. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  402. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/mixed_fail.json +0 -0
  403. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  404. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  405. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/skip.json +0 -0
  406. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/truncated.json +0 -0
  407. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  408. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  409. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  410. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  411. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  412. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  413. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  414. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  415. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_acceptance.py +0 -0
  416. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_acceptance_drivers.py +0 -0
  417. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent.py +0 -0
  418. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_api_error.py +0 -0
  419. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_app.py +0 -0
  420. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_branch_base.py +0 -0
  421. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_branch_capture.py +0 -0
  422. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_config_free_1712.py +0 -0
  423. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_deploy_units_endpoint.py +0 -0
  424. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_dirty_worktree.py +0 -0
  425. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  426. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_graph_self_heal.py +0 -0
  427. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_health_h3.py +0 -0
  428. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_idle_restart.py +0 -0
  429. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_push_failure.py +0 -0
  430. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_reap.py +0 -0
  431. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_repos_and_pull.py +0 -0
  432. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_restart_services_endpoint.py +0 -0
  433. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_skills_self_heal.py +0 -0
  434. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_startup_diagnostics.py +0 -0
  435. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_update.py +0 -0
  436. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_update_bluegreen.py +0 -0
  437. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_usage_limit.py +0 -0
  438. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_zero_commit.py +0 -0
  439. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ambient_home_isolation.py +0 -0
  440. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_approve_dependency_busy_2804.py +0 -0
  441. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_approve_reject_plan.py +0 -0
  442. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_approve_usage_gate.py +0 -0
  443. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_approved_work_2532.py +0 -0
  444. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_assignment_already_recorded_daemon.py +0 -0
  445. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_audit_log.py +0 -0
  446. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_audit_outcome.py +0 -0
  447. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_audit_query.py +0 -0
  448. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_auto_loop.py +0 -0
  449. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_auto_release_publish_2035.py +0 -0
  450. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_backend_selection.py +0 -0
  451. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_base_checkout_restore.py +0 -0
  452. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_block_log.py +0 -0
  453. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_cap_762.py +0 -0
  454. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_fixture.py +0 -0
  455. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_read_path.py +0 -0
  456. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_schema.py +0 -0
  457. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_service.py +0 -0
  458. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_state.py +0 -0
  459. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_wire.py +0 -0
  460. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_brain.py +0 -0
  461. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_branch_model.py +0 -0
  462. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_bug_intake.py +0 -0
  463. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_build_worker_image_env_update.py +0 -0
  464. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cargo_cache.py +0 -0
  465. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_check_gh_argv_containment.py +0 -0
  466. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_acceptance_gate_1950.py +0 -0
  467. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_fix.py +0 -0
  468. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_gitlab.py +0 -0
  469. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_parity_2091.py +0 -0
  470. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_store.py +0 -0
  471. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_claim.py +0 -0
  472. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_claude_md_budget.py +0 -0
  473. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_acceptance.py +0 -0
  474. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign.py +0 -0
  475. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  476. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign_interactive_remote.py +0 -0
  477. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign_provider.py +0 -0
  478. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  479. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_audit.py +0 -0
  480. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_chat_continue.py +0 -0
  481. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_decide.py +0 -0
  482. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_capability_rules.py +0 -0
  483. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_config_provenance.py +0 -0
  484. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_forge_availability.py +0 -0
  485. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_graph.py +0 -0
  486. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_self.py +0 -0
  487. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_test_coverage.py +0 -0
  488. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_doctor.py +0 -0
  489. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_doctor_config_free_1801.py +0 -0
  490. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  491. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_drive.py +0 -0
  492. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_drive_queue.py +0 -0
  493. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_escalate.py +0 -0
  494. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_fix_headless_review.py +0 -0
  495. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_gate_a.py +0 -0
  496. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_install_drift.py +0 -0
  497. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_install_skills.py +0 -0
  498. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_issue_comment.py +0 -0
  499. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_issue_create_label.py +0 -0
  500. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_issue_reopen.py +0 -0
  501. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_issue_view_list.py +0 -0
  502. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_merge.py +0 -0
  503. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_assign.py +0 -0
  504. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_capture.py +0 -0
  505. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_chat_add_child.py +0 -0
  506. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_dispatch.py +0 -0
  507. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_gate_b.py +0 -0
  508. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_gate_c.py +0 -0
  509. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_order.py +0 -0
  510. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  511. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_ship.py +0 -0
  512. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_network.py +0 -0
  513. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_new_issue_chat.py +0 -0
  514. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_plans.py +0 -0
  515. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_portal.py +0 -0
  516. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_pr.py +0 -0
  517. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_pull_artifact.py +0 -0
  518. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_queue.py +0 -0
  519. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_reattach_sessions.py +0 -0
  520. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_refine_board.py +0 -0
  521. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_release_preflight.py +0 -0
  522. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_release_propagate.py +0 -0
  523. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_release_window.py +0 -0
  524. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_repo_2220.py +0 -0
  525. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  526. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_scorecard.py +0 -0
  527. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_set_review_findings.py +0 -0
  528. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_advisory_terminal.py +0 -0
  529. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_contested_tag.py +0 -0
  530. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_merge_queue.py +0 -0
  531. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_provider.py +0 -0
  532. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_review_finalizing.py +0 -0
  533. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_test_failed_tag.py +0 -0
  534. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_usage_limit.py +0 -0
  535. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_sync_comments_873.py +0 -0
  536. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_test_plan.py +0 -0
  537. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_track.py +0 -0
  538. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_tui_update.py +0 -0
  539. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_wait.py +0 -0
  540. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_client_base_install.py +0 -0
  541. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_client_resource_migration_1946.py +0 -0
  542. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_commands_common.py +0 -0
  543. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_comments.py +0 -0
  544. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_completion_summary.py +0 -0
  545. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config.py +0 -0
  546. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_acceptance.py +0 -0
  547. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_audit.py +0 -0
  548. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_pricing.py +0 -0
  549. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  550. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_usage_gate.py +0 -0
  551. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_conflict_fix.py +0 -0
  552. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_conflict_fix_semantic.py +0 -0
  553. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  554. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test.py +0 -0
  555. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  556. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_baseline.py +0 -0
  557. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_populated_home.py +0 -0
  558. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_routing.py +0 -0
  559. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_toolchain.py +0 -0
  560. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_uat.py +0 -0
  561. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_web_sse_restart_live.py +0 -0
  562. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coordinator_machine.py +0 -0
  563. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cross_platform_imports.py +0 -0
  564. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dao.py +0 -0
  565. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dashboard.py +0 -0
  566. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dashboard_fixture.py +0 -0
  567. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dashboard_terminal.py +0 -0
  568. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dashboard_terminal_live.py +0 -0
  569. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_db.py +0 -0
  570. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dead_end.py +0 -0
  571. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_decomposition_chat.py +0 -0
  572. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_coord_db_backup.py +0 -0
  573. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_coord_web_dist.py +0 -0
  574. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_coord_web_rollback.py +0 -0
  575. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_drive_queue_unit.py +0 -0
  576. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_failure_notify_unit.py +0 -0
  577. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_manifest.py +0 -0
  578. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_notify_unit.py +0 -0
  579. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_units_lane.py +0 -0
  580. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_web_unit.py +0 -0
  581. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deprecation_telemetry.py +0 -0
  582. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deps.py +0 -0
  583. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_diagnose.py +0 -0
  584. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dispatch.py +0 -0
  585. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dispatch_target_validation.py +0 -0
  586. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dist_name.py +0 -0
  587. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_done_housekeeping.py +0 -0
  588. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive.py +0 -0
  589. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue.py +0 -0
  590. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_blocked_rendering.py +0 -0
  591. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_launch_argv.py +0 -0
  592. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  593. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_roll_pending.py +0 -0
  594. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  595. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_state.py +0 -0
  596. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_tmux.py +0 -0
  597. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_epic_up_capability_detection.py +0 -0
  598. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  599. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_epic_up_image_provenance.py +0 -0
  600. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_errors.py +0 -0
  601. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_events.py +0 -0
  602. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_failure_class.py +0 -0
  603. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_filelock.py +0 -0
  604. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  605. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fix_of_force_override.py +0 -0
  606. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fleet_config_health.py +0 -0
  607. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fleet_health_probes.py +0 -0
  608. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fleet_health_snapshot.py +0 -0
  609. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fleet_watchdog.py +0 -0
  610. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_forge_availability.py +0 -0
  611. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_freshness.py +0 -0
  612. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gate_a.py +0 -0
  613. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gate_b.py +0 -0
  614. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gate_snapshot_staleness.py +0 -0
  615. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gates.py +0 -0
  616. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  617. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gen_mock_index.py +0 -0
  618. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_generated_rust_fixture.py +0 -0
  619. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_generated_rust_requests.py +0 -0
  620. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_generated_types_fixture.py +0 -0
  621. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_github_ops.py +0 -0
  622. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_github_throttle.py +0 -0
  623. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_goal.py +0 -0
  624. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_graph_health.py +0 -0
  625. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_graph_selfheal_absent_2237.py +0 -0
  626. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_handoff.py +0 -0
  627. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_checks.py +0 -0
  628. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_cli.py +0 -0
  629. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_cli_graph.py +0 -0
  630. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_config.py +0 -0
  631. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_context.py +0 -0
  632. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_coord_tui_ci_pin.py +0 -0
  633. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_coord_web_ci_pin.py +0 -0
  634. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_deploy_lane_facts.py +0 -0
  635. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_fix.py +0 -0
  636. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_incident_regression.py +0 -0
  637. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_issues_sync_staleness.py +0 -0
  638. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_pypi.py +0 -0
  639. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_registry.py +0 -0
  640. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_release_cordon_probe.py +0 -0
  641. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_timer_active.py +0 -0
  642. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_toolchain.py +0 -0
  643. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_unit_drift.py +0 -0
  644. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_unit_enablement.py +0 -0
  645. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_wedged_drive_queue.py +0 -0
  646. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_hooks.py +0 -0
  647. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_human_attended_437.py +0 -0
  648. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_init.py +0 -0
  649. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_install_agent_venv_2911.py +0 -0
  650. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_integration.py +0 -0
  651. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_briefing_echo.py +0 -0
  652. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_pane_log_2541.py +0 -0
  653. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_prefill_state.py +0 -0
  654. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_session_relaunch.py +0 -0
  655. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_test_verdict_backstop.py +0 -0
  656. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_token_attribution.py +0 -0
  657. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_worktree.py +0 -0
  658. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_issue_store_seam.py +0 -0
  659. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_issues_sync_status.py +0 -0
  660. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_liveness_auditor.py +0 -0
  661. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_liveness_notify.py +0 -0
  662. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_lock_contention_ratchet.py +0 -0
  663. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_machine_onboard.py +0 -0
  664. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_machine_pause.py +0 -0
  665. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_merge_queue.py +0 -0
  666. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_merge_verify.py +0 -0
  667. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_chat.py +0 -0
  668. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_dispatch.py +0 -0
  669. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_gate.py +0 -0
  670. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_order.py +0 -0
  671. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_seam.py +0 -0
  672. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_mock_author.py +0 -0
  673. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_model_tiering.py +0 -0
  674. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_models.py +0 -0
  675. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_models_config_labels.py +0 -0
  676. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_needs_attention.py +0 -0
  677. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_network.py +0 -0
  678. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_new_issue_chat.py +0 -0
  679. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_next_release_tag.py +0 -0
  680. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_node_shim.py +0 -0
  681. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_baseline.py +0 -0
  682. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_cli.py +0 -0
  683. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_collect.py +0 -0
  684. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_config.py +0 -0
  685. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_drive_seam.py +0 -0
  686. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_isolation.py +0 -0
  687. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_predicate.py +0 -0
  688. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_quiet_hours.py +0 -0
  689. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_service.py +0 -0
  690. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notify.py +0 -0
  691. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_openapi.py +0 -0
  692. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_operational_defaults.py +0 -0
  693. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_overlap_fence.py +0 -0
  694. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_overlap_predict.py +0 -0
  695. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_packaged_deploy_units.py +0 -0
  696. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_parentage.py +0 -0
  697. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_paste_landed.py +0 -0
  698. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  699. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_pipeline.py +0 -0
  700. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_followup_approve_plan_command.py +0 -0
  701. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_followup_pr_command.py +0 -0
  702. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_followup_review_command.py +0 -0
  703. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_only.py +0 -0
  704. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_parser.py +0 -0
  705. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_platform_paths.py +0 -0
  706. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_portal_bridge.py +0 -0
  707. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_portal_config.py +0 -0
  708. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_portal_store.py +0 -0
  709. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_portal_sync.py +0 -0
  710. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_pr_body_lint.py +0 -0
  711. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_prereqs.py +0 -0
  712. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_production_db_guard.py +0 -0
  713. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_progress.py +0 -0
  714. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_provider_seam.py +0 -0
  715. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_providers.py +0 -0
  716. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_providers_config_labels.py +0 -0
  717. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_providers_pty.py +0 -0
  718. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_py_rust_mirror_inventory.py +0 -0
  719. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_quiet_hours.py +0 -0
  720. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_quiet_hours_store_2146.py +0 -0
  721. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reap_merged_sessions.py +0 -0
  722. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reap_stale_interactive_tick.py +0 -0
  723. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile.py +0 -0
  724. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_branch.py +0 -0
  725. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_completions.py +0 -0
  726. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  727. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_merges.py +0 -0
  728. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_no_agent_record.py +0 -0
  729. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_tick.py +0 -0
  730. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_usage_limit_done.py +0 -0
  731. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_refine_chat.py +0 -0
  732. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_cordon_2101.py +0 -0
  733. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  734. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_cordon_deadlock_2240.py +0 -0
  735. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_cordon_stuck_2490.py +0 -0
  736. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_propagate.py +0 -0
  737. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_propagate_threshold.py +0 -0
  738. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_roll_between_legs_2854.py +0 -0
  739. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_unified_1242.py +0 -0
  740. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_verify.py +0 -0
  741. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_window.py +0 -0
  742. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_remote_auto_prune.py +0 -0
  743. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_remote_interactive_reaper.py +0 -0
  744. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_add.py +0 -0
  745. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_dormancy.py +0 -0
  746. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_edit_2220.py +0 -0
  747. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_graph_fleet_2237.py +0 -0
  748. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_onboard_2220.py +0 -0
  749. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_report_result_push.py +0 -0
  750. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reports.py +0 -0
  751. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_retry.py +0 -0
  752. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_retry_advisory_1606.py +0 -0
  753. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_retry_type_1636.py +0 -0
  754. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_revalidate.py +0 -0
  755. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review.py +0 -0
  756. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_end_review_without_verdict.py +0 -0
  757. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_parse_failure_diagnostic.py +0 -0
  758. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_reaffirm.py +0 -0
  759. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_state.py +0 -0
  760. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_verdict_backstop.py +0 -0
  761. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_verdict_override_audit.py +0 -0
  762. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_verdict_relay.py +0 -0
  763. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_zero_commits.py +0 -0
  764. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_scoped_review_wiring.py +0 -0
  765. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_scorecard.py +0 -0
  766. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_self_health.py +0 -0
  767. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_serve.py +0 -0
  768. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_serve_app_board_trim.py +0 -0
  769. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_serve_rest_routes.py +0 -0
  770. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_session.py +0 -0
  771. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_slice_issue_attribution.py +0 -0
  772. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_smoke.py +0 -0
  773. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_smoke_live_checkout_restore.py +0 -0
  774. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_smoke_workflow.py +0 -0
  775. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_spend_ceiling.py +0 -0
  776. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_spend_ceiling_coordinator.py +0 -0
  777. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_split.py +0 -0
  778. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_split_work.py +0 -0
  779. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_sql_dialect.py +0 -0
  780. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_sqlite_connect_ratchet.py +0 -0
  781. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stage_projection.py +0 -0
  782. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stale_busy_reviewer_697.py +0 -0
  783. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stalled_pipeline.py +0 -0
  784. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_state.py +0 -0
  785. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_state_review_findings_daemon.py +0 -0
  786. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_status_fleet_footer.py +0 -0
  787. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stop_1567.py +0 -0
  788. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_store_contract.py +0 -0
  789. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_store_migrate.py +0 -0
  790. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stuck.py +0 -0
  791. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_terminal_command.py +0 -0
  792. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_author.py +0 -0
  793. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_chat.py +0 -0
  794. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_orchestrator.py +0 -0
  795. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_report.py +0 -0
  796. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_verdict_parsing.py +0 -0
  797. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_verdict_transcript_floor.py +0 -0
  798. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_text_io_encoding_audit.py +0 -0
  799. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_thin_client_board_audit.py +0 -0
  800. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_thin_client_config_load_1080.py +0 -0
  801. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_thin_client_daemon_routing_906.py +0 -0
  802. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_tmux_host.py +0 -0
  803. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_tmux_session.py +0 -0
  804. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_transcript_floor.py +0 -0
  805. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_usage.py +0 -0
  806. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_usage_limits.py +0 -0
  807. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_usage_rollup.py +0 -0
  808. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_venv_live_install_2121.py +0 -0
  809. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_version_single_source.py +0 -0
  810. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_watch.py +0 -0
  811. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  812. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_env_venv_isolation.py +0 -0
  813. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_events.py +0 -0
  814. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_image_pin_sync.py +0 -0
  815. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_safety.py +0 -0
  816. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_test_scoping.py +0 -0
  817. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worktree.py +0 -0
  818. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  819. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_write_parity.py +0 -0
  820. {code_coordinator-0.5.317 → code_coordinator-0.5.318}/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.317
3
+ Version: 0.5.318
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.317
3
+ Version: 0.5.318
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.317",
2
+ "tag": "0.5.318",
3
3
  "distance": 0,
4
- "node": "gf4f544e9955eaa18600b99dd2e5c9c0cc421e7e4",
4
+ "node": "g232148cbec6041ecf0afda964794347d61a21a64",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -171,6 +171,23 @@ CONFIRM_DEFAULT_TIMEOUT_SECONDS = 60 * 20
171
171
  #: so a pass can confirm ~4 branches back to back) while the daemon-side worst
172
172
  #: case stays a number the thin client can actually be given — see
173
173
  #: :func:`notify_client_timeout_seconds`.
174
+ #:
175
+ #: #2975: that "~6 min serial" sizing is calibrated on THIS repo and does not
176
+ #: hold everywhere — quadraui's ``cargo test --features tui`` builds every
177
+ #: example/test executable (#305 in coordinator.yml) and blows straight past
178
+ #: it, and every ceiling in this module (this one, ``CONFIRM_DEFAULT_
179
+ #: TIMEOUT_SECONDS``, ``deploy/coord-notify.service``'s ``TimeoutStartSec``)
180
+ #: is bigger than ``coord-notify.timer``'s 5-minute cadence, so one such
181
+ #: confirmation can span several fires. Two changes close that without
182
+ #: shrinking this constant (which would just make the COMMON case degrade to
183
+ #: UNCONFIRMED instead): ``coord.notify``'s drain now dispatches pending
184
+ #: Test/Review/PR-opens BEFORE running any confirmation each pass, so a slow
185
+ #: suite on one repo can no longer queue another repo's dispatch behind it;
186
+ #: and :func:`expected_confirmation_seconds` remembers how long a repo's
187
+ #: confirmation last took, so :func:`confirmation_timeout` can recognise a
188
+ #: repo whose suite structurally cannot fit this budget and skip straight to
189
+ #: UNCONFIRMED instead of re-discovering that identical fact — and re-paying
190
+ #: the full ceiling for it — on every single PASS claim.
174
191
  CONFIRM_PASS_BUDGET_SECONDS = 60 * 25
175
192
 
176
193
  #: Don't *start* a confirmation with less than this left in the pass budget.
@@ -232,6 +249,31 @@ KIND_NO_OUTPUT = "no_output"
232
249
  #: docstring's fail-direction section — this frozenset IS that safety property.
233
250
  REFUTING_KINDS = frozenset({KIND_BUILD, KIND_SUITE})
234
251
 
252
+ #: #2975: kinds whose elapsed wall-clock time is a trustworthy signal of how
253
+ #: long THIS repo's confirmation genuinely takes, worth remembering for next
254
+ #: time via :func:`record_confirmation_duration`.
255
+ #:
256
+ #: ``KIND_OK``/``KIND_BUILD``/``KIND_SUITE``/``KIND_BASELINE_RED``/
257
+ #: ``KIND_NO_OUTPUT`` all ran the command to actual completion — a real
258
+ #: measurement. ``KIND_TIMEOUT`` ran for at least the ceiling it was given —
259
+ #: not exact, but a valid LOWER BOUND, and a lower bound is exactly what lets
260
+ #: a chronically-too-slow repo (quadraui's ``cargo test --features tui``
261
+ #: builds every example/test executable, #305 in coordinator.yml) be
262
+ #: recognised as such after a single attempt instead of re-discovering it on
263
+ #: every PASS claim — see :func:`expected_confirmation_seconds`.
264
+ #:
265
+ #: ``KIND_SETUP``/``KIND_INFRA``/``KIND_SIGNAL`` are deliberately excluded:
266
+ #: none of them ran the real command for a representative duration (no
267
+ #: checkout, no toolchain, or killed externally mid-run), and recording their
268
+ #: near-zero elapsed time would silently erase a previously-learned
269
+ #: expectation — exactly the failure mode that would make a single lock
270
+ #: contention hiccup or a missing checkout reset a repo's hard-won "this one
271
+ #: is slow" memory back to "assume it's fast."
272
+ RECORDABLE_DURATION_KINDS = frozenset({
273
+ KIND_OK, KIND_BUILD, KIND_SUITE, KIND_BASELINE_RED, KIND_NO_OUTPUT,
274
+ KIND_TIMEOUT,
275
+ })
276
+
235
277
  #: Kinds meaning "the check could not reach a verdict". The caller falls back to
236
278
  #: the worker's own claim on any of these, which is pre-#2464 behaviour.
237
279
  INCONCLUSIVE_KINDS = frozenset({
@@ -270,7 +312,7 @@ def begin_confirmation_pass(total: float = CONFIRM_PASS_BUDGET_SECONDS) -> None:
270
312
  _pass_state.remaining = float(total)
271
313
 
272
314
 
273
- def confirmation_timeout() -> int | None:
315
+ def confirmation_timeout(expected_seconds: float | None = None) -> int | None:
274
316
  """Seconds the next confirmation in this pass may take, or ``None``.
275
317
 
276
318
  ``None`` means the pass budget is spent (or too nearly spent to be worth
@@ -279,13 +321,31 @@ def confirmation_timeout() -> int | None:
279
321
 
280
322
  Outside a pass — a direct :func:`confirm_branch` call, a unit test — there
281
323
  is no budget to draw down and the full per-run ceiling applies.
324
+
325
+ *expected_seconds* (#2975) is the caller's best estimate of how long THIS
326
+ repo's confirmation will actually take — see
327
+ :func:`expected_confirmation_seconds`, which reads it back from what
328
+ :func:`record_confirmation_duration` learned last time. When it is
329
+ already at or past what this pass has left to spend, starting the run
330
+ would only spend the remainder re-discovering a fact already on record —
331
+ this repo cannot be confirmed in what is left — so this returns ``None``
332
+ immediately instead of paying for that discovery again. This is what
333
+ turns a repo whose suite structurally cannot fit the ceiling (quadraui's
334
+ ``cargo test --features tui``, #2975) from a repeated worst-case cost —
335
+ every PASS claim spending the full budget to learn the identical lesson —
336
+ into a one-time one: the FIRST attempt still spends up to the full
337
+ ceiling discovering the suite is too slow, and every attempt after that
338
+ skips straight to UNCONFIRMED.
282
339
  """
283
340
  remaining = getattr(_pass_state, "remaining", None)
284
341
  if remaining is None:
285
342
  return int(CONFIRM_DEFAULT_TIMEOUT_SECONDS)
286
343
  if remaining < CONFIRM_MIN_RUN_SECONDS:
287
344
  return None
288
- return int(min(float(CONFIRM_DEFAULT_TIMEOUT_SECONDS), remaining))
345
+ ceiling = min(float(CONFIRM_DEFAULT_TIMEOUT_SECONDS), remaining)
346
+ if expected_seconds is not None and expected_seconds >= ceiling:
347
+ return None
348
+ return int(ceiling)
289
349
 
290
350
 
291
351
  def spend_confirmation_budget(seconds: float) -> None:
@@ -300,6 +360,112 @@ def spend_confirmation_budget(seconds: float) -> None:
300
360
  _pass_state.remaining = max(0.0, remaining - max(0.0, float(seconds)))
301
361
 
302
362
 
363
+ #: #2975: filename under ``COORD_DIR`` for the per-repo measured-duration map
364
+ #: :func:`record_confirmation_duration` / :func:`expected_confirmation_seconds`
365
+ #: read and write. A tiny flat file, not a lock-guarded store: the worst case
366
+ #: of a torn read/write is one stale or missing estimate, which degrades to
367
+ #: exactly pre-#2975 behaviour (attempt the run, learn the hard way) — never
368
+ #: a correctness problem, so it does not warrant the ceremony
369
+ #: ``confirm_lock_path`` needs for the worktree lifecycle it guards.
370
+ _CONFIRM_HISTORY_FILENAME = "confirm_test_history.json"
371
+
372
+
373
+ def _confirm_history_path() -> Path:
374
+ """Where per-repo measured confirmation durations are persisted (#2975).
375
+
376
+ Resolved against ``coord.state.COORD_DIR`` freshly on every call — the
377
+ same discipline :func:`confirm_worktree_path` /
378
+ :func:`write_confirmation_output` already use above — so a test's
379
+ ``monkeypatch.setattr("coord.state.COORD_DIR", ...)`` is honoured rather
380
+ than this module caching a stale path at import time.
381
+ """
382
+ from coord.state import COORD_DIR # noqa: PLC0415
383
+
384
+ return COORD_DIR / _CONFIRM_HISTORY_FILENAME
385
+
386
+
387
+ def _load_confirm_history() -> dict[str, float]:
388
+ """Best-effort read of the persisted per-repo duration map.
389
+
390
+ Fail-soft on everything — a missing file, corrupt JSON, an unexpected
391
+ shape, a hand-edited value — because this is purely an optimisation hint
392
+ for :func:`confirmation_timeout`, never a correctness dependency. A file
393
+ this cannot make sense of must read as "nothing learned yet", the same
394
+ posture as :func:`coord.commands.drive_queue.read_roll_pending`.
395
+ """
396
+ import json # noqa: PLC0415
397
+
398
+ try:
399
+ raw = _confirm_history_path().read_text(encoding="utf-8")
400
+ except OSError:
401
+ return {}
402
+ try:
403
+ data = json.loads(raw)
404
+ except ValueError:
405
+ return {}
406
+ if not isinstance(data, dict):
407
+ return {}
408
+ out: dict[str, float] = {}
409
+ for key, value in data.items():
410
+ if isinstance(key, str) and isinstance(value, (int, float)) and value > 0:
411
+ out[key] = float(value)
412
+ return out
413
+
414
+
415
+ def record_confirmation_duration(repo_name: str, seconds: float) -> None:
416
+ """Remember how long *repo_name*'s confirmation attempt just took (#2975).
417
+
418
+ Callers pass this only results whose ``kind`` is in
419
+ :data:`RECORDABLE_DURATION_KINDS` — see that frozenset's docstring for
420
+ which outcomes are a trustworthy signal of real suite duration.
421
+
422
+ Overwrites any previous value for this repo outright, with no averaging:
423
+ the LAST attempt is a better estimate of the CURRENT suite than a rolling
424
+ average across however long ago the repo's test suite was this size.
425
+
426
+ Best-effort and atomic (tempfile-then-rename, mirroring
427
+ :func:`coord.commands.drive_queue.write_roll_pending`) — a full disk, an
428
+ unwritable ``COORD_DIR``, or a concurrent writer must not break the
429
+ confirmation this is charging against; the caller already has its real
430
+ result, this is purely a hint for next time.
431
+ """
432
+ if seconds <= 0:
433
+ return
434
+ import json # noqa: PLC0415
435
+ import tempfile # noqa: PLC0415
436
+
437
+ path = _confirm_history_path()
438
+ history = _load_confirm_history()
439
+ history[repo_name] = float(seconds)
440
+ try:
441
+ path.parent.mkdir(parents=True, exist_ok=True)
442
+ fd, tmp_name = tempfile.mkstemp(
443
+ prefix=".confirm_test_history.", suffix=".tmp", dir=str(path.parent),
444
+ )
445
+ try:
446
+ with os.fdopen(fd, "w", encoding="utf-8") as fh:
447
+ json.dump(history, fh)
448
+ os.replace(tmp_name, path)
449
+ except OSError:
450
+ try:
451
+ os.unlink(tmp_name)
452
+ except OSError:
453
+ pass
454
+ except OSError:
455
+ pass
456
+
457
+
458
+ def expected_confirmation_seconds(repo_name: str) -> float | None:
459
+ """The most recently measured confirmation duration for *repo_name*.
460
+
461
+ ``None`` when this repo has never produced a
462
+ :data:`RECORDABLE_DURATION_KINDS` result — the common case for most
463
+ repos most of the time, and the caller's cue to fall back to the
464
+ un-informed ceiling exactly as before #2975.
465
+ """
466
+ return _load_confirm_history().get(repo_name)
467
+
468
+
303
469
  def notify_client_timeout_seconds(
304
470
  budget: float = CONFIRM_PASS_BUDGET_SECONDS,
305
471
  ) -> float:
@@ -1067,6 +1233,7 @@ __all__ = [
1067
1233
  "KIND_SIGNAL",
1068
1234
  "NOTIFY_BASE_CLIENT_TIMEOUT_SECONDS",
1069
1235
  "PERMISSION_DENIED_EXIT",
1236
+ "RECORDABLE_DURATION_KINDS",
1070
1237
  "REFUTING_KINDS",
1071
1238
  "STALE_WORKTREE_MAX_AGE_HOURS",
1072
1239
  "ConfirmationResult",
@@ -1077,7 +1244,9 @@ __all__ = [
1077
1244
  "confirm_worktree_path",
1078
1245
  "confirmation_enabled",
1079
1246
  "confirmation_timeout",
1247
+ "expected_confirmation_seconds",
1080
1248
  "notify_client_timeout_seconds",
1249
+ "record_confirmation_duration",
1081
1250
  "spend_confirmation_budget",
1082
1251
  "sweep_stale_confirm_worktrees",
1083
1252
  "unmet_confirmation_capabilities",
@@ -2033,9 +2033,12 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
2033
2033
  that cannot run must degrade to pre-#2464 behaviour, never break the reap.
2034
2034
  """
2035
2035
  from coord.confirm_test import ( # noqa: PLC0415
2036
+ RECORDABLE_DURATION_KINDS,
2036
2037
  confirm_branch,
2037
2038
  confirmation_enabled,
2038
2039
  confirmation_timeout,
2040
+ expected_confirmation_seconds,
2041
+ record_confirmation_duration,
2039
2042
  spend_confirmation_budget,
2040
2043
  )
2041
2044
 
@@ -2066,15 +2069,34 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
2066
2069
  # `/notify` request the thin client is blocked on — scale with board
2067
2070
  # activity. Exhausted budget means UNCONFIRMED, which is pre-#2464
2068
2071
  # behaviour, and it is said out loud rather than truncating silently.
2069
- timeout = confirmation_timeout()
2072
+ #
2073
+ # #2975: also hand in whatever this repo's OWN last confirmation measured
2074
+ # (`expected_confirmation_seconds`) — a repo whose suite structurally
2075
+ # cannot finish inside the budget (quadraui's `cargo test --features
2076
+ # tui`) would otherwise spend the full ceiling relearning that identical
2077
+ # fact on every single PASS claim, serialising every other repo's Test/
2078
+ # Review dispatch behind it each time. Knowing the answer already lets
2079
+ # `confirmation_timeout` skip straight to UNCONFIRMED instead.
2080
+ expected = expected_confirmation_seconds(transition.repo_name)
2081
+ timeout = confirmation_timeout(expected)
2070
2082
  if timeout is None:
2071
- log.warning(
2072
- "smoke %s: this notify pass has spent its confirmation budget "
2073
- "(coord.confirm_test.CONFIRM_PASS_BUDGET_SECONDS) — recording the "
2074
- "worker's own claim for %s UNCONFIRMED rather than holding "
2075
- "notify.lock any longer (#2464).",
2076
- transition.assignment_id, transition.repo_name,
2077
- )
2083
+ if expected is not None:
2084
+ log.warning(
2085
+ "smoke %s: %s's last measured confirmation took about %.0fs, "
2086
+ "at or beyond what this pass has left to spend — skipping "
2087
+ "the run and recording the worker's own claim UNCONFIRMED "
2088
+ "rather than repeating a run already known not to finish "
2089
+ "(#2975).",
2090
+ transition.assignment_id, transition.repo_name, expected,
2091
+ )
2092
+ else:
2093
+ log.warning(
2094
+ "smoke %s: this notify pass has spent its confirmation budget "
2095
+ "(coord.confirm_test.CONFIRM_PASS_BUDGET_SECONDS) — recording the "
2096
+ "worker's own claim for %s UNCONFIRMED rather than holding "
2097
+ "notify.lock any longer (#2464).",
2098
+ transition.assignment_id, transition.repo_name,
2099
+ )
2078
2100
  return None
2079
2101
 
2080
2102
  branch = entry.get("branch")
@@ -2084,10 +2106,12 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
2084
2106
  transition.assignment_id, transition.repo_name, branch, timeout,
2085
2107
  )
2086
2108
  started = time.monotonic()
2109
+ result: ConfirmationResult | None = None
2087
2110
  try:
2088
- return confirm_branch(
2111
+ result = confirm_branch(
2089
2112
  transition.repo_name, branch, config, timeout=timeout,
2090
2113
  )
2114
+ return result
2091
2115
  except Exception as exc: # noqa: BLE001
2092
2116
  log.warning(
2093
2117
  "smoke %s: confirmation run raised (%s) — falling back to the "
@@ -2100,7 +2124,15 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
2100
2124
  # It really did hold the drain (and `notify.lock`) for those seconds,
2101
2125
  # and a run that reliably blows up after ten minutes must not be able
2102
2126
  # to repeat that for every row on the board free of charge.
2103
- spend_confirmation_budget(time.monotonic() - started)
2127
+ elapsed = time.monotonic() - started
2128
+ spend_confirmation_budget(elapsed)
2129
+ # #2975: only remember the duration when the result is actually a
2130
+ # trustworthy measurement (see RECORDABLE_DURATION_KINDS) — an
2131
+ # exception, a disabled config load, or a KIND_SETUP/INFRA/SIGNAL
2132
+ # short-circuit tells us nothing about how long the real suite takes
2133
+ # and must never overwrite a previously-learned expectation.
2134
+ if result is not None and result.kind in RECORDABLE_DURATION_KINDS:
2135
+ record_confirmation_duration(transition.repo_name, elapsed)
2104
2136
 
2105
2137
 
2106
2138
  def _confirmed_pass_verdict(
@@ -4155,6 +4187,20 @@ def run_drain(
4155
4187
  *notifications*, not pipeline advancement, and giving the daemon a
4156
4188
  periodic detector is #1632's job (which is blocked on this).
4157
4189
 
4190
+ **Dispatch order (#2975).** Smoke/review/PR-open dispatch also runs as a
4191
+ HEAD START right at the top of the pass, before this pass's own
4192
+ transition detection (which is where a #2464 out-of-band confirmation
4193
+ runs — see :mod:`coord.confirm_test`). A confirmation re-runs a repo's
4194
+ real build+test synchronously and can hold this very lock for the whole
4195
+ confirmation-pass budget, several timer fires' worth for a repo whose
4196
+ suite is structurally too slow. Every row already eligible for dispatch
4197
+ as of the top of the pass must not queue behind that — a slow suite on
4198
+ one repo must delay only its own confirmation, never another repo's
4199
+ Test/Review dispatch. The three dispatch functions run a second time
4200
+ afterward too, in their historical place, to pick up anything the
4201
+ transition-detection step below made newly eligible; all three are
4202
+ idempotent, so the repeat costs only a second, mostly-empty scan.
4203
+
4158
4204
  **Concurrency.** The whole pass runs under ``~/.coord/notify.lock`` —
4159
4205
  literally :class:`coord.filelock.FileLock`, the same class on the same
4160
4206
  path ``coord drive``'s ``run_notify()`` takes — so a drive's nudge and the
@@ -4203,6 +4249,56 @@ def _run_drain_locked(config: Config) -> DrainResult:
4203
4249
 
4204
4250
  begin_confirmation_pass()
4205
4251
 
4252
+ # Step 0a (#2803, moved up by #2975): clear any work row wedged at
4253
+ # test_state='running' well past its Test-stage child's own terminal
4254
+ # resolution (or absence) — a lost verdict write, never a fabricated one
4255
+ # (see `sweep_stuck_test_state_rows`'s docstring). It still runs BEFORE
4256
+ # every smoke dispatch in this pass, which is #2803's invariant: a row
4257
+ # this clears is picked up and redispatched in THIS SAME pass, not the
4258
+ # next one. It now runs before step 0b's head start as well, so a row it
4259
+ # clears gets that head start too rather than waiting behind step 1's
4260
+ # confirmations. Nothing is lost by sweeping before transition detection:
4261
+ # every case the sweep acts on is gated on
4262
+ # `STUCK_TEST_STATE_GRACE_SECONDS` (10 minutes) having elapsed since the
4263
+ # child's own resolution, so a child that only just went terminal in
4264
+ # THIS pass is out of scope either way.
4265
+ try:
4266
+ _sweep_stuck_test_state(config)
4267
+ except Exception: # noqa: BLE001
4268
+ log.exception("notify drain: stuck test_state sweep failed")
4269
+
4270
+ # Step 0b (#2975): dispatch pending Test-stage smoke / PR-opens / reviews
4271
+ # from the board exactly as it reads RIGHT NOW — before step 1 below gets
4272
+ # anywhere near a `confirm_branch` call. A confirmation re-runs one
4273
+ # repo's real build+test synchronously inside THIS pass and can
4274
+ # legitimately hold `notify.lock` for the whole `CONFIRM_PASS_BUDGET_
4275
+ # SECONDS` ceiling — several `coord-notify.timer` fires' worth (#2975).
4276
+ # Every row already eligible for dispatch as of the top of this pass
4277
+ # must not queue behind that: a slow suite on one repo should delay only
4278
+ # its own confirmation, never another repo's Test/Review dispatch.
4279
+ #
4280
+ # Steps 2-3 below repeat these same three calls after the transition
4281
+ # detection has had a chance to add anything newly eligible (a work leg
4282
+ # that just finished, a PR that just opened) — this head start is
4283
+ # additive, not a replacement.
4284
+ # All three are idempotent (`_dispatch_board_pending_pr_opens`'s and
4285
+ # `_dispatch_board_pending_smoke`'s own docstrings: "safe to call even
4286
+ # when the board file doesn't exist", find-or-create PRs, dedupe via
4287
+ # `has_active_followup`), so calling each twice in one pass costs
4288
+ # nothing beyond a second, mostly-empty scan.
4289
+ try:
4290
+ _dispatch_board_pending_pr_opens(config)
4291
+ except Exception: # noqa: BLE001
4292
+ log.exception("notify drain: head-start PR-open dispatch failed")
4293
+ try:
4294
+ _dispatch_board_pending_smoke(config)
4295
+ except Exception: # noqa: BLE001
4296
+ log.exception("notify drain: head-start smoke dispatch failed")
4297
+ try:
4298
+ _dispatch_board_pending_reviews(config)
4299
+ except Exception: # noqa: BLE001
4300
+ log.exception("notify drain: head-start review dispatch failed")
4301
+
4206
4302
  # Step 1: post completion/failure/advisory/plan/review comments for rows
4207
4303
  # the agent reports terminal. This is what stamps `finished_at` (via
4208
4304
  # mark_notified) and captures cost / SMOKE_TESTS / summary / session id /
@@ -4234,18 +4330,7 @@ def _run_drain_locked(config: Config) -> DrainResult:
4234
4330
  except Exception: # noqa: BLE001
4235
4331
  log.exception("notify drain: detect_transitions failed")
4236
4332
 
4237
- # Step 2 (#2803): clear any work row wedged at test_state='running' well
4238
- # past its Test-stage child's own terminal resolution (or absence) — a
4239
- # lost verdict write, never a fabricated one (see `sweep_stuck_test_
4240
- # state_rows`'s docstring). Runs BEFORE step 3's smoke dispatch so a row
4241
- # this clears is picked up and redispatched in THIS SAME pass, not the
4242
- # next one.
4243
- try:
4244
- _sweep_stuck_test_state(config)
4245
- except Exception: # noqa: BLE001
4246
- log.exception("notify drain: stuck test_state sweep failed")
4247
-
4248
- # Step 2.5 (#2844): open PRs for work-leg completions still missing one —
4333
+ # Step 2 (#2844): open PRs for work-leg completions still missing one —
4249
4334
  # BEFORE the Test-stage dispatch below, so the pull_request CI run starts
4250
4335
  # overlapping smoke instead of waiting for review dispatch to open the
4251
4336
  # PR ~20 minutes later.
@@ -4447,6 +4532,31 @@ def run(
4447
4532
  # why this reads the marker but never writes it.
4448
4533
  _roll_pending = _roll_pending_blocks_new_dispatch()
4449
4534
 
4535
+ # Step 0 (#2975): same head start `_run_drain_locked` takes, and for the
4536
+ # identical reason — dispatch pending Test-stage smoke / PR-opens /
4537
+ # reviews from the board exactly as it reads RIGHT NOW, before the
4538
+ # transition-detection loop below gets anywhere near a `confirm_branch`
4539
+ # call that can hold `notify.lock` for up to `CONFIRM_PASS_BUDGET_
4540
+ # SECONDS`. Gated on `_roll_pending` like every other NEW-leg dispatch in
4541
+ # this function (#2587) — the later calls to the same three functions,
4542
+ # a few dozen lines down, repeat this after the loop below has had a
4543
+ # chance to add anything newly eligible; this is a head start, not a
4544
+ # replacement, and all three are idempotent so calling each twice costs
4545
+ # only a second, mostly-empty scan.
4546
+ if not _roll_pending:
4547
+ try:
4548
+ _dispatch_board_pending_pr_opens(config)
4549
+ except Exception: # noqa: BLE001
4550
+ pass
4551
+ try:
4552
+ _dispatch_board_pending_smoke(config)
4553
+ except Exception: # noqa: BLE001
4554
+ pass
4555
+ try:
4556
+ _dispatch_board_pending_reviews(config)
4557
+ except Exception: # noqa: BLE001
4558
+ pass
4559
+
4450
4560
  # #522: one terminal-state cache shared across every gh-hitting check in
4451
4561
  # this notify run (the auto-loop review/fix dispatches below, and the
4452
4562
  # #1441 stalled-pipeline sweep at the end), so a burst of activity for
@@ -1698,3 +1698,196 @@ class TestConfirmationRespectsCapabilityRouting:
1698
1698
  read that as 'gate not applicable', never as 'nothing required'
1699
1699
  collapsing into a refusal."""
1700
1700
  assert ct.branch_touched_files(tmp_path, BRANCH, "main") == []
1701
+
1702
+
1703
+ # ── #2975: per-repo measured duration, so a chronically-too-slow repo stops
1704
+ # re-learning the same lesson on every PASS claim ─────────────────────────
1705
+
1706
+
1707
+ class TestExpectedConfirmationDurationHistory:
1708
+ """quadraui's `cargo test --features tui` builds every example/test
1709
+ executable (#305 in coordinator.yml) and structurally cannot finish
1710
+ inside any ceiling this module hands out from the reap path. Before
1711
+ #2975, every PASS claim on that repo spent the FULL pass budget
1712
+ rediscovering that identical fact, serialising every other repo's
1713
+ Test/Review dispatch behind it each time (#2975's reported symptom:
1714
+ coord-tui#17 sat idle ~20 minutes with three machines free). Remembering
1715
+ the last measured duration lets `confirmation_timeout` recognise a
1716
+ doomed run and skip it instead of repeating it.
1717
+ """
1718
+
1719
+ def test_never_measured_reports_no_expectation(self) -> None:
1720
+ assert ct.expected_confirmation_seconds("quadraui") is None
1721
+
1722
+ def test_records_and_reads_back_a_measured_duration(self) -> None:
1723
+ ct.record_confirmation_duration("quadraui", 1234.5)
1724
+ assert ct.expected_confirmation_seconds("quadraui") == 1234.5
1725
+
1726
+ def test_recording_is_per_repo(self) -> None:
1727
+ ct.record_confirmation_duration("quadraui", 1200.0)
1728
+ ct.record_confirmation_duration("claude-coordinator", 360.0)
1729
+ assert ct.expected_confirmation_seconds("quadraui") == 1200.0
1730
+ assert ct.expected_confirmation_seconds("claude-coordinator") == 360.0
1731
+
1732
+ def test_a_later_measurement_overwrites_the_earlier_one(self) -> None:
1733
+ """The LAST attempt is a better estimate of the CURRENT suite than an
1734
+ average across however long ago the suite was this size — no
1735
+ averaging, straight overwrite."""
1736
+ ct.record_confirmation_duration("quadraui", 1200.0)
1737
+ ct.record_confirmation_duration("quadraui", 90.0)
1738
+ assert ct.expected_confirmation_seconds("quadraui") == 90.0
1739
+
1740
+ def test_a_non_positive_duration_is_never_recorded(self) -> None:
1741
+ ct.record_confirmation_duration("quadraui", 0.0)
1742
+ ct.record_confirmation_duration("quadraui", -5.0)
1743
+ assert ct.expected_confirmation_seconds("quadraui") is None
1744
+
1745
+ def test_recordable_kinds_are_exactly_the_ones_that_ran_for_real(self) -> None:
1746
+ """`KIND_OK`/`KIND_BUILD`/`KIND_SUITE`/`KIND_BASELINE_RED`/
1747
+ `KIND_NO_OUTPUT` ran to completion; `KIND_TIMEOUT` ran for at least
1748
+ its ceiling — all six are a trustworthy signal. `KIND_SETUP`/
1749
+ `KIND_INFRA`/`KIND_SIGNAL` never ran the command for a representative
1750
+ duration and must stay excluded, or a single lock-contention hiccup
1751
+ or missing checkout would erase a hard-won 'this one is slow'
1752
+ expectation back down to near zero."""
1753
+ assert ct.RECORDABLE_DURATION_KINDS == {
1754
+ KIND_OK, KIND_BUILD, KIND_SUITE, KIND_BASELINE_RED,
1755
+ ct.KIND_NO_OUTPUT, KIND_TIMEOUT,
1756
+ }
1757
+ for excluded in (KIND_SETUP, KIND_INFRA, ct.KIND_SIGNAL):
1758
+ assert excluded not in ct.RECORDABLE_DURATION_KINDS
1759
+
1760
+ def test_a_corrupt_history_file_reads_as_never_measured(
1761
+ self, isolated_coord_dir: Path,
1762
+ ) -> None:
1763
+ history_path = isolated_coord_dir / "confirm_test_history.json"
1764
+ history_path.write_text("not json{{{", encoding="utf-8")
1765
+ assert ct.expected_confirmation_seconds("quadraui") is None
1766
+
1767
+ def test_history_survives_being_read_back_from_a_fresh_process_view(
1768
+ self, isolated_coord_dir: Path,
1769
+ ) -> None:
1770
+ """The store is a plain file, not process memory — write it once and
1771
+ a completely separate read must see it, exactly like
1772
+ `coord.commands.drive_queue`'s roll-pending marker."""
1773
+ import json
1774
+
1775
+ history_path = isolated_coord_dir / "confirm_test_history.json"
1776
+ ct.record_confirmation_duration("quadraui", 777.0)
1777
+ assert json.loads(history_path.read_text())["quadraui"] == 777.0
1778
+
1779
+
1780
+ class TestConfirmationTimeoutSkipsAKnownDoomedRepo:
1781
+ """`confirmation_timeout`'s *expected_seconds* parameter — the wiring
1782
+ that turns a measured history entry into an actual skip."""
1783
+
1784
+ def test_expected_well_below_the_ceiling_still_hands_out_the_ceiling(
1785
+ self,
1786
+ ) -> None:
1787
+ ct.begin_confirmation_pass(600)
1788
+ assert ct.confirmation_timeout(expected_seconds=100) == 600
1789
+
1790
+ def test_expected_at_the_ceiling_skips_the_run(self) -> None:
1791
+ ct.begin_confirmation_pass(600)
1792
+ assert ct.confirmation_timeout(expected_seconds=600) is None
1793
+
1794
+ def test_expected_past_the_ceiling_skips_the_run(self) -> None:
1795
+ ct.begin_confirmation_pass(600)
1796
+ assert ct.confirmation_timeout(expected_seconds=900) is None
1797
+
1798
+ def test_no_expectation_falls_back_to_the_ordinary_ceiling(self) -> None:
1799
+ ct.begin_confirmation_pass(600)
1800
+ assert ct.confirmation_timeout(expected_seconds=None) == 600
1801
+ assert ct.confirmation_timeout() == 600
1802
+
1803
+ def test_expectation_is_irrelevant_outside_a_pass(self) -> None:
1804
+ """No `begin_confirmation_pass()` call — the full per-run ceiling
1805
+ applies regardless of history, exactly like calling this with no
1806
+ argument at all."""
1807
+ assert ct.confirmation_timeout(expected_seconds=10**9) == int(
1808
+ ct.CONFIRM_DEFAULT_TIMEOUT_SECONDS
1809
+ )
1810
+
1811
+ def test_a_shrinking_budget_can_flip_a_previously_eligible_repo_to_skipped(
1812
+ self,
1813
+ ) -> None:
1814
+ """Spending most of the pass on other rows first must make the SAME
1815
+ expectation newly disqualifying — this is what protects every OTHER
1816
+ repo's confirmation from a known-slow one eating the tail of the
1817
+ budget on a run that was already unlikely to finish."""
1818
+ ct.begin_confirmation_pass(600)
1819
+ assert ct.confirmation_timeout(expected_seconds=500) == 600
1820
+ ct.spend_confirmation_budget(550)
1821
+ assert ct.confirmation_timeout(expected_seconds=500) is None
1822
+
1823
+
1824
+ class TestNotifyReapSkipsAKnownDoomedConfirmation:
1825
+ """Integration: `coord.notify._run_pass_confirmation` actually consults
1826
+ the history and actually records into it — the two ends of #2975's fix
1827
+ wired together, not just the pure functions in isolation."""
1828
+
1829
+ @staticmethod
1830
+ def _transition():
1831
+ from coord.notify import EVENT_COMPLETION, Transition
1832
+
1833
+ return Transition(
1834
+ assignment_id="smoke-1", machine_name="laptop", repo_name="api",
1835
+ issue_number=42, event=EVENT_COMPLETION, exit_code=0,
1836
+ )
1837
+
1838
+ def test_a_timeout_is_remembered_and_the_next_attempt_skips_the_run(
1839
+ self,
1840
+ ) -> None:
1841
+ from coord.notify import _run_pass_confirmation
1842
+
1843
+ entry = {"branch": BRANCH}
1844
+ ct.begin_confirmation_pass(600)
1845
+ clock = _FakeClock()
1846
+
1847
+ def _timed_out(*_a, **_k):
1848
+ # The real `confirm_branch` blocks until it hits its deadline —
1849
+ # simulate that by advancing the fake clock the same amount
1850
+ # `_run_pass_confirmation`'s `finally` will charge to the budget.
1851
+ clock.now += 600.0
1852
+ return ct.ConfirmationResult(
1853
+ kind=KIND_TIMEOUT,
1854
+ reason="confirmation suite timed out after 600s",
1855
+ )
1856
+
1857
+ # First attempt: nothing measured yet for 'api', so it really runs —
1858
+ # and this one times out, the #2975 shape (a suite that structurally
1859
+ # cannot finish inside the ceiling).
1860
+ with (
1861
+ patch("coord.config.load", return_value=_StubConfig()),
1862
+ patch("coord.notify.time.monotonic", side_effect=clock),
1863
+ patch(
1864
+ "coord.confirm_test.confirm_branch", side_effect=_timed_out,
1865
+ ) as confirm,
1866
+ ):
1867
+ result = _run_pass_confirmation(self._transition(), entry)
1868
+
1869
+ assert result is not None and result.kind == KIND_TIMEOUT
1870
+ confirm.assert_called_once()
1871
+ assert ct.expected_confirmation_seconds("api") == 600.0, (
1872
+ "a KIND_TIMEOUT result must be remembered as (at least) how long "
1873
+ "it ran — it's a valid lower bound on how long this repo's "
1874
+ "suite takes"
1875
+ )
1876
+
1877
+ # Second attempt, same repo, a FRESH pass with a full budget again —
1878
+ # so the skip below is attributable to the measured expectation
1879
+ # alone, not to a budget the first attempt happened to exhaust.
1880
+ ct.begin_confirmation_pass(600)
1881
+ with (
1882
+ patch("coord.config.load", return_value=_StubConfig()),
1883
+ patch(
1884
+ "coord.confirm_test.confirm_branch",
1885
+ return_value=ct.ConfirmationResult(
1886
+ kind=KIND_OK, reason="should not be reached",
1887
+ ),
1888
+ ) as confirm2,
1889
+ ):
1890
+ result2 = _run_pass_confirmation(self._transition(), entry)
1891
+
1892
+ confirm2.assert_not_called()
1893
+ assert result2 is None