code-coordinator 0.5.206__tar.gz → 0.5.207__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.207}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/db.py +40 -6
  5. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/gate_a.py +13 -0
  6. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/portal_store.py +90 -0
  7. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/portal_sync.py +321 -7
  8. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/serve_app.py +9 -0
  9. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_portal_store.py +30 -0
  10. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_portal_sync.py +336 -0
  11. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.claude/commands/board.md +0 -0
  12. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.claude/commands/complete-session.md +0 -0
  13. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.claude/commands/coordinator.md +0 -0
  14. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.githooks/_lib.sh +0 -0
  15. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.githooks/post-checkout +0 -0
  16. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.githooks/post-commit +0 -0
  17. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.githooks/post-merge +0 -0
  18. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/coord-ci-acceptance.yml +0 -0
  20. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/auto-release.yml +0 -0
  21. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/cargo-test.yml +0 -0
  22. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/publish.yml +0 -0
  23. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/release-tui.yml +0 -0
  24. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.gitignore +0 -0
  26. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/GOAL.md +0 -0
  28. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/LICENSE +0 -0
  29. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/README.md +0 -0
  31. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/SOURCES.txt +0 -0
  32. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/dependency_links.txt +0 -0
  33. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/entry_points.txt +0 -0
  34. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/requires.txt +0 -0
  35. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/scm_file_list.json +0 -0
  36. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/audit.py +0 -0
  48. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/auto_loop.py +0 -0
  49. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/block_log.py +0 -0
  50. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/board_bool_guard.py +0 -0
  51. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/cargo_cache.py +0 -0
  57. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/ci_fix.py +0 -0
  58. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/ci_gitlab.py +0 -0
  60. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/ci_store.py +0 -0
  61. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/claim.py +0 -0
  62. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/cli.py +0 -0
  63. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/client.py +0 -0
  64. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/chat.py +0 -0
  70. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/dispatch.py +0 -0
  71. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/dispatch_workers.py +0 -0
  72. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/drive.py +0 -0
  73. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/drive_queue.py +0 -0
  74. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/gate_a.py +0 -0
  75. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/gates.py +0 -0
  76. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/issues.py +0 -0
  77. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/lifecycle.py +0 -0
  78. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/merge.py +0 -0
  79. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/milestone.py +0 -0
  80. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/plan_followup.py +0 -0
  81. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/plans.py +0 -0
  82. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/portal.py +0 -0
  83. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/release.py +0 -0
  84. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/repo.py +0 -0
  85. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/report.py +0 -0
  86. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/review.py +0 -0
  87. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/scorecard.py +0 -0
  88. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/sessions.py +0 -0
  89. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/setup.py +0 -0
  90. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/status.py +0 -0
  91. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/terminal.py +0 -0
  92. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/test_gate.py +0 -0
  93. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/tui.py +0 -0
  94. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/comments.py +0 -0
  95. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/config.py +0 -0
  96. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/config_reload.py +0 -0
  97. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/confirm_test.py +0 -0
  98. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/conflict_fix.py +0 -0
  99. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dao.py +0 -0
  100. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/__init__.py +0 -0
  101. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/fixture.py +0 -0
  102. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/index.html +0 -0
  103. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/server.py +0 -0
  104. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/terminal.py +0 -0
  105. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dead_end.py +0 -0
  106. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/README.md +0 -0
  107. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-agent.service +0 -0
  108. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-db-backup.service +0 -0
  109. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-db-backup.sh +0 -0
  110. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-db-backup.timer +0 -0
  111. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-drive-queue.service +0 -0
  112. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-drive-queue.timer +0 -0
  113. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-notify.service +0 -0
  114. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-notify.timer +0 -0
  115. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-release-propagate.service +0 -0
  116. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-release-propagate.timer +0 -0
  117. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-release-window.service +0 -0
  118. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-release-window.timer +0 -0
  119. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-serve.service +0 -0
  120. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-web-dist-build.service +0 -0
  121. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-web-dist-build.timer +0 -0
  122. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-web.service +0 -0
  123. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy_manifest.py +0 -0
  124. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy_units.py +0 -0
  125. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deps.py +0 -0
  126. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/diagnose.py +0 -0
  127. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dispatch.py +0 -0
  128. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dist_name.py +0 -0
  129. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/drive.py +0 -0
  130. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/drive_queue.py +0 -0
  131. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/drive_state.py +0 -0
  132. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/events.py +0 -0
  133. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/failure_class.py +0 -0
  134. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/filelock.py +0 -0
  135. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/fleet_config_health.py +0 -0
  136. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/forge_availability.py +0 -0
  137. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/freshness.py +0 -0
  138. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/gate_b.py +0 -0
  139. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/gate_snapshot.py +0 -0
  140. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/gates.py +0 -0
  141. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/github_ops.py +0 -0
  142. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/goal.py +0 -0
  143. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/graph_health.py +0 -0
  144. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/__init__.py +0 -0
  145. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/aggregate.py +0 -0
  146. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/__init__.py +0 -0
  147. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/agent_install.py +0 -0
  148. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/cargo_targets.py +0 -0
  149. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/claude_binary.py +0 -0
  150. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/coord_web_ci_pin.py +0 -0
  151. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/deploy_lane_facts.py +0 -0
  152. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/disk.py +0 -0
  153. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/fleet_board.py +0 -0
  154. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  155. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/fleet_phantom.py +0 -0
  156. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/fleet_unit_drift.py +0 -0
  157. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/graph.py +0 -0
  158. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/graphify_cli.py +0 -0
  159. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/index_lock.py +0 -0
  160. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/plan_usage.py +0 -0
  161. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/repo_state.py +0 -0
  162. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/spawned_coord.py +0 -0
  163. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/timer_active.py +0 -0
  164. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/toolchain.py +0 -0
  165. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/unit_drift.py +0 -0
  166. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/unit_enablement.py +0 -0
  167. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/worktrees.py +0 -0
  168. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/cli.py +0 -0
  169. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/context.py +0 -0
  170. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/fleet_snapshot.py +0 -0
  171. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/models.py +0 -0
  172. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/pypi.py +0 -0
  173. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/registry.py +0 -0
  174. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/render.py +0 -0
  175. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/units.py +0 -0
  176. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/hooks.py +0 -0
  177. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/housekeeping.py +0 -0
  178. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/interactive.py +0 -0
  179. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/issue_store.py +0 -0
  180. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/liveness_auditor.py +0 -0
  181. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/machine_pause.py +0 -0
  182. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/merge_queue.py +0 -0
  183. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/milestone_chat.py +0 -0
  184. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/milestone_dispatch.py +0 -0
  185. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/milestone_gate.py +0 -0
  186. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/milestone_order.py +0 -0
  187. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/mock_author.py +0 -0
  188. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/models.py +0 -0
  189. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/network.py +0 -0
  190. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/new_issue_chat.py +0 -0
  191. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/__init__.py +0 -0
  192. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/baseline.py +0 -0
  193. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/cli.py +0 -0
  194. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/collect.py +0 -0
  195. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/digest.py +0 -0
  196. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/models.py +0 -0
  197. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/predicate.py +0 -0
  198. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/service.py +0 -0
  199. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/store.py +0 -0
  200. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/transport.py +0 -0
  201. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notify.py +0 -0
  202. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/openapi.py +0 -0
  203. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/overlap_fence.py +0 -0
  204. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/overlap_predict.py +0 -0
  205. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/parentage.py +0 -0
  206. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/parentage_github.py +0 -0
  207. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/pipeline.py +0 -0
  208. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/plan_parser.py +0 -0
  209. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/plans.py +0 -0
  210. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/platform_paths.py +0 -0
  211. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/portal_bridge.py +0 -0
  212. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/pr_body_lint.py +0 -0
  213. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/prereqs.py +0 -0
  214. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/progress.py +0 -0
  215. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/__init__.py +0 -0
  216. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/base.py +0 -0
  217. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/claude.py +0 -0
  218. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/claude_pty.py +0 -0
  219. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/opencode.py +0 -0
  220. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/queue_diagnose.py +0 -0
  221. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/reconcile.py +0 -0
  222. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/reconcile_tick.py +0 -0
  223. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/refine_chat.py +0 -0
  224. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/release_cordon.py +0 -0
  225. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/release_propagate.py +0 -0
  226. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/release_verify.py +0 -0
  227. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/release_window.py +0 -0
  228. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/repo_edit.py +0 -0
  229. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/repo_onboard.py +0 -0
  230. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/reports.py +0 -0
  231. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/revalidate.py +0 -0
  232. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/review.py +0 -0
  233. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/scorecard.py +0 -0
  234. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/self_health.py +0 -0
  235. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  236. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  237. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  238. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  239. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  240. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/portal-followup/SKILL.md +0 -0
  241. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  242. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  243. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/update-issue/SKILL.md +0 -0
  244. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/smoke.py +0 -0
  245. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/spend_ceiling.py +0 -0
  246. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/split_work.py +0 -0
  247. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/stage_projection.py +0 -0
  248. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/state.py +0 -0
  249. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/test_author.py +0 -0
  250. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/test_chat.py +0 -0
  251. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/test_orchestrator.py +0 -0
  252. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/test_report.py +0 -0
  253. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/tui_release.py +0 -0
  254. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/usage.py +0 -0
  255. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/usage_limits.py +0 -0
  256. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/usage_rollup.py +0 -0
  257. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/worker_events.py +0 -0
  258. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coordinator.example.yml +0 -0
  259. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-agent.service +0 -0
  260. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-db-backup.service +0 -0
  261. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-db-backup.sh +0 -0
  262. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-db-backup.timer +0 -0
  263. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-drive-queue.service +0 -0
  264. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-drive-queue.timer +0 -0
  265. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-notify.service +0 -0
  266. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-notify.timer +0 -0
  267. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-release-propagate.service +0 -0
  268. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-release-propagate.timer +0 -0
  269. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-release-window.service +0 -0
  270. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-release-window.timer +0 -0
  271. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-serve.service +0 -0
  272. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web-dist-build.service +0 -0
  273. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web-dist-build.sh +0 -0
  274. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web-dist-build.timer +0 -0
  275. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web-rollback.sh +0 -0
  276. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web.service +0 -0
  277. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/node-shim.sh +0 -0
  278. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  279. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ADR_COORD_WEB_CI.md +0 -0
  280. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ADR_COORD_WEB_DIST.md +0 -0
  281. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/AGENT_OPERATIONS.md +0 -0
  282. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ARCHITECTURE.md +0 -0
  283. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ARCH_SECURITY_GATES.md +0 -0
  284. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/COCKPIT.md +0 -0
  285. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/CONTROL_CENTER.md +0 -0
  286. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/COST_DISCIPLINE.md +0 -0
  287. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/CROSS_PLATFORM.md +0 -0
  288. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/CUSTOMER_PORTAL.md +0 -0
  289. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/DRIVE_QUEUE.md +0 -0
  290. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/EPHEMERAL_WORKERS.md +0 -0
  291. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/FORGE_MIGRATION.md +0 -0
  292. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/GRAPHIFY_SETUP.md +0 -0
  293. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ISSUE_GUIDANCE.md +0 -0
  294. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/MAC_MINI.md +0 -0
  295. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  296. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/NOTIFIER.md +0 -0
  297. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/OPENCODE_VERIFICATION.md +0 -0
  298. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/OPERATING_GOTCHAS.md +0 -0
  299. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ORACLE_LOOP.md +0 -0
  300. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/PHONE_WEBAPP.md +0 -0
  301. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/PIPELINE_V2.md +0 -0
  302. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/PLATFORM_EVOLUTION.md +0 -0
  303. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/SECOND_BACKEND.md +0 -0
  304. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/STORE_SERVICE.md +0 -0
  305. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  306. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/WEB_CONTROL_CENTER.md +0 -0
  307. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/WSL_WINDOWS_WORKER.md +0 -0
  308. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/README.md +0 -0
  309. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/_tokens.css +0 -0
  310. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/issue-detail.html +0 -0
  311. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/pipeline-narrow.html +0 -0
  312. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/pipeline-wide.html +0 -0
  313. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/graphify-out/.gitignore +0 -0
  314. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/install-agent.sh +0 -0
  315. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/pyproject.toml +0 -0
  316. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/audit_review_verdict_overrides.py +0 -0
  317. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  318. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/build-worker-image.sh +0 -0
  319. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/coordinator-machine.py +0 -0
  320. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/epic-down.sh +0 -0
  321. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/epic-up.sh +0 -0
  322. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/preflight.sh +0 -0
  323. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/provision-worker.sh +0 -0
  324. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  325. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  326. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/verify-github-token.sh +0 -0
  327. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/check_gh_argv_containment.py +0 -0
  328. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/codegen.py +0 -0
  329. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/coord-test-runner.sh +0 -0
  330. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/drive-batch.sh +0 -0
  331. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/gen_board_fixture.py +0 -0
  332. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/gen_mock_index.py +0 -0
  333. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/next_release_tag.py +0 -0
  334. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/run_tests_in_populated_home.sh +0 -0
  335. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/run_tests_without_gh.sh +0 -0
  336. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/smoke_437_interactive.py +0 -0
  337. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/verify_878_review_capture.py +0 -0
  338. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/verify_release_published.py +0 -0
  339. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/verify_release_wheel.py +0 -0
  340. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/setup.cfg +0 -0
  341. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/SMOKE_SET.md +0 -0
  342. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/__init__.py +0 -0
  343. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  344. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/contract.md +0 -0
  345. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/manifest.yml +0 -0
  346. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  347. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  348. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  349. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  350. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/conftest.py +0 -0
  351. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/contract.md +0 -0
  352. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/manifest.yml +0 -0
  353. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  354. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  355. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/contract.md +0 -0
  356. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/manifest.yml +0 -0
  357. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  358. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  359. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  360. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  361. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  362. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  363. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  364. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  365. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  366. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  367. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/contract.md +0 -0
  368. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  369. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  370. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/manifest.yml +0 -0
  371. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  372. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/tsconfig.json +0 -0
  373. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  374. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  375. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  376. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/contract.md +0 -0
  377. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  378. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/manifest.yml +0 -0
  379. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  380. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  381. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  382. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  383. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  384. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  385. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  386. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  387. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  388. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  389. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  390. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  391. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/conftest.py +0 -0
  392. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/board-pipeline-basic.json +0 -0
  393. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  394. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  395. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  396. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  397. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/all_pass.json +0 -0
  398. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  399. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/mixed_fail.json +0 -0
  400. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  401. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  402. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/skip.json +0 -0
  403. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/truncated.json +0 -0
  404. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  405. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  406. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  407. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  408. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  409. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  410. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  411. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  412. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_acceptance.py +0 -0
  413. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_acceptance_drivers.py +0 -0
  414. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent.py +0 -0
  415. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_api_error.py +0 -0
  416. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_app.py +0 -0
  417. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_branch_base.py +0 -0
  418. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_branch_capture.py +0 -0
  419. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_config_free_1712.py +0 -0
  420. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_deploy_units_endpoint.py +0 -0
  421. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_dirty_worktree.py +0 -0
  422. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  423. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_graph_self_heal.py +0 -0
  424. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_health_h3.py +0 -0
  425. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_idle_restart.py +0 -0
  426. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_push_failure.py +0 -0
  427. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_reap.py +0 -0
  428. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_repos_and_pull.py +0 -0
  429. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_restart_services_endpoint.py +0 -0
  430. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_skills_self_heal.py +0 -0
  431. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_startup_diagnostics.py +0 -0
  432. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_update.py +0 -0
  433. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_update_bluegreen.py +0 -0
  434. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_usage_limit.py +0 -0
  435. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_zero_commit.py +0 -0
  436. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ambient_home_isolation.py +0 -0
  437. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_approve_reject_plan.py +0 -0
  438. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_approve_usage_gate.py +0 -0
  439. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_assignment_already_recorded_daemon.py +0 -0
  440. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_audit_log.py +0 -0
  441. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_audit_outcome.py +0 -0
  442. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_audit_query.py +0 -0
  443. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_auto_loop.py +0 -0
  444. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_auto_release_publish_2035.py +0 -0
  445. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_base_checkout_restore.py +0 -0
  446. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_block_log.py +0 -0
  447. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_cap_762.py +0 -0
  448. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_fixture.py +0 -0
  449. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_read_path.py +0 -0
  450. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_service.py +0 -0
  451. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_state.py +0 -0
  452. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_wire.py +0 -0
  453. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_brain.py +0 -0
  454. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_branch_model.py +0 -0
  455. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_bug_intake.py +0 -0
  456. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_build_worker_image_env_update.py +0 -0
  457. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cargo_cache.py +0 -0
  458. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_check_gh_argv_containment.py +0 -0
  459. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_acceptance_gate_1950.py +0 -0
  460. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_fix.py +0 -0
  461. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_gitlab.py +0 -0
  462. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_parity_2091.py +0 -0
  463. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_store.py +0 -0
  464. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_claim.py +0 -0
  465. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_acceptance.py +0 -0
  466. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign.py +0 -0
  467. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  468. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign_interactive_remote.py +0 -0
  469. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign_provider.py +0 -0
  470. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  471. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_audit.py +0 -0
  472. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_chat_continue.py +0 -0
  473. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_decide.py +0 -0
  474. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_diagnose_config_provenance.py +0 -0
  475. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_diagnose_forge_availability.py +0 -0
  476. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_diagnose_graph.py +0 -0
  477. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_diagnose_self.py +0 -0
  478. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_doctor.py +0 -0
  479. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_doctor_config_free_1801.py +0 -0
  480. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  481. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_drive.py +0 -0
  482. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_drive_queue.py +0 -0
  483. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_escalate.py +0 -0
  484. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_fix_headless_review.py +0 -0
  485. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_gate_a.py +0 -0
  486. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_install_drift.py +0 -0
  487. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_install_skills.py +0 -0
  488. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_issue_create_label.py +0 -0
  489. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_issue_reopen.py +0 -0
  490. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_merge.py +0 -0
  491. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_assign.py +0 -0
  492. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_capture.py +0 -0
  493. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_chat_add_child.py +0 -0
  494. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_dispatch.py +0 -0
  495. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_gate_b.py +0 -0
  496. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_gate_c.py +0 -0
  497. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_order.py +0 -0
  498. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  499. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_ship.py +0 -0
  500. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_network.py +0 -0
  501. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_new_issue_chat.py +0 -0
  502. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_plans.py +0 -0
  503. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_portal.py +0 -0
  504. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_pull_artifact.py +0 -0
  505. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_queue.py +0 -0
  506. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_reattach_sessions.py +0 -0
  507. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_refine_board.py +0 -0
  508. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_release_preflight.py +0 -0
  509. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_release_propagate.py +0 -0
  510. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_release_window.py +0 -0
  511. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_repo_2220.py +0 -0
  512. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_scorecard.py +0 -0
  513. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_set_review_findings.py +0 -0
  514. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_advisory_terminal.py +0 -0
  515. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_merge_queue.py +0 -0
  516. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_provider.py +0 -0
  517. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_review_finalizing.py +0 -0
  518. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_test_failed_tag.py +0 -0
  519. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_usage_limit.py +0 -0
  520. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_sync_comments_873.py +0 -0
  521. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_test_plan.py +0 -0
  522. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_track.py +0 -0
  523. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_tui_update.py +0 -0
  524. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_wait.py +0 -0
  525. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_client_base_install.py +0 -0
  526. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_comments.py +0 -0
  527. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_completion_summary.py +0 -0
  528. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config.py +0 -0
  529. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_acceptance.py +0 -0
  530. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_audit.py +0 -0
  531. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_pricing.py +0 -0
  532. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  533. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_usage_gate.py +0 -0
  534. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_confirm_test.py +0 -0
  535. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_conflict_fix.py +0 -0
  536. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_conflict_fix_semantic.py +0 -0
  537. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test.py +0 -0
  538. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test_runner_baseline.py +0 -0
  539. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test_runner_populated_home.py +0 -0
  540. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test_runner_routing.py +0 -0
  541. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test_runner_toolchain.py +0 -0
  542. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_web_sse_restart_live.py +0 -0
  543. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coordinator_machine.py +0 -0
  544. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cross_platform_imports.py +0 -0
  545. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dashboard.py +0 -0
  546. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dashboard_fixture.py +0 -0
  547. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dashboard_terminal.py +0 -0
  548. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dashboard_terminal_live.py +0 -0
  549. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_db.py +0 -0
  550. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dead_end.py +0 -0
  551. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_coord_db_backup.py +0 -0
  552. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_coord_web_dist.py +0 -0
  553. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_coord_web_rollback.py +0 -0
  554. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_drive_queue_unit.py +0 -0
  555. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_manifest.py +0 -0
  556. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_units_lane.py +0 -0
  557. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_web_unit.py +0 -0
  558. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deps.py +0 -0
  559. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_diagnose.py +0 -0
  560. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dispatch.py +0 -0
  561. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dispatch_target_validation.py +0 -0
  562. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dist_name.py +0 -0
  563. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_done_housekeeping.py +0 -0
  564. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_drive.py +0 -0
  565. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_drive_queue.py +0 -0
  566. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_drive_state.py +0 -0
  567. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_drive_tmux.py +0 -0
  568. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_epic_up_capability_detection.py +0 -0
  569. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  570. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_epic_up_image_provenance.py +0 -0
  571. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_errors.py +0 -0
  572. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_events.py +0 -0
  573. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_failure_class.py +0 -0
  574. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_filelock.py +0 -0
  575. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  576. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_fix_of_force_override.py +0 -0
  577. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_fleet_config_health.py +0 -0
  578. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_fleet_health_probes.py +0 -0
  579. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_fleet_health_snapshot.py +0 -0
  580. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_forge_availability.py +0 -0
  581. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_freshness.py +0 -0
  582. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gate_a.py +0 -0
  583. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gate_b.py +0 -0
  584. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gate_snapshot_staleness.py +0 -0
  585. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gates.py +0 -0
  586. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  587. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gen_mock_index.py +0 -0
  588. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_generated_types_fixture.py +0 -0
  589. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_github_ops.py +0 -0
  590. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_goal.py +0 -0
  591. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_graph_health.py +0 -0
  592. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_graph_selfheal_absent_2237.py +0 -0
  593. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_handoff.py +0 -0
  594. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_checks.py +0 -0
  595. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_cli.py +0 -0
  596. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_cli_graph.py +0 -0
  597. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_config.py +0 -0
  598. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_context.py +0 -0
  599. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_coord_web_ci_pin.py +0 -0
  600. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_deploy_lane_facts.py +0 -0
  601. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_incident_regression.py +0 -0
  602. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_pypi.py +0 -0
  603. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_registry.py +0 -0
  604. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_timer_active.py +0 -0
  605. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_toolchain.py +0 -0
  606. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_unit_drift.py +0 -0
  607. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_unit_enablement.py +0 -0
  608. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_hooks.py +0 -0
  609. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_human_attended_437.py +0 -0
  610. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_init.py +0 -0
  611. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_integration.py +0 -0
  612. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_briefing_echo.py +0 -0
  613. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_prefill_state.py +0 -0
  614. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_session_relaunch.py +0 -0
  615. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_test_verdict_backstop.py +0 -0
  616. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_token_attribution.py +0 -0
  617. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_worktree.py +0 -0
  618. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_issue_store_seam.py +0 -0
  619. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_liveness_auditor.py +0 -0
  620. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_liveness_notify.py +0 -0
  621. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_machine_pause.py +0 -0
  622. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_merge_queue.py +0 -0
  623. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_merge_verify.py +0 -0
  624. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_chat.py +0 -0
  625. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_dispatch.py +0 -0
  626. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_gate.py +0 -0
  627. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_order.py +0 -0
  628. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_seam.py +0 -0
  629. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_mock_author.py +0 -0
  630. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_model_tiering.py +0 -0
  631. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_models.py +0 -0
  632. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_models_config_labels.py +0 -0
  633. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_needs_attention.py +0 -0
  634. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_network.py +0 -0
  635. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_new_issue_chat.py +0 -0
  636. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_next_release_tag.py +0 -0
  637. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_node_shim.py +0 -0
  638. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_baseline.py +0 -0
  639. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_cli.py +0 -0
  640. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_collect.py +0 -0
  641. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_config.py +0 -0
  642. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_drive_seam.py +0 -0
  643. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_isolation.py +0 -0
  644. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_predicate.py +0 -0
  645. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_quiet_hours.py +0 -0
  646. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_service.py +0 -0
  647. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notify.py +0 -0
  648. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notify_drain.py +0 -0
  649. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_openapi.py +0 -0
  650. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_operational_defaults.py +0 -0
  651. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_overlap_fence.py +0 -0
  652. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_overlap_predict.py +0 -0
  653. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_packaged_deploy_units.py +0 -0
  654. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_parentage.py +0 -0
  655. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_paste_landed.py +0 -0
  656. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_pipeline.py +0 -0
  657. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_followup_approve_plan_command.py +0 -0
  658. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_followup_pr_command.py +0 -0
  659. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_followup_review_command.py +0 -0
  660. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_only.py +0 -0
  661. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_parser.py +0 -0
  662. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_platform_paths.py +0 -0
  663. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_portal_bridge.py +0 -0
  664. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_portal_config.py +0 -0
  665. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_pr_body_lint.py +0 -0
  666. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_prereqs.py +0 -0
  667. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_production_db_guard.py +0 -0
  668. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_progress.py +0 -0
  669. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_provider_seam.py +0 -0
  670. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_providers.py +0 -0
  671. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_providers_config_labels.py +0 -0
  672. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_providers_pty.py +0 -0
  673. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_quiet_hours.py +0 -0
  674. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_quiet_hours_store_2146.py +0 -0
  675. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reap_merged_sessions.py +0 -0
  676. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reap_stale_interactive_tick.py +0 -0
  677. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile.py +0 -0
  678. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_branch.py +0 -0
  679. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_completions.py +0 -0
  680. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_merges.py +0 -0
  681. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_no_agent_record.py +0 -0
  682. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_tick.py +0 -0
  683. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_usage_limit_done.py +0 -0
  684. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_refine_chat.py +0 -0
  685. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_cordon_2101.py +0 -0
  686. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  687. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_cordon_deadlock_2240.py +0 -0
  688. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_cordon_stuck_2490.py +0 -0
  689. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_propagate.py +0 -0
  690. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_unified_1242.py +0 -0
  691. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_verify.py +0 -0
  692. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_window.py +0 -0
  693. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_remote_auto_prune.py +0 -0
  694. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_remote_interactive_reaper.py +0 -0
  695. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_repo_edit_2220.py +0 -0
  696. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_repo_graph_fleet_2237.py +0 -0
  697. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_repo_onboard_2220.py +0 -0
  698. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_report_result_push.py +0 -0
  699. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reports.py +0 -0
  700. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_retry.py +0 -0
  701. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_retry_advisory_1606.py +0 -0
  702. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_retry_type_1636.py +0 -0
  703. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_revalidate.py +0 -0
  704. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review.py +0 -0
  705. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_end_review_without_verdict.py +0 -0
  706. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_parse_failure_diagnostic.py +0 -0
  707. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_reaffirm.py +0 -0
  708. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_state.py +0 -0
  709. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_verdict_backstop.py +0 -0
  710. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_verdict_override_audit.py +0 -0
  711. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_verdict_relay.py +0 -0
  712. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_zero_commits.py +0 -0
  713. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_scoped_review_wiring.py +0 -0
  714. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_scorecard.py +0 -0
  715. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_self_health.py +0 -0
  716. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_serve.py +0 -0
  717. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_serve_app_board_trim.py +0 -0
  718. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_session.py +0 -0
  719. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_slice_issue_attribution.py +0 -0
  720. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_smoke.py +0 -0
  721. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_smoke_live_checkout_restore.py +0 -0
  722. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_smoke_workflow.py +0 -0
  723. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_spend_ceiling.py +0 -0
  724. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_spend_ceiling_coordinator.py +0 -0
  725. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_split.py +0 -0
  726. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_split_work.py +0 -0
  727. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_stage_projection.py +0 -0
  728. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_stalled_pipeline.py +0 -0
  729. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_state.py +0 -0
  730. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_state_review_findings_daemon.py +0 -0
  731. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_status_fleet_footer.py +0 -0
  732. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_stop_1567.py +0 -0
  733. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_stuck.py +0 -0
  734. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_terminal_command.py +0 -0
  735. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_author.py +0 -0
  736. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_chat.py +0 -0
  737. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_orchestrator.py +0 -0
  738. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_report.py +0 -0
  739. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_verdict_parsing.py +0 -0
  740. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_verdict_transcript_floor.py +0 -0
  741. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_thin_client_board_audit.py +0 -0
  742. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_thin_client_config_load_1080.py +0 -0
  743. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_thin_client_daemon_routing_906.py +0 -0
  744. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_tmux_host.py +0 -0
  745. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_tmux_session.py +0 -0
  746. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_transcript_floor.py +0 -0
  747. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_usage.py +0 -0
  748. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_usage_limits.py +0 -0
  749. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_usage_rollup.py +0 -0
  750. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_venv_live_install_2121.py +0 -0
  751. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_version_single_source.py +0 -0
  752. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_watch.py +0 -0
  753. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  754. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worker_events.py +0 -0
  755. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worker_image_pin_sync.py +0 -0
  756. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worker_safety.py +0 -0
  757. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worker_test_scoping.py +0 -0
  758. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worktree.py +0 -0
  759. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  760. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/Cargo.lock +0 -0
  761. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/Cargo.toml +0 -0
  762. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/cargo-config-local-quadraui.toml.example +0 -0
  763. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/audit.rs +0 -0
  764. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/chat.rs +0 -0
  765. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/data.rs +0 -0
  766. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/dialogs.rs +0 -0
  767. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/doc_tabs.rs +0 -0
  768. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/drive.rs +0 -0
  769. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/drive_queue.rs +0 -0
  770. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/escalation.rs +0 -0
  771. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/events.rs +0 -0
  772. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/fixtures.rs +0 -0
  773. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/fleet_health.rs +0 -0
  774. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/fleet_sessions.rs +0 -0
  775. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/fleet_terminals.rs +0 -0
  776. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/format.rs +0 -0
  777. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/milestone_dag.rs +0 -0
  778. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/mod.rs +0 -0
  779. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/msv.rs +0 -0
  780. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/pipeline.rs +0 -0
  781. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/plans.rs +0 -0
  782. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/render.rs +0 -0
  783. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/reports.rs +0 -0
  784. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/sessions.rs +0 -0
  785. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/settings_ui.rs +0 -0
  786. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/sidebar.rs +0 -0
  787. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/terminal.rs +0 -0
  788. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/tests.rs +0 -0
  789. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/types.rs +0 -0
  790. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/workspace.rs +0 -0
  791. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/bin/gtk.rs +0 -0
  792. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/commands.rs +0 -0
  793. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/lib.rs +0 -0
  794. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/main.rs +0 -0
  795. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/settings.rs +0 -0
  796. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/tests/acceptance.rs +0 -0
  797. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/tests/cli.rs +0 -0
  798. {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.206
3
+ Version: 0.5.207
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.207
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.207",
3
3
  "distance": 0,
4
- "node": "g3c2392941a4c874655cc8ccc15a0ef5112a0d822",
4
+ "node": "gc33012740fef085a15f6c4a34f631d39225f18b3",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-21"
@@ -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}")
@@ -206,6 +206,44 @@ def unhandled_events(limit: int = 100) -> list[PortalEvent]:
206
206
  return [_event_from_row(r) for r in rows]
