code-coordinator 0.5.568__tar.gz → 0.5.570__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 (933) hide show
  1. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. code_coordinator-0.5.570/code_coordinator.egg-info/scm_version.json +8 -0
  6. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/drive_queue.py +111 -9
  7. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/report.py +174 -3
  8. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/config.py +43 -0
  9. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/server.py +134 -0
  10. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/drive_queue.py +56 -23
  11. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/reports.py +560 -0
  12. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_drive_queue.py +107 -0
  13. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive.py +16 -0
  14. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue.py +181 -0
  15. code_coordinator-0.5.570/tests/test_report_public_export.py +657 -0
  16. code_coordinator-0.5.568/code_coordinator.egg-info/scm_version.json +0 -8
  17. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.claude/commands/board.md +0 -0
  18. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.claude/commands/complete-session.md +0 -0
  19. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.claude/commands/coordinator.md +0 -0
  20. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.githooks/_lib.sh +0 -0
  21. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.githooks/post-checkout +0 -0
  22. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.githooks/post-commit +0 -0
  23. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.githooks/post-merge +0 -0
  24. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/coord-ci-acceptance.yml +0 -0
  26. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/workflows/auto-release.yml +0 -0
  27. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/workflows/publish.yml +0 -0
  28. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.github/workflows/test.yml +0 -0
  29. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/.gitignore +0 -0
  30. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/CLAUDE.md +0 -0
  31. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/GOAL.md +0 -0
  32. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/LICENSE +0 -0
  33. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/MANIFEST.in +0 -0
  34. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/README.md +0 -0
  35. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/dependency_links.txt +0 -0
  36. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/entry_points.txt +0 -0
  37. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/requires.txt +0 -0
  38. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/code_coordinator.egg-info/top_level.txt +0 -0
  39. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/__init__.py +0 -0
  40. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/_board_mapping.py +0 -0
  41. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/acceptance.py +0 -0
  42. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/acceptance_drivers.py +0 -0
  43. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agent.py +0 -0
  44. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/approved_work.py +0 -0
  50. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/audit.py +0 -0
  51. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/auto_loop.py +0 -0
  52. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/backup.py +0 -0
  53. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/block_log.py +0 -0
  54. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/board_schema.py +0 -0
  55. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/board_service.py +0 -0
  56. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/board_wire.py +0 -0
  57. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/brain.py +0 -0
  58. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/branch_model.py +0 -0
  59. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/bug_intake.py +0 -0
  60. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/bugbash.py +0 -0
  61. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/cargo_cache.py +0 -0
  62. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/ci_fix.py +0 -0
  63. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/ci_github.py +0 -0
  64. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/ci_gitlab.py +0 -0
  65. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/ci_store.py +0 -0
  66. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/claim.py +0 -0
  67. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/claude_setup_token.py +0 -0
  68. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/cli.py +0 -0
  69. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/client.py +0 -0
  70. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/codegen.py +0 -0
  71. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/__init__.py +0 -0
  72. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/_common.py +0 -0
  73. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/acceptance.py +0 -0
  74. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/agent_ops.py +0 -0
  75. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/audit.py +0 -0
  76. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/backup.py +0 -0
  77. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/bugbash.py +0 -0
  78. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/chat.py +0 -0
  79. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/ci.py +0 -0
  80. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/codegen.py +0 -0
  81. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/dispatch.py +0 -0
  82. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/dispatch_workers.py +0 -0
  83. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/dr.py +0 -0
  84. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/drive.py +0 -0
  85. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/gate_a.py +0 -0
  86. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/gates.py +0 -0
  87. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/issues.py +0 -0
  88. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/lifecycle.py +0 -0
  89. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/machine.py +0 -0
  90. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/merge.py +0 -0
  91. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/milestone.py +0 -0
  92. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/plan_followup.py +0 -0
  93. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/plans.py +0 -0
  94. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/portal.py +0 -0
  95. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/pr.py +0 -0
  96. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/release.py +0 -0
  97. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/repo.py +0 -0
  98. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/review.py +0 -0
  99. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/scorecard.py +0 -0
  100. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/sessions.py +0 -0
  101. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/setup.py +0 -0
  102. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/status.py +0 -0
  103. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/store_migrate.py +0 -0
  104. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/terminal.py +0 -0
  105. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/test_gate.py +0 -0
  106. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/commands/tui.py +0 -0
  107. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/comments.py +0 -0
  108. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/config_reload.py +0 -0
  109. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/confirm_test.py +0 -0
  110. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/conflict_fix.py +0 -0
  111. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dao.py +0 -0
  112. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/__init__.py +0 -0
  113. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/fixture.py +0 -0
  114. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/index.html +0 -0
  115. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/reports.html +0 -0
  116. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dashboard/terminal.py +0 -0
  117. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/db.py +0 -0
  118. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dead_end.py +0 -0
  119. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/decomposition_chat.py +0 -0
  120. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/README.md +0 -0
  121. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-agent.service +0 -0
  122. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-backup.service +0 -0
  123. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-backup.timer +0 -0
  124. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-db-backup.service +0 -0
  125. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-db-backup.sh +0 -0
  126. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-db-backup.timer +0 -0
  127. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-dr-verify.service +0 -0
  128. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-dr-verify.timer +0 -0
  129. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-drive-queue.service +0 -0
  130. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-drive-queue.timer +0 -0
  131. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-failure-notify.service +0 -0
  132. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-fleet-watchdog.service +0 -0
  133. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  134. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-notify.service +0 -0
  135. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-notify.timer +0 -0
  136. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-release-propagate.service +0 -0
  137. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-release-propagate.timer +0 -0
  138. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-release-window.service +0 -0
  139. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-release-window.timer +0 -0
  140. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-serve.service +0 -0
  141. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-web-dist-build.service +0 -0
  142. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-web-dist-build.timer +0 -0
  143. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy/coord-web.service +0 -0
  144. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy_manifest.py +0 -0
  145. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deploy_units.py +0 -0
  146. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deprecation_telemetry.py +0 -0
  147. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/deps.py +0 -0
  148. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/diagnose.py +0 -0
  149. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dispatch.py +0 -0
  150. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dispatch_liveness.py +0 -0
  151. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dist_name.py +0 -0
  152. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dr_promote.py +0 -0
  153. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/dr_verify.py +0 -0
  154. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/drive.py +0 -0
  155. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/drive_sessions_snapshot.py +0 -0
  156. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/drive_state.py +0 -0
  157. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/events.py +0 -0
  158. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/failure_class.py +0 -0
  159. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/failure_classifier.py +0 -0
  160. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/filelock.py +0 -0
  161. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/fleet_config_health.py +0 -0
  162. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/forge_availability.py +0 -0
  163. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/freshness.py +0 -0
  164. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gate_a.py +0 -0
  165. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gate_b.py +0 -0
  166. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gate_snapshot.py +0 -0
  167. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gates.py +0 -0
  168. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gen_board_fixture.py +0 -0
  169. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/github_ops.py +0 -0
  170. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/github_throttle.py +0 -0
  171. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/goal.py +0 -0
  172. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/graph_health.py +0 -0
  173. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/gtk_native_driver.py +0 -0
  174. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/__init__.py +0 -0
  175. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/aggregate.py +0 -0
  176. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/__init__.py +0 -0
  177. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/_ci_pin.py +0 -0
  178. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/agent_install.py +0 -0
  179. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/cargo_targets.py +0 -0
  180. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/claude_binary.py +0 -0
  181. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/config_drift.py +0 -0
  182. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  183. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/coord_web_ci_pin.py +0 -0
  184. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/deploy_lane_facts.py +0 -0
  185. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/disk.py +0 -0
  186. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/fleet_board.py +0 -0
  187. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  188. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/fleet_phantom.py +0 -0
  189. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/fleet_unit_drift.py +0 -0
  190. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/graph.py +0 -0
  191. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/graphify_cli.py +0 -0
  192. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/index_lock.py +0 -0
  193. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/issues_sync_staleness.py +0 -0
  194. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/local_machine_identity.py +0 -0
  195. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/plan_usage.py +0 -0
  196. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/pr_churn.py +0 -0
  197. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/release_cordon.py +0 -0
  198. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/repo_state.py +0 -0
  199. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/spawned_coord.py +0 -0
  200. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/stalled_pipeline.py +0 -0
  201. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/timer_active.py +0 -0
  202. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/toolchain.py +0 -0
  203. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/unit_drift.py +0 -0
  204. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/unit_enablement.py +0 -0
  205. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/wedged_drive_queue.py +0 -0
  206. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/checks/worktrees.py +0 -0
  207. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/cli.py +0 -0
  208. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/context.py +0 -0
  209. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/fleet_snapshot.py +0 -0
  210. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/models.py +0 -0
  211. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/pypi.py +0 -0
  212. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/registry.py +0 -0
  213. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/render.py +0 -0
  214. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/health/units.py +0 -0
  215. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/hooks.py +0 -0
  216. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/housekeeping.py +0 -0
  217. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/interactive.py +0 -0
  218. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/invariant_alarms.py +0 -0
  219. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/issue_store.py +0 -0
  220. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/issues_sync_status.py +0 -0
  221. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/liveness_auditor.py +0 -0
  222. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/mac_native_driver.py +0 -0
  223. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_fault.py +0 -0
  224. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_metrics.py +0 -0
  225. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_onboard.py +0 -0
  226. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_pause.py +0 -0
  227. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/machine_stats.py +0 -0
  228. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/merge_queue.py +0 -0
  229. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/milestone_chat.py +0 -0
  230. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/milestone_dispatch.py +0 -0
  231. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/milestone_gate.py +0 -0
  232. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/milestone_order.py +0 -0
  233. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/mock_author.py +0 -0
  234. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/models.py +0 -0
  235. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/network.py +0 -0
  236. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/new_issue_chat.py +0 -0
  237. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/__init__.py +0 -0
  238. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/baseline.py +0 -0
  239. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/cli.py +0 -0
  240. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/collect.py +0 -0
  241. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/digest.py +0 -0
  242. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/models.py +0 -0
  243. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/predicate.py +0 -0
  244. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/service.py +0 -0
  245. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/store.py +0 -0
  246. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notifier/transport.py +0 -0
  247. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/notify.py +0 -0
  248. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/openapi.py +0 -0
  249. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/overlap_fence.py +0 -0
  250. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/overlap_predict.py +0 -0
  251. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/parentage.py +0 -0
  252. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/parentage_github.py +0 -0
  253. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/pipeline.py +0 -0
  254. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/plan_parser.py +0 -0
  255. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/plans.py +0 -0
  256. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/platform_paths.py +0 -0
  257. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/portal_bridge.py +0 -0
  258. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/portal_store.py +0 -0
  259. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/portal_sync.py +0 -0
  260. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/pr_body_lint.py +0 -0
  261. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/prereqs.py +0 -0
  262. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/progress.py +0 -0
  263. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/__init__.py +0 -0
  264. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/base.py +0 -0
  265. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/claude.py +0 -0
  266. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/claude_pty.py +0 -0
  267. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/providers/opencode.py +0 -0
  268. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/queue_diagnose.py +0 -0
  269. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/reconcile.py +0 -0
  270. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/reconcile_tick.py +0 -0
  271. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/refine_chat.py +0 -0
  272. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_cordon.py +0 -0
  273. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_gate.py +0 -0
  274. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_propagate.py +0 -0
  275. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_verify.py +0 -0
  276. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/release_window.py +0 -0
  277. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/repo_dormancy.py +0 -0
  278. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/repo_edit.py +0 -0
  279. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/repo_onboard.py +0 -0
  280. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/rest_schema.py +0 -0
  281. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/restart_cmd.py +0 -0
  282. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/revalidate.py +0 -0
  283. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/review.py +0 -0
  284. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/scorecard.py +0 -0
  285. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/self_health.py +0 -0
  286. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/serve_app.py +0 -0
  287. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  288. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  289. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  290. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  291. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  292. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/portal-followup/SKILL.md +0 -0
  293. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/release-now/SKILL.md +0 -0
  294. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  295. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  296. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/skills/update-issue/SKILL.md +0 -0
  297. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/smoke.py +0 -0
  298. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/smoke_tags.py +0 -0
  299. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/spend_ceiling.py +0 -0
  300. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/split_work.py +0 -0
  301. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/sql.py +0 -0
  302. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/stage_projection.py +0 -0
  303. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/state.py +0 -0
  304. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/store_migrate.py +0 -0
  305. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/store_parity.py +0 -0
  306. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/templates/deploy-cloudflare.node.yml +0 -0
  307. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/test_author.py +0 -0
  308. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/test_chat.py +0 -0
  309. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/test_orchestrator.py +0 -0
  310. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/test_report.py +0 -0
  311. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/tui_pty_driver.py +0 -0
  312. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/tui_release.py +0 -0
  313. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/uat_checks.py +0 -0
  314. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/usage.py +0 -0
  315. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/usage_limits.py +0 -0
  316. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/usage_rollup.py +0 -0
  317. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/win_native_bridge.py +0 -0
  318. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/win_native_driver.py +0 -0
  319. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coord/worker_events.py +0 -0
  320. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/coordinator.example.yml +0 -0
  321. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-agent.service +0 -0
  322. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-backup.service +0 -0
  323. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-backup.timer +0 -0
  324. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-db-backup.service +0 -0
  325. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-db-backup.sh +0 -0
  326. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-db-backup.timer +0 -0
  327. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-dr-verify.service +0 -0
  328. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-dr-verify.timer +0 -0
  329. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-drive-queue.service +0 -0
  330. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-drive-queue.timer +0 -0
  331. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-failure-notify.service +0 -0
  332. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-failure-notify.sh +0 -0
  333. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-fleet-watchdog.service +0 -0
  334. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-fleet-watchdog.timer +0 -0
  335. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-notify.service +0 -0
  336. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-notify.timer +0 -0
  337. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-release-propagate.service +0 -0
  338. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-release-propagate.timer +0 -0
  339. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-release-window.service +0 -0
  340. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-release-window.timer +0 -0
  341. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-serve.service +0 -0
  342. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web-dist-build.service +0 -0
  343. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web-dist-build.sh +0 -0
  344. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web-dist-build.timer +0 -0
  345. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web-rollback.sh +0 -0
  346. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/coord-web.service +0 -0
  347. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/deploy/node-shim.sh +0 -0
  348. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_COORD_TUI_CI.md +0 -0
  349. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  350. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_COORD_WEB_CI.md +0 -0
  351. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_COORD_WEB_DIST.md +0 -0
  352. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  353. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/AGENT_OPERATIONS.md +0 -0
  354. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ARCHITECTURE.md +0 -0
  355. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ARCH_SECURITY_GATES.md +0 -0
  356. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/COCKPIT.md +0 -0
  357. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/CONTROL_CENTER.md +0 -0
  358. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/COST_DISCIPLINE.md +0 -0
  359. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/CROSS_PLATFORM.md +0 -0
  360. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/CUSTOMER_FACING_APPS.md +0 -0
  361. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/CUSTOMER_PORTAL.md +0 -0
  362. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/DATA_STORE_SELECTION.md +0 -0
  363. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/DISASTER_RECOVERY.md +0 -0
  364. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/DRIVE_QUEUE.md +0 -0
  365. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/EPHEMERAL_WORKERS.md +0 -0
  366. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/FORGE_MIGRATION.md +0 -0
  367. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/GRAPHIFY_SETUP.md +0 -0
  368. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ISSUE_GUIDANCE.md +0 -0
  369. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/MAC_MINI.md +0 -0
  370. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  371. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/NOTIFIER.md +0 -0
  372. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/OPENCODE_VERIFICATION.md +0 -0
  373. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/OPERATING_GOTCHAS.md +0 -0
  374. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/OPERATOR_GUIDES.md +0 -0
  375. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/ORACLE_LOOP.md +0 -0
  376. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/PHONE_WEBAPP.md +0 -0
  377. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/PIPELINE_V2.md +0 -0
  378. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/PLATFORM_EVOLUTION.md +0 -0
  379. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/SECOND_BACKEND.md +0 -0
  380. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/STORE_SERVICE.md +0 -0
  381. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  382. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/WEB_CONTROL_CENTER.md +0 -0
  383. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/WSL_WINDOWS_WORKER.md +0 -0
  384. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/README.md +0 -0
  385. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/_tokens.css +0 -0
  386. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/issue-detail.html +0 -0
  387. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/pipeline-narrow.html +0 -0
  388. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/docs/mocks/web/pipeline-wide.html +0 -0
  389. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/graphify-out/.gitignore +0 -0
  390. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/install-agent.sh +0 -0
  391. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/pyproject.toml +0 -0
  392. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/audit_review_verdict_overrides.py +0 -0
  393. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  394. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/build-worker-image.sh +0 -0
  395. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/coordinator-machine.py +0 -0
  396. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/dr-down.sh +0 -0
  397. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/dr-up.sh +0 -0
  398. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/epic-down.sh +0 -0
  399. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/epic-up.sh +0 -0
  400. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/preflight.sh +0 -0
  401. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/provision-server.sh +0 -0
  402. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/provision-worker.sh +0 -0
  403. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  404. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  405. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/throwaway-vm.sh +0 -0
  406. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/azure-workers/verify-github-token.sh +0 -0
  407. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/check_gh_argv_containment.py +0 -0
  408. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/codegen.py +0 -0
  409. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-test-runner.sh +0 -0
  410. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  411. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  412. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  413. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  414. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/coord-venv-rollback.sh +0 -0
  415. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/drive-batch.sh +0 -0
  416. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/extract-coord-tui.sh +0 -0
  417. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/fleet_watchdog.py +0 -0
  418. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/gen_board_fixture.py +0 -0
  419. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/gen_mock_index.py +0 -0
  420. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/lib/provision-core.sh +0 -0
  421. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/next_release_tag.py +0 -0
  422. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/provision-machine.sh +0 -0
  423. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/run_tests_in_populated_home.sh +0 -0
  424. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/run_tests_without_gh.sh +0 -0
  425. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/setup-macmini.sh +0 -0
  426. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/smoke_437_interactive.py +0 -0
  427. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/verify-provision-noble.sh +0 -0
  428. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/verify_878_review_capture.py +0 -0
  429. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/verify_release_published.py +0 -0
  430. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/scripts/verify_release_wheel.py +0 -0
  431. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/setup.cfg +0 -0
  432. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/SMOKE_SET.md +0 -0
  433. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/__init__.py +0 -0
  434. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/conftest.py +0 -0
  435. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/contract.md +0 -0
  436. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/manifest.yml +0 -0
  437. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  438. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  439. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/contract.md +0 -0
  440. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  441. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  442. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/manifest.yml +0 -0
  443. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  444. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-51/tsconfig.json +0 -0
  445. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  446. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/backends.py +0 -0
  447. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/conftest.py +0 -0
  448. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/board-pipeline-basic.json +0 -0
  449. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  450. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  451. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  452. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  453. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/all_pass.json +0 -0
  454. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  455. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/mixed_fail.json +0 -0
  456. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  457. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  458. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/skip.json +0 -0
  459. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/playwright/truncated.json +0 -0
  460. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  461. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  462. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  463. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  464. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  465. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  466. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  467. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  468. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  469. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_acceptance.py +0 -0
  470. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_acceptance_drivers.py +0 -0
  471. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent.py +0 -0
  472. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_api_error.py +0 -0
  473. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_app.py +0 -0
  474. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_branch_base.py +0 -0
  475. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_branch_capture.py +0 -0
  476. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_config_free_1712.py +0 -0
  477. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_deploy_units_endpoint.py +0 -0
  478. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_dirty_worktree.py +0 -0
  479. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  480. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_graph_self_heal.py +0 -0
  481. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_health_h3.py +0 -0
  482. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_idle_restart.py +0 -0
  483. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_push_failure.py +0 -0
  484. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_reap.py +0 -0
  485. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_repos_and_pull.py +0 -0
  486. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_restart_services_endpoint.py +0 -0
  487. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_skills_self_heal.py +0 -0
  488. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_startup_diagnostics.py +0 -0
  489. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_update.py +0 -0
  490. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_update_bluegreen.py +0 -0
  491. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_usage_limit.py +0 -0
  492. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_agent_zero_commit.py +0 -0
  493. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ambient_home_isolation.py +0 -0
  494. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approve_capability_reroute_3241.py +0 -0
  495. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approve_dependency_busy_2804.py +0 -0
  496. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approve_reject_plan.py +0 -0
  497. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approve_usage_gate.py +0 -0
  498. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approved_work_2532.py +0 -0
  499. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_approved_work_2996.py +0 -0
  500. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_assignment_already_recorded_daemon.py +0 -0
  501. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_audit_log.py +0 -0
  502. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_audit_outcome.py +0 -0
  503. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_audit_query.py +0 -0
  504. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_auto_loop.py +0 -0
  505. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_auto_release_publish_2035.py +0 -0
  506. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_backend_selection.py +0 -0
  507. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_backup.py +0 -0
  508. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_base_checkout_restore.py +0 -0
  509. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_block_log.py +0 -0
  510. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_cap_762.py +0 -0
  511. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_fixture.py +0 -0
  512. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_read_path.py +0 -0
  513. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_schema.py +0 -0
  514. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_service.py +0 -0
  515. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_state.py +0 -0
  516. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_board_wire.py +0 -0
  517. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_brain.py +0 -0
  518. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_branch_model.py +0 -0
  519. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_bug_intake.py +0 -0
  520. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_bugbash.py +0 -0
  521. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_build_worker_image_env_update.py +0 -0
  522. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cargo_cache.py +0 -0
  523. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_check_gh_argv_containment.py +0 -0
  524. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_acceptance_gate_1950.py +0 -0
  525. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_fix.py +0 -0
  526. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_github.py +0 -0
  527. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_gitlab.py +0 -0
  528. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_parity_2091.py +0 -0
  529. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_ci_store.py +0 -0
  530. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_claim.py +0 -0
  531. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_claude_md_budget.py +0 -0
  532. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_claude_setup_token.py +0 -0
  533. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_acceptance.py +0 -0
  534. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign.py +0 -0
  535. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  536. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign_interactive_remote.py +0 -0
  537. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign_provider.py +0 -0
  538. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  539. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_audit.py +0 -0
  540. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_chat_continue.py +0 -0
  541. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_ci.py +0 -0
  542. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_codegen.py +0 -0
  543. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_decide.py +0 -0
  544. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_capability_rules.py +0 -0
  545. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_config_provenance.py +0 -0
  546. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_forge_availability.py +0 -0
  547. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_graph.py +0 -0
  548. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_self.py +0 -0
  549. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_diagnose_test_coverage.py +0 -0
  550. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_doctor.py +0 -0
  551. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_doctor_config_free_1801.py +0 -0
  552. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  553. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  554. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_drive.py +0 -0
  555. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_escalate.py +0 -0
  556. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_fix_headless_review.py +0 -0
  557. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_gate_a.py +0 -0
  558. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_install_drift.py +0 -0
  559. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_install_skills.py +0 -0
  560. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issue_comment.py +0 -0
  561. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issue_create_label.py +0 -0
  562. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issue_reopen.py +0 -0
  563. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issue_view_list.py +0 -0
  564. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_issues.py +0 -0
  565. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_merge.py +0 -0
  566. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_assign.py +0 -0
  567. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_capture.py +0 -0
  568. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_chat_add_child.py +0 -0
  569. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_dispatch.py +0 -0
  570. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_gate_b.py +0 -0
  571. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_gate_c.py +0 -0
  572. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_order.py +0 -0
  573. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  574. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_milestone_ship.py +0 -0
  575. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_network.py +0 -0
  576. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_new_issue_chat.py +0 -0
  577. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_plans.py +0 -0
  578. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_portal.py +0 -0
  579. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_pr.py +0 -0
  580. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_pull_artifact.py +0 -0
  581. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_queue.py +0 -0
  582. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_reattach_sessions.py +0 -0
  583. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_refine_board.py +0 -0
  584. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_release_preflight.py +0 -0
  585. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_release_propagate.py +0 -0
  586. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_release_window.py +0 -0
  587. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_repo_2220.py +0 -0
  588. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  589. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_scorecard.py +0 -0
  590. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_serve_store_backend_3084.py +0 -0
  591. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_set_review_findings.py +0 -0
  592. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_advisory_terminal.py +0 -0
  593. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_contested_tag.py +0 -0
  594. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_invariant_alarms.py +0 -0
  595. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_machine_fault.py +0 -0
  596. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_merge_queue.py +0 -0
  597. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_provider.py +0 -0
  598. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_retried_3340.py +0 -0
  599. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_review_finalizing.py +0 -0
  600. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_supervisor_3366.py +0 -0
  601. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_test_failed_tag.py +0 -0
  602. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_status_usage_limit.py +0 -0
  603. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_sync_comments_873.py +0 -0
  604. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_test_plan.py +0 -0
  605. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_track.py +0 -0
  606. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_tui_update.py +0 -0
  607. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cli_wait.py +0 -0
  608. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_client.py +0 -0
  609. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_client_base_install.py +0 -0
  610. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_client_config_cache_atomic_3052.py +0 -0
  611. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_client_resource_migration_1946.py +0 -0
  612. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_commands_common.py +0 -0
  613. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_comments.py +0 -0
  614. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_completion_summary.py +0 -0
  615. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config.py +0 -0
  616. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_acceptance.py +0 -0
  617. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_audit.py +0 -0
  618. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_drift_check.py +0 -0
  619. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_effective.py +0 -0
  620. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_pricing.py +0 -0
  621. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  622. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_config_usage_gate.py +0 -0
  623. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_confirm_test.py +0 -0
  624. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_conflict_fix.py +0 -0
  625. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_conflict_fix_semantic.py +0 -0
  626. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  627. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test.py +0 -0
  628. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  629. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_baseline.py +0 -0
  630. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_populated_home.py +0 -0
  631. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_routing.py +0 -0
  632. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_test_runner_toolchain.py +0 -0
  633. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_uat.py +0 -0
  634. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coord_web_sse_restart_live.py +0 -0
  635. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_coordinator_machine.py +0 -0
  636. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_cross_platform_imports.py +0 -0
  637. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dao.py +0 -0
  638. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard.py +0 -0
  639. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_api.py +0 -0
  640. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_fixture.py +0 -0
  641. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_reports.py +0 -0
  642. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_server.py +0 -0
  643. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_terminal.py +0 -0
  644. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dashboard_terminal_live.py +0 -0
  645. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_db.py +0 -0
  646. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dead_end.py +0 -0
  647. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_decomposition_chat.py +0 -0
  648. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_coord_db_backup.py +0 -0
  649. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_coord_web_dist.py +0 -0
  650. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_coord_web_rollback.py +0 -0
  651. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_db_backup_unit.py +0 -0
  652. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_drive_queue_unit.py +0 -0
  653. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_failure_notify_unit.py +0 -0
  654. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_manifest.py +0 -0
  655. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_notify_unit.py +0 -0
  656. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_units_lane.py +0 -0
  657. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deploy_web_unit.py +0 -0
  658. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deprecation_telemetry.py +0 -0
  659. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_deps.py +0 -0
  660. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_diagnose.py +0 -0
  661. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dispatch.py +0 -0
  662. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dispatch_liveness.py +0 -0
  663. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dispatch_target_validation.py +0 -0
  664. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dispatch_workers.py +0 -0
  665. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dist_name.py +0 -0
  666. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_done_housekeeping.py +0 -0
  667. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dr_azure_scripts.py +0 -0
  668. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dr_promote.py +0 -0
  669. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_dr_verify.py +0 -0
  670. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_machine_fault.py +0 -0
  671. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_blocked_rendering.py +0 -0
  672. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_launch_argv.py +0 -0
  673. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_max_parallel_config.py +0 -0
  674. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  675. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_roll_pending.py +0 -0
  676. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  677. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_sessions_snapshot.py +0 -0
  678. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_state.py +0 -0
  679. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_drive_tmux.py +0 -0
  680. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_epic_up_capability_detection.py +0 -0
  681. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  682. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_epic_up_image_provenance.py +0 -0
  683. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_errors.py +0 -0
  684. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_events.py +0 -0
  685. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_failure_class.py +0 -0
  686. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_failure_classifier.py +0 -0
  687. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_filelock.py +0 -0
  688. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  689. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fix_escalation_classifier.py +0 -0
  690. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fix_of_force_override.py +0 -0
  691. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fleet_config_health.py +0 -0
  692. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fleet_health_probes.py +0 -0
  693. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fleet_health_snapshot.py +0 -0
  694. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_fleet_watchdog.py +0 -0
  695. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_forge_availability.py +0 -0
  696. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_freshness.py +0 -0
  697. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gate_a.py +0 -0
  698. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gate_b.py +0 -0
  699. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gate_snapshot_staleness.py +0 -0
  700. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gates.py +0 -0
  701. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  702. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gen_mock_index.py +0 -0
  703. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_generated_rust_fixture.py +0 -0
  704. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_generated_rust_requests.py +0 -0
  705. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_generated_types_fixture.py +0 -0
  706. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_github_ops.py +0 -0
  707. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_github_throttle.py +0 -0
  708. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_goal.py +0 -0
  709. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_graph_health.py +0 -0
  710. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_graph_selfheal_absent_2237.py +0 -0
  711. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_gtk_native_driver.py +0 -0
  712. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_handoff.py +0 -0
  713. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_checks.py +0 -0
  714. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_cli.py +0 -0
  715. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_cli_graph.py +0 -0
  716. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_config.py +0 -0
  717. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_context.py +0 -0
  718. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_coord_tui_ci_pin.py +0 -0
  719. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_coord_web_ci_pin.py +0 -0
  720. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_deploy_lane_facts.py +0 -0
  721. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_fix.py +0 -0
  722. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_incident_regression.py +0 -0
  723. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_issues_sync_staleness.py +0 -0
  724. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_pr_churn.py +0 -0
  725. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_pypi.py +0 -0
  726. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_registry.py +0 -0
  727. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_release_cordon_probe.py +0 -0
  728. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_timer_active.py +0 -0
  729. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_toolchain.py +0 -0
  730. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_unit_drift.py +0 -0
  731. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_unit_enablement.py +0 -0
  732. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_health_wedged_drive_queue.py +0 -0
  733. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_hooks.py +0 -0
  734. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_housekeeping.py +0 -0
  735. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_human_attended_437.py +0 -0
  736. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_init.py +0 -0
  737. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_install_agent_capabilities_3515.py +0 -0
  738. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_install_agent_venv_2911.py +0 -0
  739. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  740. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_integration.py +0 -0
  741. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive.py +0 -0
  742. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_briefing_echo.py +0 -0
  743. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_pane_log_2541.py +0 -0
  744. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_prefill_state.py +0 -0
  745. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_session_relaunch.py +0 -0
  746. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_test_verdict_backstop.py +0 -0
  747. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_token_attribution.py +0 -0
  748. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_interactive_worktree.py +0 -0
  749. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_invariant_alarms.py +0 -0
  750. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_issue_store_seam.py +0 -0
  751. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_issues_sync_status.py +0 -0
  752. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_liveness_auditor.py +0 -0
  753. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_liveness_notify.py +0 -0
  754. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_lock_contention_ratchet.py +0 -0
  755. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_mac_native_driver.py +0 -0
  756. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_fault.py +0 -0
  757. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_metrics.py +0 -0
  758. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_onboard.py +0 -0
  759. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_pause.py +0 -0
  760. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_machine_stats.py +0 -0
  761. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_merge_queue.py +0 -0
  762. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_merge_verify.py +0 -0
  763. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_chat.py +0 -0
  764. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_dispatch.py +0 -0
  765. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_gate.py +0 -0
  766. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_order.py +0 -0
  767. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_milestone_seam.py +0 -0
  768. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_mock_author.py +0 -0
  769. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_model_tiering.py +0 -0
  770. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_models.py +0 -0
  771. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_models_config_labels.py +0 -0
  772. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_needs_attention.py +0 -0
  773. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_network.py +0 -0
  774. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_new_issue_chat.py +0 -0
  775. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_next_release_tag.py +0 -0
  776. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_node_shim.py +0 -0
  777. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_baseline.py +0 -0
  778. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_cli.py +0 -0
  779. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_collect.py +0 -0
  780. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_config.py +0 -0
  781. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_drive_seam.py +0 -0
  782. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_isolation.py +0 -0
  783. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_predicate.py +0 -0
  784. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_quiet_hours.py +0 -0
  785. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notifier_service.py +0 -0
  786. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notify.py +0 -0
  787. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_notify_drain.py +0 -0
  788. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_openapi.py +0 -0
  789. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_operational_defaults.py +0 -0
  790. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_overlap_fence.py +0 -0
  791. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_overlap_predict.py +0 -0
  792. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_packaged_deploy_units.py +0 -0
  793. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_parentage.py +0 -0
  794. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_paste_landed.py +0 -0
  795. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  796. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_pipeline.py +0 -0
  797. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_followup_approve_plan_command.py +0 -0
  798. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_followup_pr_command.py +0 -0
  799. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_followup_review_command.py +0 -0
  800. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_only.py +0 -0
  801. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_plan_parser.py +0 -0
  802. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_platform_paths.py +0 -0
  803. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_portal_bridge.py +0 -0
  804. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_portal_config.py +0 -0
  805. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_portal_store.py +0 -0
  806. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_portal_sync.py +0 -0
  807. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_pr_body_lint.py +0 -0
  808. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_prereqs.py +0 -0
  809. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_production_db_guard.py +0 -0
  810. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_progress.py +0 -0
  811. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_provider_seam.py +0 -0
  812. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_providers.py +0 -0
  813. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_providers_config_labels.py +0 -0
  814. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_providers_pty.py +0 -0
  815. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_provision_core.py +0 -0
  816. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_provision_machine.py +0 -0
  817. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_py_rust_mirror_inventory.py +0 -0
  818. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_quiet_hours.py +0 -0
  819. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_quiet_hours_store_2146.py +0 -0
  820. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reap_merged_sessions.py +0 -0
  821. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reap_stale_interactive_tick.py +0 -0
  822. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile.py +0 -0
  823. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_branch.py +0 -0
  824. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_completions.py +0 -0
  825. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  826. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_merges.py +0 -0
  827. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_no_agent_record.py +0 -0
  828. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_tick.py +0 -0
  829. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reconcile_usage_limit_done.py +0 -0
  830. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_refine_chat.py +0 -0
  831. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_2101.py +0 -0
  832. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  833. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_deadlock_2240.py +0 -0
  834. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  835. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_cordon_stuck_2490.py +0 -0
  836. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_gate.py +0 -0
  837. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_propagate.py +0 -0
  838. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_propagate_threshold.py +0 -0
  839. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_roll_between_legs_2854.py +0 -0
  840. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_roll_window_handoff.py +0 -0
  841. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_unified_1242.py +0 -0
  842. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_verify.py +0 -0
  843. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_release_window.py +0 -0
  844. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_remote_auto_prune.py +0 -0
  845. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_remote_interactive_reaper.py +0 -0
  846. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_add.py +0 -0
  847. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_dormancy.py +0 -0
  848. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_edit_2220.py +0 -0
  849. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_graph_fleet_2237.py +0 -0
  850. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_max_parallel_3423.py +0 -0
  851. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_repo_onboard_2220.py +0 -0
  852. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_report_result_push.py +0 -0
  853. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_reports.py +0 -0
  854. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_restart_cmd.py +0 -0
  855. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_retry.py +0 -0
  856. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_retry_advisory_1606.py +0 -0
  857. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_retry_escalation_classify_3360.py +0 -0
  858. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_retry_type_1636.py +0 -0
  859. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_revalidate.py +0 -0
  860. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review.py +0 -0
  861. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_end_review_without_verdict.py +0 -0
  862. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_parse_failure_diagnostic.py +0 -0
  863. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_reaffirm.py +0 -0
  864. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_state.py +0 -0
  865. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_verdict_backstop.py +0 -0
  866. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_verdict_override_audit.py +0 -0
  867. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_verdict_relay.py +0 -0
  868. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_review_zero_commits.py +0 -0
  869. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_scoped_review_wiring.py +0 -0
  870. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_scorecard.py +0 -0
  871. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_self_health.py +0 -0
  872. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_serve.py +0 -0
  873. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_serve_app.py +0 -0
  874. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_serve_app_board_trim.py +0 -0
  875. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_serve_rest_routes.py +0 -0
  876. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_session.py +0 -0
  877. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_slice_issue_attribution.py +0 -0
  878. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_smoke.py +0 -0
  879. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  880. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_smoke_live_checkout_restore.py +0 -0
  881. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_smoke_workflow.py +0 -0
  882. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_spend_ceiling.py +0 -0
  883. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_spend_ceiling_coordinator.py +0 -0
  884. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_split.py +0 -0
  885. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_split_work.py +0 -0
  886. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_sql_dialect.py +0 -0
  887. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_sqlite_connect_ratchet.py +0 -0
  888. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stage_projection.py +0 -0
  889. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stale_busy_reviewer_697.py +0 -0
  890. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stalled_pipeline.py +0 -0
  891. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_state.py +0 -0
  892. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_state_review_findings_daemon.py +0 -0
  893. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_status_fleet_footer.py +0 -0
  894. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stop_1567.py +0 -0
  895. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_store_contract.py +0 -0
  896. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_store_migrate.py +0 -0
  897. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stuck.py +0 -0
  898. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  899. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_terminal_command.py +0 -0
  900. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_author.py +0 -0
  901. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_chat.py +0 -0
  902. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_orchestrator.py +0 -0
  903. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_report.py +0 -0
  904. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_verdict_parsing.py +0 -0
  905. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_test_verdict_transcript_floor.py +0 -0
  906. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_text_io_encoding_audit.py +0 -0
  907. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_thin_client_board_audit.py +0 -0
  908. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_thin_client_config_load_1080.py +0 -0
  909. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_thin_client_daemon_routing_906.py +0 -0
  910. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_throwaway_vm.py +0 -0
  911. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_tmux_host.py +0 -0
  912. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_tmux_session.py +0 -0
  913. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_transcript_floor.py +0 -0
  914. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_tui_pty_driver.py +0 -0
  915. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_uat_checks.py +0 -0
  916. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_usage.py +0 -0
  917. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_usage_limits.py +0 -0
  918. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_usage_rollup.py +0 -0
  919. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_venv_live_install_2121.py +0 -0
  920. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_version_single_source.py +0 -0
  921. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_watch.py +0 -0
  922. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_win_native_bridge.py +0 -0
  923. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_win_native_driver.py +0 -0
  924. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  925. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_env_venv_isolation.py +0 -0
  926. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_events.py +0 -0
  927. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_image_pin_sync.py +0 -0
  928. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_safety.py +0 -0
  929. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worker_test_scoping.py +0 -0
  930. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worktree.py +0 -0
  931. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  932. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/tests/test_write_parity.py +0 -0
  933. {code_coordinator-0.5.568 → code_coordinator-0.5.570}/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.568
