code-coordinator 0.5.449__tar.gz → 0.5.451__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 (875) hide show
  1. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/gates.py +5 -3
  5. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/gates.py +79 -5
  6. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/merge_queue.py +42 -12
  7. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/pipeline.py +18 -1
  8. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/serve_app.py +136 -8
  9. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_board_read_path.py +234 -8
  10. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_gates.py +143 -1
  11. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_sqlite_connect_ratchet.py +11 -3
  12. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.github/workflows/publish.yml +0 -0
  23. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.github/workflows/test.yml +0 -0
  24. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/.gitignore +0 -0
  25. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/CLAUDE.md +0 -0
  26. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/GOAL.md +0 -0
  27. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/LICENSE +0 -0
  28. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/MANIFEST.in +0 -0
  29. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/README.md +0 -0
  30. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/code_coordinator.egg-info/SOURCES.txt +0 -0
  31. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/code_coordinator.egg-info/scm_file_list.json +0 -0
  35. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/code_coordinator.egg-info/top_level.txt +0 -0
  36. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/__init__.py +0 -0
  37. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/_board_mapping.py +0 -0
  38. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/acceptance.py +0 -0
  39. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/acceptance_drivers.py +0 -0
  40. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/agent.py +0 -0
  41. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/agent_app.py +0 -0
  42. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/agent_update.py +0 -0
  43. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/agents/opencode/.gitignore +0 -0
  44. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/agents/opencode/agents/work.md +0 -0
  45. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/agents/opencode/routing.jsonc +0 -0
  46. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/approved_work.py +0 -0
  47. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/audit.py +0 -0
  48. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/auto_loop.py +0 -0
  49. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/backup.py +0 -0
  50. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/board_schema.py +0 -0
  52. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/ci_fix.py +0 -0
  59. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/ci_gitlab.py +0 -0
  61. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/cli.py +0 -0
  64. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/client.py +0 -0
  65. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/codegen.py +0 -0
  66. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/backup.py +0 -0
  72. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/chat.py +0 -0
  73. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/codegen.py +0 -0
  74. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/dispatch.py +0 -0
  75. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/dispatch_workers.py +0 -0
  76. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/dr.py +0 -0
  77. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/drive.py +0 -0
  78. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/drive_queue.py +0 -0
  79. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/gate_a.py +0 -0
  80. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/issues.py +0 -0
  81. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/lifecycle.py +0 -0
  82. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/machine.py +0 -0
  83. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/merge.py +0 -0
  84. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/milestone.py +0 -0
  85. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/plan_followup.py +0 -0
  86. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/plans.py +0 -0
  87. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/portal.py +0 -0
  88. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/pr.py +0 -0
  89. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/release.py +0 -0
  90. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/repo.py +0 -0
  91. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/report.py +0 -0
  92. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/review.py +0 -0
  93. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/scorecard.py +0 -0
  94. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/sessions.py +0 -0
  95. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/setup.py +0 -0
  96. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/status.py +0 -0
  97. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/store_migrate.py +0 -0
  98. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/terminal.py +0 -0
  99. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/test_gate.py +0 -0
  100. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/commands/tui.py +0 -0
  101. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/comments.py +0 -0
  102. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/config.py +0 -0
  103. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/config_reload.py +0 -0
  104. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/confirm_test.py +0 -0
  105. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/conflict_fix.py +0 -0
  106. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dao.py +0 -0
  107. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dashboard/__init__.py +0 -0
  108. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dashboard/fixture.py +0 -0
  109. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dashboard/index.html +0 -0
  110. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dashboard/server.py +0 -0
  111. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dashboard/terminal.py +0 -0
  112. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/db.py +0 -0
  113. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dead_end.py +0 -0
  114. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/decomposition_chat.py +0 -0
  115. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/README.md +0 -0
  116. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-agent.service +0 -0
  117. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-backup.service +0 -0
  118. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-backup.timer +0 -0
  119. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-db-backup.service +0 -0
  120. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-db-backup.sh +0 -0
  121. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-db-backup.timer +0 -0
  122. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-dr-verify.service +0 -0
  123. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-dr-verify.timer +0 -0
  124. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-drive-queue.service +0 -0
  125. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-drive-queue.timer +0 -0
  126. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-failure-notify.service +0 -0
  127. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-fleet-watchdog.service +0 -0
  128. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  129. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-notify.service +0 -0
  130. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-notify.timer +0 -0
  131. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-release-propagate.service +0 -0
  132. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-release-propagate.timer +0 -0
  133. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-release-window.service +0 -0
  134. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-release-window.timer +0 -0
  135. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-serve.service +0 -0
  136. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-web-dist-build.service +0 -0
  137. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-web-dist-build.timer +0 -0
  138. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy/coord-web.service +0 -0
  139. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy_manifest.py +0 -0
  140. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deploy_units.py +0 -0
  141. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deprecation_telemetry.py +0 -0
  142. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/deps.py +0 -0
  143. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/diagnose.py +0 -0
  144. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dispatch.py +0 -0
  145. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dist_name.py +0 -0
  146. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dr_promote.py +0 -0
  147. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/dr_verify.py +0 -0
  148. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/drive.py +0 -0
  149. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/drive_queue.py +0 -0
  150. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/drive_state.py +0 -0
  151. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/events.py +0 -0
  152. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/failure_class.py +0 -0
  153. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/filelock.py +0 -0
  154. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/fleet_config_health.py +0 -0
  155. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/forge_availability.py +0 -0
  156. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/freshness.py +0 -0
  157. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/gate_a.py +0 -0
  158. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/gate_b.py +0 -0
  159. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/gate_snapshot.py +0 -0
  160. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/gen_board_fixture.py +0 -0
  161. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/github_ops.py +0 -0
  162. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/github_throttle.py +0 -0
  163. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/goal.py +0 -0
  164. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/graph_health.py +0 -0
  165. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/__init__.py +0 -0
  166. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/aggregate.py +0 -0
  167. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/__init__.py +0 -0
  168. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/_ci_pin.py +0 -0
  169. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/agent_install.py +0 -0
  170. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/cargo_targets.py +0 -0
  171. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/claude_binary.py +0 -0
  172. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/config_drift.py +0 -0
  173. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  174. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/coord_web_ci_pin.py +0 -0
  175. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/deploy_lane_facts.py +0 -0
  176. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/disk.py +0 -0
  177. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/fleet_board.py +0 -0
  178. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  179. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/fleet_phantom.py +0 -0
  180. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/fleet_unit_drift.py +0 -0
  181. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/graph.py +0 -0
  182. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/graphify_cli.py +0 -0
  183. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/index_lock.py +0 -0
  184. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/issues_sync_staleness.py +0 -0
  185. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/plan_usage.py +0 -0
  186. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/pr_churn.py +0 -0
  187. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/release_cordon.py +0 -0
  188. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/repo_state.py +0 -0
  189. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/spawned_coord.py +0 -0
  190. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/stalled_pipeline.py +0 -0
  191. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/timer_active.py +0 -0
  192. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/toolchain.py +0 -0
  193. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/unit_drift.py +0 -0
  194. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/unit_enablement.py +0 -0
  195. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/wedged_drive_queue.py +0 -0
  196. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/checks/worktrees.py +0 -0
  197. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/cli.py +0 -0
  198. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/context.py +0 -0
  199. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/fleet_snapshot.py +0 -0
  200. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/models.py +0 -0
  201. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/pypi.py +0 -0
  202. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/registry.py +0 -0
  203. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/render.py +0 -0
  204. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/health/units.py +0 -0
  205. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/hooks.py +0 -0
  206. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/housekeeping.py +0 -0
  207. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/interactive.py +0 -0
  208. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/issue_store.py +0 -0
  209. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/issues_sync_status.py +0 -0
  210. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/liveness_auditor.py +0 -0
  211. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/machine_metrics.py +0 -0
  212. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/machine_onboard.py +0 -0
  213. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/machine_pause.py +0 -0
  214. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/machine_stats.py +0 -0
  215. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/milestone_chat.py +0 -0
  216. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/milestone_dispatch.py +0 -0
  217. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/milestone_gate.py +0 -0
  218. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/milestone_order.py +0 -0
  219. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/mock_author.py +0 -0
  220. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/models.py +0 -0
  221. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/network.py +0 -0
  222. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/new_issue_chat.py +0 -0
  223. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/__init__.py +0 -0
  224. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/baseline.py +0 -0
  225. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/cli.py +0 -0
  226. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/collect.py +0 -0
  227. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/digest.py +0 -0
  228. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/models.py +0 -0
  229. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/predicate.py +0 -0
  230. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/service.py +0 -0
  231. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/store.py +0 -0
  232. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notifier/transport.py +0 -0
  233. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/notify.py +0 -0
  234. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/openapi.py +0 -0
  235. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/overlap_fence.py +0 -0
  236. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/overlap_predict.py +0 -0
  237. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/parentage.py +0 -0
  238. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/parentage_github.py +0 -0
  239. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/plan_parser.py +0 -0
  240. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/plans.py +0 -0
  241. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/platform_paths.py +0 -0
  242. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/portal_bridge.py +0 -0
  243. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/portal_store.py +0 -0
  244. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/portal_sync.py +0 -0
  245. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/pr_body_lint.py +0 -0
  246. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/prereqs.py +0 -0
  247. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/progress.py +0 -0
  248. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/providers/__init__.py +0 -0
  249. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/providers/base.py +0 -0
  250. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/providers/claude.py +0 -0
  251. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/providers/claude_pty.py +0 -0
  252. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/providers/opencode.py +0 -0
  253. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/queue_diagnose.py +0 -0
  254. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/reconcile.py +0 -0
  255. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/reconcile_tick.py +0 -0
  256. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/refine_chat.py +0 -0
  257. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/release_cordon.py +0 -0
  258. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/release_propagate.py +0 -0
  259. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/release_verify.py +0 -0
  260. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/release_window.py +0 -0
  261. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/repo_dormancy.py +0 -0
  262. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/repo_edit.py +0 -0
  263. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/repo_onboard.py +0 -0
  264. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/reports.py +0 -0
  265. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/rest_schema.py +0 -0
  266. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/revalidate.py +0 -0
  267. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/review.py +0 -0
  268. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/scorecard.py +0 -0
  269. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/self_health.py +0 -0
  270. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  271. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  272. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  273. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  274. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  275. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/portal-followup/SKILL.md +0 -0
  276. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/release-now/SKILL.md +0 -0
  277. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  278. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  279. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/skills/update-issue/SKILL.md +0 -0
  280. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/smoke.py +0 -0
  281. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/spend_ceiling.py +0 -0
  282. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/split_work.py +0 -0
  283. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/sql.py +0 -0
  284. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/stage_projection.py +0 -0
  285. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/state.py +0 -0
  286. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/store_migrate.py +0 -0
  287. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/store_parity.py +0 -0
  288. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/templates/deploy-cloudflare.node.yml +0 -0
  289. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/test_author.py +0 -0
  290. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/test_chat.py +0 -0
  291. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/test_orchestrator.py +0 -0
  292. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/test_report.py +0 -0
  293. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/tui_release.py +0 -0
  294. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/uat_checks.py +0 -0
  295. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/usage.py +0 -0
  296. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/usage_limits.py +0 -0
  297. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/usage_rollup.py +0 -0
  298. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coord/worker_events.py +0 -0
  299. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/coordinator.example.yml +0 -0
  300. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-agent.service +0 -0
  301. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-backup.service +0 -0
  302. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-backup.timer +0 -0
  303. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-db-backup.service +0 -0
  304. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-db-backup.sh +0 -0
  305. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-db-backup.timer +0 -0
  306. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-dr-verify.service +0 -0
  307. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-dr-verify.timer +0 -0
  308. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-drive-queue.service +0 -0
  309. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-drive-queue.timer +0 -0
  310. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-failure-notify.service +0 -0
  311. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-failure-notify.sh +0 -0
  312. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-fleet-watchdog.service +0 -0
  313. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-fleet-watchdog.timer +0 -0
  314. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-notify.service +0 -0
  315. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-notify.timer +0 -0
  316. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-release-propagate.service +0 -0
  317. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-release-propagate.timer +0 -0
  318. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-release-window.service +0 -0
  319. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-release-window.timer +0 -0
  320. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-serve.service +0 -0
  321. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-web-dist-build.service +0 -0
  322. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-web-dist-build.sh +0 -0
  323. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-web-dist-build.timer +0 -0
  324. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-web-rollback.sh +0 -0
  325. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/coord-web.service +0 -0
  326. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/deploy/node-shim.sh +0 -0
  327. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/ADR_COORD_TUI_CI.md +0 -0
  328. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  329. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/ADR_COORD_WEB_CI.md +0 -0
  330. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/ADR_COORD_WEB_DIST.md +0 -0
  331. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  332. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/AGENT_OPERATIONS.md +0 -0
  333. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/ARCHITECTURE.md +0 -0
  334. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/ARCH_SECURITY_GATES.md +0 -0
  335. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/COCKPIT.md +0 -0
  336. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/CONTROL_CENTER.md +0 -0
  337. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/COST_DISCIPLINE.md +0 -0
  338. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/CROSS_PLATFORM.md +0 -0
  339. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/CUSTOMER_FACING_APPS.md +0 -0
  340. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/CUSTOMER_PORTAL.md +0 -0
  341. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/DATA_STORE_SELECTION.md +0 -0
  342. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/DISASTER_RECOVERY.md +0 -0
  343. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/DRIVE_QUEUE.md +0 -0
  344. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/EPHEMERAL_WORKERS.md +0 -0
  345. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/FORGE_MIGRATION.md +0 -0
  346. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/GRAPHIFY_SETUP.md +0 -0
  347. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/ISSUE_GUIDANCE.md +0 -0
  348. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/MAC_MINI.md +0 -0
  349. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  350. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/NOTIFIER.md +0 -0
  351. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/OPENCODE_VERIFICATION.md +0 -0
  352. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/OPERATING_GOTCHAS.md +0 -0
  353. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/OPERATOR_GUIDES.md +0 -0
  354. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/ORACLE_LOOP.md +0 -0
  355. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/PHONE_WEBAPP.md +0 -0
  356. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/PIPELINE_V2.md +0 -0
  357. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/PLATFORM_EVOLUTION.md +0 -0
  358. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/SECOND_BACKEND.md +0 -0
  359. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/STORE_SERVICE.md +0 -0
  360. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  361. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/WEB_CONTROL_CENTER.md +0 -0
  362. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/WSL_WINDOWS_WORKER.md +0 -0
  363. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/mocks/web/README.md +0 -0
  364. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/mocks/web/_tokens.css +0 -0
  365. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/mocks/web/issue-detail.html +0 -0
  366. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/mocks/web/pipeline-narrow.html +0 -0
  367. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/docs/mocks/web/pipeline-wide.html +0 -0
  368. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/graphify-out/.gitignore +0 -0
  369. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/install-agent.sh +0 -0
  370. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/pyproject.toml +0 -0
  371. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/audit_review_verdict_overrides.py +0 -0
  372. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  373. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/build-worker-image.sh +0 -0
  374. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/coordinator-machine.py +0 -0
  375. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/dr-down.sh +0 -0
  376. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/dr-up.sh +0 -0
  377. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/epic-down.sh +0 -0
  378. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/epic-up.sh +0 -0
  379. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/preflight.sh +0 -0
  380. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/provision-server.sh +0 -0
  381. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/provision-worker.sh +0 -0
  382. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  383. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  384. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/throwaway-vm.sh +0 -0
  385. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/azure-workers/verify-github-token.sh +0 -0
  386. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/check_gh_argv_containment.py +0 -0
  387. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/codegen.py +0 -0
  388. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/coord-test-runner.sh +0 -0
  389. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  390. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  391. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  392. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  393. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/coord-venv-rollback.sh +0 -0
  394. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/drive-batch.sh +0 -0
  395. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/extract-coord-tui.sh +0 -0
  396. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/fleet_watchdog.py +0 -0
  397. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/gen_board_fixture.py +0 -0
  398. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/gen_mock_index.py +0 -0
  399. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/lib/provision-core.sh +0 -0
  400. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/next_release_tag.py +0 -0
  401. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/provision-machine.sh +0 -0
  402. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/run_tests_in_populated_home.sh +0 -0
  403. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/run_tests_without_gh.sh +0 -0
  404. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/setup-macmini.sh +0 -0
  405. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/smoke_437_interactive.py +0 -0
  406. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/verify-provision-noble.sh +0 -0
  407. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/verify_878_review_capture.py +0 -0
  408. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/verify_release_published.py +0 -0
  409. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/scripts/verify_release_wheel.py +0 -0
  410. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/setup.cfg +0 -0
  411. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/SMOKE_SET.md +0 -0
  412. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/__init__.py +0 -0
  413. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-37/conftest.py +0 -0
  414. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-37/contract.md +0 -0
  415. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-37/manifest.yml +0 -0
  416. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  417. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  418. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-51/contract.md +0 -0
  419. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  420. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  421. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-51/manifest.yml +0 -0
  422. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  423. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-51/tsconfig.json +0 -0
  424. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  425. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/backends.py +0 -0
  426. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/conftest.py +0 -0
  427. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/board-pipeline-basic.json +0 -0
  428. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  429. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  430. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  431. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  432. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/playwright/all_pass.json +0 -0
  433. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  434. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/playwright/mixed_fail.json +0 -0
  435. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  436. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  437. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/playwright/skip.json +0 -0
  438. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/playwright/truncated.json +0 -0
  439. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  440. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  441. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  442. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  443. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  444. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  445. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  446. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  447. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_acceptance.py +0 -0
  448. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_acceptance_drivers.py +0 -0
  449. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent.py +0 -0
  450. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_api_error.py +0 -0
  451. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_app.py +0 -0
  452. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_branch_base.py +0 -0
  453. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_branch_capture.py +0 -0
  454. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_config_free_1712.py +0 -0
  455. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_deploy_units_endpoint.py +0 -0
  456. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_dirty_worktree.py +0 -0
  457. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  458. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_graph_self_heal.py +0 -0
  459. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_health_h3.py +0 -0
  460. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_idle_restart.py +0 -0
  461. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_push_failure.py +0 -0
  462. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_reap.py +0 -0
  463. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_repos_and_pull.py +0 -0
  464. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_restart_services_endpoint.py +0 -0
  465. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_skills_self_heal.py +0 -0
  466. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_startup_diagnostics.py +0 -0
  467. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_update.py +0 -0
  468. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_update_bluegreen.py +0 -0
  469. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_usage_limit.py +0 -0
  470. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_agent_zero_commit.py +0 -0
  471. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_ambient_home_isolation.py +0 -0
  472. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_approve_capability_reroute_3241.py +0 -0
  473. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_approve_dependency_busy_2804.py +0 -0
  474. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_approve_reject_plan.py +0 -0
  475. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_approve_usage_gate.py +0 -0
  476. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_approved_work_2532.py +0 -0
  477. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_approved_work_2996.py +0 -0
  478. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_assignment_already_recorded_daemon.py +0 -0
  479. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_audit_log.py +0 -0
  480. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_audit_outcome.py +0 -0
  481. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_audit_query.py +0 -0
  482. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_auto_loop.py +0 -0
  483. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_auto_release_publish_2035.py +0 -0
  484. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_backend_selection.py +0 -0
  485. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_backup.py +0 -0
  486. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_base_checkout_restore.py +0 -0
  487. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_block_log.py +0 -0
  488. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_board_cap_762.py +0 -0
  489. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_board_fixture.py +0 -0
  490. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_board_schema.py +0 -0
  491. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_board_service.py +0 -0
  492. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_board_state.py +0 -0
  493. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_board_wire.py +0 -0
  494. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_brain.py +0 -0
  495. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_branch_model.py +0 -0
  496. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_bug_intake.py +0 -0
  497. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_build_worker_image_env_update.py +0 -0
  498. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cargo_cache.py +0 -0
  499. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_check_gh_argv_containment.py +0 -0
  500. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_ci_acceptance_gate_1950.py +0 -0
  501. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_ci_fix.py +0 -0
  502. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_ci_github.py +0 -0
  503. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_ci_gitlab.py +0 -0
  504. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_ci_parity_2091.py +0 -0
  505. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_ci_store.py +0 -0
  506. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_claim.py +0 -0
  507. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_claude_md_budget.py +0 -0
  508. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_acceptance.py +0 -0
  509. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_assign.py +0 -0
  510. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  511. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_assign_interactive_remote.py +0 -0
  512. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_assign_provider.py +0 -0
  513. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  514. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_audit.py +0 -0
  515. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_chat_continue.py +0 -0
  516. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_codegen.py +0 -0
  517. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_decide.py +0 -0
  518. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_diagnose_capability_rules.py +0 -0
  519. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_diagnose_config_provenance.py +0 -0
  520. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_diagnose_forge_availability.py +0 -0
  521. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_diagnose_graph.py +0 -0
  522. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_diagnose_self.py +0 -0
  523. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_diagnose_test_coverage.py +0 -0
  524. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_doctor.py +0 -0
  525. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_doctor_config_free_1801.py +0 -0
  526. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  527. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  528. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_drive.py +0 -0
  529. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_drive_queue.py +0 -0
  530. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_escalate.py +0 -0
  531. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_fix_headless_review.py +0 -0
  532. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_gate_a.py +0 -0
  533. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_install_drift.py +0 -0
  534. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_install_skills.py +0 -0
  535. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_issue_comment.py +0 -0
  536. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_issue_create_label.py +0 -0
  537. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_issue_reopen.py +0 -0
  538. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_issue_view_list.py +0 -0
  539. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_merge.py +0 -0
  540. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_milestone_assign.py +0 -0
  541. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_milestone_capture.py +0 -0
  542. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_milestone_chat_add_child.py +0 -0
  543. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_milestone_dispatch.py +0 -0
  544. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_milestone_gate_b.py +0 -0
  545. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_milestone_gate_c.py +0 -0
  546. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_milestone_order.py +0 -0
  547. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  548. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_milestone_ship.py +0 -0
  549. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_network.py +0 -0
  550. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_new_issue_chat.py +0 -0
  551. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_plans.py +0 -0
  552. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_portal.py +0 -0
  553. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_pr.py +0 -0
  554. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_pull_artifact.py +0 -0
  555. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_queue.py +0 -0
  556. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_reattach_sessions.py +0 -0
  557. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_refine_board.py +0 -0
  558. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_release_preflight.py +0 -0
  559. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_release_propagate.py +0 -0
  560. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_release_window.py +0 -0
  561. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_repo_2220.py +0 -0
  562. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  563. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_scorecard.py +0 -0
  564. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_serve_store_backend_3084.py +0 -0
  565. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_set_review_findings.py +0 -0
  566. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_status_advisory_terminal.py +0 -0
  567. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_status_contested_tag.py +0 -0
  568. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_status_merge_queue.py +0 -0
  569. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_status_provider.py +0 -0
  570. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_status_review_finalizing.py +0 -0
  571. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_status_test_failed_tag.py +0 -0
  572. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_status_usage_limit.py +0 -0
  573. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_sync_comments_873.py +0 -0
  574. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_test_plan.py +0 -0
  575. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_track.py +0 -0
  576. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_tui_update.py +0 -0
  577. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cli_wait.py +0 -0
  578. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_client_base_install.py +0 -0
  579. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_client_config_cache_atomic_3052.py +0 -0
  580. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_client_resource_migration_1946.py +0 -0
  581. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_commands_common.py +0 -0
  582. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_comments.py +0 -0
  583. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_completion_summary.py +0 -0
  584. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_config.py +0 -0
  585. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_config_acceptance.py +0 -0
  586. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_config_audit.py +0 -0
  587. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_config_drift_check.py +0 -0
  588. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_config_pricing.py +0 -0
  589. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  590. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_config_usage_gate.py +0 -0
  591. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_confirm_test.py +0 -0
  592. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_conflict_fix.py +0 -0
  593. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_conflict_fix_semantic.py +0 -0
  594. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  595. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coord_test.py +0 -0
  596. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  597. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coord_test_runner_baseline.py +0 -0
  598. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coord_test_runner_populated_home.py +0 -0
  599. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coord_test_runner_routing.py +0 -0
  600. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coord_test_runner_toolchain.py +0 -0
  601. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coord_uat.py +0 -0
  602. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coord_web_sse_restart_live.py +0 -0
  603. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_coordinator_machine.py +0 -0
  604. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_cross_platform_imports.py +0 -0
  605. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dao.py +0 -0
  606. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dashboard.py +0 -0
  607. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dashboard_api.py +0 -0
  608. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dashboard_fixture.py +0 -0
  609. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dashboard_terminal.py +0 -0
  610. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dashboard_terminal_live.py +0 -0
  611. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_db.py +0 -0
  612. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dead_end.py +0 -0
  613. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_decomposition_chat.py +0 -0
  614. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_coord_db_backup.py +0 -0
  615. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_coord_web_dist.py +0 -0
  616. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_coord_web_rollback.py +0 -0
  617. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_db_backup_unit.py +0 -0
  618. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_drive_queue_unit.py +0 -0
  619. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_failure_notify_unit.py +0 -0
  620. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_manifest.py +0 -0
  621. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_notify_unit.py +0 -0
  622. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_units_lane.py +0 -0
  623. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deploy_web_unit.py +0 -0
  624. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deprecation_telemetry.py +0 -0
  625. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_deps.py +0 -0
  626. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_diagnose.py +0 -0
  627. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dispatch.py +0 -0
  628. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dispatch_target_validation.py +0 -0
  629. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dist_name.py +0 -0
  630. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_done_housekeeping.py +0 -0
  631. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dr_azure_scripts.py +0 -0
  632. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dr_promote.py +0 -0
  633. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_dr_verify.py +0 -0
  634. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_drive.py +0 -0
  635. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_drive_queue.py +0 -0
  636. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_drive_queue_blocked_rendering.py +0 -0
  637. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_drive_queue_launch_argv.py +0 -0
  638. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  639. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_drive_queue_roll_pending.py +0 -0
  640. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  641. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_drive_state.py +0 -0
  642. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_drive_tmux.py +0 -0
  643. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_epic_up_capability_detection.py +0 -0
  644. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  645. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_epic_up_image_provenance.py +0 -0
  646. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_errors.py +0 -0
  647. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_events.py +0 -0
  648. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_failure_class.py +0 -0
  649. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_filelock.py +0 -0
  650. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  651. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_fix_of_force_override.py +0 -0
  652. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_fleet_config_health.py +0 -0
  653. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_fleet_health_probes.py +0 -0
  654. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_fleet_health_snapshot.py +0 -0
  655. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_fleet_watchdog.py +0 -0
  656. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_forge_availability.py +0 -0
  657. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_freshness.py +0 -0
  658. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_gate_a.py +0 -0
  659. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_gate_b.py +0 -0
  660. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_gate_snapshot_staleness.py +0 -0
  661. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  662. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_gen_mock_index.py +0 -0
  663. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_generated_rust_fixture.py +0 -0
  664. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_generated_rust_requests.py +0 -0
  665. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_generated_types_fixture.py +0 -0
  666. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_github_ops.py +0 -0
  667. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_github_throttle.py +0 -0
  668. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_goal.py +0 -0
  669. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_graph_health.py +0 -0
  670. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_graph_selfheal_absent_2237.py +0 -0
  671. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_handoff.py +0 -0
  672. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_checks.py +0 -0
  673. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_cli.py +0 -0
  674. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_cli_graph.py +0 -0
  675. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_config.py +0 -0
  676. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_context.py +0 -0
  677. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_coord_tui_ci_pin.py +0 -0
  678. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_coord_web_ci_pin.py +0 -0
  679. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_deploy_lane_facts.py +0 -0
  680. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_fix.py +0 -0
  681. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_incident_regression.py +0 -0
  682. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_issues_sync_staleness.py +0 -0
  683. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_pr_churn.py +0 -0
  684. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_pypi.py +0 -0
  685. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_registry.py +0 -0
  686. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_release_cordon_probe.py +0 -0
  687. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_timer_active.py +0 -0
  688. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_toolchain.py +0 -0
  689. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_unit_drift.py +0 -0
  690. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_unit_enablement.py +0 -0
  691. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_health_wedged_drive_queue.py +0 -0
  692. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_hooks.py +0 -0
  693. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_human_attended_437.py +0 -0
  694. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_init.py +0 -0
  695. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_install_agent_venv_2911.py +0 -0
  696. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_integration.py +0 -0
  697. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_interactive_briefing_echo.py +0 -0
  698. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_interactive_pane_log_2541.py +0 -0
  699. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_interactive_prefill_state.py +0 -0
  700. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_interactive_session_relaunch.py +0 -0
  701. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_interactive_test_verdict_backstop.py +0 -0
  702. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_interactive_token_attribution.py +0 -0
  703. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_interactive_worktree.py +0 -0
  704. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_issue_store_seam.py +0 -0
  705. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_issues_sync_status.py +0 -0
  706. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_liveness_auditor.py +0 -0
  707. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_liveness_notify.py +0 -0
  708. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_lock_contention_ratchet.py +0 -0
  709. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_machine_metrics.py +0 -0
  710. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_machine_onboard.py +0 -0
  711. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_machine_pause.py +0 -0
  712. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_machine_stats.py +0 -0
  713. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_merge_queue.py +0 -0
  714. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_merge_verify.py +0 -0
  715. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_milestone_chat.py +0 -0
  716. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_milestone_dispatch.py +0 -0
  717. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_milestone_gate.py +0 -0
  718. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_milestone_order.py +0 -0
  719. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_milestone_seam.py +0 -0
  720. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_mock_author.py +0 -0
  721. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_model_tiering.py +0 -0
  722. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_models.py +0 -0
  723. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_models_config_labels.py +0 -0
  724. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_needs_attention.py +0 -0
  725. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_network.py +0 -0
  726. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_new_issue_chat.py +0 -0
  727. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_next_release_tag.py +0 -0
  728. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_node_shim.py +0 -0
  729. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notifier_baseline.py +0 -0
  730. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notifier_cli.py +0 -0
  731. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notifier_collect.py +0 -0
  732. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notifier_config.py +0 -0
  733. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notifier_drive_seam.py +0 -0
  734. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notifier_isolation.py +0 -0
  735. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notifier_predicate.py +0 -0
  736. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notifier_quiet_hours.py +0 -0
  737. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notifier_service.py +0 -0
  738. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notify.py +0 -0
  739. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_notify_drain.py +0 -0
  740. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_openapi.py +0 -0
  741. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_operational_defaults.py +0 -0
  742. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_overlap_fence.py +0 -0
  743. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_overlap_predict.py +0 -0
  744. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_packaged_deploy_units.py +0 -0
  745. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_parentage.py +0 -0
  746. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_paste_landed.py +0 -0
  747. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  748. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_pipeline.py +0 -0
  749. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_plan_followup_approve_plan_command.py +0 -0
  750. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_plan_followup_pr_command.py +0 -0
  751. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_plan_followup_review_command.py +0 -0
  752. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_plan_only.py +0 -0
  753. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_plan_parser.py +0 -0
  754. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_platform_paths.py +0 -0
  755. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_portal_bridge.py +0 -0
  756. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_portal_config.py +0 -0
  757. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_portal_store.py +0 -0
  758. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_portal_sync.py +0 -0
  759. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_pr_body_lint.py +0 -0
  760. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_prereqs.py +0 -0
  761. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_production_db_guard.py +0 -0
  762. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_progress.py +0 -0
  763. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_provider_seam.py +0 -0
  764. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_providers.py +0 -0
  765. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_providers_config_labels.py +0 -0
  766. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_providers_pty.py +0 -0
  767. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_provision_core.py +0 -0
  768. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_provision_machine.py +0 -0
  769. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_py_rust_mirror_inventory.py +0 -0
  770. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_quiet_hours.py +0 -0
  771. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_quiet_hours_store_2146.py +0 -0
  772. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reap_merged_sessions.py +0 -0
  773. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reap_stale_interactive_tick.py +0 -0
  774. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reconcile.py +0 -0
  775. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reconcile_branch.py +0 -0
  776. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reconcile_completions.py +0 -0
  777. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  778. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reconcile_merges.py +0 -0
  779. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reconcile_no_agent_record.py +0 -0
  780. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reconcile_tick.py +0 -0
  781. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reconcile_usage_limit_done.py +0 -0
  782. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_refine_chat.py +0 -0
  783. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_cordon_2101.py +0 -0
  784. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  785. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_cordon_deadlock_2240.py +0 -0
  786. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_cordon_stuck_2490.py +0 -0
  787. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_propagate.py +0 -0
  788. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_propagate_threshold.py +0 -0
  789. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_roll_between_legs_2854.py +0 -0
  790. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_roll_window_handoff.py +0 -0
  791. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_unified_1242.py +0 -0
  792. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_verify.py +0 -0
  793. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_release_window.py +0 -0
  794. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_remote_auto_prune.py +0 -0
  795. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_remote_interactive_reaper.py +0 -0
  796. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_repo_add.py +0 -0
  797. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_repo_dormancy.py +0 -0
  798. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_repo_edit_2220.py +0 -0
  799. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_repo_graph_fleet_2237.py +0 -0
  800. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_repo_onboard_2220.py +0 -0
  801. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_report_result_push.py +0 -0
  802. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_reports.py +0 -0
  803. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_retry.py +0 -0
  804. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_retry_advisory_1606.py +0 -0
  805. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_retry_type_1636.py +0 -0
  806. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_revalidate.py +0 -0
  807. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_review.py +0 -0
  808. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_review_end_review_without_verdict.py +0 -0
  809. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_review_parse_failure_diagnostic.py +0 -0
  810. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_review_reaffirm.py +0 -0
  811. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_review_state.py +0 -0
  812. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_review_verdict_backstop.py +0 -0
  813. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_review_verdict_override_audit.py +0 -0
  814. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_review_verdict_relay.py +0 -0
  815. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_review_zero_commits.py +0 -0
  816. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_scoped_review_wiring.py +0 -0
  817. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_scorecard.py +0 -0
  818. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_self_health.py +0 -0
  819. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_serve.py +0 -0
  820. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_serve_app.py +0 -0
  821. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_serve_app_board_trim.py +0 -0
  822. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_serve_rest_routes.py +0 -0
  823. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_session.py +0 -0
  824. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_slice_issue_attribution.py +0 -0
  825. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_smoke.py +0 -0
  826. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_smoke_live_checkout_restore.py +0 -0
  827. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_smoke_workflow.py +0 -0
  828. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_spend_ceiling.py +0 -0
  829. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_spend_ceiling_coordinator.py +0 -0
  830. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_split.py +0 -0
  831. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_split_work.py +0 -0
  832. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_sql_dialect.py +0 -0
  833. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_stage_projection.py +0 -0
  834. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_stale_busy_reviewer_697.py +0 -0
  835. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_stalled_pipeline.py +0 -0
  836. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_state.py +0 -0
  837. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_state_review_findings_daemon.py +0 -0
  838. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_status_fleet_footer.py +0 -0
  839. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_stop_1567.py +0 -0
  840. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_store_contract.py +0 -0
  841. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_store_migrate.py +0 -0
  842. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_stuck.py +0 -0
  843. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  844. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_terminal_command.py +0 -0
  845. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_test_author.py +0 -0
  846. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_test_chat.py +0 -0
  847. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_test_orchestrator.py +0 -0
  848. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_test_report.py +0 -0
  849. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_test_verdict_parsing.py +0 -0
  850. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_test_verdict_transcript_floor.py +0 -0
  851. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_text_io_encoding_audit.py +0 -0
  852. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_thin_client_board_audit.py +0 -0
  853. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_thin_client_config_load_1080.py +0 -0
  854. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_thin_client_daemon_routing_906.py +0 -0
  855. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_throwaway_vm.py +0 -0
  856. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_tmux_host.py +0 -0
  857. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_tmux_session.py +0 -0
  858. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_transcript_floor.py +0 -0
  859. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_uat_checks.py +0 -0
  860. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_usage.py +0 -0
  861. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_usage_limits.py +0 -0
  862. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_usage_rollup.py +0 -0
  863. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_venv_live_install_2121.py +0 -0
  864. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_version_single_source.py +0 -0
  865. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_watch.py +0 -0
  866. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  867. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_worker_env_venv_isolation.py +0 -0
  868. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_worker_events.py +0 -0
  869. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_worker_image_pin_sync.py +0 -0
  870. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_worker_safety.py +0 -0
  871. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_worker_test_scoping.py +0 -0
  872. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_worktree.py +0 -0
  873. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  874. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/tests/test_write_parity.py +0 -0
  875. {code_coordinator-0.5.449 → code_coordinator-0.5.451}/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.449