207
207
 
208
208
 
209
+ def events_after_verdict_watermark(
210
+ received_at: float, rowid: int, *, limit: int = 100
211
+ ) -> list[tuple[int, PortalEvent]]:
212
+ """Events strictly after ``(received_at, rowid)``, oldest first, with rowid.
213
+
214
+ The verdict consumer's (#2509) OWN scan, independent of the shared
215
+ ``handled_at`` column that :func:`unhandled_events` filters on. That
216
+ column is written by every consumer that ever gets added, but this one
217
+ only stamps it for a ``changes_requested`` event it actually dispatched —
218
+ every other kind is deliberately left ``handled_at IS NULL`` forever so a
219
+ future consumer can still read it. Scanning by ``handled_at IS NULL``
220
+ would therefore re-return that growing, never-marked backlog ahead of
221
+ anything newer on every call, and once it exceeds one page a genuinely
222
+ new ``changes_requested`` event behind it would never surface — see
223
+ :func:`coord.portal_sync._consume_verdicts`. A private, monotonic
224
+ watermark sidesteps that: it advances past every event this consumer has
225
+ *looked at*, whether or not it acted, so a pile of non-actionable events
226
+ cannot block the ones behind it.
227
+
228
+ Returns ``(rowid, event)`` pairs (not just events) so the caller can
229
+ advance the watermark to the exact row it stopped at without a second
230
+ query. ``rowid`` is SQLite's own implicit rowid — stable and unique
231
+ because ``portal_events``' primary key is the (non-integer) ``event_id``,
232
+ not ``rowid`` itself, so declaring the primary key never aliased it away.
233
+ """
234
+ rows = _conn().execute(
235
+ """
236
+ SELECT rowid, * FROM portal_events
237
+ WHERE received_at > ?
238
+ OR (received_at = ? AND rowid > ?)
239
+ ORDER BY received_at ASC, rowid ASC
240
+ LIMIT ?
241
+ """,
242
+ (received_at, received_at, rowid, limit),
243
+ ).fetchall()
244
+ return [(r["rowid"], _event_from_row(r)) for r in rows]
245
+
246
+
209
247
  def mark_event_handled(event_id: str, *, now: float | None = None) -> None:
