code-coordinator 0.5.559__tar.gz → 0.5.561__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 (929) hide show
  1. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/ci_store.py +12 -5
  5. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/drive.py +38 -12
  6. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/merge_queue.py +91 -8
  7. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/conftest.py +30 -0
  8. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_acceptance_drivers.py +26 -0
  9. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive.py +46 -4
  10. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_queue.py +21 -0
  11. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_install_agent_wsl_bridge_3515.py +30 -0
  12. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_merge_queue.py +128 -2
  13. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_throwaway_vm.py +29 -4
  14. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.claude/commands/board.md +0 -0
  15. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.claude/commands/complete-session.md +0 -0
  16. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.claude/commands/coordinator.md +0 -0
  17. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.githooks/_lib.sh +0 -0
  18. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.githooks/post-checkout +0 -0
  19. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.githooks/post-commit +0 -0
  20. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.githooks/post-merge +0 -0
  21. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  22. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.github/coord-ci-acceptance.yml +0 -0
  23. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.github/workflows/auto-release.yml +0 -0
  24. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.github/workflows/publish.yml +0 -0
  25. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.github/workflows/test.yml +0 -0
  26. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/.gitignore +0 -0
  27. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/CLAUDE.md +0 -0
  28. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/GOAL.md +0 -0
  29. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/LICENSE +0 -0
  30. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/MANIFEST.in +0 -0
  31. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/README.md +0 -0
  32. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/code_coordinator.egg-info/SOURCES.txt +0 -0
  33. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/code_coordinator.egg-info/scm_file_list.json +0 -0
  37. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/code_coordinator.egg-info/top_level.txt +0 -0
  38. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/__init__.py +0 -0
  39. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/_board_mapping.py +0 -0
  40. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/acceptance.py +0 -0
  41. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/acceptance_drivers.py +0 -0
  42. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/agent.py +0 -0
  43. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/agent_app.py +0 -0
  44. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/agent_update.py +0 -0
  45. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/agents/opencode/.gitignore +0 -0
  46. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/agents/opencode/agents/work.md +0 -0
  47. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/agents/opencode/routing.jsonc +0 -0
  48. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/approved_work.py +0 -0
  49. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/audit.py +0 -0
  50. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/auto_loop.py +0 -0
  51. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/backup.py +0 -0
  52. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/block_log.py +0 -0
  53. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/board_schema.py +0 -0
  54. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/board_service.py +0 -0
  55. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/board_wire.py +0 -0
  56. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/brain.py +0 -0
  57. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/branch_model.py +0 -0
  58. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/bug_intake.py +0 -0
  59. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/bugbash.py +0 -0
  60. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/cargo_cache.py +0 -0
  61. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/ci_fix.py +0 -0
  62. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/ci_github.py +0 -0
  63. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/ci_gitlab.py +0 -0
  64. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/claim.py +0 -0
  65. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/claude_setup_token.py +0 -0
  66. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/cli.py +0 -0
  67. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/client.py +0 -0
  68. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/codegen.py +0 -0
  69. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/__init__.py +0 -0
  70. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/_common.py +0 -0
  71. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/acceptance.py +0 -0
  72. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/agent_ops.py +0 -0
  73. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/audit.py +0 -0
  74. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/backup.py +0 -0
  75. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/bugbash.py +0 -0
  76. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/chat.py +0 -0
  77. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/ci.py +0 -0
  78. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/codegen.py +0 -0
  79. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/dispatch.py +0 -0
  80. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/dispatch_workers.py +0 -0
  81. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/dr.py +0 -0
  82. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/drive.py +0 -0
  83. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/drive_queue.py +0 -0
  84. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/gate_a.py +0 -0
  85. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/gates.py +0 -0
  86. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/issues.py +0 -0
  87. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/lifecycle.py +0 -0
  88. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/machine.py +0 -0
  89. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/merge.py +0 -0
  90. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/milestone.py +0 -0
  91. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/plan_followup.py +0 -0
  92. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/plans.py +0 -0
  93. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/portal.py +0 -0
  94. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/pr.py +0 -0
  95. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/release.py +0 -0
  96. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/repo.py +0 -0
  97. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/report.py +0 -0
  98. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/review.py +0 -0
  99. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/scorecard.py +0 -0
  100. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/sessions.py +0 -0
  101. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/setup.py +0 -0
  102. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/status.py +0 -0
  103. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/store_migrate.py +0 -0
  104. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/terminal.py +0 -0
  105. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/test_gate.py +0 -0
  106. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/commands/tui.py +0 -0
  107. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/comments.py +0 -0
  108. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/config.py +0 -0
  109. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/config_reload.py +0 -0
  110. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/confirm_test.py +0 -0
  111. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/conflict_fix.py +0 -0
  112. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dao.py +0 -0
  113. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dashboard/__init__.py +0 -0
  114. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dashboard/fixture.py +0 -0
  115. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dashboard/index.html +0 -0
  116. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dashboard/server.py +0 -0
  117. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dashboard/terminal.py +0 -0
  118. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/db.py +0 -0
  119. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dead_end.py +0 -0
  120. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/decomposition_chat.py +0 -0
  121. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/README.md +0 -0
  122. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-agent.service +0 -0
  123. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-backup.service +0 -0
  124. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-backup.timer +0 -0
  125. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-db-backup.service +0 -0
  126. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-db-backup.sh +0 -0
  127. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-db-backup.timer +0 -0
  128. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-dr-verify.service +0 -0
  129. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-dr-verify.timer +0 -0
  130. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-drive-queue.service +0 -0
  131. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-drive-queue.timer +0 -0
  132. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-failure-notify.service +0 -0
  133. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-fleet-watchdog.service +0 -0
  134. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  135. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-notify.service +0 -0
  136. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-notify.timer +0 -0
  137. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-release-propagate.service +0 -0
  138. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-release-propagate.timer +0 -0
  139. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-release-window.service +0 -0
  140. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-release-window.timer +0 -0
  141. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-serve.service +0 -0
  142. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-web-dist-build.service +0 -0
  143. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-web-dist-build.timer +0 -0
  144. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy/coord-web.service +0 -0
  145. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy_manifest.py +0 -0
  146. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deploy_units.py +0 -0
  147. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deprecation_telemetry.py +0 -0
  148. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/deps.py +0 -0
  149. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/diagnose.py +0 -0
  150. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dispatch.py +0 -0
  151. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dispatch_liveness.py +0 -0
  152. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dist_name.py +0 -0
  153. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dr_promote.py +0 -0
  154. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/dr_verify.py +0 -0
  155. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/drive_queue.py +0 -0
  156. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/drive_sessions_snapshot.py +0 -0
  157. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/drive_state.py +0 -0
  158. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/events.py +0 -0
  159. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/failure_class.py +0 -0
  160. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/failure_classifier.py +0 -0
  161. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/filelock.py +0 -0
  162. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/fleet_config_health.py +0 -0
  163. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/forge_availability.py +0 -0
  164. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/freshness.py +0 -0
  165. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/gate_a.py +0 -0
  166. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/gate_b.py +0 -0
  167. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/gate_snapshot.py +0 -0
  168. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/gates.py +0 -0
  169. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/gen_board_fixture.py +0 -0
  170. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/github_ops.py +0 -0
  171. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/github_throttle.py +0 -0
  172. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/goal.py +0 -0
  173. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/graph_health.py +0 -0
  174. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/gtk_native_driver.py +0 -0
  175. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/__init__.py +0 -0
  176. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/aggregate.py +0 -0
  177. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/__init__.py +0 -0
  178. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/_ci_pin.py +0 -0
  179. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/agent_install.py +0 -0
  180. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/cargo_targets.py +0 -0
  181. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/claude_binary.py +0 -0
  182. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/config_drift.py +0 -0
  183. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  184. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/coord_web_ci_pin.py +0 -0
  185. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/deploy_lane_facts.py +0 -0
  186. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/disk.py +0 -0
  187. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/fleet_board.py +0 -0
  188. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  189. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/fleet_phantom.py +0 -0
  190. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/fleet_unit_drift.py +0 -0
  191. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/graph.py +0 -0
  192. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/graphify_cli.py +0 -0
  193. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/index_lock.py +0 -0
  194. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/issues_sync_staleness.py +0 -0
  195. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/local_machine_identity.py +0 -0
  196. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/plan_usage.py +0 -0
  197. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/pr_churn.py +0 -0
  198. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/release_cordon.py +0 -0
  199. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/repo_state.py +0 -0
  200. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/spawned_coord.py +0 -0
  201. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/stalled_pipeline.py +0 -0
  202. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/timer_active.py +0 -0
  203. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/toolchain.py +0 -0
  204. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/unit_drift.py +0 -0
  205. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/unit_enablement.py +0 -0
  206. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/wedged_drive_queue.py +0 -0
  207. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/checks/worktrees.py +0 -0
  208. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/cli.py +0 -0
  209. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/context.py +0 -0
  210. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/fleet_snapshot.py +0 -0
  211. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/models.py +0 -0
  212. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/pypi.py +0 -0
  213. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/registry.py +0 -0
  214. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/render.py +0 -0
  215. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/health/units.py +0 -0
  216. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/hooks.py +0 -0
  217. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/housekeeping.py +0 -0
  218. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/interactive.py +0 -0
  219. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/invariant_alarms.py +0 -0
  220. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/issue_store.py +0 -0
  221. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/issues_sync_status.py +0 -0
  222. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/liveness_auditor.py +0 -0
  223. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/mac_native_driver.py +0 -0
  224. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/machine_fault.py +0 -0
  225. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/machine_metrics.py +0 -0
  226. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/machine_onboard.py +0 -0
  227. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/machine_pause.py +0 -0
  228. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/machine_stats.py +0 -0
  229. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/milestone_chat.py +0 -0
  230. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/milestone_dispatch.py +0 -0
  231. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/milestone_gate.py +0 -0
  232. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/milestone_order.py +0 -0
  233. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/mock_author.py +0 -0
  234. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/models.py +0 -0
  235. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/network.py +0 -0
  236. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/new_issue_chat.py +0 -0
  237. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/__init__.py +0 -0
  238. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/baseline.py +0 -0
  239. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/cli.py +0 -0
  240. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/collect.py +0 -0
  241. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/digest.py +0 -0
  242. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/models.py +0 -0
  243. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/predicate.py +0 -0
  244. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/service.py +0 -0
  245. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/store.py +0 -0
  246. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notifier/transport.py +0 -0
  247. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/notify.py +0 -0
  248. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/openapi.py +0 -0
  249. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/overlap_fence.py +0 -0
  250. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/overlap_predict.py +0 -0
  251. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/parentage.py +0 -0
  252. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/parentage_github.py +0 -0
  253. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/pipeline.py +0 -0
  254. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/plan_parser.py +0 -0
  255. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/plans.py +0 -0
  256. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/platform_paths.py +0 -0
  257. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/portal_bridge.py +0 -0
  258. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/portal_store.py +0 -0
  259. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/portal_sync.py +0 -0
  260. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/pr_body_lint.py +0 -0
  261. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/prereqs.py +0 -0
  262. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/progress.py +0 -0
  263. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/providers/__init__.py +0 -0
  264. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/providers/base.py +0 -0
  265. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/providers/claude.py +0 -0
  266. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/providers/claude_pty.py +0 -0
  267. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/providers/opencode.py +0 -0
  268. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/queue_diagnose.py +0 -0
  269. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/reconcile.py +0 -0
  270. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/reconcile_tick.py +0 -0
  271. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/refine_chat.py +0 -0
  272. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/release_cordon.py +0 -0
  273. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/release_gate.py +0 -0
  274. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/release_propagate.py +0 -0
  275. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/release_verify.py +0 -0
  276. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/release_window.py +0 -0
  277. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/repo_dormancy.py +0 -0
  278. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/repo_edit.py +0 -0
  279. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/repo_onboard.py +0 -0
  280. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/reports.py +0 -0
  281. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/rest_schema.py +0 -0
  282. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/restart_cmd.py +0 -0
  283. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/revalidate.py +0 -0
  284. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/review.py +0 -0
  285. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/scorecard.py +0 -0
  286. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/self_health.py +0 -0
  287. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/serve_app.py +0 -0
  288. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  289. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  290. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  291. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  292. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  293. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/portal-followup/SKILL.md +0 -0
  294. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/release-now/SKILL.md +0 -0
  295. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  296. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  297. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/skills/update-issue/SKILL.md +0 -0
  298. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/smoke.py +0 -0
  299. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/smoke_tags.py +0 -0
  300. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/spend_ceiling.py +0 -0
  301. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/split_work.py +0 -0
  302. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/sql.py +0 -0
  303. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/stage_projection.py +0 -0
  304. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/state.py +0 -0
  305. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/store_migrate.py +0 -0
  306. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/store_parity.py +0 -0
  307. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/templates/deploy-cloudflare.node.yml +0 -0
  308. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/test_author.py +0 -0
  309. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/test_chat.py +0 -0
  310. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/test_orchestrator.py +0 -0
  311. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/test_report.py +0 -0
  312. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/tui_pty_driver.py +0 -0
  313. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/tui_release.py +0 -0
  314. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/uat_checks.py +0 -0
  315. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/usage.py +0 -0
  316. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/usage_limits.py +0 -0
  317. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/usage_rollup.py +0 -0
  318. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/win_native_bridge.py +0 -0
  319. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/win_native_driver.py +0 -0
  320. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coord/worker_events.py +0 -0
  321. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/coordinator.example.yml +0 -0
  322. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-agent.service +0 -0
  323. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-backup.service +0 -0
  324. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-backup.timer +0 -0
  325. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-db-backup.service +0 -0
  326. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-db-backup.sh +0 -0
  327. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-db-backup.timer +0 -0
  328. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-dr-verify.service +0 -0
  329. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-dr-verify.timer +0 -0
  330. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-drive-queue.service +0 -0
  331. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-drive-queue.timer +0 -0
  332. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-failure-notify.service +0 -0
  333. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-failure-notify.sh +0 -0
  334. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-fleet-watchdog.service +0 -0
  335. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-fleet-watchdog.timer +0 -0
  336. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-notify.service +0 -0
  337. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-notify.timer +0 -0
  338. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-release-propagate.service +0 -0
  339. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-release-propagate.timer +0 -0
  340. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-release-window.service +0 -0
  341. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-release-window.timer +0 -0
  342. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-serve.service +0 -0
  343. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-web-dist-build.service +0 -0
  344. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-web-dist-build.sh +0 -0
  345. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-web-dist-build.timer +0 -0
  346. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-web-rollback.sh +0 -0
  347. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/coord-web.service +0 -0
  348. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/deploy/node-shim.sh +0 -0
  349. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/ADR_COORD_TUI_CI.md +0 -0
  350. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  351. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/ADR_COORD_WEB_CI.md +0 -0
  352. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/ADR_COORD_WEB_DIST.md +0 -0
  353. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  354. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/AGENT_OPERATIONS.md +0 -0
  355. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/ARCHITECTURE.md +0 -0
  356. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/ARCH_SECURITY_GATES.md +0 -0
  357. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/COCKPIT.md +0 -0
  358. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/CONTROL_CENTER.md +0 -0
  359. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/COST_DISCIPLINE.md +0 -0
  360. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/CROSS_PLATFORM.md +0 -0
  361. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/CUSTOMER_FACING_APPS.md +0 -0
  362. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/CUSTOMER_PORTAL.md +0 -0
  363. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/DATA_STORE_SELECTION.md +0 -0
  364. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/DISASTER_RECOVERY.md +0 -0
  365. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/DRIVE_QUEUE.md +0 -0
  366. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/EPHEMERAL_WORKERS.md +0 -0
  367. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/FORGE_MIGRATION.md +0 -0
  368. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/GRAPHIFY_SETUP.md +0 -0
  369. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/ISSUE_GUIDANCE.md +0 -0
  370. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/MAC_MINI.md +0 -0
  371. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  372. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/NOTIFIER.md +0 -0
  373. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/OPENCODE_VERIFICATION.md +0 -0
  374. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/OPERATING_GOTCHAS.md +0 -0
  375. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/OPERATOR_GUIDES.md +0 -0
  376. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/ORACLE_LOOP.md +0 -0
  377. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/PHONE_WEBAPP.md +0 -0
  378. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/PIPELINE_V2.md +0 -0
  379. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/PLATFORM_EVOLUTION.md +0 -0
  380. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/SECOND_BACKEND.md +0 -0
  381. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/STORE_SERVICE.md +0 -0
  382. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  383. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/WEB_CONTROL_CENTER.md +0 -0
  384. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/WSL_WINDOWS_WORKER.md +0 -0
  385. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/mocks/web/README.md +0 -0
  386. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/mocks/web/_tokens.css +0 -0
  387. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/mocks/web/issue-detail.html +0 -0
  388. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/mocks/web/pipeline-narrow.html +0 -0
  389. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/docs/mocks/web/pipeline-wide.html +0 -0
  390. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/graphify-out/.gitignore +0 -0
  391. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/install-agent.sh +0 -0
  392. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/pyproject.toml +0 -0
  393. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/audit_review_verdict_overrides.py +0 -0
  394. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  395. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/build-worker-image.sh +0 -0
  396. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/coordinator-machine.py +0 -0
  397. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/dr-down.sh +0 -0
  398. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/dr-up.sh +0 -0
  399. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/epic-down.sh +0 -0
  400. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/epic-up.sh +0 -0
  401. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/preflight.sh +0 -0
  402. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/provision-server.sh +0 -0
  403. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/provision-worker.sh +0 -0
  404. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  405. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  406. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/throwaway-vm.sh +0 -0
  407. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/azure-workers/verify-github-token.sh +0 -0
  408. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/check_gh_argv_containment.py +0 -0
  409. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/codegen.py +0 -0
  410. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/coord-test-runner.sh +0 -0
  411. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  412. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  413. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  414. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  415. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/coord-venv-rollback.sh +0 -0
  416. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/drive-batch.sh +0 -0
  417. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/extract-coord-tui.sh +0 -0
  418. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/fleet_watchdog.py +0 -0
  419. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/gen_board_fixture.py +0 -0
  420. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/gen_mock_index.py +0 -0
  421. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/lib/provision-core.sh +0 -0
  422. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/next_release_tag.py +0 -0
  423. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/provision-machine.sh +0 -0
  424. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/run_tests_in_populated_home.sh +0 -0
  425. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/run_tests_without_gh.sh +0 -0
  426. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/setup-macmini.sh +0 -0
  427. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/smoke_437_interactive.py +0 -0
  428. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/verify-provision-noble.sh +0 -0
  429. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/verify_878_review_capture.py +0 -0
  430. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/verify_release_published.py +0 -0
  431. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/scripts/verify_release_wheel.py +0 -0
  432. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/setup.cfg +0 -0
  433. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/SMOKE_SET.md +0 -0
  434. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/__init__.py +0 -0
  435. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-37/conftest.py +0 -0
  436. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-37/contract.md +0 -0
  437. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-37/manifest.yml +0 -0
  438. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  439. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  440. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-51/contract.md +0 -0
  441. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  442. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  443. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-51/manifest.yml +0 -0
  444. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  445. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-51/tsconfig.json +0 -0
  446. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  447. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/backends.py +0 -0
  448. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/board-pipeline-basic.json +0 -0
  449. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  450. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  451. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  452. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  453. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/playwright/all_pass.json +0 -0
  454. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  455. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/playwright/mixed_fail.json +0 -0
  456. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  457. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  458. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/playwright/skip.json +0 -0
  459. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/playwright/truncated.json +0 -0
  460. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  461. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  462. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  463. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  464. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  465. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  466. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  467. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  468. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  469. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_acceptance.py +0 -0
  470. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent.py +0 -0
  471. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_api_error.py +0 -0
  472. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_app.py +0 -0
  473. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_branch_base.py +0 -0
  474. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_branch_capture.py +0 -0
  475. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_config_free_1712.py +0 -0
  476. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_deploy_units_endpoint.py +0 -0
  477. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_dirty_worktree.py +0 -0
  478. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  479. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_graph_self_heal.py +0 -0
  480. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_health_h3.py +0 -0
  481. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_idle_restart.py +0 -0
  482. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_push_failure.py +0 -0
  483. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_reap.py +0 -0
  484. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_repos_and_pull.py +0 -0
  485. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_restart_services_endpoint.py +0 -0
  486. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_skills_self_heal.py +0 -0
  487. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_startup_diagnostics.py +0 -0
  488. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_update.py +0 -0
  489. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_update_bluegreen.py +0 -0
  490. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_usage_limit.py +0 -0
  491. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_agent_zero_commit.py +0 -0
  492. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_ambient_home_isolation.py +0 -0
  493. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_approve_capability_reroute_3241.py +0 -0
  494. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_approve_dependency_busy_2804.py +0 -0
  495. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_approve_reject_plan.py +0 -0
  496. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_approve_usage_gate.py +0 -0
  497. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_approved_work_2532.py +0 -0
  498. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_approved_work_2996.py +0 -0
  499. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_assignment_already_recorded_daemon.py +0 -0
  500. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_audit_log.py +0 -0
  501. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_audit_outcome.py +0 -0
  502. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_audit_query.py +0 -0
  503. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_auto_loop.py +0 -0
  504. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_auto_release_publish_2035.py +0 -0
  505. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_backend_selection.py +0 -0
  506. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_backup.py +0 -0
  507. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_base_checkout_restore.py +0 -0
  508. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_block_log.py +0 -0
  509. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_board_cap_762.py +0 -0
  510. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_board_fixture.py +0 -0
  511. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_board_read_path.py +0 -0
  512. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_board_schema.py +0 -0
  513. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_board_service.py +0 -0
  514. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_board_state.py +0 -0
  515. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_board_wire.py +0 -0
  516. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_brain.py +0 -0
  517. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_branch_model.py +0 -0
  518. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_bug_intake.py +0 -0
  519. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_bugbash.py +0 -0
  520. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_build_worker_image_env_update.py +0 -0
  521. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cargo_cache.py +0 -0
  522. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_check_gh_argv_containment.py +0 -0
  523. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_ci_acceptance_gate_1950.py +0 -0
  524. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_ci_fix.py +0 -0
  525. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_ci_github.py +0 -0
  526. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_ci_gitlab.py +0 -0
  527. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_ci_parity_2091.py +0 -0
  528. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_ci_store.py +0 -0
  529. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_claim.py +0 -0
  530. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_claude_md_budget.py +0 -0
  531. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_claude_setup_token.py +0 -0
  532. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_acceptance.py +0 -0
  533. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_assign.py +0 -0
  534. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  535. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_assign_interactive_remote.py +0 -0
  536. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_assign_provider.py +0 -0
  537. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  538. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_audit.py +0 -0
  539. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_chat_continue.py +0 -0
  540. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_ci.py +0 -0
  541. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_codegen.py +0 -0
  542. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_decide.py +0 -0
  543. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_diagnose_capability_rules.py +0 -0
  544. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_diagnose_config_provenance.py +0 -0
  545. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_diagnose_forge_availability.py +0 -0
  546. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_diagnose_graph.py +0 -0
  547. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_diagnose_self.py +0 -0
  548. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_diagnose_test_coverage.py +0 -0
  549. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_doctor.py +0 -0
  550. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_doctor_config_free_1801.py +0 -0
  551. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  552. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  553. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_drive.py +0 -0
  554. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_drive_queue.py +0 -0
  555. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_escalate.py +0 -0
  556. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_fix_headless_review.py +0 -0
  557. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_gate_a.py +0 -0
  558. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_install_drift.py +0 -0
  559. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_install_skills.py +0 -0
  560. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_issue_comment.py +0 -0
  561. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_issue_create_label.py +0 -0
  562. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_issue_reopen.py +0 -0
  563. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_issue_view_list.py +0 -0
  564. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_issues.py +0 -0
  565. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_merge.py +0 -0
  566. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_milestone_assign.py +0 -0
  567. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_milestone_capture.py +0 -0
  568. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_milestone_chat_add_child.py +0 -0
  569. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_milestone_dispatch.py +0 -0
  570. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_milestone_gate_b.py +0 -0
  571. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_milestone_gate_c.py +0 -0
  572. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_milestone_order.py +0 -0
  573. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  574. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_milestone_ship.py +0 -0
  575. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_network.py +0 -0
  576. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_new_issue_chat.py +0 -0
  577. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_plans.py +0 -0
  578. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_portal.py +0 -0
  579. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_pr.py +0 -0
  580. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_pull_artifact.py +0 -0
  581. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_queue.py +0 -0
  582. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_reattach_sessions.py +0 -0
  583. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_refine_board.py +0 -0
  584. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_release_preflight.py +0 -0
  585. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_release_propagate.py +0 -0
  586. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_release_window.py +0 -0
  587. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_repo_2220.py +0 -0
  588. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  589. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_scorecard.py +0 -0
  590. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_serve_store_backend_3084.py +0 -0
  591. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_set_review_findings.py +0 -0
  592. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_advisory_terminal.py +0 -0
  593. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_contested_tag.py +0 -0
  594. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_invariant_alarms.py +0 -0
  595. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_machine_fault.py +0 -0
  596. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_merge_queue.py +0 -0
  597. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_provider.py +0 -0
  598. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_retried_3340.py +0 -0
  599. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_review_finalizing.py +0 -0
  600. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_supervisor_3366.py +0 -0
  601. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_test_failed_tag.py +0 -0
  602. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_status_usage_limit.py +0 -0
  603. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_sync_comments_873.py +0 -0
  604. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_test_plan.py +0 -0
  605. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_track.py +0 -0
  606. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_tui_update.py +0 -0
  607. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cli_wait.py +0 -0
  608. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_client.py +0 -0
  609. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_client_base_install.py +0 -0
  610. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_client_config_cache_atomic_3052.py +0 -0
  611. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_client_resource_migration_1946.py +0 -0
  612. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_commands_common.py +0 -0
  613. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_comments.py +0 -0
  614. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_completion_summary.py +0 -0
  615. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_config.py +0 -0
  616. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_config_acceptance.py +0 -0
  617. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_config_audit.py +0 -0
  618. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_config_drift_check.py +0 -0
  619. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_config_effective.py +0 -0
  620. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_config_pricing.py +0 -0
  621. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  622. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_config_usage_gate.py +0 -0
  623. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_confirm_test.py +0 -0
  624. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_conflict_fix.py +0 -0
  625. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_conflict_fix_semantic.py +0 -0
  626. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  627. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coord_test.py +0 -0
  628. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  629. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coord_test_runner_baseline.py +0 -0
  630. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coord_test_runner_populated_home.py +0 -0
  631. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coord_test_runner_routing.py +0 -0
  632. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coord_test_runner_toolchain.py +0 -0
  633. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coord_uat.py +0 -0
  634. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coord_web_sse_restart_live.py +0 -0
  635. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_coordinator_machine.py +0 -0
  636. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_cross_platform_imports.py +0 -0
  637. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dao.py +0 -0
  638. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dashboard.py +0 -0
  639. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dashboard_api.py +0 -0
  640. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dashboard_fixture.py +0 -0
  641. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dashboard_server.py +0 -0
  642. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dashboard_terminal.py +0 -0
  643. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dashboard_terminal_live.py +0 -0
  644. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_db.py +0 -0
  645. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dead_end.py +0 -0
  646. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_decomposition_chat.py +0 -0
  647. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_coord_db_backup.py +0 -0
  648. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_coord_web_dist.py +0 -0
  649. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_coord_web_rollback.py +0 -0
  650. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_db_backup_unit.py +0 -0
  651. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_drive_queue_unit.py +0 -0
  652. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_failure_notify_unit.py +0 -0
  653. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_manifest.py +0 -0
  654. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_notify_unit.py +0 -0
  655. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_units_lane.py +0 -0
  656. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deploy_web_unit.py +0 -0
  657. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deprecation_telemetry.py +0 -0
  658. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_deps.py +0 -0
  659. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_diagnose.py +0 -0
  660. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dispatch.py +0 -0
  661. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dispatch_liveness.py +0 -0
  662. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dispatch_target_validation.py +0 -0
  663. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dispatch_workers.py +0 -0
  664. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dist_name.py +0 -0
  665. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_done_housekeeping.py +0 -0
  666. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dr_azure_scripts.py +0 -0
  667. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dr_promote.py +0 -0
  668. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_dr_verify.py +0 -0
  669. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_machine_fault.py +0 -0
  670. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_queue_blocked_rendering.py +0 -0
  671. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_queue_launch_argv.py +0 -0
  672. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_queue_max_parallel_config.py +0 -0
  673. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  674. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_queue_roll_pending.py +0 -0
  675. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  676. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_sessions_snapshot.py +0 -0
  677. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_state.py +0 -0
  678. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_drive_tmux.py +0 -0
  679. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_epic_up_capability_detection.py +0 -0
  680. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  681. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_epic_up_image_provenance.py +0 -0
  682. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_errors.py +0 -0
  683. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_events.py +0 -0
  684. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_failure_class.py +0 -0
  685. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_failure_classifier.py +0 -0
  686. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_filelock.py +0 -0
  687. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  688. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_fix_escalation_classifier.py +0 -0
  689. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_fix_of_force_override.py +0 -0
  690. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_fleet_config_health.py +0 -0
  691. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_fleet_health_probes.py +0 -0
  692. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_fleet_health_snapshot.py +0 -0
  693. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_fleet_watchdog.py +0 -0
  694. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_forge_availability.py +0 -0
  695. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_freshness.py +0 -0
  696. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_gate_a.py +0 -0
  697. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_gate_b.py +0 -0
  698. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_gate_snapshot_staleness.py +0 -0
  699. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_gates.py +0 -0
  700. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  701. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_gen_mock_index.py +0 -0
  702. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_generated_rust_fixture.py +0 -0
  703. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_generated_rust_requests.py +0 -0
  704. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_generated_types_fixture.py +0 -0
  705. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_github_ops.py +0 -0
  706. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_github_throttle.py +0 -0
  707. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_goal.py +0 -0
  708. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_graph_health.py +0 -0
  709. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_graph_selfheal_absent_2237.py +0 -0
  710. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_gtk_native_driver.py +0 -0
  711. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_handoff.py +0 -0
  712. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_checks.py +0 -0
  713. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_cli.py +0 -0
  714. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_cli_graph.py +0 -0
  715. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_config.py +0 -0
  716. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_context.py +0 -0
  717. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_coord_tui_ci_pin.py +0 -0
  718. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_coord_web_ci_pin.py +0 -0
  719. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_deploy_lane_facts.py +0 -0
  720. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_fix.py +0 -0
  721. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_incident_regression.py +0 -0
  722. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_issues_sync_staleness.py +0 -0
  723. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_pr_churn.py +0 -0
  724. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_pypi.py +0 -0
  725. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_registry.py +0 -0
  726. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_release_cordon_probe.py +0 -0
  727. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_timer_active.py +0 -0
  728. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_toolchain.py +0 -0
  729. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_unit_drift.py +0 -0
  730. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_unit_enablement.py +0 -0
  731. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_health_wedged_drive_queue.py +0 -0
  732. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_hooks.py +0 -0
  733. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_housekeeping.py +0 -0
  734. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_human_attended_437.py +0 -0
  735. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_init.py +0 -0
  736. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_install_agent_capabilities_3515.py +0 -0
  737. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_install_agent_venv_2911.py +0 -0
  738. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_integration.py +0 -0
  739. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_interactive.py +0 -0
  740. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_interactive_briefing_echo.py +0 -0
  741. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_interactive_pane_log_2541.py +0 -0
  742. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_interactive_prefill_state.py +0 -0
  743. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_interactive_session_relaunch.py +0 -0
  744. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_interactive_test_verdict_backstop.py +0 -0
  745. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_interactive_token_attribution.py +0 -0
  746. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_interactive_worktree.py +0 -0
  747. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_invariant_alarms.py +0 -0
  748. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_issue_store_seam.py +0 -0
  749. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_issues_sync_status.py +0 -0
  750. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_liveness_auditor.py +0 -0
  751. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_liveness_notify.py +0 -0
  752. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_lock_contention_ratchet.py +0 -0
  753. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_mac_native_driver.py +0 -0
  754. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_machine_fault.py +0 -0
  755. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_machine_metrics.py +0 -0
  756. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_machine_onboard.py +0 -0
  757. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_machine_pause.py +0 -0
  758. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_machine_stats.py +0 -0
  759. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_merge_verify.py +0 -0
  760. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_milestone_chat.py +0 -0
  761. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_milestone_dispatch.py +0 -0
  762. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_milestone_gate.py +0 -0
  763. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_milestone_order.py +0 -0
  764. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_milestone_seam.py +0 -0
  765. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_mock_author.py +0 -0
  766. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_model_tiering.py +0 -0
  767. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_models.py +0 -0
  768. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_models_config_labels.py +0 -0
  769. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_needs_attention.py +0 -0
  770. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_network.py +0 -0
  771. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_new_issue_chat.py +0 -0
  772. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_next_release_tag.py +0 -0
  773. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_node_shim.py +0 -0
  774. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notifier_baseline.py +0 -0
  775. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notifier_cli.py +0 -0
  776. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notifier_collect.py +0 -0
  777. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notifier_config.py +0 -0
  778. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notifier_drive_seam.py +0 -0
  779. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notifier_isolation.py +0 -0
  780. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notifier_predicate.py +0 -0
  781. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notifier_quiet_hours.py +0 -0
  782. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notifier_service.py +0 -0
  783. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notify.py +0 -0
  784. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_notify_drain.py +0 -0
  785. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_openapi.py +0 -0
  786. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_operational_defaults.py +0 -0
  787. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_overlap_fence.py +0 -0
  788. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_overlap_predict.py +0 -0
  789. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_packaged_deploy_units.py +0 -0
  790. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_parentage.py +0 -0
  791. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_paste_landed.py +0 -0
  792. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  793. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_pipeline.py +0 -0
  794. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_plan_followup_approve_plan_command.py +0 -0
  795. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_plan_followup_pr_command.py +0 -0
  796. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_plan_followup_review_command.py +0 -0
  797. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_plan_only.py +0 -0
  798. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_plan_parser.py +0 -0
  799. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_platform_paths.py +0 -0
  800. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_portal_bridge.py +0 -0
  801. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_portal_config.py +0 -0
  802. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_portal_store.py +0 -0
  803. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_portal_sync.py +0 -0
  804. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_pr_body_lint.py +0 -0
  805. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_prereqs.py +0 -0
  806. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_production_db_guard.py +0 -0
  807. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_progress.py +0 -0
  808. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_provider_seam.py +0 -0
  809. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_providers.py +0 -0
  810. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_providers_config_labels.py +0 -0
  811. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_providers_pty.py +0 -0
  812. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_provision_core.py +0 -0
  813. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_provision_machine.py +0 -0
  814. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_py_rust_mirror_inventory.py +0 -0
  815. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_quiet_hours.py +0 -0
  816. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_quiet_hours_store_2146.py +0 -0
  817. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reap_merged_sessions.py +0 -0
  818. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reap_stale_interactive_tick.py +0 -0
  819. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reconcile.py +0 -0
  820. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reconcile_branch.py +0 -0
  821. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reconcile_completions.py +0 -0
  822. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  823. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reconcile_merges.py +0 -0
  824. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reconcile_no_agent_record.py +0 -0
  825. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reconcile_tick.py +0 -0
  826. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reconcile_usage_limit_done.py +0 -0
  827. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_refine_chat.py +0 -0
  828. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_cordon_2101.py +0 -0
  829. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  830. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_cordon_deadlock_2240.py +0 -0
  831. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  832. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_cordon_stuck_2490.py +0 -0
  833. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_gate.py +0 -0
  834. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_propagate.py +0 -0
  835. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_propagate_threshold.py +0 -0
  836. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_roll_between_legs_2854.py +0 -0
  837. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_roll_window_handoff.py +0 -0
  838. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_unified_1242.py +0 -0
  839. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_verify.py +0 -0
  840. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_release_window.py +0 -0
  841. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_remote_auto_prune.py +0 -0
  842. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_remote_interactive_reaper.py +0 -0
  843. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_repo_add.py +0 -0
  844. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_repo_dormancy.py +0 -0
  845. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_repo_edit_2220.py +0 -0
  846. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_repo_graph_fleet_2237.py +0 -0
  847. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_repo_max_parallel_3423.py +0 -0
  848. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_repo_onboard_2220.py +0 -0
  849. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_report_result_push.py +0 -0
  850. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_reports.py +0 -0
  851. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_restart_cmd.py +0 -0
  852. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_retry.py +0 -0
  853. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_retry_advisory_1606.py +0 -0
  854. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_retry_escalation_classify_3360.py +0 -0
  855. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_retry_type_1636.py +0 -0
  856. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_revalidate.py +0 -0
  857. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_review.py +0 -0
  858. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_review_end_review_without_verdict.py +0 -0
  859. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_review_parse_failure_diagnostic.py +0 -0
  860. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_review_reaffirm.py +0 -0
  861. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_review_state.py +0 -0
  862. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_review_verdict_backstop.py +0 -0
  863. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_review_verdict_override_audit.py +0 -0
  864. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_review_verdict_relay.py +0 -0
  865. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_review_zero_commits.py +0 -0
  866. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_scoped_review_wiring.py +0 -0
  867. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_scorecard.py +0 -0
  868. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_self_health.py +0 -0
  869. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_serve.py +0 -0
  870. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_serve_app.py +0 -0
  871. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_serve_app_board_trim.py +0 -0
  872. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_serve_rest_routes.py +0 -0
  873. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_session.py +0 -0
  874. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_slice_issue_attribution.py +0 -0
  875. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_smoke.py +0 -0
  876. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  877. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_smoke_live_checkout_restore.py +0 -0
  878. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_smoke_workflow.py +0 -0
  879. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_spend_ceiling.py +0 -0
  880. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_spend_ceiling_coordinator.py +0 -0
  881. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_split.py +0 -0
  882. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_split_work.py +0 -0
  883. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_sql_dialect.py +0 -0
  884. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_sqlite_connect_ratchet.py +0 -0
  885. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_stage_projection.py +0 -0
  886. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_stale_busy_reviewer_697.py +0 -0
  887. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_stalled_pipeline.py +0 -0
  888. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_state.py +0 -0
  889. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_state_review_findings_daemon.py +0 -0
  890. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_status_fleet_footer.py +0 -0
  891. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_stop_1567.py +0 -0
  892. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_store_contract.py +0 -0
  893. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_store_migrate.py +0 -0
  894. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_stuck.py +0 -0
  895. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  896. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_terminal_command.py +0 -0
  897. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_test_author.py +0 -0
  898. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_test_chat.py +0 -0
  899. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_test_orchestrator.py +0 -0
  900. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_test_report.py +0 -0
  901. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_test_verdict_parsing.py +0 -0
  902. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_test_verdict_transcript_floor.py +0 -0
  903. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_text_io_encoding_audit.py +0 -0
  904. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_thin_client_board_audit.py +0 -0
  905. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_thin_client_config_load_1080.py +0 -0
  906. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_thin_client_daemon_routing_906.py +0 -0
  907. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_tmux_host.py +0 -0
  908. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_tmux_session.py +0 -0
  909. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_transcript_floor.py +0 -0
  910. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_tui_pty_driver.py +0 -0
  911. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_uat_checks.py +0 -0
  912. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_usage.py +0 -0
  913. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_usage_limits.py +0 -0
  914. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_usage_rollup.py +0 -0
  915. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_venv_live_install_2121.py +0 -0
  916. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_version_single_source.py +0 -0
  917. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_watch.py +0 -0
  918. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_win_native_bridge.py +0 -0
  919. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_win_native_driver.py +0 -0
  920. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  921. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_worker_env_venv_isolation.py +0 -0
  922. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_worker_events.py +0 -0
  923. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_worker_image_pin_sync.py +0 -0
  924. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_worker_safety.py +0 -0
  925. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_worker_test_scoping.py +0 -0
  926. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_worktree.py +0 -0
  927. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  928. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/tests/test_write_parity.py +0 -0
  929. {code_coordinator-0.5.559 → code_coordinator-0.5.561}/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.559