3
+ Version: 0.5.570
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.568
3
+ Version: 0.5.570
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
@@ -812,6 +812,7 @@ tests/test_repo_edit_2220.py
812
812
  tests/test_repo_graph_fleet_2237.py
813
813
  tests/test_repo_max_parallel_3423.py
814
814
  tests/test_repo_onboard_2220.py
815
+ tests/test_report_public_export.py
815
816
  tests/test_report_result_push.py
816
817
  tests/test_reports.py
817
818
  tests/test_restart_cmd.py
@@ -839,6 +839,7 @@
839
839
  "tests/test_repo_graph_fleet_2237.py",
840
840
  "tests/test_repo_max_parallel_3423.py",
841
841
  "tests/test_repo_onboard_2220.py",
842
+ "tests/test_report_public_export.py",
842
843
  "tests/test_report_result_push.py",
843
844
  "tests/test_reports.py",
844
845
  "tests/test_restart_cmd.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.570",
3
+ "distance": 0,
4
+ "node": "g29bd794d5c1bbedb62f22cdd0bef36e1a1cddd33",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-03"
8
+ }
@@ -485,6 +485,7 @@ def drive_queue_add(
485
485
  # kind is happening on that path. Merging (or fixing forward) a
486
486
  # discovered PR is deliberately left to the operator — see
487
487
  # `existing_pr_relaunch_remedy`'s own docstring.
488
+ existing_pr_resume_note = ""
488
489
  if previous is None or previous.state in STUCK_QUEUE_STATES:
489
490
  existing_match = _existing_pr_match(config_path, repo, issue)
490
491
  existing_remedy = existing_pr_relaunch_remedy(repo, issue, existing_match)
@@ -494,6 +495,24 @@ def drive_queue_add(
494
495
  f"{existing_remedy['what_happens']} Run instead: "
495
496
  f"{existing_remedy['command_or_action']}"
496
497
  )
498
+ # #3539: `existing_remedy is None` with a real *existing_match* is
499
+ # ambiguous on its own — "no PR found, start fresh" and "PR found,
500
+ # green, but still missing a gate — resume on it" both return
501
+ # `None` from `existing_pr_relaunch_remedy` (see its docstring).
502
+ # Say which one happened: silently queuing a resume with no echo
503
+ # at all would read identically to a fresh `add` and hide the exact
504
+ # trap #3539 reports (an operator with no way to tell this add is
505
+ # about to drive the SAME branch, not a new one).
506
+ if existing_match is not None and existing_match.missing_gates:
507
+ gates_list = " and ".join(existing_match.missing_gates)
508
+ existing_pr_resume_note = (
509
+ f"\nresuming on existing PR #{existing_match.number} "
510
+ f"({existing_match.branch}) — CI is green but {gates_list} "
511
+ f"{'gate is' if len(existing_match.missing_gates) == 1 else 'gates are'} "
512
+ "not yet recorded; this add will dispatch only the missing "
513
+ f"stage(s) on that branch, never a new Work leg (coord "
514
+ f"gates {repo} {issue} shows the live detail)."
515
+ )
497
516
 
498
517
  # #2247: predicted file overlap ORDERS, never refuses. Anything that goes
499
518
  # wrong in here (unreadable body, unreachable board, a failed compare)
@@ -645,6 +664,7 @@ def drive_queue_add(
645
664
  click.echo(
646
665
  f"queued {entry_key(repo, issue)}{pinned}{suffix}{gate}{fix_rounds_note}"
647
666
  f"{no_acceptance_note}{scope_downgrade_warning}{overlap_note}"
667
+ f"{existing_pr_resume_note}"
648
668
  )
649
669
 
650
670
  # #2339: say out loud when this add cannot possibly accomplish anything —
@@ -951,15 +971,32 @@ def _existing_pr_match(
951
971
  answer than `coord.merge_queue.plan()`'s own `PLAN_READY` verdict — it
952
972
  reads raw `failed_checks`/`in_flight_checks` only and does not account
953
973
  for `merge_queue._ci_checks_are_stale` (a green check that silently
954
- outlived a base move), review state, or any other merge gate. The
955
- issue's own design accepted either condition ("all green OR `coord merge
956
- --plan` reads READY"), and `coord merge --only` re-runs its own full gate
957
- check before actually merging either way, so the worst case from the gap
958
- is a confusing round trip (recommended here, still BLOCKED there), never
959
- an incorrect merge. Wiring the fuller verdict in would need this call
960
- site to assemble `plan()`'s board/GhOps/smoke-verdict inputs for a
961
- single PR lookup — a bigger, riskier change than this fix-round's scope;
962
- left as a known gap rather than attempted half-wired.
974
+ outlived a base move). The issue's own design accepted either condition
975
+ ("all green OR `coord merge --plan` reads READY"), and `coord merge
976
+ --only` re-runs its own full gate check before actually merging either
977
+ way, so the worst case from the gap is a confusing round trip
978
+ (recommended here, still BLOCKED there), never an incorrect merge.
979
+ Wiring the fuller verdict in would need this call site to assemble
980
+ `plan()`'s board/GhOps/smoke-verdict inputs for a single PR lookup — a
981
+ bigger, riskier change than this fix-round's scope; left as a known gap
982
+ rather than attempted half-wired.
983
+
984
+ `missing_gates` (#3539), unlike `all_green`, DOES reuse the real gate
985
+ decision — `coord.gates.build_gate_report`, the exact function `coord
986
+ gates` prints and that wraps `coord.merge_queue`'s own
987
+ `requires_review`/`scan_approved_reviews`/`requires_smoke`/
988
+ `evaluate_smoke_verdict` — rather than a second guess, closing the
989
+ quadraui#1109 gap: a PR can be all-green on CI while `coord gates`
990
+ still reports `review`/`test` BLOCKED, and the #2377 guard's old
991
+ "merge it" advice for an all-green PR was then impossible (`coord merge
992
+ --only` itself refused with `enqueue blocked by review gate`). Only
993
+ computed when `all_green` — a red PR's gate state is moot, the caller
994
+ refuses on CI alone either way. Fails open toward "missing" (NEVER
995
+ toward "satisfied"): an unreadable board/config, or a PR whose work
996
+ chain `build_gate_report` can't resolve a decision for, reports every
997
+ gate as still missing rather than claiming a merge is ready when a live
998
+ `coord merge --only` might still refuse it (#2096: unconfirmed success
999
+ is a defect).
963
1000
  """
964
1001
  coordinates = _repo_coordinates(config_path, repo)
965
1002
  if coordinates is None:
@@ -990,14 +1027,64 @@ def _existing_pr_match(
990
1027
  # reported", which `all_green` below already reads as not-green.
991
1028
  checks = []
992
1029
  all_green = bool(checks) and not failed_checks(checks) and not in_flight_checks(checks)
1030
+ missing_gates = _missing_required_gates(config_path, repo, issue) if all_green else ()
993
1031
  return ExistingPrMatch(
994
1032
  number=number,
995
1033
  branch=str(pr.get("headRefName") or ""),
996
1034
  url=str(pr.get("url") or ""),
997
1035
  all_green=all_green,
1036
+ missing_gates=missing_gates,
998
1037
  )
999
1038
 
1000
1039
 
1040
+ def _missing_required_gates(config_path: Path, repo: str, issue: int) -> tuple[str, ...]:
1041
+ """#3539: which of ``("review", "test")`` are still required-but-not-ok
1042
+ for *repo*#*issue*, per `coord.gates.build_gate_report` — the SAME
1043
+ review/test decision `coord gates` prints and `coord merge` itself
1044
+ gates on (#2096: one question, one answer; never a second, driftable
1045
+ guess at "is this PR actually ready").
1046
+
1047
+ Fails open toward "missing", never toward "satisfied": any read failure
1048
+ (unreadable config, no board, an exception inside `build_gate_report`
1049
+ itself) or a report with no resolved decisions at all (no work-like
1050
+ assignment `build_gate_report` could select a winner from) reports
1051
+ BOTH gates missing. A false "missing" here costs one operator-visible
1052
+ resume note on an add that may turn out to be a no-op once the real
1053
+ gates are read live again a moment later; a false "satisfied" would
1054
+ reproduce the exact #3539 incident — advising ``coord merge --only``
1055
+ over a PR a live merge attempt still refuses.
1056
+
1057
+ The board comes from ``coord.board_service.read_board()``, NOT
1058
+ ``coord.state.build_board()`` (#615/#906): `coord drive-queue add` has
1059
+ no whole-command daemon reroute, so a thin client reading the local DB
1060
+ here would see an empty board, resolve no decisions, and fail open to
1061
+ "both gates missing" on every add — technically safe, uselessly noisy.
1062
+ `read_board()` is the one place the local-vs-daemon decision is made
1063
+ (GET /board on a thin client, the local DB otherwise), which is also
1064
+ why no entry is needed in `tests/test_thin_client_board_audit.py`'s
1065
+ ``COMMANDS_ALLOWLIST``: there is no direct local-board call site to
1066
+ allowlist.
1067
+ """
1068
+ try:
1069
+ from coord import github_ops # noqa: PLC0415
1070
+ from coord.board_service import read_board # noqa: PLC0415
1071
+ from coord.commands._common import _load_config # noqa: PLC0415
1072
+ from coord.gates import build_gate_report # noqa: PLC0415
1073
+
1074
+ cfg = _load_config(config_path)
1075
+ board = read_board()
1076
+ report = build_gate_report(board, cfg, repo, issue, gh_ops=github_ops)
1077
+ except (Exception, SystemExit): # noqa: BLE001 — fail-open to "missing"
1078
+ return ("review", "test")
1079
+ by_gate = {d.gate: d for d in report.decisions}
1080
+ missing = []
1081
+ for gate in ("review", "test"):
1082
+ decision = by_gate.get(gate)
1083
+ if decision is None or (decision.required and not decision.ok):
1084
+ missing.append(gate)
1085
+ return tuple(missing)
1086
+
1087
+
1001
1088
  def _predict_overlap(
1002
1089
  config_path: Path, repo: str, issue: int, existing_entries: list[QueueEntry],
1003
1090
  ) -> tuple[Prediction, str, str]:
@@ -6433,6 +6520,17 @@ def _blocked_escalation_command(
6433
6520
  behaviour) purely so every OTHER existing caller/test of this function
6434
6521
  that has no config to hand keeps working unchanged; the real `tick`
6435
6522
  call sites below always pass their own.
6523
+
6524
+ #3539: `existing_pr_relaunch_remedy` returning ``None`` is no longer
6525
+ proof that *match* itself is ``None`` — a green PR with Test and/or
6526
+ Review never recorded ALSO returns ``None`` (see that function's own
6527
+ docstring), on purpose, so a plain `add` can resume on it. That case
6528
+ still HAS a PR and HAS been dispatched, so it must not fall through to
6529
+ `_requeue_command`'s blind ``remove && add`` either — remove would
6530
+ discard a completed, green work cycle for no reason. Propose the plain
6531
+ `add` (no `remove` first) instead; `_requeue_command` stays reserved for
6532
+ the one case its own docstring names: *match* itself is ``None``,
6533
+ i.e. nothing was ever dispatched for this row at all.
6436
6534
  """
6437
6535
  if is_merge_gate_block_reason(reason):
6438
6536
  parsed = parse_key(key)
@@ -6446,6 +6544,10 @@ def _blocked_escalation_command(
6446
6544
  remedy = existing_pr_relaunch_remedy(repo, issue, match)
6447
6545
  if remedy is not None:
6448
6546
  return remedy["command_or_action"]
6547
+ if match is not None:
6548
+ # #3539: green PR, gate(s) not yet recorded — resume via a
6549
+ # plain `add`, never the blind `remove && add` requeue below.
6550
+ return f"coord drive-queue add {repo} {issue}"
6449
6551
  return _requeue_command(entry, key)
6450
6552
 
6451
6553
 
@@ -26,10 +26,34 @@ why ``started_at`` exports as an epoch (or a real Excel datetime cell for
26
26
  extra rather than a crash. ``--json`` survives as a hidden alias for
27
27
  ``--format json``.
28
28
 
29
+ ``coord report export <id> --public`` (#3474) runs a report the same way
30
+ ``report run`` does (``coord.state.run_report`` — daemon when
31
+ ``board_service`` is set, local registry otherwise) and then redacts it for
32
+ an audience OUTSIDE the fleet, via :func:`coord.reports.redact_report_for_public`:
33
+ every repo not named in ``coordinator.yml``'s ``reporting.public.allowlist_
34
+ repos`` is dropped and folded into one aggregate ``"private repo"`` row —
35
+ no name, no issue number, no title. The result is written as a
36
+ self-contained ``.public.html`` (data inlined, chart on a pinned ECharts
37
+ CDN) plus the same redacted ``.public.csv`` into ``--out`` (default: the
38
+ current directory). A report whose dollar figure has no stated cost basis
39
+ left standing after redaction is refused outright (``PublicExportError``) —
40
+ "a public number with no stated basis is not produced" (#3474). The
41
+ redaction itself runs **client-side**, over the already-fetched result —
42
+ same precedent as every ``--format`` above, which also serialises
43
+ client-side over ``run_report``'s own return value — so a thin client never
44
+ needs a second, DB-backed export path. The allowlist that drives it,
45
+ though, is resolved via :func:`_resolve_public_allowlist` — the same
46
+ thin-client-first ``board_service``/``fetch_remote_config`` seam
47
+ ``coord.commands._common._load_config`` uses for every other config read
48
+ (#1080/#947/#2824), never a raw local ``coordinator.yml`` load: the
49
+ allowlist is the one input here that is explicitly security-sensitive, so
50
+ a thin client with a stale local copy must never under-redact against it.
51
+
29
52
  Exit codes: ``2`` for a bad request (unknown report, unknown parameter, bad
30
- value, or ``--format xlsx`` without the extra installed — the message names
31
- what was allowed/needed), ``1`` for a read/transport failure. Never a
32
- traceback for either.
53
+ value, ``--format xlsx`` without the extra installed, or a public export
54
+ refused over an unstated cost basis — the message names what was
55
+ allowed/needed), ``1`` for a read/transport failure. Never a traceback for
56
+ either.
33
57
  """
34
58
 
35
59
  from __future__ import annotations
@@ -43,6 +67,36 @@ import click
43
67
 
44
68
  from coord.commands._common import _CONFIG_OPTION
45
69
 
70
+
71
+ def _resolve_public_allowlist(config_path) -> frozenset[str]: # noqa: ANN001
72
+ """The thin-client-safe ``reporting.public.allowlist_repos`` for
73
+ ``coord report export --public`` (#3474 review).
74
+
75
+ Mirrors :func:`coord.commands._common._load_config`'s "thin client
76
+ first" resolution — a machine with ``board_service``/``client.toml``
77
+ configured fetches the DAEMON's live config (``fetch_remote_config``)
78
+ rather than trusting whatever ``coordinator.yml`` happens to sit on
79
+ local disk, the exact bug class #1080/#947/#2824 already paid for
80
+ (a stale/stray local file silently diverging from the daemon's real
81
+ config with no signal anything is wrong). ``_load_config`` itself
82
+ ``sys.exit(2)``s on a bad config, which is right for every OTHER
83
+ command but wrong here: the allowlist is the one input this feature
84
+ treats as security-sensitive, so a failure to resolve it (daemon
85
+ unreachable, local file malformed/absent) must fail SOFT — the caller
86
+ catches whatever this raises and falls back to the empty allowlist,
87
+ i.e. "redact everything" (same posture as the daemon-side sibling,
88
+ :func:`coord.reports.load_public_allowlist`).
89
+ """
90
+ from coord.client import fetch_remote_config, resolve_board_service # noqa: PLC0415
91
+ from coord.config import load as load_config # noqa: PLC0415
92
+
93
+ path = config_path
94
+ svc = resolve_board_service()
95
+ if svc is not None:
96
+ path = fetch_remote_config(svc)
97
+ return frozenset(load_config(path).reporting.public.allowlist_repos)
98
+
99
+
46
100
  # Row keys whose values are epoch timestamps — rendered as a relative age in
47
101
  # the human table (absolute in --json, which is the machine contract).
48
102
  # Fallback only: used when a row column is not covered by the report's
@@ -372,3 +426,120 @@ def report_run(
372
426
  click.echo(f"notes ({len(notes)}):")
373
427
  for note in notes:
374
428
  click.echo(f" • {note}")
429
+
430
+
431
+ @report_group.command(
432
+ "export",
433
+ help="Export a report for sharing outside the fleet (#3474; --public is required today).",
434
+ )
435
+ @click.argument("report_id")
436
+ @click.option(
437
+ "--param", "raw_params", multiple=True, metavar="KEY=VALUE",
438
+ help="Report parameter, repeatable (e.g. --param since=13h).",
439
+ )
440
+ @click.option(
441
+ "--public", is_flag=True, default=False,
442
+ help=(
443
+ "Redact every repo not in coordinator.yml's "
444
+ "reporting.public.allowlist_repos before exporting — everything "
445
+ "else is aggregated into one 'private repo' row with no name, "
446
+ "issue number or title. The only export mode supported today; "
447
+ "omitting this flag is a usage error rather than silently "
448
+ "producing an un-redacted export."
449
+ ),
450
+ )
451
+ @click.option(
452
+ "--out", "out_dir", type=click.Path(path_type=Path), default=Path("."),
453
+ show_default=True,
454
+ help="Directory to write the exported <report>.public.html/.csv pair into.",
455
+ )
456
+ @_CONFIG_OPTION
457
+ def report_export(
458
+ report_id: str,
459
+ raw_params: tuple[str, ...],
460
+ public: bool,
461
+ out_dir: Path,
462
+ config_path: Path,
463
+ ) -> None:
464
+ if not public:
465
+ click.echo(
466
+ "error: `coord report export` needs --public today — a "
467
+ "self-contained, redacted HTML+CSV pair for sharing outside the "
468
+ "fleet (#3474). There is no un-redacted export mode.",
469
+ err=True,
470
+ )
471
+ raise SystemExit(2)
472
+
473
+ from coord.reports import ( # noqa: PLC0415
474
+ REPORTS,
475
+ PublicExportError,
476
+ assert_public_export_allowed,
477
+ public_csv_filename,
478
+ public_html_filename,
479
+ redact_report_for_public,
480
+ result_to_csv,
481
+ result_to_public_html,
482
+ )
483
+ from coord.state import run_report # noqa: PLC0415
484
+
485
+ params: dict[str, str] = {}
486
+ for raw in raw_params:
487
+ if "=" not in raw:
488
+ click.echo(
489
+ f"error: --param expects KEY=VALUE, got {raw!r} "
490
+ "(e.g. --param since=13h)",
491
+ err=True,
492
+ )
493
+ raise SystemExit(2)
494
+ key, _, value = raw.partition("=")
495
+ params[key.strip()] = value
496
+
497
+ try:
498
+ result = run_report(report_id, params)
499
+ except ValueError as e:
500
+ # ReportError (local) or the daemon's 400/404 body, re-raised as a
501
+ # ValueError by coord.client.fetch_report — mirrors `report run`.
502
+ click.echo(f"error: {e}", err=True)
503
+ raise SystemExit(2) from e
504
+ except Exception as e: # noqa: BLE001 — transport/DB failure
505
+ click.echo(f"error: report run failed: {e}", err=True)
506
+ raise SystemExit(1) from e
507
+
508
+ # #3474: redaction runs HERE, client-side, over the already-fetched
509
+ # `result` — same precedent `--format csv|xlsx|...` above already sets
510
+ # (those also serialise client-side over `run_report`'s own return
511
+ # value), so a thin client never needs a second, DB-backed export path.
512
+ # The allowlist itself goes through `_resolve_public_allowlist` — the
513
+ # SAME thin-client-first resolution every other config read uses
514
+ # (#1080/#947/#2824), not a raw local-file load — so a thin client whose
515
+ # daemon has since tightened `reporting.public.allowlist_repos` can
516
+ # never under-redact from a stale local copy. Any failure to resolve it
517
+ # (daemon unreachable, local file malformed/absent — reports need no
518
+ # config at all for `list`/`run`) is NOT a usage error here: it falls
519
+ # back to the empty allowlist, i.e. redact everything, the only safe
520
+ # default for an export leaving the fleet.
521
+ try:
522
+ allowed = _resolve_public_allowlist(config_path)
523
+ except Exception as e: # noqa: BLE001 — fail CLOSED: unreadable/unreachable config => redact everything
524
+ click.echo(
525
+ f"warning: could not resolve reporting.public.allowlist_repos "
526
+ f"({e}) — redacting every repo.",
527
+ err=True,
528
+ )
529
+ allowed = frozenset()
530
+
531
+ report_def = REPORTS.get(report_id)
532
+ redacted = redact_report_for_public(result, allowed_repos=allowed, report=report_def)
533
+ try:
534
+ assert_public_export_allowed(redacted, report_id)
535
+ except PublicExportError as e:
536
+ click.echo(f"error: {e}", err=True)
537
+ raise SystemExit(2) from e
538
+
539
+ out_dir.mkdir(parents=True, exist_ok=True)
540
+ html_path = out_dir / public_html_filename(redacted)
541
+ csv_path = out_dir / public_csv_filename(redacted)
542
+ html_path.write_text(result_to_public_html(redacted), encoding="utf-8")
543
+ csv_path.write_text(result_to_csv(redacted), encoding="utf-8")
544
+ click.echo(f"wrote {html_path}")
545
+ click.echo(f"wrote {csv_path}")
@@ -1956,6 +1956,29 @@ class PricingConfig:
1956
1956
  COST_BASIS_CHOICES = ("api_equivalent", "billed")
1957
1957
 
1958
1958
 
1959
+ @dataclass
1960
+ class PublicReportingConfig:
1961
+ """``reporting.public:`` block (#3474) — the redaction policy for a
1962
+ report export meant to leave the fleet (``coord report export
1963
+ --public``, the dashboard's ``/reports`` "Share" button).
1964
+
1965
+ A public export is for an audience that must never see a private repo's
1966
+ name, issue titles or numbers — someone evaluating the tool, or
1967
+ marketing material quoting "cost per merged issue". ``allowlist_repos``
1968
+ is the only field: the coord-local repo names (as declared under
1969
+ ``coordinator.yml``'s ``repos:``) that MAY be named verbatim in a public
1970
+ export. Every row about any other repo is redacted — aggregated into a
1971
+ single ``"private repo"`` row with no issue number, no title, and no
1972
+ repo name of its own (:func:`coord.reports.redact_report_for_public`).
1973
+
1974
+ Default is empty, i.e. **redact everything** — the safe default for a
1975
+ config that predates this block, or one that simply never opted a repo
1976
+ in.
1977
+ """
1978
+
1979
+ allowlist_repos: tuple[str, ...] = ()
1980
+
1981
+
1959
1982
  @dataclass
1960
1983
  class ReportingConfig:
1961
1984
  """``reporting:`` block (#3471) — what a cost-bearing report's dollar
@@ -1980,9 +2003,13 @@ class ReportingConfig:
1980
2003
  and the figure is real money charged — set it only when that is
1981
2004
  actually true; this config does no verification of its own; it only
1982
2005
  labels, on every report, what the operator asserts here.
2006
+
2007
+ ``public`` (#3474) is the redaction policy for a report export that
2008
+ leaves the fleet entirely — see :class:`PublicReportingConfig`.
1983
2009
  """
1984
2010
 
1985
2011
  cost_basis: str = "api_equivalent"
2012
+ public: PublicReportingConfig = field(default_factory=PublicReportingConfig)
1986
2013
 
1987
2014
 
1988
2015
  @dataclass
@@ -5088,6 +5115,22 @@ def _parse_reporting(raw: Any) -> ReportingConfig:
5088
5115
  + ", ".join(COST_BASIS_CHOICES)
5089
5116
  )
5090
5117
  cfg.cost_basis = value
5118
+ if "public" in raw:
5119
+ public_raw = raw["public"]
5120
+ if public_raw is None:
5121
+ public_raw = {}
5122
+ if not isinstance(public_raw, dict):
5123
+ raise ConfigError("'reporting.public' must be a mapping")
5124
+ allowlist = public_raw.get("allowlist_repos", [])
5125
+ if allowlist is None:
5126
+ allowlist = []
5127
+ if not isinstance(allowlist, list) or not all(
5128
+ isinstance(x, str) for x in allowlist
5129
+ ):
5130
+ raise ConfigError(
5131
+ "reporting.public.allowlist_repos must be a list of repo names"
5132
+ )
5133
+ cfg.public = PublicReportingConfig(allowlist_repos=tuple(allowlist))
5091
5134
  return cfg
5092
5135
 
5093
5136
 
@@ -1820,6 +1820,59 @@ def openapi_spec() -> dict:
1820
1820
  },
1821
1821
  }
1822
1822
  },
1823
+ "/api/report/{report_id}/public": {
1824
+ "get": {
1825
+ "summary": (
1826
+ "#3474: a redacted, self-contained export of a report "
1827
+ "for sharing OUTSIDE the fleet. Every repo not in "
1828
+ "coordinator.yml's reporting.public.allowlist_repos is "
1829
+ "aggregated into one 'private repo' row — no name, "
1830
+ "issue number or title. Refused with 400 when the "
1831
+ "report carries a cost figure but no cost-basis/"
1832
+ "coverage note survives redaction."
1833
+ ),
1834
+ "parameters": [
1835
+ _dashboard_path_param("report_id", "report id from the catalogue"),
1836
+ {
1837
+ "name": "format",
1838
+ "in": "query",
1839
+ "required": False,
1840
+ "schema": {"type": "string", "enum": ["html", "csv"]},
1841
+ "description": (
1842
+ "Absent/`html` returns a self-contained static "
1843
+ "page (data inlined; a declared chart renders "
1844
+ "via a pinned ECharts CDN script). `csv` "
1845
+ "returns the identical redacted rows as "
1846
+ "text/csv. Both ship a Content-Disposition "
1847
+ "filename."
1848
+ ),
1849
+ },
1850
+ ],
1851
+ "responses": {
1852
+ "200": {
1853
+ "description": "OK",
1854
+ "content": {
1855
+ "text/html": {
1856
+ "schema": {"type": "string"},
1857
+ "description": "`?format=html` (default).",
1858
+ },
1859
+ "text/csv": {
1860
+ "schema": {"type": "string"},
1861
+ "description": "`?format=csv`.",
1862
+ },
1863
+ },
1864
+ },
1865
+ "400": {
1866
+ "description": (
1867
+ "Unknown parameter / bad parameter value / "
1868
+ "unknown format / an unstated cost basis "
1869
+ "refused the export"
1870
+ )
1871
+ },
1872
+ "404": {"description": "Unknown report id"},
1873
+ },
1874
+ }
1875
+ },
1823
1876
  "/api/approve": {
1824
1877
  "post": {
1825
1878
  "summary": "Dispatch one or more proposals by id",
@@ -3721,6 +3774,82 @@ def build_app(
3721
3774
  result.to_dict() if isinstance(result, _reports.ReportResult) else result
3722
3775
  )
3723
3776
 
3777
+ async def api_report_export_public(request: Request) -> Response:
3778
+ """GET /api/report/{report_id}/public?format=html|csv&... — a
3779
+ redacted, self-contained export for sharing OUTSIDE the fleet
3780
+ (#3474): the dashboard's ``/reports`` "Share" affordance and
3781
+ ``coord report export --public`` both end up describing the exact
3782
+ same redaction, since both go through
3783
+ ``coord.reports.redact_report_for_public`` — never a second,
3784
+ independently-drifting idea of what "public" means (#2096).
3785
+
3786
+ ``format`` defaults to ``html`` (the self-contained page: data
3787
+ inlined, chart — if any — on a pinned ECharts CDN); ``csv`` returns
3788
+ the identical redacted rows as a download. Every repo not in the
3789
+ loaded ``coordinator.yml``'s ``reporting.public.allowlist_repos``
3790
+ is aggregated into one ``"private repo"`` row with no name, issue
3791
+ number or title. A cost-bearing report whose basis/coverage note
3792
+ did not survive redaction is refused with 400 — "a public number
3793
+ with no stated basis is not produced" (#3474).
3794
+ """
3795
+ from starlette.concurrency import run_in_threadpool # noqa: PLC0415
3796
+
3797
+ from coord import reports as _reports # noqa: PLC0415
3798
+
3799
+ report_id = request.path_params["report_id"]
3800
+ params = dict(request.query_params)
3801
+ fmt = (params.pop("format", "") or "html").strip().lower()
3802
+ if fmt not in ("html", "csv"):
3803
+ return JSONResponse(
3804
+ {"error": f"unknown public export format {fmt!r} — allowed values: html, csv"},
3805
+ status_code=400,
3806
+ )
3807
+ try:
3808
+ if _fixture is not None:
3809
+ raw_result = _fixture.report_result(report_id, params)
3810
+ else:
3811
+ raw_result = await run_in_threadpool(_reports.run_report, report_id, params)
3812
+ except _reports.UnknownReportError as e:
3813
+ return JSONResponse({"error": str(e)}, status_code=404)
3814
+ except _reports.ReportError as e:
3815
+ return JSONResponse({"error": str(e)}, status_code=400)
3816
+ except Exception as e: # noqa: BLE001 — surface a clean 503 rather than a stack trace
3817
+ return JSONResponse(
3818
+ {"error": "report run failed", "detail": str(e)}, status_code=503
3819
+ )
3820
+
3821
+ report_def = _reports.REPORTS.get(report_id)
3822
+ # The app's own bound `config` (fixture or live — see `build_app`'s
3823
+ # own docstring), never a second, independent `coordinator.yml`
3824
+ # read off disk: fixture mode's "every read is answered from the
3825
+ # fixture" promise has to hold for the redaction policy too, not
3826
+ # just the report data being redacted.
3827
+ allowed = frozenset(config.reporting.public.allowlist_repos)
3828
+ redacted = await run_in_threadpool(
3829
+ _reports.redact_report_for_public,
3830
+ raw_result,
3831
+ allowed_repos=allowed,
3832
+ report=report_def,
3833
+ )
3834
+ try:
3835
+ _reports.assert_public_export_allowed(redacted, report_id)
3836
+ except _reports.PublicExportError as e:
3837
+ return JSONResponse({"error": str(e)}, status_code=400)
3838
+
3839
+ if fmt == "csv":
3840
+ body = await run_in_threadpool(_reports.result_to_csv, redacted)
3841
+ filename = _reports.public_csv_filename(redacted)
3842
+ media_type = "text/csv; charset=utf-8"
3843
+ else:
3844
+ body = await run_in_threadpool(_reports.result_to_public_html, redacted)
3845
+ filename = _reports.public_html_filename(redacted)
3846
+ media_type = "text/html; charset=utf-8"
3847
+ return Response(
3848
+ body,
3849
+ media_type=media_type,
3850
+ headers={"Content-Disposition": f'attachment; filename="{filename}"'},
3851
+ )
3852
+
3724
3853
  async def api_approve(request: Request) -> JSONResponse:
3725
3854
  from coord.dispatch import (
3726
3855
  apply_liveness_reroute,
@@ -5666,6 +5795,11 @@ def build_app(
5666
5795
  Route("/api/drive-queue/action", api_drive_queue_action, methods=["POST"]),
5667
5796
  Route("/api/report", api_report_catalogue, methods=["GET"]),
5668
5797
  Route("/api/report/{report_id}", api_report_run, methods=["GET"]),
5798
+ Route(
5799
+ "/api/report/{report_id}/public",
5800
+ api_report_export_public,
5801
+ methods=["GET"],
5802
+ ),
5669
5803
  Route("/api/approve", api_approve, methods=["POST"]),
5670
5804
  Route("/api/reject", api_reject, methods=["POST"]),
5671
5805
  Route("/api/diff/{id}", api_diff, methods=["GET"]),