210
248
  """Stamp an event as consumed. Idempotent — re-stamping is a plain UPDATE."""
211
249
  conn = _conn()
@@ -704,6 +742,8 @@ class SyncState:
704
742
  last_push_at: float | None = None
705
743
  last_heartbeat_at: float | None = None
706
744
  last_error: str = ""
745
+ verdict_watermark_at: float = 0.0
746
+ verdict_watermark_rowid: int = 0
707
747
 
708
748
 
709
749
  def get_sync_state() -> SyncState:
@@ -718,6 +758,8 @@ def get_sync_state() -> SyncState:
718
758
  last_push_at=row["last_push_at"],
719
759
  last_heartbeat_at=row["last_heartbeat_at"],
720
760
  last_error=row["last_error"] or "",
761
+ verdict_watermark_at=row["verdict_watermark_at"] or 0.0,
762
+ verdict_watermark_rowid=row["verdict_watermark_rowid"] or 0,
721
763
  )
722
764
 
723
765
 
@@ -748,6 +790,36 @@ def note_pull(*, now: float | None = None) -> None:
748
790
  _update_sync_state(last_pull_at=time.time() if now is None else now)
749
791
 
750
792
 
793
+ def get_verdict_watermark() -> tuple[float, int]:
794
+ """The verdict consumer's own read position, ``(0.0, 0)`` if never set.
795
+
796
+ ``(0.0, 0)`` sorts before every real ``portal_events`` row (``received_at``
797
+ is a wall-clock epoch stamp, ``rowid`` starts at 1), so a fresh database
798
+ or one predating this column reads as "nothing scanned yet" and the next
799
+ scan starts from the very beginning of the inbox — see
800
+ :func:`events_after_verdict_watermark`.
801
+ """
802
+ row = _conn().execute(
803
+ "SELECT verdict_watermark_at, verdict_watermark_rowid "
804
+ "FROM portal_sync_state WHERE id = 1"
805
+ ).fetchone()
806
+ if row is None or row["verdict_watermark_at"] is None:
807
+ return (0.0, 0)
808
+ return (row["verdict_watermark_at"], row["verdict_watermark_rowid"] or 0)
809
+
810
+
811
+ def set_verdict_watermark(received_at: float, rowid: int) -> None:
812
+ """Advance the verdict consumer's read position past ``(received_at, rowid)``.
813
+
814
+ Called after a scan has looked at that row — regardless of whether it was
815
+ acted on — so a run of non-actionable events cannot make this consumer
816
+ re-scan them forever (#2509 review fix). Independent of
817
+ :func:`mark_event_handled`, which is shared, per-event bookkeeping for
818
+ whatever future consumer looks at ``handled_at`` next.
819
+ """
820
+ _update_sync_state(verdict_watermark_at=received_at, verdict_watermark_rowid=rowid)
821
+
822
+
751
823
  def note_push(*, now: float | None = None) -> None:
