code-coordinator 0.5.552__tar.gz → 0.5.554__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 (925) hide show
  1. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/acceptance.py +16 -1
  5. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/acceptance_drivers.py +26 -3
  6. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/bugbash.py +108 -10
  7. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/release.py +19 -2
  8. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/config.py +105 -14
  9. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gtk_native_driver.py +73 -15
  10. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/mac_native_driver.py +64 -0
  11. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_gate.py +51 -0
  12. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/reports.py +5 -0
  13. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/review.py +183 -6
  14. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/win_native_driver.py +121 -0
  15. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_acceptance.py +40 -0
  16. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_acceptance_drivers.py +50 -0
  17. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_bugbash.py +71 -0
  18. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config.py +20 -0
  19. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_acceptance.py +124 -0
  20. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gtk_native_driver.py +69 -3
  21. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_mac_native_driver.py +35 -0
  22. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_gate.py +112 -0
  23. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review.py +269 -0
  24. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_win_native_driver.py +64 -0
  25. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.claude/commands/board.md +0 -0
  26. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.claude/commands/complete-session.md +0 -0
  27. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.claude/commands/coordinator.md +0 -0
  28. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.githooks/_lib.sh +0 -0
  29. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.githooks/post-checkout +0 -0
  30. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.githooks/post-commit +0 -0
  31. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.githooks/post-merge +0 -0
  32. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  33. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/coord-ci-acceptance.yml +0 -0
  34. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/workflows/auto-release.yml +0 -0
  35. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/workflows/publish.yml +0 -0
  36. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/workflows/test.yml +0 -0
  37. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.gitignore +0 -0
  38. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/CLAUDE.md +0 -0
  39. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/GOAL.md +0 -0
  40. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/LICENSE +0 -0
  41. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/MANIFEST.in +0 -0
  42. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/README.md +0 -0
  43. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/SOURCES.txt +0 -0
  44. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/dependency_links.txt +0 -0
  45. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/entry_points.txt +0 -0
  46. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/requires.txt +0 -0
  47. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/scm_file_list.json +0 -0
  48. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/top_level.txt +0 -0
  49. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/__init__.py +0 -0
  50. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/_board_mapping.py +0 -0
  51. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agent.py +0 -0
  52. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agent_app.py +0 -0
  53. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agent_update.py +0 -0
  54. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agents/opencode/.gitignore +0 -0
  55. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agents/opencode/agents/work.md +0 -0
  56. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agents/opencode/routing.jsonc +0 -0
  57. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/approved_work.py +0 -0
  58. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/audit.py +0 -0
  59. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/auto_loop.py +0 -0
  60. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/backup.py +0 -0
  61. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/block_log.py +0 -0
  62. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/board_schema.py +0 -0
  63. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/board_service.py +0 -0
  64. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/board_wire.py +0 -0
  65. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/brain.py +0 -0
  66. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/branch_model.py +0 -0
  67. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/bug_intake.py +0 -0
  68. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/cargo_cache.py +0 -0
  69. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/ci_fix.py +0 -0
  70. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/ci_github.py +0 -0
  71. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/ci_gitlab.py +0 -0
  72. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/ci_store.py +0 -0
  73. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/claim.py +0 -0
  74. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/claude_setup_token.py +0 -0
  75. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/cli.py +0 -0
  76. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/client.py +0 -0
  77. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/codegen.py +0 -0
  78. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/__init__.py +0 -0
  79. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/_common.py +0 -0
  80. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/acceptance.py +0 -0
  81. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/agent_ops.py +0 -0
  82. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/audit.py +0 -0
  83. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/backup.py +0 -0
  84. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/bugbash.py +0 -0
  85. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/chat.py +0 -0
  86. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/ci.py +0 -0
  87. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/codegen.py +0 -0
  88. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/dispatch.py +0 -0
  89. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/dispatch_workers.py +0 -0
  90. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/dr.py +0 -0
  91. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/drive.py +0 -0
  92. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/drive_queue.py +0 -0
  93. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/gate_a.py +0 -0
  94. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/gates.py +0 -0
  95. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/issues.py +0 -0
  96. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/lifecycle.py +0 -0
  97. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/machine.py +0 -0
  98. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/merge.py +0 -0
  99. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/milestone.py +0 -0
  100. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/plan_followup.py +0 -0
  101. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/plans.py +0 -0
  102. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/portal.py +0 -0
  103. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/pr.py +0 -0
  104. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/repo.py +0 -0
  105. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/report.py +0 -0
  106. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/review.py +0 -0
  107. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/scorecard.py +0 -0
  108. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/sessions.py +0 -0
  109. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/setup.py +0 -0
  110. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/status.py +0 -0
  111. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/store_migrate.py +0 -0
  112. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/terminal.py +0 -0
  113. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/test_gate.py +0 -0
  114. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/tui.py +0 -0
  115. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/comments.py +0 -0
  116. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/config_reload.py +0 -0
  117. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/confirm_test.py +0 -0
  118. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/conflict_fix.py +0 -0
  119. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dao.py +0 -0
  120. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/__init__.py +0 -0
  121. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/fixture.py +0 -0
  122. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/index.html +0 -0
  123. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/server.py +0 -0
  124. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/terminal.py +0 -0
  125. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/db.py +0 -0
  126. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dead_end.py +0 -0
  127. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/decomposition_chat.py +0 -0
  128. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/README.md +0 -0
  129. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-agent.service +0 -0
  130. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-backup.service +0 -0
  131. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-backup.timer +0 -0
  132. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-db-backup.service +0 -0
  133. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-db-backup.sh +0 -0
  134. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-db-backup.timer +0 -0
  135. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-dr-verify.service +0 -0
  136. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-dr-verify.timer +0 -0
  137. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-drive-queue.service +0 -0
  138. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-drive-queue.timer +0 -0
  139. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-failure-notify.service +0 -0
  140. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-fleet-watchdog.service +0 -0
  141. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  142. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-notify.service +0 -0
  143. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-notify.timer +0 -0
  144. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-release-propagate.service +0 -0
  145. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-release-propagate.timer +0 -0
  146. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-release-window.service +0 -0
  147. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-release-window.timer +0 -0
  148. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-serve.service +0 -0
  149. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-web-dist-build.service +0 -0
  150. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-web-dist-build.timer +0 -0
  151. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-web.service +0 -0
  152. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy_manifest.py +0 -0
  153. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy_units.py +0 -0
  154. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deprecation_telemetry.py +0 -0
  155. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deps.py +0 -0
  156. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/diagnose.py +0 -0
  157. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dispatch.py +0 -0
  158. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dispatch_liveness.py +0 -0
  159. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dist_name.py +0 -0
  160. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dr_promote.py +0 -0
  161. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dr_verify.py +0 -0
  162. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/drive.py +0 -0
  163. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/drive_queue.py +0 -0
  164. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/drive_sessions_snapshot.py +0 -0
  165. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/drive_state.py +0 -0
  166. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/events.py +0 -0
  167. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/failure_class.py +0 -0
  168. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/failure_classifier.py +0 -0
  169. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/filelock.py +0 -0
  170. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/fleet_config_health.py +0 -0
  171. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/forge_availability.py +0 -0
  172. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/freshness.py +0 -0
  173. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gate_a.py +0 -0
  174. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gate_b.py +0 -0
  175. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gate_snapshot.py +0 -0
  176. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gates.py +0 -0
  177. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gen_board_fixture.py +0 -0
  178. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/github_ops.py +0 -0
  179. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/github_throttle.py +0 -0
  180. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/goal.py +0 -0
  181. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/graph_health.py +0 -0
  182. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/__init__.py +0 -0
  183. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/aggregate.py +0 -0
  184. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/__init__.py +0 -0
  185. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/_ci_pin.py +0 -0
  186. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/agent_install.py +0 -0
  187. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/cargo_targets.py +0 -0
  188. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/claude_binary.py +0 -0
  189. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/config_drift.py +0 -0
  190. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  191. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/coord_web_ci_pin.py +0 -0
  192. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/deploy_lane_facts.py +0 -0
  193. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/disk.py +0 -0
  194. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/fleet_board.py +0 -0
  195. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  196. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/fleet_phantom.py +0 -0
  197. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/fleet_unit_drift.py +0 -0
  198. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/graph.py +0 -0
  199. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/graphify_cli.py +0 -0
  200. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/index_lock.py +0 -0
  201. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/issues_sync_staleness.py +0 -0
  202. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/local_machine_identity.py +0 -0
  203. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/plan_usage.py +0 -0
  204. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/pr_churn.py +0 -0
  205. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/release_cordon.py +0 -0
  206. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/repo_state.py +0 -0
  207. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/spawned_coord.py +0 -0
  208. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/stalled_pipeline.py +0 -0
  209. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/timer_active.py +0 -0
  210. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/toolchain.py +0 -0
  211. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/unit_drift.py +0 -0
  212. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/unit_enablement.py +0 -0
  213. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/wedged_drive_queue.py +0 -0
  214. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/worktrees.py +0 -0
  215. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/cli.py +0 -0
  216. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/context.py +0 -0
  217. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/fleet_snapshot.py +0 -0
  218. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/models.py +0 -0
  219. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/pypi.py +0 -0
  220. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/registry.py +0 -0
  221. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/render.py +0 -0
  222. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/units.py +0 -0
  223. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/hooks.py +0 -0
  224. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/housekeeping.py +0 -0
  225. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/interactive.py +0 -0
  226. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/invariant_alarms.py +0 -0
  227. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/issue_store.py +0 -0
  228. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/issues_sync_status.py +0 -0
  229. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/liveness_auditor.py +0 -0
  230. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_fault.py +0 -0
  231. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_metrics.py +0 -0
  232. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_onboard.py +0 -0
  233. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_pause.py +0 -0
  234. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_stats.py +0 -0
  235. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/merge_queue.py +0 -0
  236. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/milestone_chat.py +0 -0
  237. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/milestone_dispatch.py +0 -0
  238. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/milestone_gate.py +0 -0
  239. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/milestone_order.py +0 -0
  240. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/mock_author.py +0 -0
  241. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/models.py +0 -0
  242. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/network.py +0 -0
  243. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/new_issue_chat.py +0 -0
  244. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/__init__.py +0 -0
  245. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/baseline.py +0 -0
  246. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/cli.py +0 -0
  247. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/collect.py +0 -0
  248. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/digest.py +0 -0
  249. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/models.py +0 -0
  250. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/predicate.py +0 -0
  251. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/service.py +0 -0
  252. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/store.py +0 -0
  253. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/transport.py +0 -0
  254. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notify.py +0 -0
  255. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/openapi.py +0 -0
  256. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/overlap_fence.py +0 -0
  257. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/overlap_predict.py +0 -0
  258. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/parentage.py +0 -0
  259. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/parentage_github.py +0 -0
  260. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/pipeline.py +0 -0
  261. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/plan_parser.py +0 -0
  262. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/plans.py +0 -0
  263. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/platform_paths.py +0 -0
  264. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/portal_bridge.py +0 -0
  265. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/portal_store.py +0 -0
  266. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/portal_sync.py +0 -0
  267. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/pr_body_lint.py +0 -0
  268. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/prereqs.py +0 -0
  269. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/progress.py +0 -0
  270. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/__init__.py +0 -0
  271. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/base.py +0 -0
  272. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/claude.py +0 -0
  273. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/claude_pty.py +0 -0
  274. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/opencode.py +0 -0
  275. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/queue_diagnose.py +0 -0
  276. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/reconcile.py +0 -0
  277. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/reconcile_tick.py +0 -0
  278. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/refine_chat.py +0 -0
  279. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_cordon.py +0 -0
  280. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_propagate.py +0 -0
  281. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_verify.py +0 -0
  282. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_window.py +0 -0
  283. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/repo_dormancy.py +0 -0
  284. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/repo_edit.py +0 -0
  285. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/repo_onboard.py +0 -0
  286. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/rest_schema.py +0 -0
  287. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/restart_cmd.py +0 -0
  288. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/revalidate.py +0 -0
  289. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/scorecard.py +0 -0
  290. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/self_health.py +0 -0
  291. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/serve_app.py +0 -0
  292. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  293. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  294. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  295. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  296. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  297. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/portal-followup/SKILL.md +0 -0
  298. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/release-now/SKILL.md +0 -0
  299. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  300. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  301. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/update-issue/SKILL.md +0 -0
  302. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/smoke.py +0 -0
  303. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/smoke_tags.py +0 -0
  304. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/spend_ceiling.py +0 -0
  305. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/split_work.py +0 -0
  306. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/sql.py +0 -0
  307. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/stage_projection.py +0 -0
  308. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/state.py +0 -0
  309. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/store_migrate.py +0 -0
  310. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/store_parity.py +0 -0
  311. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/templates/deploy-cloudflare.node.yml +0 -0
  312. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/test_author.py +0 -0
  313. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/test_chat.py +0 -0
  314. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/test_orchestrator.py +0 -0
  315. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/test_report.py +0 -0
  316. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/tui_pty_driver.py +0 -0
  317. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/tui_release.py +0 -0
  318. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/uat_checks.py +0 -0
  319. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/usage.py +0 -0
  320. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/usage_limits.py +0 -0
  321. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/usage_rollup.py +0 -0
  322. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/worker_events.py +0 -0
  323. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coordinator.example.yml +0 -0
  324. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-agent.service +0 -0
  325. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-backup.service +0 -0
  326. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-backup.timer +0 -0
  327. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-db-backup.service +0 -0
  328. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-db-backup.sh +0 -0
  329. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-db-backup.timer +0 -0
  330. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-dr-verify.service +0 -0
  331. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-dr-verify.timer +0 -0
  332. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-drive-queue.service +0 -0
  333. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-drive-queue.timer +0 -0
  334. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-failure-notify.service +0 -0
  335. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-failure-notify.sh +0 -0
  336. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-fleet-watchdog.service +0 -0
  337. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-fleet-watchdog.timer +0 -0
  338. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-notify.service +0 -0
  339. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-notify.timer +0 -0
  340. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-release-propagate.service +0 -0
  341. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-release-propagate.timer +0 -0
  342. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-release-window.service +0 -0
  343. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-release-window.timer +0 -0
  344. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-serve.service +0 -0
  345. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web-dist-build.service +0 -0
  346. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web-dist-build.sh +0 -0
  347. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web-dist-build.timer +0 -0
  348. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web-rollback.sh +0 -0
  349. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web.service +0 -0
  350. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/node-shim.sh +0 -0
  351. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_COORD_TUI_CI.md +0 -0
  352. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  353. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_COORD_WEB_CI.md +0 -0
  354. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_COORD_WEB_DIST.md +0 -0
  355. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  356. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/AGENT_OPERATIONS.md +0 -0
  357. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ARCHITECTURE.md +0 -0
  358. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ARCH_SECURITY_GATES.md +0 -0
  359. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/COCKPIT.md +0 -0
  360. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/CONTROL_CENTER.md +0 -0
  361. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/COST_DISCIPLINE.md +0 -0
  362. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/CROSS_PLATFORM.md +0 -0
  363. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/CUSTOMER_FACING_APPS.md +0 -0
  364. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/CUSTOMER_PORTAL.md +0 -0
  365. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/DATA_STORE_SELECTION.md +0 -0
  366. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/DISASTER_RECOVERY.md +0 -0
  367. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/DRIVE_QUEUE.md +0 -0
  368. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/EPHEMERAL_WORKERS.md +0 -0
  369. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/FORGE_MIGRATION.md +0 -0
  370. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/GRAPHIFY_SETUP.md +0 -0
  371. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ISSUE_GUIDANCE.md +0 -0
  372. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/MAC_MINI.md +0 -0
  373. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  374. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/NOTIFIER.md +0 -0
  375. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/OPENCODE_VERIFICATION.md +0 -0
  376. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/OPERATING_GOTCHAS.md +0 -0
  377. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/OPERATOR_GUIDES.md +0 -0
  378. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ORACLE_LOOP.md +0 -0
  379. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/PHONE_WEBAPP.md +0 -0
  380. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/PIPELINE_V2.md +0 -0
  381. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/PLATFORM_EVOLUTION.md +0 -0
  382. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/SECOND_BACKEND.md +0 -0
  383. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/STORE_SERVICE.md +0 -0
  384. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  385. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/WEB_CONTROL_CENTER.md +0 -0
  386. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/WSL_WINDOWS_WORKER.md +0 -0
  387. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/README.md +0 -0
  388. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/_tokens.css +0 -0
  389. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/issue-detail.html +0 -0
  390. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/pipeline-narrow.html +0 -0
  391. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/pipeline-wide.html +0 -0
  392. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/graphify-out/.gitignore +0 -0
  393. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/install-agent.sh +0 -0
  394. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/pyproject.toml +0 -0
  395. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/audit_review_verdict_overrides.py +0 -0
  396. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  397. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/build-worker-image.sh +0 -0
  398. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/coordinator-machine.py +0 -0
  399. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/dr-down.sh +0 -0
  400. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/dr-up.sh +0 -0
  401. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/epic-down.sh +0 -0
  402. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/epic-up.sh +0 -0
  403. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/preflight.sh +0 -0
  404. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/provision-server.sh +0 -0
  405. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/provision-worker.sh +0 -0
  406. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  407. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  408. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/throwaway-vm.sh +0 -0
  409. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/verify-github-token.sh +0 -0
  410. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/check_gh_argv_containment.py +0 -0
  411. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/codegen.py +0 -0
  412. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-test-runner.sh +0 -0
  413. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  414. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  415. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  416. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  417. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-venv-rollback.sh +0 -0
  418. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/drive-batch.sh +0 -0
  419. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/extract-coord-tui.sh +0 -0
  420. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/fleet_watchdog.py +0 -0
  421. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/gen_board_fixture.py +0 -0
  422. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/gen_mock_index.py +0 -0
  423. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/lib/provision-core.sh +0 -0
  424. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/next_release_tag.py +0 -0
  425. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/provision-machine.sh +0 -0
  426. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/run_tests_in_populated_home.sh +0 -0
  427. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/run_tests_without_gh.sh +0 -0
  428. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/setup-macmini.sh +0 -0
  429. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/smoke_437_interactive.py +0 -0
  430. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/verify-provision-noble.sh +0 -0
  431. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/verify_878_review_capture.py +0 -0
  432. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/verify_release_published.py +0 -0
  433. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/verify_release_wheel.py +0 -0
  434. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/setup.cfg +0 -0
  435. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/SMOKE_SET.md +0 -0
  436. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/__init__.py +0 -0
  437. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/conftest.py +0 -0
  438. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/contract.md +0 -0
  439. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/manifest.yml +0 -0
  440. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  441. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  442. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/contract.md +0 -0
  443. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  444. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  445. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/manifest.yml +0 -0
  446. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  447. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/tsconfig.json +0 -0
  448. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  449. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/backends.py +0 -0
  450. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/conftest.py +0 -0
  451. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/board-pipeline-basic.json +0 -0
  452. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  453. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  454. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  455. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  456. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/all_pass.json +0 -0
  457. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  458. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/mixed_fail.json +0 -0
  459. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  460. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  461. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/skip.json +0 -0
  462. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/truncated.json +0 -0
  463. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  464. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  465. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  466. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  467. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  468. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  469. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  470. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  471. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  472. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent.py +0 -0
  473. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_api_error.py +0 -0
  474. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_app.py +0 -0
  475. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_branch_base.py +0 -0
  476. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_branch_capture.py +0 -0
  477. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_config_free_1712.py +0 -0
  478. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_deploy_units_endpoint.py +0 -0
  479. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_dirty_worktree.py +0 -0
  480. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  481. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_graph_self_heal.py +0 -0
  482. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_health_h3.py +0 -0
  483. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_idle_restart.py +0 -0
  484. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_push_failure.py +0 -0
  485. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_reap.py +0 -0
  486. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_repos_and_pull.py +0 -0
  487. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_restart_services_endpoint.py +0 -0
  488. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_skills_self_heal.py +0 -0
  489. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_startup_diagnostics.py +0 -0
  490. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_update.py +0 -0
  491. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_update_bluegreen.py +0 -0
  492. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_usage_limit.py +0 -0
  493. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_zero_commit.py +0 -0
  494. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ambient_home_isolation.py +0 -0
  495. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approve_capability_reroute_3241.py +0 -0
  496. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approve_dependency_busy_2804.py +0 -0
  497. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approve_reject_plan.py +0 -0
  498. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approve_usage_gate.py +0 -0
  499. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approved_work_2532.py +0 -0
  500. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approved_work_2996.py +0 -0
  501. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_assignment_already_recorded_daemon.py +0 -0
  502. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_audit_log.py +0 -0
  503. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_audit_outcome.py +0 -0
  504. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_audit_query.py +0 -0
  505. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_auto_loop.py +0 -0
  506. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_auto_release_publish_2035.py +0 -0
  507. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_backend_selection.py +0 -0
  508. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_backup.py +0 -0
  509. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_base_checkout_restore.py +0 -0
  510. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_block_log.py +0 -0
  511. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_cap_762.py +0 -0
  512. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_fixture.py +0 -0
  513. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_read_path.py +0 -0
  514. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_schema.py +0 -0
  515. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_service.py +0 -0
  516. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_state.py +0 -0
  517. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_wire.py +0 -0
  518. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_brain.py +0 -0
  519. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_branch_model.py +0 -0
  520. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_bug_intake.py +0 -0
  521. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_build_worker_image_env_update.py +0 -0
  522. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cargo_cache.py +0 -0
  523. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_check_gh_argv_containment.py +0 -0
  524. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_acceptance_gate_1950.py +0 -0
  525. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_fix.py +0 -0
  526. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_github.py +0 -0
  527. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_gitlab.py +0 -0
  528. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_parity_2091.py +0 -0
  529. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_store.py +0 -0
  530. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_claim.py +0 -0
  531. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_claude_md_budget.py +0 -0
  532. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_claude_setup_token.py +0 -0
  533. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_acceptance.py +0 -0
  534. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign.py +0 -0
  535. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  536. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign_interactive_remote.py +0 -0
  537. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign_provider.py +0 -0
  538. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  539. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_audit.py +0 -0
  540. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_chat_continue.py +0 -0
  541. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_ci.py +0 -0
  542. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_codegen.py +0 -0
  543. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_decide.py +0 -0
  544. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_capability_rules.py +0 -0
  545. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_config_provenance.py +0 -0
  546. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_forge_availability.py +0 -0
  547. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_graph.py +0 -0
  548. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_self.py +0 -0
  549. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_test_coverage.py +0 -0
  550. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_doctor.py +0 -0
  551. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_doctor_config_free_1801.py +0 -0
  552. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  553. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  554. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_drive.py +0 -0
  555. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_drive_queue.py +0 -0
  556. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_escalate.py +0 -0
  557. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_fix_headless_review.py +0 -0
  558. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_gate_a.py +0 -0
  559. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_install_drift.py +0 -0
  560. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_install_skills.py +0 -0
  561. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issue_comment.py +0 -0
  562. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issue_create_label.py +0 -0
  563. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issue_reopen.py +0 -0
  564. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issue_view_list.py +0 -0
  565. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issues.py +0 -0
  566. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_merge.py +0 -0
  567. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_assign.py +0 -0
  568. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_capture.py +0 -0
  569. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_chat_add_child.py +0 -0
  570. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_dispatch.py +0 -0
  571. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_gate_b.py +0 -0
  572. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_gate_c.py +0 -0
  573. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_order.py +0 -0
  574. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  575. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_ship.py +0 -0
  576. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_network.py +0 -0
  577. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_new_issue_chat.py +0 -0
  578. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_plans.py +0 -0
  579. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_portal.py +0 -0
  580. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_pr.py +0 -0
  581. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_pull_artifact.py +0 -0
  582. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_queue.py +0 -0
  583. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_reattach_sessions.py +0 -0
  584. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_refine_board.py +0 -0
  585. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_release_preflight.py +0 -0
  586. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_release_propagate.py +0 -0
  587. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_release_window.py +0 -0
  588. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_repo_2220.py +0 -0
  589. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  590. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_scorecard.py +0 -0
  591. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_serve_store_backend_3084.py +0 -0
  592. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_set_review_findings.py +0 -0
  593. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_advisory_terminal.py +0 -0
  594. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_contested_tag.py +0 -0
  595. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_invariant_alarms.py +0 -0
  596. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_machine_fault.py +0 -0
  597. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_merge_queue.py +0 -0
  598. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_provider.py +0 -0
  599. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_retried_3340.py +0 -0
  600. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_review_finalizing.py +0 -0
  601. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_supervisor_3366.py +0 -0
  602. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_test_failed_tag.py +0 -0
  603. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_usage_limit.py +0 -0
  604. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_sync_comments_873.py +0 -0
  605. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_test_plan.py +0 -0
  606. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_track.py +0 -0
  607. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_tui_update.py +0 -0
  608. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_wait.py +0 -0
  609. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_client.py +0 -0
  610. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_client_base_install.py +0 -0
  611. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_client_config_cache_atomic_3052.py +0 -0
  612. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_client_resource_migration_1946.py +0 -0
  613. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_commands_common.py +0 -0
  614. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_comments.py +0 -0
  615. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_completion_summary.py +0 -0
  616. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_audit.py +0 -0
  617. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_drift_check.py +0 -0
  618. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_effective.py +0 -0
  619. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_pricing.py +0 -0
  620. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  621. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_usage_gate.py +0 -0
  622. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_confirm_test.py +0 -0
  623. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_conflict_fix.py +0 -0
  624. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_conflict_fix_semantic.py +0 -0
  625. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  626. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test.py +0 -0
  627. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  628. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_baseline.py +0 -0
  629. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_populated_home.py +0 -0
  630. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_routing.py +0 -0
  631. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_toolchain.py +0 -0
  632. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_uat.py +0 -0
  633. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_web_sse_restart_live.py +0 -0
  634. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coordinator_machine.py +0 -0
  635. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cross_platform_imports.py +0 -0
  636. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dao.py +0 -0
  637. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard.py +0 -0
  638. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_api.py +0 -0
  639. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_fixture.py +0 -0
  640. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_server.py +0 -0
  641. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_terminal.py +0 -0
  642. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_terminal_live.py +0 -0
  643. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_db.py +0 -0
  644. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dead_end.py +0 -0
  645. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_decomposition_chat.py +0 -0
  646. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_coord_db_backup.py +0 -0
  647. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_coord_web_dist.py +0 -0
  648. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_coord_web_rollback.py +0 -0
  649. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_db_backup_unit.py +0 -0
  650. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_drive_queue_unit.py +0 -0
  651. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_failure_notify_unit.py +0 -0
  652. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_manifest.py +0 -0
  653. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_notify_unit.py +0 -0
  654. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_units_lane.py +0 -0
  655. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_web_unit.py +0 -0
  656. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deprecation_telemetry.py +0 -0
  657. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deps.py +0 -0
  658. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_diagnose.py +0 -0
  659. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dispatch.py +0 -0
  660. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dispatch_liveness.py +0 -0
  661. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dispatch_target_validation.py +0 -0
  662. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dispatch_workers.py +0 -0
  663. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dist_name.py +0 -0
  664. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_done_housekeeping.py +0 -0
  665. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dr_azure_scripts.py +0 -0
  666. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dr_promote.py +0 -0
  667. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dr_verify.py +0 -0
  668. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive.py +0 -0
  669. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_machine_fault.py +0 -0
  670. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue.py +0 -0
  671. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_blocked_rendering.py +0 -0
  672. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_launch_argv.py +0 -0
  673. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_max_parallel_config.py +0 -0
  674. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  675. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_roll_pending.py +0 -0
  676. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  677. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_sessions_snapshot.py +0 -0
  678. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_state.py +0 -0
  679. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_tmux.py +0 -0
  680. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_epic_up_capability_detection.py +0 -0
  681. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  682. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_epic_up_image_provenance.py +0 -0
  683. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_errors.py +0 -0
  684. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_events.py +0 -0
  685. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_failure_class.py +0 -0
  686. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_failure_classifier.py +0 -0
  687. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_filelock.py +0 -0
  688. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  689. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fix_escalation_classifier.py +0 -0
  690. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fix_of_force_override.py +0 -0
  691. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fleet_config_health.py +0 -0
  692. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fleet_health_probes.py +0 -0
  693. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fleet_health_snapshot.py +0 -0
  694. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fleet_watchdog.py +0 -0
  695. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_forge_availability.py +0 -0
  696. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_freshness.py +0 -0
  697. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gate_a.py +0 -0
  698. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gate_b.py +0 -0
  699. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gate_snapshot_staleness.py +0 -0
  700. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gates.py +0 -0
  701. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  702. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gen_mock_index.py +0 -0
  703. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_generated_rust_fixture.py +0 -0
  704. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_generated_rust_requests.py +0 -0
  705. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_generated_types_fixture.py +0 -0
  706. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_github_ops.py +0 -0
  707. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_github_throttle.py +0 -0
  708. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_goal.py +0 -0
  709. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_graph_health.py +0 -0
  710. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_graph_selfheal_absent_2237.py +0 -0
  711. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_handoff.py +0 -0
  712. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_checks.py +0 -0
  713. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_cli.py +0 -0
  714. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_cli_graph.py +0 -0
  715. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_config.py +0 -0
  716. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_context.py +0 -0
  717. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_coord_tui_ci_pin.py +0 -0
  718. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_coord_web_ci_pin.py +0 -0
  719. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_deploy_lane_facts.py +0 -0
  720. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_fix.py +0 -0
  721. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_incident_regression.py +0 -0
  722. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_issues_sync_staleness.py +0 -0
  723. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_pr_churn.py +0 -0
  724. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_pypi.py +0 -0
  725. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_registry.py +0 -0
  726. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_release_cordon_probe.py +0 -0
  727. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_timer_active.py +0 -0
  728. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_toolchain.py +0 -0
  729. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_unit_drift.py +0 -0
  730. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_unit_enablement.py +0 -0
  731. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_wedged_drive_queue.py +0 -0
  732. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_hooks.py +0 -0
  733. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_housekeeping.py +0 -0
  734. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_human_attended_437.py +0 -0
  735. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_init.py +0 -0
  736. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_install_agent_venv_2911.py +0 -0
  737. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_integration.py +0 -0
  738. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive.py +0 -0
  739. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_briefing_echo.py +0 -0
  740. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_pane_log_2541.py +0 -0
  741. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_prefill_state.py +0 -0
  742. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_session_relaunch.py +0 -0
  743. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_test_verdict_backstop.py +0 -0
  744. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_token_attribution.py +0 -0
  745. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_worktree.py +0 -0
  746. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_invariant_alarms.py +0 -0
  747. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_issue_store_seam.py +0 -0
  748. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_issues_sync_status.py +0 -0
  749. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_liveness_auditor.py +0 -0
  750. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_liveness_notify.py +0 -0
  751. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_lock_contention_ratchet.py +0 -0
  752. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_fault.py +0 -0
  753. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_metrics.py +0 -0
  754. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_onboard.py +0 -0
  755. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_pause.py +0 -0
  756. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_stats.py +0 -0
  757. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_merge_queue.py +0 -0
  758. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_merge_verify.py +0 -0
  759. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_chat.py +0 -0
  760. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_dispatch.py +0 -0
  761. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_gate.py +0 -0
  762. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_order.py +0 -0
  763. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_seam.py +0 -0
  764. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_mock_author.py +0 -0
  765. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_model_tiering.py +0 -0
  766. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_models.py +0 -0
  767. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_models_config_labels.py +0 -0
  768. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_needs_attention.py +0 -0
  769. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_network.py +0 -0
  770. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_new_issue_chat.py +0 -0
  771. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_next_release_tag.py +0 -0
  772. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_node_shim.py +0 -0
  773. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_baseline.py +0 -0
  774. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_cli.py +0 -0
  775. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_collect.py +0 -0
  776. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_config.py +0 -0
  777. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_drive_seam.py +0 -0
  778. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_isolation.py +0 -0
  779. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_predicate.py +0 -0
  780. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_quiet_hours.py +0 -0
  781. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_service.py +0 -0
  782. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notify.py +0 -0
  783. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notify_drain.py +0 -0
  784. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_openapi.py +0 -0
  785. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_operational_defaults.py +0 -0
  786. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_overlap_fence.py +0 -0
  787. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_overlap_predict.py +0 -0
  788. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_packaged_deploy_units.py +0 -0
  789. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_parentage.py +0 -0
  790. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_paste_landed.py +0 -0
  791. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  792. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_pipeline.py +0 -0
  793. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_followup_approve_plan_command.py +0 -0
  794. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_followup_pr_command.py +0 -0
  795. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_followup_review_command.py +0 -0
  796. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_only.py +0 -0
  797. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_parser.py +0 -0
  798. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_platform_paths.py +0 -0
  799. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_portal_bridge.py +0 -0
  800. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_portal_config.py +0 -0
  801. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_portal_store.py +0 -0
  802. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_portal_sync.py +0 -0
  803. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_pr_body_lint.py +0 -0
  804. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_prereqs.py +0 -0
  805. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_production_db_guard.py +0 -0
  806. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_progress.py +0 -0
  807. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_provider_seam.py +0 -0
  808. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_providers.py +0 -0
  809. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_providers_config_labels.py +0 -0
  810. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_providers_pty.py +0 -0
  811. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_provision_core.py +0 -0
  812. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_provision_machine.py +0 -0
  813. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_py_rust_mirror_inventory.py +0 -0
  814. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_quiet_hours.py +0 -0
  815. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_quiet_hours_store_2146.py +0 -0
  816. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reap_merged_sessions.py +0 -0
  817. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reap_stale_interactive_tick.py +0 -0
  818. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile.py +0 -0
  819. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_branch.py +0 -0
  820. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_completions.py +0 -0
  821. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  822. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_merges.py +0 -0
  823. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_no_agent_record.py +0 -0
  824. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_tick.py +0 -0
  825. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_usage_limit_done.py +0 -0
  826. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_refine_chat.py +0 -0
  827. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_2101.py +0 -0
  828. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  829. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_deadlock_2240.py +0 -0
  830. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  831. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_stuck_2490.py +0 -0
  832. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_propagate.py +0 -0
  833. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_propagate_threshold.py +0 -0
  834. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_roll_between_legs_2854.py +0 -0
  835. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_roll_window_handoff.py +0 -0
  836. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_unified_1242.py +0 -0
  837. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_verify.py +0 -0
  838. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_window.py +0 -0
  839. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_remote_auto_prune.py +0 -0
  840. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_remote_interactive_reaper.py +0 -0
  841. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_add.py +0 -0
  842. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_dormancy.py +0 -0
  843. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_edit_2220.py +0 -0
  844. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_graph_fleet_2237.py +0 -0
  845. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_max_parallel_3423.py +0 -0
  846. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_onboard_2220.py +0 -0
  847. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_report_result_push.py +0 -0
  848. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reports.py +0 -0
  849. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_restart_cmd.py +0 -0
  850. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_retry.py +0 -0
  851. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_retry_advisory_1606.py +0 -0
  852. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_retry_escalation_classify_3360.py +0 -0
  853. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_retry_type_1636.py +0 -0
  854. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_revalidate.py +0 -0
  855. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_end_review_without_verdict.py +0 -0
  856. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_parse_failure_diagnostic.py +0 -0
  857. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_reaffirm.py +0 -0
  858. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_state.py +0 -0
  859. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_verdict_backstop.py +0 -0
  860. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_verdict_override_audit.py +0 -0
  861. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_verdict_relay.py +0 -0
  862. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_zero_commits.py +0 -0
  863. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_scoped_review_wiring.py +0 -0
  864. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_scorecard.py +0 -0
  865. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_self_health.py +0 -0
  866. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_serve.py +0 -0
  867. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_serve_app.py +0 -0
  868. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_serve_app_board_trim.py +0 -0
  869. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_serve_rest_routes.py +0 -0
  870. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_session.py +0 -0
  871. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_slice_issue_attribution.py +0 -0
  872. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_smoke.py +0 -0
  873. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  874. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_smoke_live_checkout_restore.py +0 -0
  875. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_smoke_workflow.py +0 -0
  876. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_spend_ceiling.py +0 -0
  877. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_spend_ceiling_coordinator.py +0 -0
  878. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_split.py +0 -0
  879. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_split_work.py +0 -0
  880. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_sql_dialect.py +0 -0
  881. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_sqlite_connect_ratchet.py +0 -0
  882. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stage_projection.py +0 -0
  883. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stale_busy_reviewer_697.py +0 -0
  884. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stalled_pipeline.py +0 -0
  885. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_state.py +0 -0
  886. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_state_review_findings_daemon.py +0 -0
  887. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_status_fleet_footer.py +0 -0
  888. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stop_1567.py +0 -0
  889. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_store_contract.py +0 -0
  890. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_store_migrate.py +0 -0
  891. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stuck.py +0 -0
  892. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  893. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_terminal_command.py +0 -0
  894. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_author.py +0 -0
  895. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_chat.py +0 -0
  896. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_orchestrator.py +0 -0
  897. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_report.py +0 -0
  898. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_verdict_parsing.py +0 -0
  899. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_verdict_transcript_floor.py +0 -0
  900. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_text_io_encoding_audit.py +0 -0
  901. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_thin_client_board_audit.py +0 -0
  902. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_thin_client_config_load_1080.py +0 -0
  903. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_thin_client_daemon_routing_906.py +0 -0
  904. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_throwaway_vm.py +0 -0
  905. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_tmux_host.py +0 -0
  906. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_tmux_session.py +0 -0
  907. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_transcript_floor.py +0 -0
  908. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_tui_pty_driver.py +0 -0
  909. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_uat_checks.py +0 -0
  910. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_usage.py +0 -0
  911. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_usage_limits.py +0 -0
  912. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_usage_rollup.py +0 -0
  913. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_venv_live_install_2121.py +0 -0
  914. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_version_single_source.py +0 -0
  915. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_watch.py +0 -0
  916. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  917. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_env_venv_isolation.py +0 -0
  918. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_events.py +0 -0
  919. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_image_pin_sync.py +0 -0
  920. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_safety.py +0 -0
  921. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_test_scoping.py +0 -0
  922. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worktree.py +0 -0
  923. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  924. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_write_parity.py +0 -0
  925. {code_coordinator-0.5.552 → code_coordinator-0.5.554}/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.552