3
+ Version: 0.5.561
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.559
3
+ Version: 0.5.561
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.559",
2
+ "tag": "0.5.561",
3
3
  "distance": 0,
4
- "node": "gdb53efc5211a6f969b2f3a6c6686b3b561821626",
4
+ "node": "g719f616d563fc6b94375e7381da2f4b6bc6c833d",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-02"
@@ -733,7 +733,7 @@ def is_verdictless_job(check: CheckRun, job: JobRun | None) -> bool:
733
733
 
734
734
 
735
735
  def checks_are_stale(checks: list[CheckRun], base_commit_time: float | None) -> bool:
736
- """True when a **green** *checks* result predates *base_commit_time* (#1851).
736
+ """True when *checks* predate *base_commit_time* (#1851).
737
737
 
738
738
  GitHub attaches ``pull_request`` check runs to the PR's *head* SHA and
739
739
  re-runs them on head ``synchronize`` — never on base movement — so a
@@ -742,10 +742,17 @@ def checks_are_stale(checks: list[CheckRun], base_commit_time: float | None) ->
742
742
  what matters is what the base looked like when the run *began*, not when
743
743
  it finished.
744
744
 
745
- Callers should apply :func:`failed_checks`/:func:`in_flight_checks`
746
- first — this function assumes *checks* is the all-passing remainder and
747
- doesn't re-derive that itself, so it never contradicts "CI failed"/"CI
748
- running" with a third, competing reading of the same checks. An empty
745
+ Originally written for the caller's all-**passing** remainder — apply
746
+ :func:`failed_checks`/:func:`in_flight_checks` first and pass what's
747
+ left, so this never contradicts "CI failed"/"CI running" with a third,
748
+ competing reading of the same checks. #1986 also calls this with the
749
+ FAILED remainder instead (``coord.merge_queue``'s ``checks_failed``
750
+ path): the comparison itself never inspects ``conclusion``, only
751
+ ``started_at``, so "did this run predate the base?" is the identical
752
+ question either way — there is no second notion of CI staleness for the
753
+ red case, only a second caller asking the same one (#2096: one question,
754
+ one answer). Which verdict a stale run carries decides what the caller's
755
+ message says; it never decides whether the merge blocks. An empty
749
756
  *checks* list (nothing to compare) reads as not-stale; the caller's own
750
757
  "no checks" handling covers that case — see :meth:`CiStore.expects_checks`
751
758
  and ``coord.merge_queue``'s ``checks_absent`` gate (#1904), which now
@@ -1006,16 +1006,19 @@ class OracleDecision:
1006
1006
  — the argument :func:`_decide_acceptance_author` needs to build ``coord
1007
1007
  acceptance author <repo> <tracking_issue> --issue <N>``.
1008
1008
 
1009
- #2199: ``issue_exempt`` — resolved alongside ``active`` (same one-shot
1010
- GitHub fetch budget: ``AcceptanceGateChecker.is_issue_exempt`` reuses the
1011
- #1138 hard gate's own manifest read) — is *this issue*'s
1012
- ``manifest.exempt``/``oracle:exempt`` opt-out from the sealed suite.
1013
- :func:`_decide_acceptance_gate` (the trust gate) skips entirely when
1014
- this is ``True``: an exempt issue has no authored slice for `coord
1015
- acceptance record` to re-run, so treating its absence as a red verdict
1016
- would be exactly the "acquire a new blocking gate it never opted into"
1017
- regression #2199's acceptance criteria rule out. Always ``False`` when
1018
- ``active`` is ``False`` — meaningless outside the oracle loop.
1009
+ #2199/#2171: ``issue_exempt`` — resolved alongside ``active`` (same
1010
+ one-shot GitHub fetch budget: ``AcceptanceGateChecker.is_issue_exempt``
1011
+ reuses the #1138 hard gate's own manifest read) — is *this issue*'s
1012
+ ``manifest.exempt``/``oracle:exempt`` opt-out from the sealed suite. An
1013
+ exempt issue makes :func:`resolve_oracle_decision` return ``active=False``
1014
+ (#2171 — it has no slice for a `test-author` session to write, so
1015
+ JIT-authoring must not run either), with ``issue_exempt=True`` and
1016
+ ``reason`` naming the exemption for the preflight banner. ``True`` only
1017
+ ever coincides with ``active=False`` by construction; kept as its own
1018
+ field (rather than inferred from ``reason``) so
1019
+ :func:`_decide_acceptance_gate` and :func:`_dispatch_work_stage` can
1020
+ check it directly and defensively, without parsing prose. ``False``
1021
+ when the issue is not exempt, whatever ``active`` is.
1019
1022
  """
1020
1023
 
1021
1024
  active: bool
@@ -1094,6 +1097,24 @@ def resolve_oracle_decision(
1094
1097
  issue_exempt = gate_checker.is_issue_exempt(
1095
1098
  state.repo, state.milestone_number, state.issue, state.issue_labels,
1096
1099
  )
1100
+ if issue_exempt:
1101
+ # #2171: an issue in `manifest.exempt`/labelled `oracle:exempt` has
1102
+ # no sealed slice for a `type="test-author"` session to write — the
1103
+ # #1138 hard gate (`issue_oracle_ready`) would never block its Work
1104
+ # dispatch on one either. Returning INACTIVE here (not just setting
1105
+ # `issue_exempt=True` on an active decision) means BOTH downstream
1106
+ # gates fall through to a normal drive: `_dispatch_work_stage`
1107
+ # dispatches Work directly instead of authoring first, and
1108
+ # `_decide_acceptance_gate`'s trust gate never fires. Before this,
1109
+ # `active` stayed True for an exempt issue, so the JIT-authoring
1110
+ # step ran anyway — burning a metered dispatch for guaranteed-zero
1111
+ # output and then dead-ending with nothing left to dispatch Work.
1112
+ return OracleDecision(
1113
+ False,
1114
+ f"#{state.issue} is exempt in ms-{state.milestone_number}'s "
1115
+ "manifest — normal drive",
1116
+ issue_exempt=True,
1117
+ )
1097
1118
  return OracleDecision(
1098
1119
  True,
1099
1120
  f"ORACLE DRIVE — ms-{state.milestone_number}'s Gate-A contract is "
@@ -1102,7 +1123,6 @@ def resolve_oracle_decision(
1102
1123
  f"{state.milestone_tracking_issue} --issue {state.issue}`) before "
1103
1124
  "dispatching work",
1104
1125
  tracking_issue=state.milestone_tracking_issue,
1105
- issue_exempt=issue_exempt,
1106
1126
  )
1107
1127
 
1108
1128
 
@@ -2997,7 +3017,13 @@ def _dispatch_work_stage(
2997
3017
  *counters* is threaded in for the slice's own merge budget (#2079 —
2998
3018
  ``DriveCounters.acceptance``); every other decision here is stateless.
2999
3019
  """
3000
- if oracle is not None and oracle.active:
3020
+ if oracle is not None and oracle.active and not oracle.issue_exempt:
3021
+ # #2171: `oracle.active` alone already excludes an exempt issue
3022
+ # (`resolve_oracle_decision` returns `active=False` for one) — the
3023
+ # explicit `not oracle.issue_exempt` here is belt-and-suspenders,
3024
+ # mirroring `_decide_acceptance_gate`'s own guard below, so this
3025
+ # call site asks the SAME direct question rather than relying on
3026
+ # `active`'s meaning to carry it transitively.
3001
3027
  assert gate_checker is not None and verifier is not None, (
3002
3028
  "oracle.active implies resolve_oracle_decision ran with a real "
3003
3029
  "gate_checker; decide()/Driver always thread one through"
@@ -2770,9 +2770,19 @@ def _ci_checks_are_stale(
2770
2770
  *,
2771
2771
  fail_closed: bool = True,
2772
2772
  ) -> bool:
2773
- """True when *checks* — already confirmed by the caller to have no
2774
- failed/in-flight entries — are stale relative to *target_branch*'s
2775
- current base (#1851).
2773
+ """True when *checks* are stale relative to *target_branch*'s current
2774
+ base (#1851).
2775
+
2776
+ Originally written for the caller's all-PASSING remainder (no
2777
+ failed/in-flight entries) — the ``checks_stale`` path below. #1986 reuses
2778
+ it unchanged for the FAILED remainder too: the underlying comparison
2779
+ (``started_at`` vs. the base's current commit time, via
2780
+ :func:`coord.ci_store.checks_are_stale`) never reads ``conclusion``, so
2781
+ "did this run see the base's current tip?" has exactly one answer
2782
+ regardless of which way the run concluded (#2096: one question, one
2783
+ answer). A stale FAILING check still blocks the merge either way — this
2784
+ only changes whether the refusal names the staleness, never the
2785
+ pass/fail verdict itself.
2776
2786
 
2777
2787
  GitHub does not re-run ``pull_request`` workflows on a base-only move
2778
2788
  (only on head ``synchronize``), so a green check can silently outlive the
@@ -2906,6 +2916,50 @@ def ci_stale_reason(
2906
2916
  )
2907
2917
 
2908
2918
 
2919
+ def checks_failed_stale_suffix(
2920
+ failed: "list[CheckRun]",
2921
+ gh_ops: "GhOps | None",
2922
+ repo_github: str | None,
2923
+ target_branch: str | None,
2924
+ ) -> str:
2925
+ """Clause appended to a ``checks failed: ...`` refusal when the failing
2926
+ run(s) predate *target_branch*'s current base (#1986).
2927
+
2928
+ Hit while merging #1895: a `windows` check was red for `ModuleNotFoundError:
2929
+ No module named 'fcntl'` — a bug #1156 had already fixed on `main` 33
2930
+ commits before this branch's base. The gate reported it as a bare,
2931
+ current-looking failure, inviting either pointless debugging of a defect
2932
+ that no longer exists, or a `--force-merge` reasoned on "it's probably
2933
+ just flaky" — neither of which an operator should have to guess at when
2934
+ the gate already has the evidence.
2935
+
2936
+ #1851/:func:`ci_stale_reason` already answers "did this run see the
2937
+ base's current tip?" for a stale PASSING check; this is the exact same
2938
+ question for a FAILING one, so it reuses :func:`ci_staleness_note` for
2939
+ the anchor wording rather than inventing a second rendering of "predates
2940
+ the base" (#2096: one question, one answer). Callers decide staleness
2941
+ first via :func:`_ci_checks_are_stale` — this never makes that call
2942
+ itself, only renders the clause once asked to.
2943
+
2944
+ Returns ``""`` when the anchors can't be read — the same unreadable case
2945
+ :func:`ci_staleness_note` itself falls back on — so the caller's plain
2946
+ ``checks failed: ...`` message prints unchanged rather than asserting
2947
+ staleness evidence this can't actually produce. Either way the refusal
2948
+ still BLOCKS: this only ever adds provenance to an existing block, never
2949
+ removes or downgrades it.
2950
+ """
2951
+ note = ci_staleness_note(failed, gh_ops, repo_github, target_branch)
2952
+ if not note:
2953
+ return ""
2954
+ branch = target_branch or "the target branch"
2955
+ return (
2956
+ " — but that run predates the current base" + note + " — rebase "
2957
+ f"onto {branch} and push (`git push --force-with-lease`) and let CI "
2958
+ "re-run before trusting this result; a CI re-run against the same "
2959
+ "base cannot see a moved base"
2960
+ )
2961
+
2962
+
2909
2963
  # #1826: `--force-merge` still overrides the CI gate, but the override must
2910
2964
  # never be SILENT — the same posture `epic_closing_keyword_in_commit_forced`
2911
2965
  # already takes for the #1318 gate. A waived stale-CI merge is precisely the
@@ -7649,11 +7703,26 @@ def process(
7649
7703
  summary = ", ".join(
7650
7704
  f"{c.name} ({c.conclusion})" for c in failed
7651
7705
  )
7652
- msg = (
7653
- unreadable_reason
7654
- or infra_reason
7655
- or f"checks failed: {summary}"
7656
- )
7706
+ if unreadable_reason:
7707
+ msg = unreadable_reason
7708
+ elif infra_reason:
7709
+ msg = infra_reason
7710
+ else:
7711
+ # #1986: preview the same staleness
7712
+ # provenance the live path now adds to a
7713
+ # bare `checks failed: ...` — see
7714
+ # `checks_failed_stale_suffix`'s docstring.
7715
+ # Preview-only: never mutates, just shows
7716
+ # what a real attempt would compute.
7717
+ msg = f"checks failed: {summary}"
7718
+ if _ci_checks_are_stale(
7719
+ failed, gh_ops, entry.repo_github,
7720
+ entry.target_branch, _smoke,
7721
+ ):
7722
+ msg += checks_failed_stale_suffix(
7723
+ failed, gh_ops, entry.repo_github,
7724
+ entry.target_branch,
7725
+ )
7657
7726
  events.append(MergeEvent(
7658
7727
  entry, "checks_failed",
7659
7728
  f"(dry run) would be blocked: {msg}",
@@ -8283,6 +8352,20 @@ def process(
8283
8352
  # this already-confirmed streak as a flake.
8284
8353
  entry.ci_flaky_pending = ""
8285
8354
  msg = f"checks failed: {summary}"
8355
+ # #1986: a RED check can be exactly as stale as a GREEN
8356
+ # one (#1851) — it just looks like a current defect
8357
+ # instead of an obvious re-test candidate, which is what
8358
+ # invites either pointless debugging of a bug already
8359
+ # fixed on the current base, or a wrong `--force-merge`.
8360
+ # Reports provenance only; the entry still blocks either
8361
+ # way (see `checks_failed_stale_suffix`'s docstring).
8362
+ if _ci_checks_are_stale(
8363
+ failed, gh_ops, entry.repo_github, entry.target_branch,
8364
+ smoke,
8365
+ ):
8366
+ msg += checks_failed_stale_suffix(
8367
+ failed, gh_ops, entry.repo_github, entry.target_branch,
8368
+ )
8286
8369
  entry.error = msg
8287
8370
  events.append(MergeEvent(entry, "checks_failed", msg))
8288
8371
  continue # #292: skip, don't halt the group
@@ -1304,3 +1304,33 @@ def _no_frozen_coord_dir_constants():
1304
1304
  _scrub_lazy_coord_dir_constants()
1305
1305
  yield
1306
1306
  _scrub_lazy_coord_dir_constants()
1307
+
1308
+
1309
+ @pytest.fixture(autouse=True)
1310
+ def _non_wsl_host_by_default(monkeypatch):
1311
+ """#3532: ``coord.win_native_bridge.is_wsl_host`` detects the REAL host
1312
+ it's running on (``WSL_DISTRO_NAME``/``/proc/version``) — fine for
1313
+ production, but it means every ``win-native`` acceptance-driver test
1314
+ that doesn't scripts its own ``run_native_spec``/bridge fake implicitly
1315
+ assumed "whatever machine runs this test suite is not WSL". That held
1316
+ for every machine except dell64 (a genuine WSL2 host with a working
1317
+ Windows-side Python, #3519): there, ``is_wsl_host()`` legitimately
1318
+ returns ``True`` and ``coord.acceptance_drivers._run_win_native`` takes
1319
+ the real WSL->Windows bridge path instead of the scripted fake these
1320
+ tests set up on ``coord.win_native_driver.run_native_spec`` — a
1321
+ baseline-red latch (#3386), not a test bug in the assertions themselves.
1322
+
1323
+ Forcing the DEFAULT to non-WSL here, once, is the same "one question,
1324
+ one answer" posture as this file's other ``_no_real_*``/``_no_live_*``
1325
+ fixtures: every test in the suite gets a hermetic answer to "is this
1326
+ host WSL" regardless of which machine actually runs it. A test that
1327
+ means to exercise the WSL/bridge branch (``TestRunDriverWinNativeWslBridge``
1328
+ in ``tests/test_acceptance_drivers.py``) monkeypatches
1329
+ ``win_native_bridge.is_wsl_host`` back to ``True`` itself, inside the
1330
+ test body — that call reuses this same function-scoped ``monkeypatch``
1331
+ fixture and so simply wins (last ``setattr`` on the same attribute),
1332
+ no ordering trick needed.
1333
+ """
1334
+ import coord.win_native_bridge as win_native_bridge
1335
+
1336
+ monkeypatch.setattr(win_native_bridge, "is_wsl_host", lambda: False)
@@ -1699,6 +1699,32 @@ class TestRunDriverWinNativeWslBridge:
1699
1699
  result = run_driver("win-native", "./vimcode.exe", cwd=str(tmp_path), entrypoint="native.yaml")
1700
1700
  assert result.exit_code == 0
1701
1701
 
1702
+ def test_hermetic_default_beats_a_real_looking_wsl_environ(self, tmp_path, monkeypatch) -> None:
1703
+ """#3532: dell64 is a genuine WSL host, so ``conftest.py``'s
1704
+ ``_non_wsl_host_by_default`` autouse fixture must win over
1705
+ ``is_wsl_host``'s OWN detection inputs outright — not merely happen
1706
+ to agree with them because the box running this particular test
1707
+ suite isn't WSL. Forcing ``WSL_DISTRO_NAME`` (the stronger of
1708
+ ``is_wsl_host``'s two signals, and the one WSL sets for every
1709
+ interactive/non-interactive shell alike) to look exactly like
1710
+ dell64, and confirming the in-process (non-bridge) path still runs,
1711
+ proves the fixture actually overrides the real signal rather than
1712
+ coincidentally matching a non-WSL test runner."""
1713
+ monkeypatch.setenv("WSL_DISTRO_NAME", "Ubuntu")
1714
+
1715
+ spec = tmp_path / "native.yaml"
1716
+ spec.write_text("steps:\n - type: launch\n")
1717
+
1718
+ import coord.win_native_driver as win_native_driver
1719
+
1720
+ def fake_run_native_spec(spec_text, *, launch_command, cwd, timeout=None):
1721
+ return [{"id": "000 launch", "status": "pass", "message": ""}]
1722
+
1723
+ monkeypatch.setattr(win_native_driver, "run_native_spec", fake_run_native_spec)
1724
+
1725
+ result = run_driver("win-native", "./vimcode.exe", cwd=str(tmp_path), entrypoint="native.yaml")
1726
+ assert result.exit_code == 0
1727
+
1702
1728
 
1703
1729
  class TestRunDriverMacNative:
1704
1730
  """#3485: the ``mac-native`` driver — the actual Quartz/AX calls, the
@@ -654,9 +654,14 @@ def test_resolve_oracle_decision_is_active_when_everything_lines_up():
654
654
  assert "ms-38" in decision.reason
655
655
 
656
656
 
657
- def test_resolve_oracle_decision_resolves_issue_exempt_when_active():
658
- """#2199: `issue_exempt` is resolved alongside `active` — one GitHub
659
- fetch budget, not a second one paid later by the trust gate."""
657
+ def test_resolve_oracle_decision_is_inactive_for_an_exempt_issue():
658
+ """#2171: an issue in `manifest.exempt` (or labelled `oracle:exempt`)
659
+ has no sealed slice for a `type="test-author"` session to write — the
660
+ same #1138 hard gate (`issue_oracle_ready`) would never block its Work
661
+ dispatch on one either. `resolve_oracle_decision` must say so with
662
+ `active=False` (not merely flag `issue_exempt=True` on an otherwise
663
+ active decision) so `_dispatch_work_stage` dispatches Work directly
664
+ instead of dead-ending on a test-author with nothing to author."""
660
665
  checker = FakeGateChecker(exists=True, exempt=True)
661
666
  decision = resolve_oracle_decision(
662
667
  oracle_state(issue_labels=("bug",)),
@@ -664,8 +669,10 @@ def test_resolve_oracle_decision_resolves_issue_exempt_when_active():
664
669
  make_config_with_acceptance_driver(),
665
670
  checker,
666
671
  )
667
- assert decision.active is True
672
+ assert decision.active is False
668
673
  assert decision.issue_exempt is True
674
+ assert "exempt" in decision.reason
675
+ assert "ms-38" in decision.reason
669
676
  assert checker.exempt_calls == [(REPO, 38, ISSUE, ("bug",))]
670
677
 
671
678
 
@@ -871,6 +878,41 @@ def test_oracle_inactive_dispatches_work_directly_as_before():
871
878
  )
872
879
 
873
880
 
881
+ def test_oracle_exempt_issue_dispatches_work_directly_no_test_author():
882
+ """#2171: `resolve_oracle_decision` returns `active=False` for an exempt
883
+ issue (see the regression test above), so `_dispatch_work_stage` must
884
+ skip the JIT-authoring branch entirely and dispatch Work straight away
885
+ — never a `coord acceptance author ...` for an issue with nothing to
886
+ author."""
887
+ oracle = OracleDecision(
888
+ False,
889
+ "#1392 is exempt in ms-38's manifest — normal drive",
890
+ issue_exempt=True,
891
+ )
892
+ action = step(state(), oracle=oracle)
893
+ assert action.kind == RUN
894
+ assert action.command == (
895
+ "assign", "precision", REPO, "1392",
896
+ "--driven-by", f"drive:{REPO}#1392",
897
+ )
898
+
899
+
900
+ def test_dispatch_work_stage_also_guards_on_issue_exempt_defensively():
901
+ """Belt-and-suspenders (mirrors `_decide_acceptance_gate`'s own guard):
902
+ even if something ever constructed an `active=True, issue_exempt=True`
903
+ decision, the work-stage dispatch must still skip authoring rather than
904
+ trust `active` alone."""
905
+ oracle = OracleDecision(
906
+ True, "ORACLE DRIVE", tracking_issue=1120, issue_exempt=True,
907
+ )
908
+ action = step(state(), oracle=oracle)
909
+ assert action.kind == RUN
910
+ assert action.command == (
911
+ "assign", "precision", REPO, "1392",
912
+ "--driven-by", f"drive:{REPO}#1392",
913
+ )
914
+
915
+
874
916
  def test_oracle_active_authors_the_slice_before_dispatching_work():
875
917
  oracle = OracleDecision(True, "ORACLE DRIVE", tracking_issue=1120)
876
918
  action = step(state(), oracle=oracle)
@@ -7364,6 +7364,27 @@ def test_merge_gate_remedy_command_falls_back_to_inspect_for_red_ci():
7364
7364
  assert "drive-queue remove" not in command
7365
7365
 
7366
7366
 
7367
+ def test_merge_gate_remedy_command_recognizes_a_stale_checks_failed_reason():
7368
+ """#1986: a RED check that predates the current base still carries the
7369
+ plain `checks failed` prefix (`coord/merge_queue.py`'s
7370
+ `checks_failed_stale_suffix` only ever APPENDS to it) — so this must
7371
+ keep matching here exactly as the bare #2983-less red-CI shape does
7372
+ above, not fall through to "not a merge-gate block" just because the
7373
+ message now also names the stale base."""
7374
+ reason = (
7375
+ "checks failed: windows (failure) — but that run predates the "
7376
+ "current base (ran against main as of 2026-08-07T03:33:48Z, main "
7377
+ "now 2026-08-08T01:02:03Z) — rebase onto main and push (`git push "
7378
+ "--force-with-lease`) and let CI re-run before trusting this "
7379
+ "result; a CI re-run against the same base cannot see a moved base"
7380
+ )
7381
+ assert is_merge_gate_block_reason(reason) is True
7382
+ command = merge_gate_remedy_command(reason, REPO, 1986)
7383
+ assert command == merge_plan_inspect_command(REPO)
7384
+ assert "revalidate" not in command
7385
+ assert "drive-queue remove" not in command
7386
+
7387
+
7367
7388
  def test_merge_gate_remedy_command_falls_back_to_inspect_for_review_required():
7368
7389
  reason = (
7369
7390
  "review_required — coord merge's own gate reports 'review missing', "
@@ -73,9 +73,33 @@ exit 1
73
73
  _write_exe(fake_bin / "systemctl", "#!/usr/bin/env bash\nexit 0\n")
74
74
  for noop in ("loginctl", "claude"):
75
75
  _write_exe(fake_bin / noop, "#!/usr/bin/env bash\nexit 0\n")
76
+ _write_exe(fake_bin / "grep", _GREP_STUB)
76
77
  return fake_bin
77
78
 
78
79
 
80
+ #: #3532: `install-agent.sh`'s WSL-detection fallback is literally
81
+ #: `grep -qi microsoft /proc/version` (consulted only when `WSL_DISTRO_NAME`
82
+ #: is unset) — run for real, that reads the actual host's `/proc/version`,
83
+ #: which says "microsoft" on a genuine WSL2 host (dell64) regardless of
84
+ #: which branch THIS test means to exercise. Intercepting exactly that one
85
+ #: invocation and answering from `$COORD_TEST_PROC_VERSION_IS_WSL` (set by
86
+ #: `_run_installer` below, from the same `wsl=` flag the test author
87
+ #: already passed) makes the installer's WSL detection hermetic the same
88
+ #: way `tests/conftest.py`'s `_non_wsl_host_by_default` does for the Python
89
+ #: driver path — every OTHER `grep` call (e.g. the `python3 --version`
90
+ #: compatibility check) is forwarded to the real binary unchanged.
91
+ _GREP_STUB = """#!/usr/bin/env bash
92
+ if [ "$1" = "-qi" ] && [ "$2" = "microsoft" ] && [ "$3" = "/proc/version" ]; then
93
+ if [ "${COORD_TEST_PROC_VERSION_IS_WSL:-0}" = "1" ]; then
94
+ exit 0
95
+ else
96
+ exit 1
97
+ fi
98
+ fi
99
+ exec /usr/bin/grep "$@"
100
+ """
101
+
102
+
79
103
  def _bridge_log(tmp_path: Path) -> Path:
80
104
  return tmp_path / "home" / "bridge-ensure.log"
81
105
 
@@ -111,6 +135,12 @@ def _run_installer(
111
135
  env["WSL_DISTRO_NAME"] = "Ubuntu"
112
136
  else:
113
137
  env.pop("WSL_DISTRO_NAME", None)
138
+ # #3532: back the installer's `/proc/version` fallback check with the
139
+ # same `wsl=` flag, via the `grep` stub in `_make_fake_bin`, instead of
140
+ # leaving it to read the REAL host's `/proc/version` — a genuine WSL2
141
+ # host (dell64) would otherwise always win that check regardless of
142
+ # what `WSL_DISTRO_NAME` above says.
143
+ env["COORD_TEST_PROC_VERSION_IS_WSL"] = "1" if wsl else "0"
114
144
  return subprocess.run(
115
145
  [POSIX_BASH, str(INSTALLER), "--machine", "testhost", *extra_args],
116
146
  cwd=tmp_path,
@@ -44,14 +44,20 @@ def _check(
44
44
  status: str = "completed",
45
45
  conclusion: str | None = "failure",
46
46
  run_id: str = "1",
47
+ started_at: float | None = None,
47
48
  ) -> CheckRun:
48
49
  """#1892 test helper: a `CheckRun` with a settable `run_id`, needed to
49
50
  exercise `_ci_infra_reason`'s per-run job lookup — mirrors
50
- `tests/test_ci_store.py`'s `_check`, which has no `run_id` parameter."""
51
+ `tests/test_ci_store.py`'s `_check`, which has no `run_id` parameter.
52
+
53
+ `started_at` (#1986) lets a caller position the run before/after a
54
+ fake base timestamp, to exercise the `checks_failed` staleness wording
55
+ — defaults to `None` (unreadable anchor) exactly like every pre-#1986
56
+ caller of this helper, so none of them need updating."""
51
57
  return CheckRun(
52
58
  name=name, status=status, conclusion=conclusion,
53
59
  url=f"https://gh/runs/{run_id}", run_id=run_id,
54
- started_at=None, completed_at=None,
60
+ started_at=started_at, completed_at=None,
55
61
  )
56
62
 
57
63
 
@@ -9590,6 +9596,126 @@ class TestTwoGreenBranchesOneBaseMove:
9590
9596
  assert gh.ts_calls == 1 # the gate's own read, and nothing more
9591
9597
 
9592
9598
 
9599
+ class TestChecksFailedStaleness:
9600
+ """#1986: a FAILING check can be exactly as stale as a #1851 PASSING
9601
+ one — this issue's live incident (#1895) was a `windows` check red for
9602
+ `fcntl` import failure that #1156 had already fixed on `main`, 33
9603
+ commits before this branch's base. Unlike a stale pass (reported with
9604
+ full provenance since #1851), a stale failure used to be reported as a
9605
+ bare, current-looking defect, inviting either pointless debugging of a
9606
+ bug that no longer exists, or a wrong `--force-merge`.
9607
+
9608
+ Acceptance: the refusal still BLOCKS either way — only the message
9609
+ changes, never the decision — and a CURRENT failing check must be
9610
+ reported exactly as before (no staleness wording), so the signal stays
9611
+ meaningful."""
9612
+
9613
+ class _Gh(FakeGh):
9614
+ ts: float = 1000.0
9615
+ def get_branch_commit_timestamp(self, repo, branch):
9616
+ return self.ts
9617
+
9618
+ @staticmethod
9619
+ def _ci(failed_started_at: float | None):
9620
+ class _Ci:
9621
+ is_available = True
9622
+ def list_checks_for_pr(self, repo, number):
9623
+ return [_check("windows", started_at=failed_started_at)]
9624
+ return _Ci()
9625
+
9626
+ def test_stale_failure_names_both_anchors_and_still_blocks(self) -> None:
9627
+ items = [_q("w1", pr=99)]
9628
+ gh = self._Gh()
9629
+ events = process(items, gh, ci_store=self._ci(failed_started_at=500.0))
9630
+
9631
+ assert items[0].state == PENDING # still blocks
9632
+ kinds = [e.kind for e in events]
9633
+ assert "checks_failed" in kinds
9634
+ failed = [e for e in events if e.kind == "checks_failed"][0]
9635
+ assert failed.message.startswith("checks failed:") # #2212: drive_queue matches on this
9636
+ assert "predates the current base" in failed.message
9637
+ assert "rebase" in failed.message
9638
+ assert items[0].error == failed.message
9639
+
9640
+ def test_current_failure_has_no_staleness_wording(self) -> None:
9641
+ items = [_q("w1", pr=99)]
9642
+ gh = self._Gh()
9643
+ events = process(items, gh, ci_store=self._ci(failed_started_at=1500.0))
9644
+
9645
+ assert items[0].state == PENDING # still blocks
9646
+ failed = [e for e in events if e.kind == "checks_failed"][0]
9647
+ assert failed.message == "checks failed: windows (failure)"
9648
+ assert "predates the current base" not in failed.message
9649
+ assert "stale" not in failed.message.lower()
9650
+
9651
+ def test_stale_and_current_failure_reasons_differ(self) -> None:
9652
+ """Acceptance criterion: the two reason strings must differ."""
9653
+ stale_items = [_q("w1", pr=99)]
9654
+ stale_events = process(
9655
+ stale_items, self._Gh(), ci_store=self._ci(failed_started_at=500.0),
9656
+ )
9657
+ current_items = [_q("w2", pr=100)]
9658
+ current_events = process(
9659
+ current_items, self._Gh(), ci_store=self._ci(failed_started_at=1500.0),
9660
+ )
9661
+ stale_msg = [e for e in stale_events if e.kind == "checks_failed"][0].message
9662
+ current_msg = [e for e in current_events if e.kind == "checks_failed"][0].message
9663
+ assert stale_msg != current_msg
9664
+ # Both share the same prefix — only the provenance differs.
9665
+ assert stale_msg.startswith("checks failed: windows (failure)")
9666
+ assert current_msg == "checks failed: windows (failure)"
9667
+
9668
+ def test_dry_run_previews_the_same_staleness_wording(self) -> None:
9669
+ items = [_q("w1", pr=99)]
9670
+ gh = self._Gh()
9671
+ events = process(
9672
+ items, gh, ci_store=self._ci(failed_started_at=500.0), dry_run=True,
9673
+ )
9674
+ assert items[0].state == PENDING
9675
+ failed = [e for e in events if e.kind == "checks_failed"][0]
9676
+ assert "would be blocked: checks failed:" in failed.message
9677
+ assert "predates the current base" in failed.message
9678
+
9679
+ def test_dry_run_current_failure_has_no_staleness_wording(self) -> None:
9680
+ items = [_q("w1", pr=99)]
9681
+ gh = self._Gh()
9682
+ events = process(
9683
+ items, gh, ci_store=self._ci(failed_started_at=1500.0), dry_run=True,
9684
+ )
9685
+ failed = [e for e in events if e.kind == "checks_failed"][0]
9686
+ assert failed.message == "(dry run) would be blocked: checks failed: windows (failure)"
9687
+
9688
+ def test_unreadable_base_anchor_omits_the_claim_rather_than_guessing(self) -> None:
9689
+ """When the base timestamp can't be read at all, the stale-looking
9690
+ default inside `_ci_checks_are_stale` must NOT make this function
9691
+ assert staleness it has no evidence for — `ci_staleness_note`'s own
9692
+ anchor read fails the same way and the suffix comes back empty."""
9693
+ class _NoTimestampGh(FakeGh):
9694
+ pass
9695
+
9696
+ items = [_q("w1", pr=99)]
9697
+ events = process(
9698
+ items, _NoTimestampGh(), ci_store=self._ci(failed_started_at=500.0),
9699
+ )
9700
+ failed = [e for e in events if e.kind == "checks_failed"][0]
9701
+ assert failed.message == "checks failed: windows (failure)"
9702
+
9703
+ def test_checks_failed_stale_suffix_direct(self) -> None:
9704
+ """Direct unit coverage of the suffix renderer, independent of the
9705
+ `process()` plumbing around it."""
9706
+ failed = [_check("windows", started_at=500.0)]
9707
+ suffix = mq.checks_failed_stale_suffix(
9708
+ failed, self._Gh(), "acme/api", "main",
9709
+ )
9710
+ assert "predates the current base" in suffix
9711
+ assert "rebase" in suffix
9712
+
9713
+ def test_checks_failed_stale_suffix_empty_when_anchor_unreadable(self) -> None:
9714
+ failed = [_check("windows", started_at=500.0)]
9715
+ suffix = mq.checks_failed_stale_suffix(failed, None, "acme/api", "main")
9716
+ assert suffix == ""
9717
+
9718
+
9593
9719
  class TestProcessConflictedEmptyChecks:
9594
9720
  """#1877: a conflicted PR reports zero CI checks — GitHub can't build a
9595
9721
  merge ref to run a `pull_request`-triggered workflow against it. Before