752
824
  _update_sync_state(last_push_at=time.time() if now is None else now)
753
825
 
@@ -894,3 +966,21 @@ def list_milestone_links() -> list[PortalLink]:
894
966
 
895
967
  links = [PortalLink.from_dict(raw) for raw in state.list_portal_links()]
896
968
  return [link for link in links if link is not None]
969
+
970
+
971
+ def get_link_by_submission(submission_id: str) -> PortalLink | None:
972
+ """Reverse lookup: the milestone link for a portal ``submission_id``, if any.
973
+
974
+ :func:`link_milestone` / :func:`get_milestone_link` only index the
975
+ forward direction (milestone → submission_id), which is all PDR-3's
976
+ auto-push needs. PDR-4's verdict consumer needs the other direction —
977
+ an inbound event carries only ``submission_id`` and must resolve back to
978
+ the ``(repo_name, milestone_number)`` coord dispatches against. Links are
979
+ few enough (one per submission a customer has ever been sent to) that a
980
+ linear scan of :func:`list_milestone_links` is simply the read path — no
981
+ new index, no new table.
982
+ """
983
+ for link in list_milestone_links():
984
+ if link.submission_id == submission_id:
985
+ return link
986
+ return None
@@ -10,9 +10,25 @@ One pass, in this order:
10
10
  1. **Pull** — customer-authored events since the stored cursor (new
11
11
  submissions · sign-off verdicts · answers to open questions) into the