3
+ Version: 0.5.451
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.449
3
+ Version: 0.5.451
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.449",
2
+ "tag": "0.5.451",
3
3
  "distance": 0,
4
- "node": "g7dfdcb7b4d399030cd2ec41d318600ac37e88140",
4
+ "node": "g75985b1122962fa0ccd6b97ab453eabdc7a1b5e9",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-11"
@@ -45,9 +45,11 @@ def _gates_via_daemon(svc, params: dict) -> None:
45
45
  help=(
46
46
  "Print a work row's gate columns (test_state, smoke_test, test_reason, "
47
47
  "test_toolchain, review_state, review_verdict, review_of_assignment_id), "
48
- "plus the LIVE review/test/merge gate decision — including whether a recorded verdict "
49
- "is #1479-stale (recorded against a base/branch SHA that has since "
50
- "moved) and the SHAs compared. Read-only: never mutates board state."
48
+ "plus the LIVE review/test/uat/merge gate decision — including whether a recorded "
49
+ "verdict is #1479-stale (recorded against a base/branch SHA that has since "
50
+ "moved) and the SHAs compared. A gate that does not apply (e.g. uat, when "
51
+ "not configured for this repo) is still shown, with an explicit reason. "
52
+ "Read-only: never mutates board state."
51
53
  )
