code-coordinator 0.5.206__tar.gz → 0.5.209__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 (798) hide show
  1. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/CLAUDE.md +14 -0
  2. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/code_coordinator.egg-info/PKG-INFO +1 -1
  4. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/code_coordinator.egg-info/scm_version.json +2 -2
  5. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/dashboard/fixture.py +67 -0
  6. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/dashboard/server.py +269 -1
  7. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/db.py +40 -6
  8. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/gate_a.py +13 -0
  9. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/portal_store.py +90 -0
  10. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/portal_sync.py +321 -7
  11. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/serve_app.py +9 -0
  12. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_dashboard.py +95 -0
  13. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_dashboard_fixture.py +105 -0
  14. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_portal_store.py +30 -0
  15. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_portal_sync.py +336 -0
  16. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/drive_queue.rs +260 -23
  17. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/tests.rs +34 -14
  18. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.claude/commands/board.md +0 -0
  19. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.claude/commands/complete-session.md +0 -0
  20. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.claude/commands/coordinator.md +0 -0
  21. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.githooks/_lib.sh +0 -0
  22. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.githooks/post-checkout +0 -0
  23. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.githooks/post-commit +0 -0
  24. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.githooks/post-merge +0 -0
  25. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  26. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.github/coord-ci-acceptance.yml +0 -0
  27. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.github/workflows/auto-release.yml +0 -0
  28. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.github/workflows/cargo-test.yml +0 -0
  29. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.github/workflows/publish.yml +0 -0
  30. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.github/workflows/release-tui.yml +0 -0
  31. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.github/workflows/test.yml +0 -0
  32. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/.gitignore +0 -0
  33. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/GOAL.md +0 -0
  34. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/LICENSE +0 -0
  35. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/MANIFEST.in +0 -0
  36. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/README.md +0 -0
  37. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/code_coordinator.egg-info/SOURCES.txt +0 -0
  38. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/code_coordinator.egg-info/dependency_links.txt +0 -0
  39. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/code_coordinator.egg-info/entry_points.txt +0 -0
  40. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/code_coordinator.egg-info/requires.txt +0 -0
  41. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/code_coordinator.egg-info/scm_file_list.json +0 -0
  42. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/agent.py +0 -0
  48. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/agent_app.py +0 -0
  49. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/agent_update.py +0 -0
  50. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/agents/opencode/.gitignore +0 -0
  51. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/agents/opencode/agents/work.md +0 -0
  52. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/agents/opencode/routing.jsonc +0 -0
  53. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/audit.py +0 -0
  54. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/auto_loop.py +0 -0
  55. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/block_log.py +0 -0
  56. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/board_bool_guard.py +0 -0
  57. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/board_service.py +0 -0
  58. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/board_wire.py +0 -0
  59. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/brain.py +0 -0
  60. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/branch_model.py +0 -0
  61. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/bug_intake.py +0 -0
  62. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/cargo_cache.py +0 -0
  63. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/ci_fix.py +0 -0
  64. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/ci_github.py +0 -0
  65. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/ci_gitlab.py +0 -0
  66. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/ci_store.py +0 -0
  67. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/claim.py +0 -0
  68. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/cli.py +0 -0
  69. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/client.py +0 -0
  70. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/__init__.py +0 -0
  71. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/_common.py +0 -0
  72. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/acceptance.py +0 -0
  73. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/agent_ops.py +0 -0
  74. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/audit.py +0 -0
  75. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/chat.py +0 -0
  76. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/dispatch.py +0 -0
  77. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/dispatch_workers.py +0 -0
  78. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/drive.py +0 -0
  79. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/drive_queue.py +0 -0
  80. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/gate_a.py +0 -0
  81. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/gates.py +0 -0
  82. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/issues.py +0 -0
  83. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/lifecycle.py +0 -0
  84. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/merge.py +0 -0
  85. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/milestone.py +0 -0
  86. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/plan_followup.py +0 -0
  87. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/plans.py +0 -0
  88. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/portal.py +0 -0
  89. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/release.py +0 -0
  90. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/repo.py +0 -0
  91. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/report.py +0 -0
  92. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/review.py +0 -0
  93. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/scorecard.py +0 -0
  94. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/sessions.py +0 -0
  95. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/setup.py +0 -0
  96. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/status.py +0 -0
  97. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/terminal.py +0 -0
  98. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/test_gate.py +0 -0
  99. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/commands/tui.py +0 -0
  100. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/comments.py +0 -0
  101. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/config.py +0 -0
  102. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/config_reload.py +0 -0
  103. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/confirm_test.py +0 -0
  104. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/conflict_fix.py +0 -0
  105. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/dao.py +0 -0
  106. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/dashboard/__init__.py +0 -0
  107. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/dashboard/index.html +0 -0
  108. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/dead_end.py +0 -0
  110. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/README.md +0 -0
  111. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-agent.service +0 -0
  112. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-db-backup.service +0 -0
  113. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-db-backup.sh +0 -0
  114. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-db-backup.timer +0 -0
  115. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-drive-queue.service +0 -0
  116. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-drive-queue.timer +0 -0
  117. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-notify.service +0 -0
  118. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-notify.timer +0 -0
  119. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-release-propagate.service +0 -0
  120. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-release-propagate.timer +0 -0
  121. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-release-window.service +0 -0
  122. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-release-window.timer +0 -0
  123. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-serve.service +0 -0
  124. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-web-dist-build.service +0 -0
  125. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-web-dist-build.timer +0 -0
  126. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy/coord-web.service +0 -0
  127. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy_manifest.py +0 -0
  128. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deploy_units.py +0 -0
  129. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/deps.py +0 -0
  130. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/diagnose.py +0 -0
  131. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/dispatch.py +0 -0
  132. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/dist_name.py +0 -0
  133. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/drive.py +0 -0
  134. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/drive_queue.py +0 -0
  135. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/drive_state.py +0 -0
  136. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/events.py +0 -0
  137. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/failure_class.py +0 -0
  138. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/filelock.py +0 -0
  139. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/fleet_config_health.py +0 -0
  140. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/forge_availability.py +0 -0
  141. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/freshness.py +0 -0
  142. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/gate_b.py +0 -0
  143. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/gate_snapshot.py +0 -0
  144. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/gates.py +0 -0
  145. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/github_ops.py +0 -0
  146. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/goal.py +0 -0
  147. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/graph_health.py +0 -0
  148. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/__init__.py +0 -0
  149. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/aggregate.py +0 -0
  150. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/__init__.py +0 -0
  151. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/agent_install.py +0 -0
  152. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/cargo_targets.py +0 -0
  153. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/claude_binary.py +0 -0
  154. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/coord_web_ci_pin.py +0 -0
  155. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/deploy_lane_facts.py +0 -0
  156. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/disk.py +0 -0
  157. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/fleet_board.py +0 -0
  158. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  159. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/fleet_phantom.py +0 -0
  160. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/fleet_unit_drift.py +0 -0
  161. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/graph.py +0 -0
  162. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/graphify_cli.py +0 -0
  163. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/index_lock.py +0 -0
  164. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/plan_usage.py +0 -0
  165. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/repo_state.py +0 -0
  166. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/spawned_coord.py +0 -0
  167. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/timer_active.py +0 -0
  168. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/toolchain.py +0 -0
  169. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/unit_drift.py +0 -0
  170. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/unit_enablement.py +0 -0
  171. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/checks/worktrees.py +0 -0
  172. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/cli.py +0 -0
  173. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/context.py +0 -0
  174. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/fleet_snapshot.py +0 -0
  175. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/models.py +0 -0
  176. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/pypi.py +0 -0
  177. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/registry.py +0 -0
  178. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/render.py +0 -0
  179. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/health/units.py +0 -0
  180. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/hooks.py +0 -0
  181. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/housekeeping.py +0 -0
  182. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/interactive.py +0 -0
  183. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/issue_store.py +0 -0
  184. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/liveness_auditor.py +0 -0
  185. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/machine_pause.py +0 -0
  186. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/merge_queue.py +0 -0
  187. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/milestone_chat.py +0 -0
  188. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/milestone_dispatch.py +0 -0
  189. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/milestone_gate.py +0 -0
  190. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/milestone_order.py +0 -0
  191. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/mock_author.py +0 -0
  192. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/models.py +0 -0
  193. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/network.py +0 -0
  194. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/new_issue_chat.py +0 -0
  195. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/__init__.py +0 -0
  196. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/baseline.py +0 -0
  197. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/cli.py +0 -0
  198. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/collect.py +0 -0
  199. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/digest.py +0 -0
  200. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/models.py +0 -0
  201. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/predicate.py +0 -0
  202. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/service.py +0 -0
  203. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/store.py +0 -0
  204. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notifier/transport.py +0 -0
  205. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/notify.py +0 -0
  206. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/openapi.py +0 -0
  207. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/overlap_fence.py +0 -0
  208. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/overlap_predict.py +0 -0
  209. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/parentage.py +0 -0
  210. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/parentage_github.py +0 -0
  211. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/pipeline.py +0 -0
  212. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/plan_parser.py +0 -0
  213. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/plans.py +0 -0
  214. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/platform_paths.py +0 -0
  215. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/portal_bridge.py +0 -0
  216. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/pr_body_lint.py +0 -0
  217. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/prereqs.py +0 -0
  218. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/progress.py +0 -0
  219. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/providers/__init__.py +0 -0
  220. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/providers/base.py +0 -0
  221. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/providers/claude.py +0 -0
  222. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/providers/claude_pty.py +0 -0
  223. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/providers/opencode.py +0 -0
  224. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/queue_diagnose.py +0 -0
  225. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/reconcile.py +0 -0
  226. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/reconcile_tick.py +0 -0
  227. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/refine_chat.py +0 -0
  228. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/release_cordon.py +0 -0
  229. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/release_propagate.py +0 -0
  230. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/release_verify.py +0 -0
  231. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/release_window.py +0 -0
  232. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/repo_edit.py +0 -0
  233. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/repo_onboard.py +0 -0
  234. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/reports.py +0 -0
  235. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/revalidate.py +0 -0
  236. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/review.py +0 -0
  237. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/scorecard.py +0 -0
  238. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/self_health.py +0 -0
  239. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  240. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  241. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  242. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  243. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  244. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/skills/portal-followup/SKILL.md +0 -0
  245. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  246. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  247. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/skills/update-issue/SKILL.md +0 -0
  248. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/smoke.py +0 -0
  249. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/spend_ceiling.py +0 -0
  250. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/split_work.py +0 -0
  251. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/stage_projection.py +0 -0
  252. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/state.py +0 -0
  253. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/test_author.py +0 -0
  254. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/test_chat.py +0 -0
  255. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/test_orchestrator.py +0 -0
  256. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/test_report.py +0 -0
  257. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/tui_release.py +0 -0
  258. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/usage.py +0 -0
  259. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/usage_limits.py +0 -0
  260. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/usage_rollup.py +0 -0
  261. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coord/worker_events.py +0 -0
  262. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/coordinator.example.yml +0 -0
  263. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-agent.service +0 -0
  264. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-db-backup.service +0 -0
  265. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-db-backup.sh +0 -0
  266. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-db-backup.timer +0 -0
  267. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-drive-queue.service +0 -0
  268. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-drive-queue.timer +0 -0
  269. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-notify.service +0 -0
  270. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-notify.timer +0 -0
  271. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-release-propagate.service +0 -0
  272. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-release-propagate.timer +0 -0
  273. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-release-window.service +0 -0
  274. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-release-window.timer +0 -0
  275. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-serve.service +0 -0
  276. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-web-dist-build.service +0 -0
  277. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-web-dist-build.sh +0 -0
  278. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-web-dist-build.timer +0 -0
  279. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-web-rollback.sh +0 -0
  280. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/coord-web.service +0 -0
  281. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/deploy/node-shim.sh +0 -0
  282. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  283. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/ADR_COORD_WEB_CI.md +0 -0
  284. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/ADR_COORD_WEB_DIST.md +0 -0
  285. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/AGENT_OPERATIONS.md +0 -0
  286. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/ARCHITECTURE.md +0 -0
  287. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/ARCH_SECURITY_GATES.md +0 -0
  288. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/COCKPIT.md +0 -0
  289. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/CONTROL_CENTER.md +0 -0
  290. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/COST_DISCIPLINE.md +0 -0
  291. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/CROSS_PLATFORM.md +0 -0
  292. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/CUSTOMER_PORTAL.md +0 -0
  293. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/DRIVE_QUEUE.md +0 -0
  294. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/EPHEMERAL_WORKERS.md +0 -0
  295. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/FORGE_MIGRATION.md +0 -0
  296. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/GRAPHIFY_SETUP.md +0 -0
  297. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/ISSUE_GUIDANCE.md +0 -0
  298. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/MAC_MINI.md +0 -0
  299. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  300. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/NOTIFIER.md +0 -0
  301. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/OPENCODE_VERIFICATION.md +0 -0
  302. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/OPERATING_GOTCHAS.md +0 -0
  303. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/ORACLE_LOOP.md +0 -0
  304. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/PHONE_WEBAPP.md +0 -0
  305. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/PIPELINE_V2.md +0 -0
  306. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/PLATFORM_EVOLUTION.md +0 -0
  307. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/SECOND_BACKEND.md +0 -0
  308. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/STORE_SERVICE.md +0 -0
  309. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  310. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/WEB_CONTROL_CENTER.md +0 -0
  311. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/WSL_WINDOWS_WORKER.md +0 -0
  312. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/mocks/web/README.md +0 -0
  313. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/mocks/web/_tokens.css +0 -0
  314. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/mocks/web/issue-detail.html +0 -0
  315. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/mocks/web/pipeline-narrow.html +0 -0
  316. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/docs/mocks/web/pipeline-wide.html +0 -0
  317. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/graphify-out/.gitignore +0 -0
  318. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/install-agent.sh +0 -0
  319. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/pyproject.toml +0 -0
  320. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/audit_review_verdict_overrides.py +0 -0
  321. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  322. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/build-worker-image.sh +0 -0
  323. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/coordinator-machine.py +0 -0
  324. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/epic-down.sh +0 -0
  325. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/epic-up.sh +0 -0
  326. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/preflight.sh +0 -0
  327. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/provision-worker.sh +0 -0
  328. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  329. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  330. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/azure-workers/verify-github-token.sh +0 -0
  331. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/check_gh_argv_containment.py +0 -0
  332. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/codegen.py +0 -0
  333. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/coord-test-runner.sh +0 -0
  334. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/drive-batch.sh +0 -0
  335. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/gen_board_fixture.py +0 -0
  336. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/gen_mock_index.py +0 -0
  337. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/next_release_tag.py +0 -0
  338. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/run_tests_in_populated_home.sh +0 -0
  339. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/run_tests_without_gh.sh +0 -0
  340. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/smoke_437_interactive.py +0 -0
  341. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/verify_878_review_capture.py +0 -0
  342. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/verify_release_published.py +0 -0
  343. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/scripts/verify_release_wheel.py +0 -0
  344. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/setup.cfg +0 -0
  345. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/SMOKE_SET.md +0 -0
  346. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/__init__.py +0 -0
  347. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  348. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-33/contract.md +0 -0
  349. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-33/manifest.yml +0 -0
  350. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  351. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  352. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  353. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  354. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-37/conftest.py +0 -0
  355. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-37/contract.md +0 -0
  356. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-37/manifest.yml +0 -0
  357. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  358. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  359. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/contract.md +0 -0
  360. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/manifest.yml +0 -0
  361. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  362. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  363. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  364. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  365. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  366. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  367. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  368. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  369. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  370. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  371. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-51/contract.md +0 -0
  372. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  373. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  374. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-51/manifest.yml +0 -0
  375. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  376. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-51/tsconfig.json +0 -0
  377. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  378. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  379. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  380. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/contract.md +0 -0
  381. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  382. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/manifest.yml +0 -0
  383. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  384. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  385. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  386. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  387. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  388. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  389. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  390. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  391. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  392. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  393. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  394. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  395. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/conftest.py +0 -0
  396. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/board-pipeline-basic.json +0 -0
  397. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  398. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  399. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  400. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  401. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/playwright/all_pass.json +0 -0
  402. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  403. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/playwright/mixed_fail.json +0 -0
  404. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  405. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  406. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/playwright/skip.json +0 -0
  407. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/playwright/truncated.json +0 -0
  408. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  409. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  410. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  411. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  412. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  413. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  414. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  415. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  416. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_acceptance.py +0 -0
  417. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_acceptance_drivers.py +0 -0
  418. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent.py +0 -0
  419. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_api_error.py +0 -0
  420. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_app.py +0 -0
  421. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_branch_base.py +0 -0
  422. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_branch_capture.py +0 -0
  423. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_config_free_1712.py +0 -0
  424. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_deploy_units_endpoint.py +0 -0
  425. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_dirty_worktree.py +0 -0
  426. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  427. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_graph_self_heal.py +0 -0
  428. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_health_h3.py +0 -0
  429. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_idle_restart.py +0 -0
  430. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_push_failure.py +0 -0
  431. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_reap.py +0 -0
  432. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_repos_and_pull.py +0 -0
  433. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_restart_services_endpoint.py +0 -0
  434. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_skills_self_heal.py +0 -0
  435. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_startup_diagnostics.py +0 -0
  436. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_update.py +0 -0
  437. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_update_bluegreen.py +0 -0
  438. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_usage_limit.py +0 -0
  439. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_agent_zero_commit.py +0 -0
  440. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_ambient_home_isolation.py +0 -0
  441. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_approve_reject_plan.py +0 -0
  442. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_approve_usage_gate.py +0 -0
  443. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_assignment_already_recorded_daemon.py +0 -0
  444. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_audit_log.py +0 -0
  445. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_audit_outcome.py +0 -0
  446. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_audit_query.py +0 -0
  447. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_auto_loop.py +0 -0
  448. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_auto_release_publish_2035.py +0 -0
  449. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_base_checkout_restore.py +0 -0
  450. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_block_log.py +0 -0
  451. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_board_cap_762.py +0 -0
  452. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_board_fixture.py +0 -0
  453. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_board_read_path.py +0 -0
  454. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_board_service.py +0 -0
  455. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_board_state.py +0 -0
  456. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_board_wire.py +0 -0
  457. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_brain.py +0 -0
  458. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_branch_model.py +0 -0
  459. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_bug_intake.py +0 -0
  460. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_build_worker_image_env_update.py +0 -0
  461. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cargo_cache.py +0 -0
  462. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_check_gh_argv_containment.py +0 -0
  463. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_ci_acceptance_gate_1950.py +0 -0
  464. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_ci_fix.py +0 -0
  465. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_ci_gitlab.py +0 -0
  466. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_ci_parity_2091.py +0 -0
  467. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_ci_store.py +0 -0
  468. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_claim.py +0 -0
  469. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_acceptance.py +0 -0
  470. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_assign.py +0 -0
  471. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  472. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_assign_interactive_remote.py +0 -0
  473. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_assign_provider.py +0 -0
  474. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  475. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_audit.py +0 -0
  476. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_chat_continue.py +0 -0
  477. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_decide.py +0 -0
  478. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_diagnose_config_provenance.py +0 -0
  479. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_diagnose_forge_availability.py +0 -0
  480. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_diagnose_graph.py +0 -0
  481. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_diagnose_self.py +0 -0
  482. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_doctor.py +0 -0
  483. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_doctor_config_free_1801.py +0 -0
  484. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  485. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_drive.py +0 -0
  486. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_drive_queue.py +0 -0
  487. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_escalate.py +0 -0
  488. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_fix_headless_review.py +0 -0
  489. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_gate_a.py +0 -0
  490. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_install_drift.py +0 -0
  491. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_install_skills.py +0 -0
  492. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_issue_create_label.py +0 -0
  493. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_issue_reopen.py +0 -0
  494. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_merge.py +0 -0
  495. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_milestone_assign.py +0 -0
  496. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_milestone_capture.py +0 -0
  497. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_milestone_chat_add_child.py +0 -0
  498. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_milestone_dispatch.py +0 -0
  499. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_milestone_gate_b.py +0 -0
  500. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_milestone_gate_c.py +0 -0
  501. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_milestone_order.py +0 -0
  502. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  503. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_milestone_ship.py +0 -0
  504. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_network.py +0 -0
  505. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_new_issue_chat.py +0 -0
  506. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_plans.py +0 -0
  507. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_portal.py +0 -0
  508. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_pull_artifact.py +0 -0
  509. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_queue.py +0 -0
  510. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_reattach_sessions.py +0 -0
  511. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_refine_board.py +0 -0
  512. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_release_preflight.py +0 -0
  513. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_release_propagate.py +0 -0
  514. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_release_window.py +0 -0
  515. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_repo_2220.py +0 -0
  516. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_scorecard.py +0 -0
  517. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_set_review_findings.py +0 -0
  518. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_status_advisory_terminal.py +0 -0
  519. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_status_merge_queue.py +0 -0
  520. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_status_provider.py +0 -0
  521. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_status_review_finalizing.py +0 -0
  522. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_status_test_failed_tag.py +0 -0
  523. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_status_usage_limit.py +0 -0
  524. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_sync_comments_873.py +0 -0
  525. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_test_plan.py +0 -0
  526. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_track.py +0 -0
  527. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_tui_update.py +0 -0
  528. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cli_wait.py +0 -0
  529. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_client_base_install.py +0 -0
  530. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_comments.py +0 -0
  531. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_completion_summary.py +0 -0
  532. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_config.py +0 -0
  533. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_config_acceptance.py +0 -0
  534. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_config_audit.py +0 -0
  535. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_config_pricing.py +0 -0
  536. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  537. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_config_usage_gate.py +0 -0
  538. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_confirm_test.py +0 -0
  539. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_conflict_fix.py +0 -0
  540. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_conflict_fix_semantic.py +0 -0
  541. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_coord_test.py +0 -0
  542. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_coord_test_runner_baseline.py +0 -0
  543. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_coord_test_runner_populated_home.py +0 -0
  544. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_coord_test_runner_routing.py +0 -0
  545. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_coord_test_runner_toolchain.py +0 -0
  546. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_coord_web_sse_restart_live.py +0 -0
  547. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_coordinator_machine.py +0 -0
  548. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_cross_platform_imports.py +0 -0
  549. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_dashboard_terminal.py +0 -0
  550. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_dashboard_terminal_live.py +0 -0
  551. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_db.py +0 -0
  552. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_dead_end.py +0 -0
  553. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_deploy_coord_db_backup.py +0 -0
  554. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_deploy_coord_web_dist.py +0 -0
  555. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_deploy_coord_web_rollback.py +0 -0
  556. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_deploy_drive_queue_unit.py +0 -0
  557. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_deploy_manifest.py +0 -0
  558. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_deploy_units_lane.py +0 -0
  559. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_deploy_web_unit.py +0 -0
  560. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_deps.py +0 -0
  561. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_diagnose.py +0 -0
  562. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_dispatch.py +0 -0
  563. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_dispatch_target_validation.py +0 -0
  564. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_dist_name.py +0 -0
  565. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_done_housekeeping.py +0 -0
  566. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_drive.py +0 -0
  567. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_drive_queue.py +0 -0
  568. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_drive_state.py +0 -0
  569. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_drive_tmux.py +0 -0
  570. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_epic_up_capability_detection.py +0 -0
  571. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  572. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_epic_up_image_provenance.py +0 -0
  573. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_errors.py +0 -0
  574. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_events.py +0 -0
  575. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_failure_class.py +0 -0
  576. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_filelock.py +0 -0
  577. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  578. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_fix_of_force_override.py +0 -0
  579. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_fleet_config_health.py +0 -0
  580. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_fleet_health_probes.py +0 -0
  581. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_fleet_health_snapshot.py +0 -0
  582. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_forge_availability.py +0 -0
  583. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_freshness.py +0 -0
  584. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_gate_a.py +0 -0
  585. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_gate_b.py +0 -0
  586. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_gate_snapshot_staleness.py +0 -0
  587. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_gates.py +0 -0
  588. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  589. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_gen_mock_index.py +0 -0
  590. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_generated_types_fixture.py +0 -0
  591. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_github_ops.py +0 -0
  592. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_goal.py +0 -0
  593. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_graph_health.py +0 -0
  594. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_graph_selfheal_absent_2237.py +0 -0
  595. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_handoff.py +0 -0
  596. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_checks.py +0 -0
  597. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_cli.py +0 -0
  598. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_cli_graph.py +0 -0
  599. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_config.py +0 -0
  600. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_context.py +0 -0
  601. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_coord_web_ci_pin.py +0 -0
  602. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_deploy_lane_facts.py +0 -0
  603. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_incident_regression.py +0 -0
  604. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_pypi.py +0 -0
  605. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_registry.py +0 -0
  606. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_timer_active.py +0 -0
  607. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_toolchain.py +0 -0
  608. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_unit_drift.py +0 -0
  609. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_health_unit_enablement.py +0 -0
  610. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_hooks.py +0 -0
  611. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_human_attended_437.py +0 -0
  612. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_init.py +0 -0
  613. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_integration.py +0 -0
  614. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_interactive_briefing_echo.py +0 -0
  615. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_interactive_prefill_state.py +0 -0
  616. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_interactive_session_relaunch.py +0 -0
  617. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_interactive_test_verdict_backstop.py +0 -0
  618. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_interactive_token_attribution.py +0 -0
  619. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_interactive_worktree.py +0 -0
  620. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_issue_store_seam.py +0 -0
  621. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_liveness_auditor.py +0 -0
  622. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_liveness_notify.py +0 -0
  623. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_machine_pause.py +0 -0
  624. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_merge_queue.py +0 -0
  625. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_merge_verify.py +0 -0
  626. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_milestone_chat.py +0 -0
  627. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_milestone_dispatch.py +0 -0
  628. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_milestone_gate.py +0 -0
  629. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_milestone_order.py +0 -0
  630. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_milestone_seam.py +0 -0
  631. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_mock_author.py +0 -0
  632. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_model_tiering.py +0 -0
  633. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_models.py +0 -0
  634. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_models_config_labels.py +0 -0
  635. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_needs_attention.py +0 -0
  636. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_network.py +0 -0
  637. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_new_issue_chat.py +0 -0
  638. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_next_release_tag.py +0 -0
  639. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_node_shim.py +0 -0
  640. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notifier_baseline.py +0 -0
  641. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notifier_cli.py +0 -0
  642. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notifier_collect.py +0 -0
  643. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notifier_config.py +0 -0
  644. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notifier_drive_seam.py +0 -0
  645. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notifier_isolation.py +0 -0
  646. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notifier_predicate.py +0 -0
  647. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notifier_quiet_hours.py +0 -0
  648. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notifier_service.py +0 -0
  649. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notify.py +0 -0
  650. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_notify_drain.py +0 -0
  651. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_openapi.py +0 -0
  652. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_operational_defaults.py +0 -0
  653. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_overlap_fence.py +0 -0
  654. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_overlap_predict.py +0 -0
  655. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_packaged_deploy_units.py +0 -0
  656. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_parentage.py +0 -0
  657. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_paste_landed.py +0 -0
  658. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_pipeline.py +0 -0
  659. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_plan_followup_approve_plan_command.py +0 -0
  660. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_plan_followup_pr_command.py +0 -0
  661. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_plan_followup_review_command.py +0 -0
  662. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_plan_only.py +0 -0
  663. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_plan_parser.py +0 -0
  664. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_platform_paths.py +0 -0
  665. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_portal_bridge.py +0 -0
  666. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_portal_config.py +0 -0
  667. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_pr_body_lint.py +0 -0
  668. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_prereqs.py +0 -0
  669. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_production_db_guard.py +0 -0
  670. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_progress.py +0 -0
  671. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_provider_seam.py +0 -0
  672. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_providers.py +0 -0
  673. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_providers_config_labels.py +0 -0
  674. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_providers_pty.py +0 -0
  675. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_quiet_hours.py +0 -0
  676. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_quiet_hours_store_2146.py +0 -0
  677. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reap_merged_sessions.py +0 -0
  678. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reap_stale_interactive_tick.py +0 -0
  679. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reconcile.py +0 -0
  680. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reconcile_branch.py +0 -0
  681. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reconcile_completions.py +0 -0
  682. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reconcile_merges.py +0 -0
  683. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reconcile_no_agent_record.py +0 -0
  684. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reconcile_tick.py +0 -0
  685. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reconcile_usage_limit_done.py +0 -0
  686. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_refine_chat.py +0 -0
  687. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_release_cordon_2101.py +0 -0
  688. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  689. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_release_cordon_deadlock_2240.py +0 -0
  690. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_release_cordon_stuck_2490.py +0 -0
  691. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_release_propagate.py +0 -0
  692. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_release_unified_1242.py +0 -0
  693. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_release_verify.py +0 -0
  694. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_release_window.py +0 -0
  695. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_remote_auto_prune.py +0 -0
  696. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_remote_interactive_reaper.py +0 -0
  697. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_repo_edit_2220.py +0 -0
  698. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_repo_graph_fleet_2237.py +0 -0
  699. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_repo_onboard_2220.py +0 -0
  700. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_report_result_push.py +0 -0
  701. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_reports.py +0 -0
  702. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_retry.py +0 -0
  703. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_retry_advisory_1606.py +0 -0
  704. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_retry_type_1636.py +0 -0
  705. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_revalidate.py +0 -0
  706. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_review.py +0 -0
  707. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_review_end_review_without_verdict.py +0 -0
  708. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_review_parse_failure_diagnostic.py +0 -0
  709. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_review_reaffirm.py +0 -0
  710. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_review_state.py +0 -0
  711. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_review_verdict_backstop.py +0 -0
  712. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_review_verdict_override_audit.py +0 -0
  713. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_review_verdict_relay.py +0 -0
  714. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_review_zero_commits.py +0 -0
  715. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_scoped_review_wiring.py +0 -0
  716. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_scorecard.py +0 -0
  717. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_self_health.py +0 -0
  718. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_serve.py +0 -0
  719. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_serve_app_board_trim.py +0 -0
  720. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_session.py +0 -0
  721. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_slice_issue_attribution.py +0 -0
  722. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_smoke.py +0 -0
  723. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_smoke_live_checkout_restore.py +0 -0
  724. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_smoke_workflow.py +0 -0
  725. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_spend_ceiling.py +0 -0
  726. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_spend_ceiling_coordinator.py +0 -0
  727. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_split.py +0 -0
  728. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_split_work.py +0 -0
  729. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_stage_projection.py +0 -0
  730. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_stalled_pipeline.py +0 -0
  731. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_state.py +0 -0
  732. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_state_review_findings_daemon.py +0 -0
  733. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_status_fleet_footer.py +0 -0
  734. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_stop_1567.py +0 -0
  735. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_stuck.py +0 -0
  736. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_terminal_command.py +0 -0
  737. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_test_author.py +0 -0
  738. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_test_chat.py +0 -0
  739. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_test_orchestrator.py +0 -0
  740. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_test_report.py +0 -0
  741. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_test_verdict_parsing.py +0 -0
  742. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_test_verdict_transcript_floor.py +0 -0
  743. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_thin_client_board_audit.py +0 -0
  744. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_thin_client_config_load_1080.py +0 -0
  745. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_thin_client_daemon_routing_906.py +0 -0
  746. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_tmux_host.py +0 -0
  747. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_tmux_session.py +0 -0
  748. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_transcript_floor.py +0 -0
  749. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_usage.py +0 -0
  750. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_usage_limits.py +0 -0
  751. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_usage_rollup.py +0 -0
  752. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_venv_live_install_2121.py +0 -0
  753. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_version_single_source.py +0 -0
  754. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_watch.py +0 -0
  755. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  756. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_worker_events.py +0 -0
  757. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_worker_image_pin_sync.py +0 -0
  758. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_worker_safety.py +0 -0
  759. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_worker_test_scoping.py +0 -0
  760. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_worktree.py +0 -0
  761. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  762. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/Cargo.lock +0 -0
  763. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/Cargo.toml +0 -0
  764. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/cargo-config-local-quadraui.toml.example +0 -0
  765. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/audit.rs +0 -0
  766. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/chat.rs +0 -0
  767. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/data.rs +0 -0
  768. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/dialogs.rs +0 -0
  769. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/doc_tabs.rs +0 -0
  770. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/drive.rs +0 -0
  771. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/escalation.rs +0 -0
  772. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/events.rs +0 -0
  773. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/fixtures.rs +0 -0
  774. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/fleet_health.rs +0 -0
  775. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/fleet_sessions.rs +0 -0
  776. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/fleet_terminals.rs +0 -0
  777. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/format.rs +0 -0
  778. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/milestone_dag.rs +0 -0
  779. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/mod.rs +0 -0
  780. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/msv.rs +0 -0
  781. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/pipeline.rs +0 -0
  782. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/plans.rs +0 -0
  783. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/render.rs +0 -0
  784. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/reports.rs +0 -0
  785. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/sessions.rs +0 -0
  786. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/settings_ui.rs +0 -0
  787. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/sidebar.rs +0 -0
  788. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/terminal.rs +0 -0
  789. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/types.rs +0 -0
  790. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/app/workspace.rs +0 -0
  791. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/bin/gtk.rs +0 -0
  792. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/commands.rs +0 -0
  793. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/lib.rs +0 -0
  794. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/main.rs +0 -0
  795. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/src/settings.rs +0 -0
  796. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/tests/acceptance.rs +0 -0
  797. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/tests/cli.rs +0 -0
  798. {code_coordinator-0.5.206 → code_coordinator-0.5.209}/tui/tests/fixtures/board_sample.json +0 -0