12
12
  local inbox, then advance the cursor.
13
- 2. **Push** coord-authored facts from the outbox (design rounds · status ·
13
+ 2. **Consume verdicts** (#2509, PDR-4) walk events pulled but not yet
14
+ *scanned by this consumer* (its own watermark —
15
+ :func:`coord.portal_store.events_after_verdict_watermark`, independent of
16
+ the shared ``handled_at`` column) and, for each ``changes-requested``
17
+ sign-off, resolve the linked ``(repo, milestone)`` (#2507, PDR-1) and
18
+ dispatch a targeted Gate-A contract amendment
19
+ (:func:`coord.mock_author.dispatch_acceptance_mock` with
20
+ ``amend_briefing`` set to the client's own comment) — the same
21
+ ``coord acceptance mock --amend`` path an operator would type by hand,
22
+ now triggered by the portal event instead. An event is marked consumed
23
+ (``handled_at``) only once the dispatch itself has succeeded, and the
24
+ watermark stops advancing at the first dispatch failure in a page, so a
25
+ crash — or a stuck dispatch (no idle machine, Gate A already claimed) —
26
+ re-processes that event next tick rather than dropping the client's
27
+ feedback or skipping past it. An ``approved`` verdict is deliberately
28
+ left alone here — see :func:`_consume_verdicts`.
29
+ 3. **Push** — coord-authored facts from the outbox (design rounds · status ·
14
30
  open questions), one row at a time, in per-submission FIFO order.
15
- 3. **Heartbeat** — say the daemon is alive.
31
+ 4. **Heartbeat** — say the daemon is alive.
16
32
 
17
33
  Each phase is independently guarded: a portal outage, a rejected field, or a
18
34
  malformed event can never crash the tick or silence the other two phases (the
@@ -58,6 +74,7 @@ before can be confirmed that way.
58
74
  from __future__ import annotations
59
75
 
60
76
  import logging
77
+ import re
61
78
  from dataclasses import dataclass, field
62
79
  from typing import Any
63
80
 
@@ -130,6 +147,29 @@ MAX_PUSH_PER_TICK = 25
130
147
  #: former freezes a customer's queue forever behind a request that will never
131
148
  #: succeed.
132
149
  MAX_PUSH_ATTEMPTS = 8
150
+ #: Events walked per page by the verdict consumer (#2509). Bounded for the
151
+ #: same reason as the push/pull budgets above — a large backlog must not make
152
+ #: one tick unbounded.
153
+ #:
154
+ #: This consumer tracks its OWN watermark into `portal_events`
155
+ #: (`portal_store.get_verdict_watermark` / `set_verdict_watermark`),
156
+ #: independent of the shared `handled_at` column: a `changes-requested`
157
+ #: sign-off is the only kind ever stamped `handled_at` here, so relying on
158
+ #: `handled_at IS NULL` to decide what is left to scan would mean the
159
+ #: never-marked backlog of every OTHER kind (new submissions, `approved`
160
+ #: verdicts, Q&A answers) piles up ahead of anything newer forever, and once
161
+ #: it exceeds one page a genuinely new `changes-requested` event behind it
162
+ #: would never be seen again by ANY future tick. The watermark advances past
163
+ #: every event this pass has looked at, acted on or not, so a backlog of
164
+ #: non-actionable events cannot block the ones behind it. See
165
+ #: :func:`_consume_verdicts`.
166
+ MAX_VERDICTS_PER_TICK = 100
167
+ #: Pages of `MAX_VERDICTS_PER_TICK` walked in one tick before leaving the
168
+ #: rest for the next — the verdict-consumer counterpart to `MAX_PULL_PAGES`,
169
+ #: for the same reason: a one-time backlog (e.g. the first tick after this
170
+ #: consumer shipped) should drain in a handful of ticks, not one page a
171
+ #: tick forever.
172
+ MAX_VERDICT_PAGES = 10
133
173
 
134
174
 
135
175
  @dataclass(frozen=True)
@@ -138,6 +178,7 @@ class SyncResult:
138
178
 
139
179
  enabled: bool = True
140
180
  pulled: int = 0
181
+ verdicts_consumed: int = 0
141
182
  applied: int = 0
142
183
  rejected: int = 0
143
184
  held: int = 0
@@ -147,7 +188,9 @@ class SyncResult:
147
188
  @property
148
189
  def moved(self) -> bool:
149
190
  """True when this pass actually moved a row in either direction."""
150
- return bool(self.pulled or self.applied or self.rejected)
191
+ return bool(
192
+ self.pulled or self.verdicts_consumed or self.applied or self.rejected
193
+ )
151
194
 
152
195
  def summary(self) -> str:
153
196
  if not self.enabled:
@@ -159,6 +202,7 @@ class SyncResult:
159
202
  return "portal sync: disabled"
160
203
  parts = [
161
204
  f"pulled={self.pulled}",
205
+ f"verdicts_consumed={self.verdicts_consumed}",
162
206
  f"applied={self.applied}",
163
207
  f"rejected={self.rejected}",
164
208
  f"held={self.held}",
@@ -326,11 +370,12 @@ def sync_tick(
326
370
  ``SyncResult(enabled=False)`` having sent nothing. Pass *client*
327
371
  explicitly to bypass config (tests, ``coord portal sync``).
328
372
 
329
- The three phases are independently isolated, deliberately in this order:
373
+ The four phases are independently isolated, deliberately in this order:
330
374
  pull first (a sign-off verdict pulled now can be acted on this same
331
- tick), push second, heartbeat last but unconditionally — a pass that
332
- failed everything else still proves the daemon is alive, and that is
333
- precisely the pass the portal most needs to hear about.
375
+ tick), then verdict consumption (#2509), then push, heartbeat last but
376
+ unconditionally — a pass that failed everything else still proves the
377
+ daemon is alive, and that is precisely the pass the portal most needs to
378
+ hear about.
334
379
  """
335
380
  if client is None:
336
381
  try:
@@ -353,6 +398,19 @@ def sync_tick(
353
398
  errors.append(f"pull: {exc}")
354
399
  logger.warning("portal sync: pull failed", exc_info=True)
355
400
 
401
+ # #2509 (PDR-4): act on whatever the pull above (or an earlier tick) left
402
+ # in the inbox. Isolated exactly like the other phases — a dispatch
403
+ # failure (no idle machine, GitHub down, the milestone's Gate A already
404
+ # claimed) must not silence push or heartbeat, and must not be mistaken
405
+ # for a portal-side problem.
406
+ verdicts_consumed = 0
407
+ try:
408
+ verdicts_consumed, verdict_errors = _consume_verdicts(config, now=now)
409
+ errors.extend(verdict_errors)
410
+ except Exception as exc: # noqa: BLE001
411
+ errors.append(f"verdicts: {exc}")
412
+ logger.warning("portal sync: verdict consumption failed", exc_info=True)
413
+
356
414
  applied = rejected = held = 0
357
415
  try:
358
416
  applied, rejected, held, push_errors = _push(
@@ -391,6 +449,7 @@ def sync_tick(
391
449
  return SyncResult(
392
450
  enabled=True,
393
451
  pulled=pulled,
452
+ verdicts_consumed=verdicts_consumed,
394
453
  applied=applied,
395
454
  rejected=rejected,
396
455
  held=held,
@@ -505,6 +564,261 @@ def _mirror_event(event: dict[str, Any], *, now: float | None) -> None:
505
564
  portal_store.seed_revision(submission_id, revision, now=now)
506
565
 
507
566
 
567
+ # ── consuming portal verdicts (#2509, PDR-4) ────────────────────────────────
568
+ #
569
+ # The counterpart to `enqueue_*` above: those put coord-owned facts on the
570
+ # outbound queue, this acts on customer-owned ones the portal already sent.
571
+ # `portal_store.unhandled_events()` / `mark_event_handled()` have existed as
572
+ # pull-side plumbing since #1982 with zero callers — this consumer is the
573
+ # first, but does NOT scan through `unhandled_events()` (see below).
574
+ #
575
+ # Scope, deliberately narrow: only a `changes-requested` sign-off is acted on
576
+ # here. Every other event kind (a new submission, an `approved` sign-off, an
577
+ # answer to an open question) never gets `handled_at` stamped by this
578
+ # consumer — not lost, just not this ticket's job — so a future consumer can
579
+ # still read it via `unhandled_events()`, and nothing here silently decides a
580
+ # question it wasn't asked. See the "approved" branch below for the specific
581
+ # open question this deliberately does not resolve.
582
+ #
583
+ # That is also exactly why this consumer cannot scan `unhandled_events()`
584
+ # (`handled_at IS NULL`, oldest first) to find its own work: every kind above
585
+ # piles up there FOREVER, always sorted ahead of anything newer, so once that
586
+ # backlog exceeds one page a genuinely new `changes-requested` event behind
587
+ # it would never be returned — not this tick, not any future one (found in
588
+ # review; reproduced by seeding 150 non-actionable events ahead of one
589
+ # `changes_requested` event and running 5 ticks: `consumed == 0` every time,
590
+ # and the targeted event never appeared in `unhandled_events()`'s result at
591
+ # all). Instead this consumer tracks its OWN watermark
592
+ # (`portal_store.get_verdict_watermark` / `set_verdict_watermark`,
593
+ # `events_after_verdict_watermark`) into `portal_events`, which advances past
594
+ # every event it has looked at regardless of what it decided — so a pile of
595
+ # events it will never mark `handled_at` cannot block it from reaching what
596
+ # comes after them.
597
+
598
+
599
+ def _signoff_verdict(event: "portal_store.PortalEvent") -> str | None:
600
+ """The sign-off verdict *event* carries, or ``None`` if it isn't one.
601
+
602
+ The portal's own event contract for a sign-off is not fully pinned down
603
+ yet, so this reads either shape that has been observed: the verdict as a
604
+ suffix on ``type`` (``"signoff.changes_requested"``) or nested in the
605
+ event's ``data``/``fields`` payload (``{"type": "signoff", "data":
606
+ {"verdict": "changes_requested"}}``). Never raises on a malformed event —
607
+ it just returns ``None``, and the event is left unhandled for a human to
608
+ look at rather than mis-filed as "not a sign-off".
609
+ """
610
+ kind = (event.kind or "").strip()
611
+ if not (kind == "signoff" or kind.startswith("signoff.")):
612
+ return None
613
+ if "." in kind:
614
+ suffix = kind.split(".", 1)[1].strip()
615
+ if suffix:
616
+ return suffix
617
+ payload = event.payload if isinstance(event.payload, dict) else {}
618
+ nested = payload.get("data")
619
+ if not isinstance(nested, dict):
620
+ nested = payload.get("fields")
621
+ verdict = nested.get("verdict") if isinstance(nested, dict) else None
622
+ if not isinstance(verdict, str) or not verdict.strip():
623
+ verdict = payload.get("verdict")
624
+ return verdict.strip() if isinstance(verdict, str) and verdict.strip() else None
625
+
626
+
627
+ def _signoff_comment(event: "portal_store.PortalEvent") -> str:
628
+ """The client's own comment text on *event*, or ``""`` if it left none."""
629
+ payload = event.payload if isinstance(event.payload, dict) else {}
630
+ nested = payload.get("data")
631
+ if not isinstance(nested, dict):
632
+ nested = payload.get("fields")
633
+ for source in (nested, payload):
634
+ if not isinstance(source, dict):
635
+ continue
636
+ for key in ("comments", "comment", "message", "note"):
637
+ value = source.get(key)
638
+ if isinstance(value, str) and value.strip():
639
+ return value.strip()
640
+ return ""
641
+
642
+
643
+ def _resolve_tracking_issue(repo_cfg: Any, milestone_number: int) -> int | None:
644
+ """The milestone's tracking (epic) issue number, or ``None`` if unresolved.
645
+
646
+ Every command that dispatches milestone work
647
+ (:func:`coord.mock_author.dispatch_acceptance_mock` included) is keyed by
648
+ tracking-issue number, resolving the milestone FROM it — but a
649
+ :class:`coord.portal_store.PortalLink` only carries the milestone number
650
+ the other direction, inbound events never see a tracking-issue number at
651
+ all. This is the reverse lookup, same approach
652
+ :func:`coord.plans.aggregate_repo_plans` already uses: open issues + the
653
+ closed-epics list, filtered to the one carrying the epic label under this
654
+ milestone (:func:`coord.plans.find_tracking_issue`).
655
+ """
656
+ from coord import github_ops # noqa: PLC0415
657
+ from coord.plans import find_tracking_issue # noqa: PLC0415
658
+
659
+ candidates = github_ops.get_open_issues(repo_cfg.github) + github_ops.get_closed_epics(
660
+ repo_cfg.github
661
+ )
662
+ tracking = find_tracking_issue(milestone_number, candidates)
663
+ return tracking["number"] if tracking is not None else None
664
+
665
+
666
+ def _amend_from_verdict(config: Any, event: "portal_store.PortalEvent") -> None:
667
+ """Dispatch the targeted Gate-A amendment for one `changes-requested` event.
668
+
669
+ Raises on anything that stops the dispatch (no link recorded, unknown
670
+ repo, no resolvable tracking issue, Gate A already claimed, no idle
671
+ machine, ...) — the caller marks the event consumed only if this returns
672
+ normally, so any of these leaves the event to retry next tick rather than
673
+ dropping the client's feedback.
674
+ """
675
+ link = portal_store.get_link_by_submission(event.submission_id)
676
+ if link is None:
677
+ raise RuntimeError(
678
+ f"no milestone is linked to portal submission "
679
+ f"{event.submission_id!r} (coord portal link) — cannot resolve "
680
+ "where to dispatch the amendment"
681
+ )
682
+ repo_cfg = config.repo(link.repo_name)
683
+ if repo_cfg is None:
684
+ raise RuntimeError(
685
+ f"linked repo {link.repo_name!r} is not in coordinator.yml"
686
+ )
687
+
688
+ tracking_issue_number = _resolve_tracking_issue(repo_cfg, link.milestone_number)
689
+ if tracking_issue_number is None:
690
+ raise RuntimeError(
691
+ f"could not resolve a tracking (epic) issue for milestone "
692
+ f"{link.milestone_number} in {link.repo_name!r}"
693
+ )
694
+
695
+ comment = _signoff_comment(event)
696
+ amend_text = comment or (
697
+ "The client requested changes via the portal sign-off but left no "
698
+ f"comment text — check portal submission {event.submission_id!r} "
699
+ "directly for context."
700
+ )
701
+
702
+ from coord.mock_author import dispatch_acceptance_mock # noqa: PLC0415
703
+
704
+ dispatch_acceptance_mock(
705
+ link.repo_name,
706
+ tracking_issue_number,
707
+ config,
708
+ amend_briefing=amend_text,
709
+ )
710
+
711
+
712
+ #: Matches a sign-off verdict's separator, whichever the portal actually
713
+ #: used — a literal hyphen (`"changes-requested"`) or a space
714
+ #: (`"changes requested"`). The portal's own event contract for this field
715
+ #: is not fully pinned down (see `_signoff_verdict`'s docstring), so both are
716
+ #: folded to `_` before comparing against `"changes_requested"` rather than
717
+ #: risking a silent no-match on a contract detail neither side has confirmed.
718
+ _VERDICT_SEPARATOR_RE = re.compile(r"[-\s]+")
719
+
720
+
721
+ def _normalize_verdict(verdict: str) -> str:
722
+ return _VERDICT_SEPARATOR_RE.sub("_", verdict.strip().lower()).strip("_")
723
+
724
+
725
+ def _consume_verdicts(
726
+ config: Any,
727
+ *,
728
+ limit: int = MAX_VERDICTS_PER_TICK,
729
+ pages: int = MAX_VERDICT_PAGES,
730
+ now: float | None = None,
731
+ ) -> tuple[int, list[str]]:
732
+ """Walk the inbox from this consumer's own watermark, acting on every
733
+ `changes-requested` sign-off found.
734
+
735
+ Requires *config* (a real :class:`coord.config.Config`) to resolve the
736
+ linked repo and dispatch through — a bare *client* (the test/CLI bypass
737
+ :func:`sync_tick` also accepts) is not enough to dispatch anything, so
738
+ with no config this is a deliberate no-op rather than a crash.
739
+
740
+ Returns ``(consumed, errors)``. Never raises: every event is handled
741
+ inside its own try/except so one bad event (an unresolved link, a
742
+ machine-picking failure) cannot stop the rest of the *page* — mirroring
743
+ `_push`'s per-row isolation. It CAN, deliberately, stop the watermark: the
744
+ first dispatch failure freezes it at the position just before that event,
745
+ so a still-broken link or a still-claimed Gate A is retried every tick
746
+ rather than silently skipped — the same "an event is marked consumed only
747
+ once the dispatch itself has succeeded" guarantee this module's docstring
748
+ promises, just enforced by a cursor now instead of a shared flag. Events
749
+ already looked at earlier are still walked (and, if newly actionable,
750
+ still acted on) even while frozen — only the PERSISTED watermark holds
751
+ still, so isolation and no-silent-drop both hold at once.
752
+ """
753
+ if config is None:
754
+ return 0, []
755
+ consumed = 0
756
+ errors: list[str] = []
757
+
758
+ initial_at, initial_rowid = portal_store.get_verdict_watermark()
759
+ commit_at, commit_rowid = initial_at, initial_rowid
760
+ scan_at, scan_rowid = initial_at, initial_rowid
761
+ blocked = False
762
+
763
+ for _page_num in range(pages):
764
+ page = portal_store.events_after_verdict_watermark(
765
+ scan_at, scan_rowid, limit=limit
766
+ )
767
+ if not page:
768
+ break
769
+ for rowid, event in page:
770
+ scan_at, scan_rowid = event.received_at, rowid
771
+ if event.handled_at is not None:
772
+ # Already dispatched by an earlier pass — e.g. this tick's
773
+ # commit point is frozen behind a still-failing sibling from a
774
+ # PRIOR tick and this one was successfully handled back then,
775
+ # before that sibling ever failed. Nothing new to do; just
776
+ # let the scan move past it without re-dispatching.
777
+ if not blocked:
778
+ commit_at, commit_rowid = scan_at, scan_rowid
779
+ continue
780
+ verdict = _signoff_verdict(event)
781
+ if verdict is None:
782
+ if not blocked:
783
+ commit_at, commit_rowid = scan_at, scan_rowid
784
+ continue
785
+ if _normalize_verdict(verdict) != "changes_requested":
786
+ # Includes "approved". Whether an approved verdict should
787
+ # auto-record `coord gate-a --approved` (coord/gate_a.py) or
788
+ # wait for a separate operator confirmation is an open policy
789
+ # question (#2509) — deliberately not decided here. Leaving
790
+ # `handled_at` unset means a future consumer can still see it
791
+ # via `unhandled_events()`; advancing the watermark just means
792
+ # THIS consumer will not look at it again, which is separate.
793
+ if not blocked:
794
+ commit_at, commit_rowid = scan_at, scan_rowid
795
+ continue
796
+ try:
797
+ _amend_from_verdict(config, event)
798
+ except Exception as exc: # noqa: BLE001 — one bad event must not stop the page
799
+ errors.append(
800
+ f"verdict {event.event_id} ({event.submission_id}): {exc}"
801
+ )
802
+ logger.warning(
803
+ "portal sync: could not act on changes-requested verdict "
804
+ "for submission %s",
805
+ event.submission_id,
806
+ exc_info=True,
807
+ )
808
+ blocked = True
809
+ continue
810
+ portal_store.mark_event_handled(event.event_id, now=now)
811
+ consumed += 1
812
+ if not blocked:
813
+ commit_at, commit_rowid = scan_at, scan_rowid
814
+ if blocked or len(page) < limit:
815
+ break
816
+
817
+ if (commit_at, commit_rowid) != (initial_at, initial_rowid):
818
+ portal_store.set_verdict_watermark(commit_at, commit_rowid)
819
+ return consumed, errors
820
+
821
+
508
822
  def _push(
509
823
  client: Any, *, limit: int, now: float | None
510
824
  ) -> tuple[int, int, int, list[str]]:
@@ -777,6 +777,15 @@ def _portal_sync_tick(config: Config): # noqa: ANN201 — coord.portal_sync.Syn
777
777
  internet and an outage there must never touch dispatch, merge, or any
778
778
  verdict. The caller's try/except is the belt to that braces.
779
779
 
780
+ As of #2509 (PDR-4), one of `sync_tick`'s phases *is* a verdict: it
781
+ drains events pulled but not yet consumed
782
+ (``coord.portal_store.unhandled_events``) and, for each
783
+ `changes-requested` sign-off, dispatches a targeted Gate-A contract
784
+ amendment (``coord.mock_author.dispatch_acceptance_mock``) against the
785
+ milestone PDR-1's link (``coord portal link``) resolves — the same
786
+ ``coord acceptance mock --amend`` an operator would type by hand, now
787
+ triggered by the client's own portal comment instead.
788
+
780
789
  Extracted as a module-level function so tests can call it directly without
781
790
  wiring up the async ``_tick_loop`` infrastructure (mirrors
782
791
  ``_passive_tick`` / ``_sync_issues_tick``).