52
54
  )
53
55
  @click.argument("repo")
@@ -1,6 +1,6 @@
1
1
  """#1657: ``coord gates <repo> <issue>`` — read a work row's gate columns
2
- plus the LIVE gate decision (review / test / merge), without a hand-extracted
3
- bearer token and a raw ``/board`` curl.
2
+ plus the LIVE gate decision (review / test / uat / merge), without a
3
+ hand-extracted bearer token and a raw ``/board`` curl.
4
4
 
5
5
  Two things were missing before this module existed:
6
6
 
@@ -24,6 +24,12 @@ reuses ``coord.merge_queue``'s own review/smoke gate functions
24
24
  :func:`~coord.merge_queue.evaluate_smoke_verdict`) rather than
25
25
  re-implementing the #1479 freshness math a second time, so this can never
26
26
  drift from what ``coord merge``/``coord merge --plan`` actually decide.
27
+ #3273 (S-5 of #3261): any OTHER gate described in
28
+ ``coord.pipeline.GATE_REGISTRY`` (today just ``"uat"``) is walked generically
29
+ rather than hardcoded here — a gate added to that registry in the future
30
+ needs no further change to this module, and one that doesn't currently
31
+ apply (not configured, an exempt issue, ...) is reported with an explicit
32
+ reason rather than silently omitted.
27
33
 
28
34
  Read-only by construction: nothing in this module calls ``save_board``,
29
35
  ``save_queue``, or any ``gh`` write. The synthetic
@@ -680,20 +686,64 @@ def build_gate_report(
680
686
  "round has actually been tested (#2024)."
681
687
  )
682
688
 
689
+ # #3273 (S-5 of #3261): walk every OTHER registry-backed gate (today just
690
+ # "uat" — "review"/"test" stay the bespoke blocks above, since they carry
691
+ # richer per-gate detail — #1479 SHA staleness anchors, #1956 verdict-
692
+ # unparseable detection — that doesn't fit GateSpec's generic
693
+ # ``(ok, message)`` evaluator shape; see #3273's epic-closing comment on
694
+ # #3261 for why that's a real seam, not an oversight). This is what lets
695
+ # a gate added to `coord.pipeline.GATE_REGISTRY` in the future show up
696
+ # here with zero further changes to this module, and it's what fixes the
697
+ # actual #3273 gap: before this, `coord gates` never even asked about
698
+ # UAT, so it could print "merge READY" for an entry `coord merge` would
699
+ # refuse outright on `uat_required`.
700
+ from coord.pipeline import GATE_REGISTRY # noqa: PLC0415
701
+
702
+ registry_decisions: dict[str, GateDecision] = {}
703
+ for gate_name, spec in GATE_REGISTRY.items():
704
+ if gate_name in ("review", "test"):
705
+ continue # already covered by the bespoke blocks above
706
+ gate_required = spec.applies(entry, config)
707
+ if not gate_required:
708
+ decision = GateDecision(
709
+ gate=gate_name,
710
+ required=False,
711
+ ok=True,
712
+ reason=spec.explain_inapplicable(entry, config)
713
+ if spec.explain_inapplicable is not None
714
+ else None,
715
+ )
716
+ else:
717
+ gate_ok, gate_message = spec.evaluate(entry, board, config, gh_ops)
718
+ decision = GateDecision(
719
+ gate=gate_name,
720
+ required=True,
721
+ ok=gate_ok,
722
+ reason=(gate_message or None) if not gate_ok else None,
723
+ )
724
+ registry_decisions[gate_name] = decision
725
+ report.decisions.append(decision)
726
+
683
727
  merge_blocked_gate: str | None = None
684
728
  if review_required and not review_ok:
685
729
  merge_blocked_gate = REVIEW_REQUIRED
686
730
  elif smoke_required and not test_ok:
687
731
  merge_blocked_gate = SMOKE_REQUIRED
732
+ else:
733
+ for gate_name, decision in registry_decisions.items():
734
+ if decision.required and not decision.ok:
735
+ merge_blocked_gate = f"{gate_name}_required"
736
+ break
688
737
  merge_decision = GateDecision(
689
738
  gate="merge", required=True, ok=merge_blocked_gate is None, reason=merge_blocked_gate,
690
739
  )
691
740
  report.decisions.append(merge_decision)
692
741
  if merge_decision.ok:
742
+ gate_names_summary = "/".join(["review", "test", *registry_decisions.keys()])
693
743
  report.notes.append(
694
- "merge READY reflects the review/test gates only — CI checks and the "
695
- "#1318 epic-closing-keyword guard are evaluated live by `coord merge`/"
696
- "`coord merge --plan`, not by `coord gates`."
744
+ f"merge READY reflects the {gate_names_summary} gates only — CI checks "
745
+ "and the #1318 epic-closing-keyword guard are evaluated live by "
746
+ "`coord merge`/`coord merge --plan`, not by `coord gates`."
697
747
  )
698
748
 
699
749
  # #3236: the apply-verdict gate, appended ONLY when a --hold-after entry
@@ -808,6 +858,30 @@ def format_gate_report(report: GateReport) -> str:
808
858
  lines.append(f" {test.reason}")
809
859
  else:
810
860
  lines.append(f" test : BLOCKED — {test.reason}")
861
+ # #3273 (S-5 of #3261): any other registry-backed gate (today just
862
+ # "uat") renders generically here, in `report.decisions`' own
863
+ # insertion order — a gate GATE_REGISTRY grows in the future needs no
864
+ # new branch here, and — the actual fix this slice makes — a
865
+ # skipped/inapplicable one (UAT not configured, or an exempt issue)
866
+ # gets an explicit reason instead of being silently omitted like it
867
+ # was before #3273.
868
+ _KNOWN_GATE_LINES = ("review", "test", "merge", "apply")
869
+ for decision in report.decisions:
870
+ if decision.gate in _KNOWN_GATE_LINES:
871
+ continue
872
+ label = f"{decision.gate:<6}"
873
+ if not decision.required:
874
+ lines.append(
875
+ f" {label} : not required"
876
+ + (f" — {decision.reason}" if decision.reason else "")
877
+ )
878
+ elif decision.ok:
879
+ lines.append(
880
+ f" {label} : passed"
881
+ + (f" (recorded on {decision.assignment_id})" if decision.assignment_id else "")
882
+ )
883
+ else:
884
+ lines.append(f" {label} : BLOCKED — {decision.reason}")
811
885
  merge = by_gate.get("merge")
812
886
  if merge is not None:
813
887
  lines.append(
@@ -1005,10 +1005,15 @@ def _uat_repo_for(entry, config):
1005
1005
  return None
1006
1006
 
1007
1007
 
1008
- def requires_uat(entry: "QueuedMerge", config) -> bool:
1009
- """True when *entry* must have a recorded UAT verdict before merging.
1010
-
1011
- See the module-comment above this function for the two-part opt-in.
1008
+ def _uat_applicability(entry: "QueuedMerge", config) -> tuple[bool, str | None]:
1009
+ """``(applies, reason_if_not)`` the single source both :func:`requires_uat`
1010
+ and :func:`uat_inapplicable_reason` (#3273, S-5 of #3261) read, so a
1011
+ caller asking "does UAT gate this entry" and one asking "why not" can
1012
+ never disagree about which condition actually decided it (#2096: one
1013
+ question, one answer). *reason* is only meaningful when *applies* is
1014
+ ``False`` — always ``None`` on the ``True`` branch.
1015
+
1016
+ See the module comment above this function for the two-part opt-in.
1012
1017
  Duck-typed on ``entry.repo_name``/``entry.required_gates``, matching
1013
1018
  :func:`requires_review`/:func:`requires_smoke`.
1014
1019
 
@@ -1027,18 +1032,43 @@ def requires_uat(entry: "QueuedMerge", config) -> bool:
1027
1032
  """