3
+ Version: 0.5.554
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.552
3
+ Version: 0.5.554
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.552",
2
+ "tag": "0.5.554",
3
3
  "distance": 0,
4
- "node": "gd43086f6113245eb21f4a5f940ed0037f0a100fa",
4
+ "node": "g9153537fcc25cf8e03c74a83899452ecc73a6f92",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-01"
@@ -957,13 +957,22 @@ def build_verdict(
957
957
  passed = sum(1 for t in tests if t.get("status") == "pass")
958
958
  failed = sum(1 for t in tests if t.get("status") == "fail")
959
959
  skipped = sum(1 for t in tests if t.get("status") == "skip")
960
+ # #3510: a session precheck (win-native/mac-native/gtk-native) that
961
+ # finds a locked/absent GUI reports a distinct "unavailable" status,
962
+ # not "fail" — it's an environment condition, not an app bug. It must
963
+ # still block `green`/`ci_green`: an unconfirmed result is not a pass
964
+ # (epic #2096's "a gate must be able to fail" / "unconfirmed success
965
+ # is a defect"). Counted and reported separately so callers can tell
966
+ # "the app is broken" apart from "go unlock the host".
967
+ unavailable = sum(1 for t in tests if t.get("status") == "unavailable")
960
968
  payload: dict[str, Any] = {
961
969
  "scope": scope,
962
970
  "total": len(tests),
963
971
  "passed": passed,
964
972
  "failed": failed,
965
973
  "skipped": skipped,
966
- "green": failed == 0 and len(tests) > 0,
974
+ "unavailable": unavailable,
975
+ "green": failed == 0 and unavailable == 0 and len(tests) > 0,
967
976
  "tests": tests,
968
977
  }
969
978
  if issue_number is not None:
@@ -1038,12 +1047,18 @@ def apply_expected_red(verdict: dict[str, Any], expected_red_ids: "set[str]") ->
1038
1047
  real_failures = sum(
1039
1048
  1 for t in tests if t.get("status") == "fail" and t["id"] not in expected_red_ids
1040
1049
  )
1050
+ # #3510: an `unavailable` entry (locked/absent GUI session) is never
1051
+ # expected-red-eligible — it isn't a test failure to excuse, it's a
1052
+ # precheck that never ran anything — so it always counts against
1053
+ # `ci_green` just like it does against `green` in build_verdict.
1054
+ unavailable = verdict.get("unavailable", 0)
1041
1055
  verdict["unexpected_green"] = unexpected_green
1042
1056
  verdict["expected_red_still_red"] = expected_red_still_red
1043
1057
  verdict["missing_expected_red_ids"] = missing_expected_red_ids
1044
1058
  verdict["ci_green"] = (
1045
1059
  len(tests) > 0
1046
1060
  and real_failures == 0
1061
+ and unavailable == 0
1047
1062
  and not unexpected_green
1048
1063
  and not missing_expected_red_ids
1049
1064
  )
@@ -782,7 +782,15 @@ def _run_win_native(run_command: str, cwd: str, entrypoint: str, *, timeout: int
782
782
  except WinNativeRuntimeError as e:
783
783
  raise DriverError(f"win-native driver could not run: {e}") from e
784
784
 
785
- exit_code = 0 if tests and all(t.get("status") != "fail" for t in tests) else 1
785
+ # #3510: a locked/absent interactive session reports a distinct
786
+ # "unavailable" status (coord.win_native_driver's session precheck),
787
+ # not "fail" — it must still fail this exit code rather than read as a
788
+ # silent pass. An unconfirmed result is not a pass.
789
+ exit_code = (
790
+ 0
791
+ if tests and all(t.get("status") not in ("fail", "unavailable") for t in tests)
792
+ else 1
793
+ )
786
794
  raw_output = "\n".join(
787
795
  f"{t.get('status')}: {t.get('id')} {t.get('message', '')}".rstrip()
788
796
  for t in tests
@@ -843,7 +851,14 @@ def _run_mac_native(run_command: str, cwd: str, entrypoint: str, *, timeout: int
843
851
  except MacNativeRuntimeError as e:
844
852
  raise DriverError(f"mac-native driver could not run: {e}") from e
845
853
 
846
- exit_code = 0 if tests and all(t.get("status") != "fail" for t in tests) else 1
854
+ # #3510: a locked/absent GUI session reports a distinct "unavailable"
855
+ # status (coord.mac_native_driver's session precheck), not "fail" —
856
+ # it must still fail this exit code rather than read as a silent pass.
857
+ exit_code = (
858
+ 0
859
+ if tests and all(t.get("status") not in ("fail", "unavailable") for t in tests)
860
+ else 1
861
+ )
847
862
  raw_output = "\n".join(
848
863
  f"{t.get('status')}: {t.get('id')} {t.get('message', '')}".rstrip()
849
864
  for t in tests
@@ -904,7 +919,15 @@ def _run_gtk_native(run_command: str, cwd: str, entrypoint: str, *, timeout: int
904
919
  except GtkNativeRuntimeError as e:
905
920
  raise DriverError(f"gtk-native driver could not run: {e}") from e
906
921
 
907
- exit_code = 0 if tests and all(t.get("status") != "fail" for t in tests) else 1
922
+ # #3510: a missing $DISPLAY/$WAYLAND_DISPLAY reports a distinct
923
+ # "unavailable" status (coord.gtk_native_driver's session precheck),
924
+ # not "fail" — it must still fail this exit code rather than read as a
925
+ # silent pass.
926
+ exit_code = (
927
+ 0
928
+ if tests and all(t.get("status") not in ("fail", "unavailable") for t in tests)
929
+ else 1
930
+ )
908
931
  raw_output = "\n".join(
909
932
  f"{t.get('status')}: {t.get('id')} {t.get('message', '')}".rstrip()
910
933
  for t in tests
@@ -45,6 +45,20 @@ routing does — a lane only exists when some configured machine actually
45
45
  carries the driver's declared ``capability``, so a repo with no capable
46
46
  machine for a platform silently gets no lane rather than a lane that can
47
47
  never run.
48
+
49
+ **#3510: an unavailable lane is not a bug finding.** When a win-native/
50
+ mac-native/gtk-native lane's own driver reports a locked or absent GUI
51
+ session (or no usable display), an explorer that sets
52
+ :attr:`ExploreOutcome.unavailable` causes :func:`run_bugbash` to skip that
53
+ lane for the round (:attr:`RoundReport.unavailable_lanes`) rather than
54
+ running the exploration checklist against it or filing any finding from it
55
+ — a locked desktop is an environment condition for the operator to fix,
56
+ not evidence of an app bug. This engine-level behavior is unit-tested
57
+ against a fake explorer in ``tests/test_bugbash.py``; the production
58
+ explorer (:func:`coord.commands.bugbash._dispatch_and_await_lane`) does
59
+ not itself set ``unavailable`` yet — see its own module docstring's
60
+ "KNOWN GAP" note — so a live ``coord bugbash`` run does not currently
61
+ benefit from this skip until that wiring lands.
48
62
  """
49
63
 
50
64
  from __future__ import annotations
@@ -426,12 +440,31 @@ class ExploreOutcome:
426
440
  there were findings," the second means "we looked, and there weren't
427
441
  any" — :func:`run_bugbash` keeps them distinguishable in
428
442
  :attr:`RoundReport.lane_failures` and its termination reason, rather
429
- than collapsing both into "zero findings"."""
443
+ than collapsing both into "zero findings".
444
+
445
+ ``unavailable`` is a THIRD, separate outcome (#3510): the lane's own
446
+ native driver observed a locked/absent GUI session (win-native/
447
+ mac-native) or no usable display (gtk-native) and ran no exploration at
448
+ all — a host/environment condition, never a bug finding and never a
449
+ dispatch/poll failure. An explorer that sets ``unavailable=True`` (as
450
+ the fake explorers in ``tests/test_bugbash.py`` do, modeling a
451
+ dispatched worker whose Tier-2 lane result came back
452
+ ``status="unavailable"`` — see ``coord.win_native_driver``'s/
453
+ ``coord.mac_native_driver``'s/``coord.gtk_native_driver``'s own
454
+ precheck) causes :func:`run_bugbash` to skip that lane for the round —
455
+ recording it in :attr:`RoundReport.unavailable_lanes` instead of
456
+ :attr:`RoundReport.lane_failures` — and never file findings from it
457
+ this round, even defensively, regardless of what ``findings`` carries.
458
+ The production explorer,
459
+ :func:`coord.commands.bugbash._dispatch_and_await_lane`, does not yet
460
+ set this flag (tracked as a KNOWN GAP in that module's docstring) —
461
+ today this is exercised only at the engine/unit-test level."""
430
462
 
431
463
  findings: tuple[Finding, ...] = ()
432
464
  cost: float = 0.0
433
465
  notes: str = ""
434
466
  ok: bool = True
467
+ unavailable: bool = False
435
468
 
436
469
 
437
470
  #: ``(lane, round_num) -> ExploreOutcome`` — "go run this lane's
@@ -628,6 +661,16 @@ class RoundReport:
628
661
  #: a lane skipped for having blown its per-lane cost cap was never
629
662
  #: asked a question this round, so it can't have failed to answer one).
630
663
  lane_failures: dict[str, str] = field(default_factory=dict)
664
+ #: ``{platform: notes}`` for every lane explored this round whose
665
+ #: :attr:`ExploreOutcome.unavailable` was ``True`` (#3510) — a locked or
666
+ #: absent GUI session (win-native/mac-native) or no usable display
667
+ #: (gtk-native). Distinct from :attr:`lane_failures`: this is a verified
668
+ #: observation (the native driver's own session precheck ran and
669
+ #: reported it), not a dispatch/poll/log failure — but it is ALSO not a
670
+ #: verified "ran the checklist and found nothing" either, so it is
671
+ #: tracked separately rather than folded into either bucket. No
672
+ #: findings are ever filed from a lane recorded here this round.
673
+ unavailable_lanes: dict[str, str] = field(default_factory=dict)
631
674
 
632
675
  @property
633
676
  def explored_lanes(self) -> set[str]:
@@ -643,10 +686,27 @@ class RoundReport:
643
686
  not a clean pass" signal (#2096). A round with nothing explored at
644
687
  all (e.g. every lane skipped on its cost cap) is NOT reported as
645
688
  "all failed" — there is nothing to distrust, just nothing that
646
- ran."""
689
+ ran. Does NOT count an ``unavailable`` lane as failed — see
690
+ :attr:`all_explored_lanes_unavailable_or_failed` for the combined
691
+ check."""
647
692
  explored = self.explored_lanes
648
693
  return bool(explored) and explored <= set(self.lane_failures)
649
694
 
695
+ @property
696
+ def all_explored_lanes_unavailable_or_failed(self) -> bool:
697
+ """``True`` when every lane explored this round either failed to
698
+ dispatch/poll/log OR reported its GUI session/display unavailable
699
+ (#3510) — i.e. NONE of them actually ran the exploration checklist.
700
+ Used by :func:`run_bugbash` to pick the ``"lanes_unavailable"``
701
+ termination reason over a false ``"zero_findings"`` clean-pass read
702
+ when every lane this round was simply locked/absent rather than
703
+ genuinely explored (#2096: zero findings is only a clean pass when
704
+ something was actually observed to run)."""
705
+ explored = self.explored_lanes
706
+ return bool(explored) and explored <= (
707
+ set(self.lane_failures) | set(self.unavailable_lanes)
708
+ )
709
+
650
710
 
651
711
  @dataclass
652
712
  class BugbashReport:
@@ -677,6 +737,15 @@ class BugbashReport:
677
737
  part of what it observed along the way was unverified (#2096)."""
678
738
  return any(r.lane_failures for r in self.rounds)
679
739
 
740
+ @property
741
+ def any_lane_unavailable(self) -> bool:
742
+ """``True`` if ANY round recorded a lane as unavailable (#3510) —
743
+ surfaced regardless of whether it happened to be the terminating
744
+ round, so an operator glancing at a run that otherwise filed/found
745
+ plenty still sees that one platform was locked/absent the whole
746
+ time and needs attention, not a bug report."""
747
+ return any(r.unavailable_lanes for r in self.rounds)
748
+
680
749
 
681
750
  def run_bugbash(
682
751
  config: BugbashConfig,
@@ -701,14 +770,24 @@ def run_bugbash(
701
770
  ``new_count``/cost, never inferred from "no exception was raised":
702
771
 
703
772
  - ``"zero_findings"`` — this round's non-duplicate finding count is 0,
704
- AND at least one explored lane actually completed
705
- (``RoundReport.all_explored_lanes_failed`` is ``False``) — a genuine
706
- observed clean pass.
773
+ AND at least one explored lane actually completed its checklist
774
+ (neither ``RoundReport.all_explored_lanes_failed`` nor
775
+ ``RoundReport.all_explored_lanes_unavailable_or_failed`` is ``True``)
776
+ — a genuine observed clean pass.
707
777
  - ``"lane_failure"`` — this round's non-duplicate finding count is ALSO
708
778
  0, but every lane explored this round came back ``ok=False``
709
779
  (dispatch/poll/log failure) — #2096: a fleet-wide dispatch outage
710
780
  must never be reported identically to a clean bugbash pass. Check
711
781
  ``BugbashReport.rounds[-1].lane_failures`` for what actually broke.
782
+ - ``"lanes_unavailable"`` — this round's non-duplicate finding count is
783
+ ALSO 0, no lane came back a dispatch/poll/log failure, but every lane
784
+ explored this round reported its GUI session/display unavailable
785
+ (#3510: locked or absent, e.g. a locked dell64) — a different reason
786
+ from ``"lane_failure"`` (the explorer DID run and DID get a verified
787
+ answer, it's just "the host is locked", not "I don't know"), and
788
+ still not a clean pass either, since nothing was actually exercised
789
+ against the app. Check ``BugbashReport.rounds[-1].unavailable_lanes``
790
+ for which host needs unlocking.
712
791
  - ``"cost_cap"`` — cumulative cost has reached ``cost_cap_total``.
713
792
  - ``"round_cap"`` — ``config.max_rounds`` rounds ran without either of
714
793
  the above firing.
@@ -730,6 +809,16 @@ def run_bugbash(
730
809
  lane_cost[lane.platform] += outcome.cost
731
810
  report.lane_cost[lane.platform] = lane_cost[lane.platform]
732
811
  total_cost += outcome.cost
812
+ if outcome.unavailable:
813
+ # #3510: a locked/absent GUI session (or missing display)
814
+ # is a host condition, not a finding — recorded separately
815
+ # from both a clean pass and a dispatch/poll failure, and
816
+ # NEVER contributes findings this round, even defensively
817
+ # if the explorer happened to also hand some back.
818
+ report.unavailable_lanes[lane.platform] = (
819
+ outcome.notes or "lane unavailable — no usable GUI session/display"
820
+ )
821
+ continue
733
822
  report.findings.extend(outcome.findings)
734
823
  if not outcome.ok:
735
824
  # #2096: this lane's "findings" (almost certainly empty) are
@@ -788,11 +877,20 @@ def run_bugbash(
788
877
 
789
878
  if report.new_count == 0:
790
879
  # #2096: "zero findings" is only a genuine clean-pass verdict
791
- # when at least one lane was actually verified to have run this
792
- # round. A round where every explored lane failed to dispatch,
793
- # poll, or fetch its log gets its own distinct reason instead —
794
- # see RoundReport.lane_failures for what broke.
795
- reason = "lane_failure" if report.all_explored_lanes_failed else "zero_findings"
880
+ # when at least one lane was actually verified to have RUN THE
881
+ # CHECKLIST this round. A round where every explored lane failed
882
+ # to dispatch/poll/fetch its log gets "lane_failure"; a round
883
+ # where every explored lane instead reported its session/display
884
+ # unavailable (#3510 — locked or absent, never a dispatch
885
+ # failure) gets its own distinct "lanes_unavailable" reason, in
886
+ # that priority order since a round can't be "all failed" AND
887
+ # "all unavailable" (each lane only sets one of the two).
888
+ if report.all_explored_lanes_failed:
889
+ reason = "lane_failure"
890
+ elif report.all_explored_lanes_unavailable_or_failed:
891
+ reason = "lanes_unavailable"
892
+ else:
893
+ reason = "zero_findings"
796
894
  break
797
895
  if total_cost >= config.cost_cap_total:
798
896
  reason = "cost_cap"
@@ -4551,6 +4551,12 @@ def _load_release_gate_observations(
4551
4551
  passed=_require_bool(entry["passed"], field_name="lanes[].passed"),
4552
4552
  detail=entry.get("detail", ""),
4553
4553
  checked_at=entry.get("checked_at"),
4554
+ # #3510: a locked/absent GUI session or missing display, as
4555
+ # reported by the native driver's own session precheck — never
4556
+ # coerced from a truthy non-bool, same discipline as `passed`.
4557
+ unavailable=_require_bool(
4558
+ entry.get("unavailable", False), field_name="lanes[].unavailable",
4559
+ ),
4554
4560
  )
4555
4561
  for entry in payload.get("lanes", []) or []
4556
4562
  ]
@@ -4576,7 +4582,10 @@ def _gate_verdict_to_dict(verdict: "Any") -> dict[str, Any]:
4576
4582
  "gate_passed": verdict.gate_passed,
4577
4583
  "effective_passed": verdict.effective_passed,
4578
4584
  "steps": [
4579
- {"name": s.name, "passed": s.passed, "detail": s.detail}
4585
+ {
4586
+ "name": s.name, "passed": s.passed, "detail": s.detail,
4587
+ "unavailable": s.unavailable,
4588
+ }
4580
4589
  for s in verdict.steps
4581
4590
  ],
4582
4591
  "override": None if verdict.override is None else {
@@ -4590,7 +4599,15 @@ def _gate_verdict_to_dict(verdict: "Any") -> dict[str, Any]:
4590
4599
  def _render_gate_verdict(verdict: "Any") -> str:
4591
4600
  lines = [f"release gate: {verdict.repo} @ {verdict.release_sha}"]
4592
4601
  for step in verdict.steps:
4593
- marker = "PASS" if step.passed else "FAIL"
4602
+ # #3510: a locked/absent GUI session is blocking but is NOT the app
4603
+ # failing — labeled distinctly so an operator knows to unlock the
4604
+ # host rather than go debug the app.
4605
+ if step.unavailable:
4606
+ marker = "UNAVAILABLE"
4607
+ elif step.passed:
4608
+ marker = "PASS"
4609
+ else:
4610
+ marker = "FAIL"
4594
4611
  lines.append(f" [{marker}] {step.name}: {step.detail}")
4595
4612
  if verdict.override is not None:
4596
4613
  lines.append(
@@ -427,6 +427,20 @@ class AcceptanceDriverConfig:
427
427
  ``pytest tests/acceptance/{ms}`` legitimately has no entry point, which
428
428
  is exactly why #1175's blanket refusal only ever broke the Rust route.
429
429
 
430
+ #3509: the four Tier-2 lane kinds (:data:`TIER2_LANE_KINDS` —
431
+ ``tui-pty``/``win-native``/``mac-native``/``gtk-native``) are the one
432
+ exception to "folded into the sealed set" above. Their ``entrypoint:``
433
+ is a smoke spec that ``coord bugbash`` (#3487) expects every fix to
434
+ GROW, with no independent ``test-author`` the way ``tests/acceptance/``
435
+ has one — full sealing made it impossible for a ``type="work"`` worker
436
+ to add the smoke-spec step its own fix is required to ship. See
437
+ :meth:`AcceptanceConfig.sealed_paths` and
438
+ :meth:`AcceptanceConfig.additive_only_entrypoints` for the derived sets,
439
+ and :func:`coord.review._lane_entrypoint_violation_lines` for the
440
+ mandatory (but narrower) rule that still applies: additions are
441
+ unrestricted, but removing or rewriting a pre-existing line is still a
442
+ mandatory ``request-changes``.
443
+
430
444
  ``match`` and ``routes`` implement #1125's in-repo path routing: a repo
431
445
  entry with a non-empty ``routes`` list is a *router* — its own
432
446
  ``kind``/``run``/``mock``/``capability``/``setup``/``entrypoint`` are
@@ -469,6 +483,20 @@ class AcceptanceDriverConfig:
469
483
  # directory without the trailing slash.
470
484
  SEALED_ACCEPTANCE_DIR = "tests/acceptance/"
471
485
 
486
+ # #3509: the four Tier-2 (epic #3482) platform-lane acceptance driver kinds
487
+ # whose `entrypoint:` is a smoke spec `coord bugbash` (#3487) grows one step
488
+ # at a time, not an oracle a `test-author` writes once and a worker is
489
+ # graded against — see `AcceptanceConfig.sealed_paths`'s docstring for why
490
+ # that makes full sealing wrong for exactly these four kinds. Kept in sync
491
+ # with `coord.bugbash.LANE_DRIVER_KINDS` by hand rather than imported — the
492
+ # same hand-sync discipline `coord.acceptance_drivers.SUPPORTED_KINDS` and
493
+ # `coord.bugbash.LANE_DRIVER_KINDS` already use for each other, for the same
494
+ # reason: `coord.bugbash` deliberately takes a duck-typed `config: Any`
495
+ # rather than importing this (foundational, widely-imported) module, so
496
+ # this module returns the favor instead of introducing a config->feature
497
+ # dependency from the other side.
498
+ TIER2_LANE_KINDS = frozenset({"tui-pty", "win-native", "mac-native", "gtk-native"})
499
+
472
500
 
473
501
  def entrypoint_sibling_acceptance_dir(entrypoint: str) -> str:
474
502
  """The ``acceptance/`` directory an entrypoint-linked driver ``include!``s
@@ -496,6 +524,27 @@ class AcceptanceConfig:
496
524
 
497
525
  drivers: dict[str, AcceptanceDriverConfig] = field(default_factory=dict)
498
526
 
527
+ def _entrypoint_kind_pairs(self, repo_name: str) -> list[tuple[str, str]]:
528
+ """``(entrypoint, kind)`` for every declared entrypoint of
529
+ *repo_name*, deduped on the entrypoint, declaration order preserved
530
+ — the one traversal :meth:`entrypoints`, :meth:`sealed_paths` and
531
+ (#3509) :meth:`additive_only_entrypoints` all build on, so "which
532
+ driver kind owns this entrypoint" is answered in exactly one place
533
+ rather than three copies of the same ``for cfg in [entry,
534
+ *entry.routes]`` walk silently drifting apart.
535
+ """
536
+ entry = self.drivers.get(repo_name)
537
+ if entry is None:
538
+ return []
539
+ out: list[tuple[str, str]] = []
540
+ seen: set[str] = set()
541
+ for cfg in [entry, *entry.routes]:
542
+ ep = cfg.entrypoint.strip()
543
+ if ep and ep not in seen:
544
+ seen.add(ep)
545
+ out.append((ep, cfg.kind))
546
+ return out
547
+
499
548
  def entrypoints(self, repo_name: str) -> list[str]:
500
549
  """Every ``entrypoint:`` declared by *repo_name*'s acceptance driver
501
550
  (#1552), deduped, declaration order preserved.
@@ -508,16 +557,31 @@ class AcceptanceConfig:
508
557
  flat repo contributes at most its own. Repos with no driver — and
509
558
  drivers whose suite is directory-discovered (``cli-pytest``) —
510
559
  return ``[]``.
560
+
561
+ Includes Tier-2 lane-kind entrypoints (:data:`TIER2_LANE_KINDS`) —
562
+ this is "every entrypoint the repo declares", not "every SEALED
563
+ entrypoint"; use :meth:`sealed_paths` for the sealed subset and
564
+ :meth:`additive_only_entrypoints` for the lane-kind one (#3509).
511
565
  """
512
- entry = self.drivers.get(repo_name)
513
- if entry is None:
514
- return []
515
- out: list[str] = []
516
- for cfg in [entry, *entry.routes]:
517
- ep = cfg.entrypoint.strip()
518
- if ep and ep not in out:
519
- out.append(ep)
520
- return out
566
+ return [ep for ep, _kind in self._entrypoint_kind_pairs(repo_name)]
567
+
568
+ def additive_only_entrypoints(self, repo_name: str) -> list[str]:
569
+ """(#3509) The subset of :meth:`entrypoints` declared by a Tier-2
570
+ lane-kind driver (``tui-pty``/``win-native``/``mac-native``/
571
+ ``gtk-native``, :data:`TIER2_LANE_KINDS`) — deliberately excluded
572
+ from :meth:`sealed_paths`, see that method's docstring for why.
573
+
574
+ These paths are not a free-for-all: :func:`coord.review
575
+ ._lane_entrypoint_violation_lines` still mandatorily rejects a
576
+ ``type="work"`` diff that removes or rewrites a pre-existing line in
577
+ one of them (a deleted step, a loosened ``expect_*`` field, a raised
578
+ latency budget, a shortened idle window) — only ADDING to them (a
579
+ new step, or a wholly new spec file beside them) is unrestricted.
580
+ """
581
+ return [
582
+ ep for ep, kind in self._entrypoint_kind_pairs(repo_name)
583
+ if kind in TIER2_LANE_KINDS
584
+ ]
521
585
 
522
586
  def sealed_paths(self, repo_name: str) -> list[str]:
523
587
  """The full sealed-oracle path set for *repo_name* (#944 sealing v1,
@@ -554,11 +618,33 @@ class AcceptanceConfig:
554
618
  standalone ``coord-tui`` repo's flat ``tests/acceptance.rs``) has
555
619
  that sibling collapse onto ``SEALED_ACCEPTANCE_DIR`` itself — see the
556
620
  dedup below.
621
+
622
+ #3509: a Tier-2 lane-kind entrypoint (:data:`TIER2_LANE_KINDS` —
623
+ ``tui-pty``/``win-native``/``mac-native``/``gtk-native``) is
624
+ deliberately excluded from this set, entrypoint AND sibling dir
625
+ both. Those four kinds' ``entrypoint:`` is a smoke spec
626
+ ``coord bugbash`` (#3487) files findings against on the acceptance
627
+ line "the fix must add a Tier-1 shared conformance scenario or a
628
+ Tier-2 smoke-spec step that fails first" — a regression ratchet
629
+ every fix is expected to GROW, with no independent author the way
630
+ ``tests/acceptance/`` has one. Full sealing made that structurally
631
+ impossible: a ``type="work"`` diff adding the very step its own fix
632
+ requires tripped the same mandatory tamper banner as rewriting the
633
+ oracle it's graded against. Excluded here does not mean
634
+ unrestricted — :func:`coord.review._lane_entrypoint_violation_lines`
635
+ (fed by :meth:`additive_only_entrypoints`) still mandatorily rejects
636
+ a diff that removes or weakens a pre-existing line in one of these
637
+ files; only growing them is unconstrained. ``tui-tuidriver`` and
638
+ ``cli-pytest`` are unaffected — neither kind is in
639
+ :data:`TIER2_LANE_KINDS`, so their entrypoints stay fully sealed
640
+ exactly as before.
557
641
  """
558
642
  if not self.has_driver(repo_name):
559
643
  return []
560
644
  out = [SEALED_ACCEPTANCE_DIR]
561
- for ep in self.entrypoints(repo_name):
645
+ for ep, kind in self._entrypoint_kind_pairs(repo_name):
646
+ if kind in TIER2_LANE_KINDS:
647
+ continue
562
648
  if ep not in out:
563
649
  out.append(ep)
564
650
  sibling = entrypoint_sibling_acceptance_dir(ep)
@@ -3908,10 +3994,15 @@ def _parse_acceptance_routes(
3908
3994
  def _acceptance_entrypoint(entry: dict, label: str) -> str:
3909
3995
  """Validate an acceptance driver's optional ``entrypoint:`` (#1552).
3910
3996
 
3911
- Must be a repo-root-relative *file* path — it is folded into the sealed
3912
- set as an exact-match entry (:meth:`AcceptanceConfig.sealed_paths`), so
3913
- an absolute path or a trailing-slash directory would silently seal
3914
- nothing at all. Reject both here rather than at review time, where the
3997
+ Must be a repo-root-relative *file* path — for most ``kind`` values it
3998
+ is folded into the sealed set as an exact-match entry
3999
+ (:meth:`AcceptanceConfig.sealed_paths`), so an absolute path or a
4000
+ trailing-slash directory would silently seal nothing at all. (#3509:
4001
+ the four Tier-2 lane kinds in :data:`TIER2_LANE_KINDS` are the one
4002
+ exception — their entrypoint is additive-only, not sealed — but the
4003
+ same validation still applies: a malformed path there would just as
4004
+ silently defeat :meth:`AcceptanceConfig.additive_only_entrypoints`.)
4005
+ Reject both malformations here rather than at review time, where the
3915
4006
  only symptom would be a `test-author` bounced for a scope violation it
3916
4007
  cannot fix.
3917
4008
  """
@@ -106,6 +106,18 @@ child. See ``tests/test_gtk_native_driver.py``'s
106
106
  regression guard, mirroring :mod:`coord.win_native_driver`'s
107
107
  ``test_no_image_name_kill_path_exists_in_the_module`` and
108
108
  :mod:`coord.mac_native_driver`'s own equivalent.
109
+
110
+ **Missing-display precheck (#3510).** Unlike ``win-native``/``mac-native``,
111
+ a missing display here means no ``$DISPLAY``/``$WAYLAND_DISPLAY`` at all —
112
+ no Xvfb/compositor session is up on this host. That's a host-provisioning
113
+ condition, not an app bug, so before :meth:`NativeRunner.run` launches
114
+ anything it calls :meth:`GtkCalls.session_available`. When unavailable, the
115
+ run returns a single ``status="unavailable"`` result — never a ``"fail"``
116
+ — and no step (not even ``launch``) runs. ``LinuxGtkCalls`` itself no
117
+ longer raises at construction time for a missing display (that check moved
118
+ into :meth:`LinuxGtkCalls.session_available` so it's always reachable
119
+ through the seam, including from a fake in tests) — only a non-Linux host
120
+ is still a construction-time :class:`GtkNativeRuntimeError`.
109
121
  """
110
122
 
111
123
  from __future__ import annotations
@@ -129,10 +141,12 @@ class GtkNativeSpecError(Exception):
129
141
 
130
142
 
131
143
  class GtkNativeRuntimeError(Exception):
132
- """Raised when the native driver itself can't run: not on Linux, no
133
- ``$DISPLAY`` available, a missing ``xdotool``/``xwd`` binary or AT-SPI
134
- binding, the launched process/window never appearing, or a step
135
- referencing a window before any ``launch`` step ran."""
144
+ """Raised when the native driver itself can't run: not on Linux, a
145
+ missing ``xdotool``/``xwd`` binary or AT-SPI binding, the launched
146
+ process/window never appearing, or a step referencing a window before
147
+ any ``launch`` step ran. A missing ``$DISPLAY``/``$WAYLAND_DISPLAY`` is
148
+ NOT one of these (#3510) — that is an "unavailable" lane verdict via
149
+ :meth:`GtkCalls.session_available`, never a raised exception."""
136
150
 
137
151
 
138
152
  # ── native spec model ───────────────────────────────────────────────────────
@@ -314,6 +328,16 @@ class GtkCalls(Protocol):
314
328
 
315
329
  def kill(self, pid: int) -> None: ...
316
330
 
331
+ def session_available(self) -> tuple[bool, str]:
332
+ """``(True, "")`` when a usable display is present for this driver
333
+ to launch into; ``(False, reason)`` when neither ``$DISPLAY`` nor
334
+ ``$WAYLAND_DISPLAY`` is set (#3510) — checked by
335
+ :meth:`NativeRunner.run` BEFORE any step (including ``launch``)
336
+ runs, so a missing display is reported as ``status="unavailable"``
337
+ rather than a failed step. Never raises — a probe failure here is
338
+ itself an "unavailable" verdict, not a crash."""
339
+ ...
340
+
317
341
 
318
342
  def _find_a11y_match(elements: list[dict], role: str, name: str) -> dict | None:
319
343
  """The first *elements* entry whose ``role`` matches exactly
@@ -368,7 +392,19 @@ class NativeRunner:
368
392
  self._window_id: int | None = None
369
393
 
370
394
  def run(self, spec: NativeSpec) -> list[dict]:
395
+ """Run *spec*, first checking :meth:`GtkCalls.session_available`
396
+ (#3510). A missing display is a host-provisioning condition, not an
397
+ app bug: when unavailable, this returns a single
398
+ ``status="unavailable"`` entry and runs NO step at all (not even
399
+ ``launch``) — never folding it into an ordinary ``"fail"``."""
371
400
  self._spec = spec
401
+ available, reason = self._calls.session_available()
402
+ if not available:
403
+ return [{
404
+ "id": "session",
405
+ "status": "unavailable",
406
+ "message": reason or "no usable display is available",
407
+ }]
372
408
  results: list[dict] = []
373
409
  try:
374
410
  for step in spec.steps:
@@ -557,12 +593,14 @@ class LinuxGtkCalls:
557
593
  ``python3-gi``) for the accessibility tree, and ``xwd`` (ships with every
558
594
  X11 install) for window captures.
559
595
 
560
- Linux-only, and requires a live ``$DISPLAY``: raises
561
- :class:`GtkNativeRuntimeError` at construction otherwise, mirroring
562
- :class:`coord.mac_native_driver.MacOSCalls`'s/
563
- :class:`coord.win_native_driver.Win32Calls`'s own platform guards. This
564
- driver never starts its own ``Xvfb`` — see the module docstring's
565
- "headless by construction" note.
596
+ Linux-only: raises :class:`GtkNativeRuntimeError` at construction on any
597
+ other platform, mirroring :class:`coord.mac_native_driver.MacOSCalls`'s/
598
+ :class:`coord.win_native_driver.Win32Calls`'s own platform guards. A
599
+ missing ``$DISPLAY``/``$WAYLAND_DISPLAY`` is NOT a construction-time
600
+ raise (#3510) — see :meth:`session_available`, checked by
601
+ :class:`NativeRunner` before any step runs. This driver never starts its
602
+ own ``Xvfb`` — see the module docstring's "headless by construction"
603
+ note.
566
604
  """
567
605
 
568
606
  def __init__(self) -> None:
@@ -572,11 +610,25 @@ class LinuxGtkCalls:
572
610
  "runs on a real Linux host with a display (e.g. a fleet "
573
611
  "host running a persistent Xvfb session)"
574
612
  )
575
- if not os.environ.get("DISPLAY"):
576
- raise GtkNativeRuntimeError(
577
- "gtk-native needs $DISPLAY set — no headless compositor or "
578
- "Xvfb session appears to be running on this host"
579
- )
613
+ # Deliberately NOT a construction-time raise for a missing display
614
+ # (#3510) — that is an "unavailable" lane verdict, not a driver
615
+ # construction failure, and is checked (and reachable through the
616
+ # same `GtkCalls` seam a test's fake implements) via
617
+ # :meth:`session_available`, called by `NativeRunner.run` before any
618
+ # step — see the module docstring's "missing-display precheck".
619
+
620
+ # -- session precheck (#3510) --
621
+
622
+ def session_available(self) -> tuple[bool, str]:
623
+ """Real check: either ``$DISPLAY`` (X11) or ``$WAYLAND_DISPLAY``
624
+ (Wayland) must be set — no headless compositor or Xvfb session
625
+ appears to be running on this host otherwise."""
626
+ if os.environ.get("DISPLAY") or os.environ.get("WAYLAND_DISPLAY"):
627
+ return True, ""
628
+ return False, (
629
+ "neither $DISPLAY nor $WAYLAND_DISPLAY is set — no headless "
630
+ "compositor or Xvfb session appears to be running on this host"
631
+ )
580
632
 
581
633
  # -- process lifecycle --
582
634
 
@@ -772,6 +824,12 @@ def run_native_spec(
772
824
  assertion fails) do NOT raise — they're folded into the returned list
773
825
  as a ``status="fail"`` entry, the same "partial results, not a crash"
774
826
  contract :func:`coord.mac_native_driver.run_native_spec` already gives.
827
+
828
+ When *calls* reports no usable display
829
+ (:meth:`GtkCalls.session_available`, #3510), the returned list is a
830
+ single ``status="unavailable"`` entry and no step runs — a distinct
831
+ verdict from ``"fail"``, since a missing display is a host-provisioning
832
+ condition, not an app bug.
775
833
  """
776
834
  spec = parse_native_spec(spec_text)
777
835
  resolved_calls = calls if calls is not None else LinuxGtkCalls()