@@ -10,6 +10,20 @@ CLI tool + per-machine agent server that coordinates Claude Code workers across
10
10
  > [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#design-decisions--the-settled-rationale).
11
11
  > Keep it that way: if a new rule does not change what a worker does, it belongs in `docs/`.
12
12
 
13
+ > **Operator sessions: dispatch, don't do.** If you're the interactive coordinator session —
14
+ > not a dispatched `type=work`/`review` leg — and the user asks for a change in any repo listed
15
+ > in `coordinator.yml`, don't edit that repo's tree yourself: file a GitHub issue and `coord
16
+ > drive-queue add` it. That gets the change tested, independently reviewed, merged, and
17
+ > deployed; hand-editing it here skips all four. (Doc-only edits to *this* repo are the
18
+ > documented exception for *who* does the work — see
19
+ > [`docs/COST_DISCIPLINE.md`](docs/COST_DISCIPLINE.md) — **not** for *how* it lands: every commit
20
+ > on `main`, doc-only ones included, is squash-merged from a branch's PR, never pushed to `main`
21
+ > directly. Use `EnterWorktree`, branch, commit, push, open the PR, let it merge, then
22
+ > `ExitWorktree`.) Caught 2026-08-21: this exact rule used to live inline here, got moved to
23
+ > that linked doc by #2195, and was then skipped — an operator session hand-implemented a
24
+ > natal-chart feature directly instead of dispatching it. If you're a worker or reviewer leg,
25
+ > this paragraph isn't for you.
26
+
13
27
  ## Current Goal — read first
14
28
 
15
29
  **[`GOAL.md`](GOAL.md) holds the current north-star objective** — the living, cross-repo / cross-machine goal that should bias all planning, triage, and dispatch. It is meta-level (above any single issue, repo, or session) and changes as priorities evolve: read it first, plan against it, and keep it current. `coordinator.yml` is the source of truth for *topology*; `GOAL.md` is the source of truth for *intent*.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.206
3
+ Version: 0.5.209
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.206
3
+ Version: 0.5.209
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.206",
2
+ "tag": "0.5.209",
3
3
  "distance": 0,
4
- "node": "g3c2392941a4c874655cc8ccc15a0ef5112a0d822",
4
+ "node": "g8dd6856fa1b46016cf34e83dd691cc4cec06d72e",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-21"
@@ -36,6 +36,8 @@ Fixture schema (every key optional except ``board``)::
36
36
  "machines": [ {...GET /api/machines entry...} ],
37
37
  "sessions": [ {...GET /api/sessions entry...} ],
38
38
  "drive_queue": [ {...coord.state._decode_drive_queue_row shape...} ],
39
+ "report_catalogue": {"reports": [ {...coord.reports.ReportDef.to_dict()...} ]},
40
+ "report_results": {"issue-activity": {...coord.reports.ReportResult.to_dict()...}},
39
41
  "review_findings": {"rev-1": {"verdict": "approve", "body": "..."}},
40
42
  "diffs": {"work-1": "diff --git ..."},
41
43
  "chat_reply": "canned /api/chat response text",
@@ -60,6 +62,7 @@ from __future__ import annotations
60
62
 
61
63
  import copy
62
64
  import json
65
+ from collections.abc import Mapping
63
66
  from dataclasses import MISSING, asdict, dataclass, field, fields
64
67
  from pathlib import Path
65
68
  from typing import Any
@@ -156,6 +159,12 @@ class FixtureServer:
156
159
  machines_raw: list = field(default_factory=list)
157
160
  sessions_raw: list = field(default_factory=list)
158
161
  drive_queue_raw: list = field(default_factory=list)
162
+ #: #2492 RPT-1: `GET /api/report`'s catalogue. `None` (the default) falls
163
+ #: back to the real `coord.reports.catalogue()` — see `report_catalogue()`.
164
+ report_catalogue_raw: dict | None = None
165
+ #: #2492 RPT-1: seeded `GET /api/report/{id}` results, keyed by report id
166
+ #: — see `report_result()`.
167
+ report_results_raw: dict = field(default_factory=dict)
159
168
  review_findings_raw: dict = field(default_factory=dict)
160
169
  diffs: dict = field(default_factory=dict)
161
170
  chat_reply: str = "fixture mode: the coordinator assistant is not wired up."
@@ -210,6 +219,51 @@ class FixtureServer:
210
219
  rows = [r for r in rows if r.get("repo_name") == repo_name]
211
220
  return rows
212
221
 
222
+ def report_catalogue(self) -> dict[str, Any]:
223
+ """The seeded ``GET /api/report`` catalogue (#2492 RPT-1).
224
+
225
+ Unlike the board/drive-queue, ``coord.reports.catalogue()`` is pure
226
+ in-process metadata (report ids/titles/param definitions) — never a
227
+ DB read — so it is already deterministic without seeding. A fixture
228
+ overrides it only when a test wants a different catalogue than
229
+ production's (e.g. a smaller one for a focused scenario); absent an
230
+ override, this falls back to the real registry so `report_result()`
231
+ below (which validates against seeded results, not the catalogue)
232
+ stays the only place a report fixture is actually required.
233
+ """
234
+ if self.report_catalogue_raw is not None:
235
+ return copy.deepcopy(self.report_catalogue_raw)
236
+ from coord import reports as _reports # noqa: PLC0415
237
+
238
+ return _reports.catalogue()
239
+
240
+ def report_result(
241
+ self, report_id: str, params: Mapping[str, Any] | None = None
242
+ ) -> dict[str, Any]:
243
+ """The seeded ``ReportResult``-shaped dict for *report_id* (#2492 RPT-1).
244
+
245
+ Keyed by report id only — one canned result per id, mirroring how
246
+ ``diffs`` is one canned string per assignment id rather than
247
+ branching on request details. ``params`` is accepted only for
248
+ signature symmetry with ``coord.reports.run_report(report_id,
249
+ params)``; a fixture that needs a param-sensitive variant seeds a
250
+ distinct fixture file per scenario, same as every other accessor
251
+ here.
252
+
253
+ Raises the real :class:`coord.reports.UnknownReportError` for a
254
+ report id with no seeded result, so ``GET /api/report/{id}`` returns
255
+ the byte-identical 404 shape in fixture and live mode.
256
+ """
257
+ from coord import reports as _reports # noqa: PLC0415
258
+
259
+ entry = self.report_results_raw.get(report_id)
260
+ if entry is None:
261
+ raise _reports.UnknownReportError(
262
+ f"unknown report {report_id!r} — known reports: "
263
+ f"{', '.join(sorted(self.report_results_raw))}"
264
+ )
265
+ return copy.deepcopy(entry)
266
+
213
267
  def review_findings(self, assignment_id: str) -> tuple[str, str] | None:
214
268
  """Stand-in for ``coord.state.load_assignment_review_findings``.
215
269
 
@@ -353,6 +407,17 @@ def parse_fixture(raw: Any, *, path: Path | None = None) -> FixtureServer:
353
407
  if not all(isinstance(v, str) for v in diffs.values()):
354
408
  raise FixtureError("fixture 'diffs' values must be strings")
355
409
 
410
+ report_catalogue_raw = raw.get("report_catalogue")
411
+ if report_catalogue_raw is not None and not isinstance(report_catalogue_raw, dict):
412
+ raise FixtureError(
413
+ "fixture 'report_catalogue' must be a mapping (the GET /api/report response shape)"
414
+ )
415
+ report_results_raw = _as_dict(raw.get("report_results"), "report_results")
416
+ if not all(isinstance(v, dict) for v in report_results_raw.values()):
417
+ raise FixtureError(
418
+ "fixture 'report_results' values must be mappings (ReportResult wire shape)"
419
+ )
420
+
356
421
  server = FixtureServer(
357
422
  board_payload=board_payload,
358
423
  merge_queue_raw=_as_list(raw.get("merge_queue"), "merge_queue"),
@@ -360,6 +425,8 @@ def parse_fixture(raw: Any, *, path: Path | None = None) -> FixtureServer:
360
425
  machines_raw=_as_list(raw.get("machines"), "machines"),
361
426
  sessions_raw=_as_list(raw.get("sessions"), "sessions"),
362
427
  drive_queue_raw=_as_list(raw.get("drive_queue"), "drive_queue"),
428
+ report_catalogue_raw=report_catalogue_raw,
429
+ report_results_raw=report_results_raw,
363
430
  review_findings_raw=_as_dict(raw.get("review_findings"), "review_findings"),
364
431
  diffs=diffs,
365
432
  events=_parse_events(raw.get("events")),
@@ -15,7 +15,13 @@ from pathlib import Path
15
15
  import httpx
16
16
  from starlette.applications import Starlette
17
17
  from starlette.requests import Request
18
- from starlette.responses import FileResponse, HTMLResponse, JSONResponse, StreamingResponse
18
+ from starlette.responses import (
19
+ FileResponse,
20
+ HTMLResponse,
21
+ JSONResponse,
22
+ Response,
23
+ StreamingResponse,
24
+ )
19
25
  from starlette.routing import Mount, Route, WebSocketRoute
20
26
  from starlette.staticfiles import StaticFiles
21
27
  from starlette.websockets import WebSocket, WebSocketDisconnect
@@ -449,6 +455,119 @@ def openapi_spec() -> dict:
449
455
  "summary": drive_queue_summary_ref,
450
456
  },
451
457
  }
458
+ # #2492 RPT-1: the report engine's wire types. `dataclass_schema` walks
459
+ # `coord.reports` dataclasses straight (like `DriveQueueSummary` above)
460
+ # for the ones its generic dataclass -> JSON-Schema walk actually
461
+ # supports (`RowIdentity`/`ColumnMeta`/`ChartSeries` have no `tuple[...]`
462
+ # or `Callable` fields). `ReportParam`/`ReportDef`/`ChartSpec`/
463
+ # `ReportResult` do — `ReportParam.validate`/`ReportDef.run` are
464
+ # deliberately non-wire (excluded from their own `to_dict()`), and
465
+ # `coord/openapi.py:json_schema_for` has no mapping for `Callable` or
466
+ # `tuple[...]` at all (`ChartSpec.series`, `ReportResult.window`,
467
+ # `ReportDef.params`, `ReportParam.choices` are all tuples on the
468
+ # dataclass but lists on the wire) — so those four are hand-built here,
469
+ # matching each type's own `to_dict()` field-for-field, the same way
470
+ # `board_response`/`session_response` below are hand-built rather than
471
+ # derived. Registered as named `components` refs either way (not inlined
472
+ # like `board_response`) because these are reused across both report
473
+ # routes and are what #1550's TS codegen (`scripts/codegen.py`) emits an
474
+ # `interface` for.
475
+ from coord.reports import ChartSeries, ColumnMeta, RowIdentity # noqa: PLC0415 — mirrors serve_app.py's lazy `reports` import
476
+
477
+ row_identity_ref = dataclass_schema(RowIdentity, components)
478
+ column_meta_ref = dataclass_schema(ColumnMeta, components)
479
+ chart_series_ref = dataclass_schema(ChartSeries, components)
480
+ components["ReportParam"] = {
481
+ "type": "object",
482
+ "properties": {
483
+ "id": {"type": "string"},
484
+ "label": {"type": "string"},
485
+ "kind": {"type": "string", "description": "choice|text"},
486
+ "choices": {"type": "array", "items": {"type": "string"}},
487
+ "default": {"type": "string"},
488
+ "help": {"type": "string"},
489
+ "free_form": {
490
+ "type": "boolean",
491
+ "description": "choices are presets, not a whitelist",
492
+ },
493
+ },
494
+ "required": ["id", "label"],
495
+ }
496
+ report_param_ref = {"$ref": "#/components/schemas/ReportParam"}
497
+ components["ReportDef"] = {
498
+ "type": "object",
499
+ "properties": {
500
+ "id": {"type": "string"},
501
+ "title": {"type": "string"},
502
+ "description": {"type": "string"},
503
+ "params": {"type": "array", "items": report_param_ref},
504
+ "row_identity": {**row_identity_ref, "nullable": True},
505
+ },
506
+ "required": ["id", "title", "description", "params"],
507
+ }
508
+ report_def_ref = {"$ref": "#/components/schemas/ReportDef"}
509
+ components["ChartSpec"] = {
510
+ "type": "object",
511
+ "properties": {
512
+ "kind": {
513
+ "type": "string",
514
+ "description": "open vocabulary — bar|line|sparkline today",
515
+ },
516
+ "series": {"type": "array", "items": chart_series_ref},
517
+ "x": {"type": "string", "nullable": True},
518
+ "group_by": {"type": "string", "nullable": True},
519
+ "stacked": {"type": "boolean"},
520
+ "title": {"type": "string"},
521
+ "y_label": {"type": "string"},
522
+ },
523
+ "required": ["kind", "series"],
524
+ }
525
+ chart_spec_ref = {"$ref": "#/components/schemas/ChartSpec"}
526
+ components["ReportResult"] = {
527
+ "type": "object",
528
+ "properties": {
529
+ "report_id": {"type": "string"},
530
+ "generated_at": {"type": "number"},
531
+ "window": {"type": "array", "items": {"type": "number"}},
532
+ "columns": {"type": "array", "items": {"type": "string"}},
533
+ "column_meta": {"type": "array", "items": column_meta_ref},
534
+ "rows": {"type": "array", "items": {"type": "object"}},
535
+ "notes": {"type": "array", "items": {"type": "string"}},
536
+ "totals": {
537
+ "type": "object",
538
+ "nullable": True,
539
+ "description": (
540
+ "#1763: optional grand-total row keyed by the same "
541
+ "column ids as `rows`. `null` for reports with no "
542
+ "meaningful sum."
543
+ ),
544
+ },
545
+ "chart": {
546
+ **chart_spec_ref,
547
+ "nullable": True,
548
+ "description": (
549
+ "#2271: optional chart declaration — carries no numbers "
550
+ "of its own, the renderer reads the same `rows` the "
551
+ "table does."
552
+ ),
553
+ },
554
+ },
555
+ "required": [
556
+ "report_id",
557
+ "generated_at",
558
+ "window",
559
+ "columns",
560
+ "column_meta",
561
+ "rows",
562
+ "notes",
563
+ ],
564
+ }
565
+ report_result_ref = {"$ref": "#/components/schemas/ReportResult"}
566
+ report_catalogue_response = {
567
+ "type": "object",
568
+ "properties": {"reports": {"type": "array", "items": report_def_ref}},
569
+ "required": ["reports"],
570
+ }
452
571
  board_response = {
453
572
  "type": "object",
454
573
  "properties": {
@@ -580,6 +699,70 @@ def openapi_spec() -> dict:
580
699
  },
581
700
  }
582
701
  },
702
+ "/api/report": {
703
+ "get": {
704
+ "summary": (
705
+ "#2492: the report catalogue — ids, titles, descriptions "
706
+ "and full parameter metadata (kind/choices/default), so "
707
+ "a client builds its parameter form from here rather "
708
+ "than hardcoding it"
709
+ ),
710
+ "responses": {
711
+ "200": {
712
+ "description": "OK",
713
+ "content": {
714
+ "application/json": {"schema": report_catalogue_response}
715
+ },
716
+ }
717
+ },
718
+ }
719
+ },
720
+ "/api/report/{report_id}": {
721
+ "get": {
722
+ "summary": (
723
+ "#2492: run a report and return its ReportResult. "
724
+ "Read-only — no board write, no reconcile side effect. "
725
+ "Query parameters are the report's own params (see "
726
+ "GET /api/report)"
727
+ ),
728
+ "parameters": [
729
+ _dashboard_path_param("report_id", "report id from the catalogue"),
730
+ {
731
+ "name": "format",
732
+ "in": "query",
733
+ "required": False,
734
+ "schema": {"type": "string", "enum": ["json", "csv"]},
735
+ "description": (
736
+ "#1765: response encoding. Absent/`json` returns "
737
+ "the ReportResult unchanged; `csv` returns "
738
+ "text/csv (raw values, `#`-prefixed notes) with "
739
+ "a Content-Disposition filename."
740
+ ),
741
+ },
742
+ ],
743
+ "responses": {
744
+ "200": {
745
+ "description": "OK",
746
+ "content": {
747
+ "application/json": {"schema": report_result_ref},
748
+ "text/csv": {
749
+ "schema": {"type": "string"},
750
+ "description": (
751
+ "`?format=csv`. Header row labelled from "
752
+ "`column_meta`, one row per `rows` entry "
753
+ "with raw values, `notes` as leading `#` "
754
+ "lines."
755
+ ),
756
+ },
757
+ },
758
+ },
759
+ "400": {
760
+ "description": "Unknown parameter / bad parameter value / unknown format"
761
+ },
762
+ "404": {"description": "Unknown report id"},
763
+ },
764
+ }
765
+ },
583
766
  "/api/approve": {
584
767
  "post": {
585
768
  "summary": "Dispatch one or more proposals by id",
@@ -923,6 +1106,22 @@ def build_app(
923
1106
  }
924
1107
  raise ValueError(f"unknown drive-queue action: {action!r}")
925
1108
 
1109
+ def _report_catalogue() -> dict:
1110
+ """The report engine's catalogue — seeded fixture or the real
1111
+ registry (#2492).
1112
+
1113
+ Unlike ``_read_drive_queue()``, there is no daemon-vs-local split to
1114
+ resolve here: ``coord.reports.catalogue()`` is pure in-process
1115
+ metadata (report ids/titles/param definitions), never a DB read, so
1116
+ live mode calls it directly — same as ``coord/serve_app.py``'s own
1117
+ ``get_report_catalogue``.
1118
+ """
1119
+ if _fixture is not None:
1120
+ return _fixture.report_catalogue()
1121
+ from coord import reports as _reports # noqa: PLC0415
1122
+
1123
+ return _reports.catalogue()
1124
+
926
1125
  # ── Real-time event bus ────────────────────────────────────────────────
927
1126
  event_source = EventSource()
928
1127
 
@@ -1395,6 +1594,73 @@ def build_app(
1395
1594
  )
1396
1595
  return JSONResponse({"ok": True})
1397
1596
 
1597
+ async def api_report_catalogue(request: Request) -> Response: # noqa: ARG001 — Starlette handler signature
1598
+ """GET /api/report — the report catalogue (#2492).
1599
+
1600
+ Mirrors ``coord/serve_app.py``'s ``get_report_catalogue`` almost
1601
+ verbatim, just routed through ``_report_catalogue()`` — the
1602
+ fixture-vs-live indirection every handler in this file goes through
1603
+ (see ``_read_board()``/``_read_drive_queue()``).
1604
+ """
1605
+ return JSONResponse(_report_catalogue())
1606
+
1607
+ async def api_report_run(request: Request) -> Response:
1608
+ """GET /api/report/{report_id}?... — run a report and return its
1609
+ ReportResult (#2492).
1610
+
1611
+ Mirrors ``coord/serve_app.py``'s ``get_report`` almost verbatim:
1612
+ ``format`` is popped before param validation (a rendering choice,
1613
+ not a report parameter — #1765), ``UnknownReportError`` -> 404,
1614
+ ``ReportError`` -> 400, anything else -> 503. ``run_report`` reads
1615
+ local state directly (audit_log/issues/assignments) same as the
1616
+ daemon does today, so live mode needs no board-daemon proxy either
1617
+ — only fixture mode swaps the source, via
1618
+ ``_fixture.report_result()``.
1619
+ """
1620
+ from starlette.concurrency import run_in_threadpool # noqa: PLC0415
1621
+
1622
+ from coord import reports as _reports # noqa: PLC0415
1623
+
1624
+ report_id = request.path_params["report_id"]
1625
+ params = dict(request.query_params)
1626
+ # #1765: `format` is a *rendering* choice, not a report parameter —
1627
+ # pop it before validation or `resolve_params` rejects it as an
1628
+ # unknown parameter.
1629
+ fmt = (params.pop("format", "") or "json").strip().lower()
1630
+ if fmt not in ("json", "csv"):
1631
+ return JSONResponse(
1632
+ {"error": f"unknown format {fmt!r} — allowed values: json, csv"},
1633
+ status_code=400,
1634
+ )
1635
+ try:
1636
+ if _fixture is not None:
1637
+ result = _fixture.report_result(report_id, params)
1638
+ else:
1639
+ result = await run_in_threadpool(_reports.run_report, report_id, params)
1640
+ except _reports.UnknownReportError as e:
1641
+ return JSONResponse({"error": str(e)}, status_code=404)
1642
+ except _reports.ReportError as e:
1643
+ return JSONResponse({"error": str(e)}, status_code=400)
1644
+ except Exception as e: # noqa: BLE001 — surface a clean 503 rather than a stack trace
1645
+ return JSONResponse(
1646
+ {"error": "report run failed", "detail": str(e)}, status_code=503
1647
+ )
1648
+ if fmt == "csv":
1649
+ # Same serializer the CLI calls, so `coord report run --format
1650
+ # csv` and this route emit identical bytes for identical params.
1651
+ return Response(
1652
+ _reports.result_to_csv(result),
1653
+ media_type="text/csv; charset=utf-8",
1654
+ headers={
1655
+ "Content-Disposition": (
1656
+ f'attachment; filename="{_reports.csv_filename(result)}"'
1657
+ )
1658
+ },
1659
+ )
1660
+ return JSONResponse(
1661
+ result.to_dict() if isinstance(result, _reports.ReportResult) else result
1662
+ )
1663
+
1398
1664
  async def api_approve(request: Request) -> JSONResponse:
1399
1665
  from coord.dispatch import dispatch, post_briefing, compute_do_not_touch
1400
1666
  from coord.state import (
@@ -2316,6 +2582,8 @@ def build_app(
2316
2582
  Route("/api/proposals", api_proposals, methods=["GET"]),
2317
2583
  Route("/api/drive-queue", api_drive_queue, methods=["GET"]),
2318
2584
  Route("/api/drive-queue/action", api_drive_queue_action, methods=["POST"]),
2585
+ Route("/api/report", api_report_catalogue, methods=["GET"]),
2586
+ Route("/api/report/{report_id}", api_report_run, methods=["GET"]),
2319
2587
  Route("/api/approve", api_approve, methods=["POST"]),
2320
2588
  Route("/api/reject", api_reject, methods=["POST"]),
2321
2589
  Route("/api/diff/{id}", api_diff, methods=["GET"]),
@@ -583,13 +583,35 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
583
583
  -- CHECK pins it to one row so "which cursor?" can never be a
584
584
  -- question). `pull_cursor` is opaque to coord — it is whatever the
585
585
  -- portal handed back — and is the replay point on daemon restart.
586
+ --
587
+ -- `verdict_watermark_at` / `verdict_watermark_rowid` (#2509 review
588
+ -- fix): the verdict consumer's OWN read position into
589
+ -- `portal_events`, independent of the shared `handled_at` column.
590
+ -- `unhandled_events()`/`mark_event_handled()` are shared plumbing —
591
+ -- this consumer only stamps `handled_at` for a `changes_requested`
592
+ -- event it actually dispatched, leaving every other kind (a new
593
+ -- submission, an `approved` verdict, a Q&A answer) NULL by design so
594
+ -- a future consumer can still read it. Scanning by `handled_at IS
595
+ -- NULL` therefore re-returns that growing, never-marked backlog
596
+ -- ahead of anything newer forever once it exceeds one page — a real
597
+ -- `changes-requested` event behind it would never surface. A
598
+ -- private watermark sidesteps that: it advances past every event
599
+ -- this consumer has looked at, acted on or not, so a pile of
600
+ -- non-actionable events cannot block the ones behind it.
601
+ -- `(received_at, rowid)` mirrors `unhandled_events`'s own tiebreaker
602
+ -- ordering.
603
+ -- Both NULL until the first tick with this column runs (an empty
604
+ -- `~/.coord/coord.db` or one predating this migration), read as
605
+ -- `(0.0, 0)` — before every real event's `received_at`/`rowid`.
586
606
  CREATE TABLE IF NOT EXISTS portal_sync_state (
587
- id INTEGER PRIMARY KEY CHECK (id = 1),
588
- pull_cursor TEXT,
589
- last_pull_at REAL,
590
- last_push_at REAL,
591
- last_heartbeat_at REAL,
592
- last_error TEXT NOT NULL DEFAULT ''
607
+ id INTEGER PRIMARY KEY CHECK (id = 1),
608
+ pull_cursor TEXT,
609
+ last_pull_at REAL,
610
+ last_push_at REAL,
611
+ last_heartbeat_at REAL,
612
+ last_error TEXT NOT NULL DEFAULT '',
613
+ verdict_watermark_at REAL,
614
+ verdict_watermark_rowid INTEGER
593
615
  );
594
616
 
595
617
  CREATE INDEX IF NOT EXISTS idx_assignments_status ON assignments(status);
@@ -942,6 +964,18 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
942
964
  # predating this migration, same as the column's own default for a
943
965
  # freshly-enqueued entry.
944
966
  "ALTER TABLE merge_queue ADD COLUMN ci_fix_dispatches INTEGER NOT NULL DEFAULT 0",
967
+ # #2509 review fix: the verdict consumer's own read position into
968
+ # `portal_events` — see the CREATE TABLE comment above for why it
969
+ # cannot reuse the shared `handled_at` column. NULL (read as
970
+ # `(0.0, 0)`, before every real event) for every database predating
971
+ # this migration, which replays the full existing inbox exactly once
972
+ # on upgrade — safe: re-scanning a non-actionable event is a no-op,
973
+ # and `_consume_verdicts` skips (never re-dispatches) any event
974
+ # whose `handled_at` is already set, so an already-consumed
975
+ # `changes_requested` event from before this migration is walked
976
+ # past, not re-sent — see `coord.portal_sync._consume_verdicts`.
977
+ "ALTER TABLE portal_sync_state ADD COLUMN verdict_watermark_at REAL",
978
+ "ALTER TABLE portal_sync_state ADD COLUMN verdict_watermark_rowid INTEGER",
945
979
  ]
946
980
  for sql in migrations:
947
981
  try:
@@ -224,6 +224,19 @@ def make_record(
224
224
  ``verdict`` must be one of :data:`VERDICTS`; anything else is a
225
225
  programming error, not an operator error (the CLI's mutually-exclusive
226
226
  ``--approved``/``--changes`` flags already reject bad input).
227
+
228
+ **Open policy question (#2509, flagged for the operator, not resolved by
229
+ this call or any caller yet):** should an "approved" verdict on the
230
+ customer portal auto-call this with ``verdict=VERDICT_APPROVED`` — i.e.
231
+ does a client's portal sign-off record itself — or does an operator
232
+ still confirm separately via the existing CLI/TUI path? Today nothing
233
+ does the former: ``coord.portal_sync._consume_verdicts`` only acts on
234
+ `changes-requested` (auto-amending the contract) and deliberately leaves
235
+ `approved` events unconsumed rather than silently picking an answer here.
236
+ Whichever way this is eventually decided, an auto-recorded call MUST
237
+ pass ``actor="client via portal"`` (or similarly explicit) — never leave
238
+ ``actor`` to default such that a client's decision reads as if some
239
+ coord process made it.
227
240
  """
228
241
  if verdict not in VERDICTS:
229
242
  raise ValueError(f"unknown Gate A verdict {verdict!r}")