1028
1033
  pipeline = getattr(config, "pipeline", None)
1029
1034
  if pipeline is None or config is None:
1030
- return False
1035
+ return False, "no pipeline configuration available"
1031
1036
  if not _gate_in_effective_gates("uat", entry, config):
1032
- return False
1037
+ return False, '"uat" is not in this entry\'s effective gate list (required_gates / pipeline.default_gates)'
1033
1038
  repo = _uat_repo_for(entry, config)
1034
1039
  if repo is None:
1035
- return False
1040
+ return False, f"repo {getattr(entry, 'repo_name', None)!r} not found in configuration"
1036
1041
  uat_checks_cfg = getattr(repo, "uat_checks", None)
1037
- if uat_checks_cfg is not None and uat_checks_cfg.is_exempt(
1038
- getattr(entry, "issue_number", None)
1039
- ):
1040
- return False
1041
- return bool(repo.uat_preview) or bool(getattr(repo, "uat_live_preview", False))
1042
+ issue_number = getattr(entry, "issue_number", None)
1043
+ if uat_checks_cfg is not None and uat_checks_cfg.is_exempt(issue_number):
1044
+ return False, f"issue #{issue_number} is exempt via this repo's uat_checks.exempt"
1045
+ if not (bool(repo.uat_preview) or bool(getattr(repo, "uat_live_preview", False))):
1046
+ return False, "repo has neither uat_preview nor uat_live_preview configured"
1047
+ return True, None
1048
+
1049
+
1050
+ def requires_uat(entry: "QueuedMerge", config) -> bool:
1051
+ """True when *entry* must have a recorded UAT verdict before merging.
1052
+
1053
+ Delegates entirely to :func:`_uat_applicability` — see that function's
1054
+ docstring for the full two-part opt-in this decides.
1055
+ """
1056
+ return _uat_applicability(entry, config)[0]
1057
+
1058
+
1059
+ def uat_inapplicable_reason(entry: "QueuedMerge", config) -> str | None:
1060
+ """Human-readable reason UAT does *not* gate *entry*, or ``None`` when it
1061
+ does (i.e. :func:`requires_uat` would return ``True``).
1062
+
1063
+ #3273 (S-5 of #3261): the ``coord gates`` render path used to omit the
1064
+ UAT gate entirely rather than say why it isn't running — this is what
1065
+ lets it render "uat : not required — <reason>" instead of silently
1066
+ dropping the gate, mirroring how ``milestone_gate.plan_sequence`` gives
1067
+ every remaining gate an explicit reason rather than skipping the ones
1068
+ that won't fire. Shares :func:`_uat_applicability` with
1069
+ :func:`requires_uat` so the two can never drift apart on WHY.
1070
+ """
1071
+ return _uat_applicability(entry, config)[1]
1042
1072
 
1043
1073
 
1044
1074
  def _uat_branch_work(entry: "QueuedMerge", board) -> list:
@@ -32,7 +32,12 @@ from __future__ import annotations
32
32
  from dataclasses import dataclass, field
33
33
  from typing import TYPE_CHECKING, Callable
34
34
 
35
- from coord.merge_queue import evaluate_uat_verdict, is_uat_gate_reason, requires_uat
35
+ from coord.merge_queue import (
36
+ evaluate_uat_verdict,
37
+ is_uat_gate_reason,
38
+ requires_uat,
39
+ uat_inapplicable_reason,
40
+ )
36
41
 
37
42
  if TYPE_CHECKING:
38
43
  from coord.config import Config
@@ -187,6 +192,17 @@ class GateSpec:
187
192
  #: for the same allowance).
188
193
  identifies_reason: Callable[[str], bool] | None = None
189
194
 
195
+ #: ``(entry, config) -> str | None`` — a human-readable reason THIS gate
196
+ #: does not apply to *entry*, populated only when ``applies`` would
197
+ #: return ``False`` (``None`` on the ``applies=True`` branch). #3273
198
+ #: (S-5 of #3261): this is what lets a render path (``coord gates``) walk
199
+ #: every registry gate and give the skipped ones an explicit reason
200
+ #: ("UAT not configured for this repo", "issue exempt via
201
+ #: uat_checks.exempt", ...) instead of silently omitting them — the same
202
+ #: posture ``milestone_gate.plan_sequence`` already takes for the
203
+ #: Gate-A..D walk. ``None`` for a gate that hasn't grown this yet.
204
+ explain_inapplicable: Callable[["QueuedMerge", "Config"], str | None] | None = None
205
+
190
206
 
191
207
  GATE_REGISTRY: dict[str, GateSpec] = {
192
208
  "uat": GateSpec(
@@ -196,6 +212,7 @@ GATE_REGISTRY: dict[str, GateSpec] = {
196
212
  verdicts=("passed", "failed", None),
197
213
  fail_route="coord.drive._park_uat_fixup_dispatch_failure",
198
214
  identifies_reason=is_uat_gate_reason,
215
+ explain_inapplicable=uat_inapplicable_reason,
199
216
  ),
200
217
  }
201
218
 
@@ -5665,6 +5665,104 @@ def openapi_spec() -> dict:
5665
5665
  )
5666
5666
 
5667
5667
 
5668
+ # #3293: keys whose values are inherently volatile per-build (a sliding
5669
+ # window count) but carry no board-state signal of their own — excluded from
5670
+ # the ``/board`` ETag DIGEST INPUT only (see ``_board_digest_projection``
5671
+ # below and ``_stamp_board_version``'s docstring). Every one of these fields
5672
+ # still ships on the wire, unchanged; this only stops them from deciding
5673
+ # whether the version bumps.
5674
+ _BOARD_DIGEST_VOLATILE_TOP_KEYS = frozenset({"audit_recent_count"})
5675
+
5676
+
5677
+ def _board_digest_projection(result: dict) -> dict:
5678
+ """A copy of *result* with digest-irrelevant volatile fields stripped.
5679
+
5680
+ Used ONLY to compute the ``/board`` ETag/version digest (#3293) — the
5681
+ actual wire body is `result` itself, untouched. Three culprits, in order
5682
+ of how often they move (see issue #3293's measurements):
5683
+
5684
+ - ``audit_recent_count``: a sliding 900s window count, changed on
5685
+ essentially every build.
5686
+ - ``issues[*].synced_at``: ~788 rows share one sync timestamp that moves
5687
+ on the issues-sync tick, re-digesting the whole issues section at once.
5688
+ - ``fleet_health``: moves on the 60s health tick. Its ``refreshed_at``
5689
+ clock and its ``fleet_board_latency`` check are excluded — the latter
5690
+ measures THIS /board response's own fetch latency and serialized size
5691
+ and stores that measurement inside the response, which is structurally
5692
+ self-invalidating for a content digest.
5693
+
5694
+ Deliberately narrow: per-machine health severities/results/headrooms are
5695
+ left in the digest, because a real state change there (a machine going
5696
+ offline, a disk filling up) SHOULD bump the ETag — only the fields that
5697
+ move on their own, independent of any real state change, are excluded.
5698
+ """
5699
+ projection = {
5700
+ k: v for k, v in result.items() if k not in _BOARD_DIGEST_VOLATILE_TOP_KEYS
5701
+ }
5702
+
5703
+ issues = projection.get("issues")
5704
+ if isinstance(issues, list):
5705
+ projection["issues"] = [
5706
+ {k: v for k, v in issue.items() if k != "synced_at"}
5707
+ if isinstance(issue, dict) else issue
5708
+ for issue in issues
5709
+ ]
5710
+
5711
+ fleet_health = projection.get("fleet_health")
5712
+ if isinstance(fleet_health, dict):
5713
+ projection["fleet_health"] = _board_digest_fleet_health(fleet_health)
5714
+
5715
+ return projection
5716
+
5717
+
5718
+ def _board_digest_fleet_health(fleet_health: dict) -> dict:
5719
+ """Strip ``fleet_health``'s clocks + self-referential latency check.
5720
+
5721
+ See ``_board_digest_projection`` — digest input only, never the wire body.
5722
+ """
5723
+ masked = {k: v for k, v in fleet_health.items() if k != "refreshed_at"}
5724
+
5725
+ machine_health = masked.get("machine_health")
5726
+ if isinstance(machine_health, list):
5727
+ masked["machine_health"] = [
5728
+ _board_digest_health_row(row) if isinstance(row, dict) else row
5729
+ for row in machine_health
5730
+ ]
5731
+
5732
+ fleet_checks = masked.get("fleet_checks")
5733
+ if isinstance(fleet_checks, list):
5734
+ masked["fleet_checks"] = [
5735
+ _board_digest_check_result(c) if isinstance(c, dict) else c
5736
+ for c in fleet_checks
5737
+ ]
5738
+
5739
+ return masked
5740
+
5741
+
5742
+ def _board_digest_health_row(row: dict) -> dict:
5743
+ """Drop one machine's poll clocks (``received_at``/``checked_at``) from
5744
+ the digest input — the results/severity/headroom that actually describe
5745
+ the machine's state stay in, per ``_board_digest_projection``'s docstring.
5746
+ """
5747
+ return {k: v for k, v in row.items() if k not in ("received_at", "checked_at")}
5748
+
5749
+
5750
+ def _board_digest_check_result(check: dict) -> dict:
5751
+ """Drop ``fleet_board_latency``'s self-measurement from the digest input.
5752
+
5753
+ This one check answers "how fast/big was the /board response that is
5754
+ carrying this very check result?" — its ``headroom`` text and ``values``
5755
+ (``latency_ms``/``payload_bytes``) are a measurement of the response
5756
+ embedded in the response, so they change on every build regardless of
5757
+ whether anything a human/client cares about actually changed. Every
5758
+ other fleet check's headroom/values reflect real, digest-worthy state
5759
+ and are left untouched.
5760
+ """
5761
+ if check.get("check_id") != "fleet_board_latency":
5762
+ return check
5763
+ return {k: v for k, v in check.items() if k not in ("headroom", "values")}
5764
+
5765
+
5668
5766
  def build_app(
5669
5767
  store: CoordStore,
5670
5768
  config: Config,
@@ -5768,13 +5866,31 @@ def build_app(
5768
5866
  _board_inflight: asyncio.Future[tuple] | None = None
5769
5867
 
5770
5868
  def _stamp_board_version(result: dict) -> tuple[str, bytes]:
5771
- """Serialize *result* to JSON exactly once, bump the version when the
5772
- content changed, stamp ``board_version`` into the payload, and
5773
- return ``(etag, body_bytes)`` the SAME bytes serve as both the
5774
- content-hash input and the wire body (#1597 Part 2: previously this
5775
- hashed a separate ``sort_keys=True`` dump and the caller re-encoded
5776
- the dict a second time via ``JSONResponse`` ~10 MB of JSON work per
5777
- build for a 5 MB board).
5869
+ """Serialize *result* to JSON exactly once for the wire body, bump
5870
+ the version when a STABLE PROJECTION of the content changed, stamp
5871
+ ``board_version`` into the payload, and return ``(etag, body_bytes)``.
5872
+
5873
+ #1597 Part 2: the wire ``body`` bytes below are the same bytes
5874
+ published to callers no second encoder pass for the response
5875
+ itself.
5876
+
5877
+ #3293: the content-hash input is deliberately NOT those same bytes
5878
+ any more. The payload embeds fields that move on every build without
5879
+ any board-state signal of their own — ``audit_recent_count`` (a
5880
+ sliding 900s window count), ``issues[*].synced_at`` (~788 rows
5881
+ re-stamped on one shared sync tick), and ``fleet_health``'s clocks
5882
+ and its self-referential ``fleet_board_latency`` check (which
5883
+ measures THIS response's own fetch latency/size and stores the
5884
+ measurement inside the response being measured). Hashing those made
5885
+ the ETag change on effectively every request, defeating #1336's
5886
+ cache-validated polling entirely. ``_board_digest_projection`` builds
5887
+ a masked copy for hashing only; the wire ``body`` — and every field
5888
+ in it, unchanged — still carries the real values. This does cost a
5889
+ second JSON encode of (most of) the payload on every cache-miss
5890
+ rebuild, which is rare relative to requests (TTL-cached in between);
5891
+ that's the trade #1597 avoided but #3293 requires; a truly stable
5892
+ ETag that lets pollers 304 is worth far more than skipping it on the
5893
+ rebuild path.
5778
5894
 
5779
5895
  ``board_version`` can't be known before the hash is computed (it
5780
5896
  depends on whether the hash changed), so it is deliberately excluded
@@ -5822,7 +5938,19 @@ def build_app(
5822
5938
  indent=None, separators=(",", ":"), default=str,
5823
5939
  ).encode("utf-8")
5824
5940
  else:
5825
- digest = hashlib.sha256(body).hexdigest()[:16]
5941
+ # #3293: hash a stable PROJECTION of the content, not the wire
5942
+ # bytes themselves — see the docstring above. The wire `body`
5943
+ # computed just above is untouched and still carries every
5944
+ # field, including the ones excluded here.
5945
+ # No `default=str` needed (unlike the fallback above): reaching
5946
+ # this branch means the strict encode of `result` just SUCCEEDED,
5947
+ # and the projection is a key-subset of those same values, so it
5948
+ # cannot contain a type the strict encoder would reject.
5949
+ digest_body = _json.dumps(
5950
+ _board_digest_projection(result), ensure_ascii=False,
5951
+ allow_nan=False, indent=None, separators=(",", ":"),
5952
+ ).encode("utf-8")
5953
+ digest = hashlib.sha256(digest_body).hexdigest()[:16]
5826
5954
  if digest != _board_hash:
5827
5955
  _board_hash = digest
5828
5956
  _board_version += 1