code-coordinator 0.5.280__tar.gz → 0.5.282__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 (884) hide show
  1. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agent.py +5 -1
  5. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/portal.py +301 -21
  6. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/config.py +90 -0
  7. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/merge_queue.py +15 -0
  8. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/portal_store.py +390 -1
  9. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/portal_sync.py +150 -10
  10. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_portal.py +279 -0
  11. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_decomposition_chat.py +10 -2
  12. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_merge_queue.py +50 -4
  13. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_portal_config.py +93 -0
  14. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_portal_store.py +310 -0
  15. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_portal_sync.py +270 -5
  16. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.claude/commands/board.md +0 -0
  17. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.claude/commands/complete-session.md +0 -0
  18. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.claude/commands/coordinator.md +0 -0
  19. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.githooks/_lib.sh +0 -0
  20. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.githooks/post-checkout +0 -0
  21. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.githooks/post-commit +0 -0
  22. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.githooks/post-merge +0 -0
  23. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/coord-ci-acceptance.yml +0 -0
  25. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/workflows/auto-release.yml +0 -0
  26. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/workflows/cargo-test.yml +0 -0
  27. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/workflows/publish.yml +0 -0
  28. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.github/workflows/test.yml +0 -0
  29. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/.gitignore +0 -0
  30. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/CLAUDE.md +0 -0
  31. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/GOAL.md +0 -0
  32. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/LICENSE +0 -0
  33. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/MANIFEST.in +0 -0
  34. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/README.md +0 -0
  35. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/SOURCES.txt +0 -0
  36. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/dependency_links.txt +0 -0
  37. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/entry_points.txt +0 -0
  38. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/requires.txt +0 -0
  39. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/scm_file_list.json +0 -0
  40. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/code_coordinator.egg-info/top_level.txt +0 -0
  41. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/__init__.py +0 -0
  42. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/_board_mapping.py +0 -0
  43. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/acceptance.py +0 -0
  44. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/acceptance_drivers.py +0 -0
  45. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agent_app.py +0 -0
  46. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agent_update.py +0 -0
  47. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agents/opencode/.gitignore +0 -0
  48. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agents/opencode/agents/work.md +0 -0
  49. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/agents/opencode/routing.jsonc +0 -0
  50. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/approved_work.py +0 -0
  51. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/audit.py +0 -0
  52. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/auto_loop.py +0 -0
  53. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/block_log.py +0 -0
  54. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/board_bool_guard.py +0 -0
  55. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/board_schema.py +0 -0
  56. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/board_service.py +0 -0
  57. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/board_wire.py +0 -0
  58. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/brain.py +0 -0
  59. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/branch_model.py +0 -0
  60. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/bug_intake.py +0 -0
  61. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/cargo_cache.py +0 -0
  62. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/ci_fix.py +0 -0
  63. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/ci_github.py +0 -0
  64. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/ci_gitlab.py +0 -0
  65. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/ci_store.py +0 -0
  66. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/claim.py +0 -0
  67. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/cli.py +0 -0
  68. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/client.py +0 -0
  69. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/__init__.py +0 -0
  70. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/_common.py +0 -0
  71. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/acceptance.py +0 -0
  72. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/agent_ops.py +0 -0
  73. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/audit.py +0 -0
  74. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/chat.py +0 -0
  75. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/dispatch.py +0 -0
  76. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/dispatch_workers.py +0 -0
  77. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/drive.py +0 -0
  78. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/drive_queue.py +0 -0
  79. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/gate_a.py +0 -0
  80. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/gates.py +0 -0
  81. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/issues.py +0 -0
  82. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/lifecycle.py +0 -0
  83. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/merge.py +0 -0
  84. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/milestone.py +0 -0
  85. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/plan_followup.py +0 -0
  86. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/plans.py +0 -0
  87. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/pr.py +0 -0
  88. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/release.py +0 -0
  89. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/repo.py +0 -0
  90. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/report.py +0 -0
  91. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/review.py +0 -0
  92. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/scorecard.py +0 -0
  93. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/sessions.py +0 -0
  94. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/setup.py +0 -0
  95. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/status.py +0 -0
  96. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/store_migrate.py +0 -0
  97. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/terminal.py +0 -0
  98. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/test_gate.py +0 -0
  99. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/commands/tui.py +0 -0
  100. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/comments.py +0 -0
  101. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/config_reload.py +0 -0
  102. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/confirm_test.py +0 -0
  103. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/conflict_fix.py +0 -0
  104. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dao.py +0 -0
  105. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/__init__.py +0 -0
  106. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/fixture.py +0 -0
  107. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/index.html +0 -0
  108. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/server.py +0 -0
  109. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dashboard/terminal.py +0 -0
  110. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/db.py +0 -0
  111. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dead_end.py +0 -0
  112. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/decomposition_chat.py +0 -0
  113. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/README.md +0 -0
  114. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-agent.service +0 -0
  115. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-db-backup.service +0 -0
  116. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-db-backup.sh +0 -0
  117. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-db-backup.timer +0 -0
  118. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-drive-queue.service +0 -0
  119. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-drive-queue.timer +0 -0
  120. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-failure-notify.service +0 -0
  121. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-fleet-watchdog.service +0 -0
  122. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  123. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-notify.service +0 -0
  124. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-notify.timer +0 -0
  125. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-release-propagate.service +0 -0
  126. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-release-propagate.timer +0 -0
  127. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-release-window.service +0 -0
  128. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-release-window.timer +0 -0
  129. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-serve.service +0 -0
  130. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-web-dist-build.service +0 -0
  131. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-web-dist-build.timer +0 -0
  132. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy/coord-web.service +0 -0
  133. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy_manifest.py +0 -0
  134. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deploy_units.py +0 -0
  135. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/deps.py +0 -0
  136. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/diagnose.py +0 -0
  137. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dispatch.py +0 -0
  138. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/dist_name.py +0 -0
  139. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/drive.py +0 -0
  140. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/drive_queue.py +0 -0
  141. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/drive_state.py +0 -0
  142. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/events.py +0 -0
  143. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/failure_class.py +0 -0
  144. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/filelock.py +0 -0
  145. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/fleet_config_health.py +0 -0
  146. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/forge_availability.py +0 -0
  147. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/freshness.py +0 -0
  148. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/gate_a.py +0 -0
  149. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/gate_b.py +0 -0
  150. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/gate_snapshot.py +0 -0
  151. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/gates.py +0 -0
  152. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/github_ops.py +0 -0
  153. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/github_throttle.py +0 -0
  154. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/goal.py +0 -0
  155. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/graph_health.py +0 -0
  156. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/__init__.py +0 -0
  157. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/aggregate.py +0 -0
  158. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/__init__.py +0 -0
  159. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/agent_install.py +0 -0
  160. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/cargo_targets.py +0 -0
  161. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/claude_binary.py +0 -0
  162. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/coord_web_ci_pin.py +0 -0
  163. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/deploy_lane_facts.py +0 -0
  164. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/disk.py +0 -0
  165. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/fleet_board.py +0 -0
  166. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  167. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/fleet_phantom.py +0 -0
  168. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/fleet_unit_drift.py +0 -0
  169. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/graph.py +0 -0
  170. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/graphify_cli.py +0 -0
  171. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/index_lock.py +0 -0
  172. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/issues_sync_staleness.py +0 -0
  173. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/plan_usage.py +0 -0
  174. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/release_cordon.py +0 -0
  175. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/repo_state.py +0 -0
  176. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/spawned_coord.py +0 -0
  177. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/stalled_pipeline.py +0 -0
  178. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/timer_active.py +0 -0
  179. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/toolchain.py +0 -0
  180. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/unit_drift.py +0 -0
  181. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/unit_enablement.py +0 -0
  182. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/checks/worktrees.py +0 -0
  183. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/cli.py +0 -0
  184. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/context.py +0 -0
  185. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/fleet_snapshot.py +0 -0
  186. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/models.py +0 -0
  187. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/pypi.py +0 -0
  188. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/registry.py +0 -0
  189. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/render.py +0 -0
  190. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/health/units.py +0 -0
  191. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/hooks.py +0 -0
  192. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/housekeeping.py +0 -0
  193. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/interactive.py +0 -0
  194. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/issue_store.py +0 -0
  195. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/issues_sync_status.py +0 -0
  196. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/liveness_auditor.py +0 -0
  197. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/machine_pause.py +0 -0
  198. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/milestone_chat.py +0 -0
  199. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/milestone_dispatch.py +0 -0
  200. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/milestone_gate.py +0 -0
  201. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/milestone_order.py +0 -0
  202. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/mock_author.py +0 -0
  203. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/models.py +0 -0
  204. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/network.py +0 -0
  205. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/new_issue_chat.py +0 -0
  206. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/__init__.py +0 -0
  207. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/baseline.py +0 -0
  208. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/cli.py +0 -0
  209. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/collect.py +0 -0
  210. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/digest.py +0 -0
  211. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/models.py +0 -0
  212. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/predicate.py +0 -0
  213. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/service.py +0 -0
  214. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/store.py +0 -0
  215. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notifier/transport.py +0 -0
  216. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/notify.py +0 -0
  217. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/openapi.py +0 -0
  218. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/overlap_fence.py +0 -0
  219. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/overlap_predict.py +0 -0
  220. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/parentage.py +0 -0
  221. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/parentage_github.py +0 -0
  222. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/pipeline.py +0 -0
  223. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/plan_parser.py +0 -0
  224. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/plans.py +0 -0
  225. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/platform_paths.py +0 -0
  226. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/portal_bridge.py +0 -0
  227. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/pr_body_lint.py +0 -0
  228. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/prereqs.py +0 -0
  229. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/progress.py +0 -0
  230. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/__init__.py +0 -0
  231. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/base.py +0 -0
  232. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/claude.py +0 -0
  233. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/claude_pty.py +0 -0
  234. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/providers/opencode.py +0 -0
  235. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/queue_diagnose.py +0 -0
  236. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/reconcile.py +0 -0
  237. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/reconcile_tick.py +0 -0
  238. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/refine_chat.py +0 -0
  239. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/release_cordon.py +0 -0
  240. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/release_propagate.py +0 -0
  241. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/release_verify.py +0 -0
  242. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/release_window.py +0 -0
  243. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/repo_edit.py +0 -0
  244. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/repo_onboard.py +0 -0
  245. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/reports.py +0 -0
  246. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/rest_schema.py +0 -0
  247. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/revalidate.py +0 -0
  248. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/review.py +0 -0
  249. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/scorecard.py +0 -0
  250. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/self_health.py +0 -0
  251. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/serve_app.py +0 -0
  252. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  253. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  254. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  255. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  256. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  257. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/portal-followup/SKILL.md +0 -0
  258. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/release-now/SKILL.md +0 -0
  259. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  260. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  261. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/skills/update-issue/SKILL.md +0 -0
  262. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/smoke.py +0 -0
  263. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/spend_ceiling.py +0 -0
  264. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/split_work.py +0 -0
  265. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/sql.py +0 -0
  266. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/stage_projection.py +0 -0
  267. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/state.py +0 -0
  268. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/store_migrate.py +0 -0
  269. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/test_author.py +0 -0
  270. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/test_chat.py +0 -0
  271. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/test_orchestrator.py +0 -0
  272. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/test_report.py +0 -0
  273. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/tui_release.py +0 -0
  274. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/usage.py +0 -0
  275. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/usage_limits.py +0 -0
  276. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/usage_rollup.py +0 -0
  277. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coord/worker_events.py +0 -0
  278. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/coordinator.example.yml +0 -0
  279. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-agent.service +0 -0
  280. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-db-backup.service +0 -0
  281. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-db-backup.sh +0 -0
  282. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-db-backup.timer +0 -0
  283. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-drive-queue.service +0 -0
  284. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-drive-queue.timer +0 -0
  285. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-failure-notify.service +0 -0
  286. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-failure-notify.sh +0 -0
  287. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-fleet-watchdog.service +0 -0
  288. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-fleet-watchdog.timer +0 -0
  289. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-notify.service +0 -0
  290. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-notify.timer +0 -0
  291. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-release-propagate.service +0 -0
  292. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-release-propagate.timer +0 -0
  293. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-release-window.service +0 -0
  294. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-release-window.timer +0 -0
  295. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-serve.service +0 -0
  296. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web-dist-build.service +0 -0
  297. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web-dist-build.sh +0 -0
  298. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web-dist-build.timer +0 -0
  299. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web-rollback.sh +0 -0
  300. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/coord-web.service +0 -0
  301. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/deploy/node-shim.sh +0 -0
  302. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  303. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ADR_COORD_WEB_CI.md +0 -0
  304. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ADR_COORD_WEB_DIST.md +0 -0
  305. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/AGENT_OPERATIONS.md +0 -0
  306. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ARCHITECTURE.md +0 -0
  307. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ARCH_SECURITY_GATES.md +0 -0
  308. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/COCKPIT.md +0 -0
  309. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/CONTROL_CENTER.md +0 -0
  310. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/COST_DISCIPLINE.md +0 -0
  311. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/CROSS_PLATFORM.md +0 -0
  312. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/CUSTOMER_FACING_APPS.md +0 -0
  313. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/CUSTOMER_PORTAL.md +0 -0
  314. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/DRIVE_QUEUE.md +0 -0
  315. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/EPHEMERAL_WORKERS.md +0 -0
  316. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/FORGE_MIGRATION.md +0 -0
  317. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/GRAPHIFY_SETUP.md +0 -0
  318. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ISSUE_GUIDANCE.md +0 -0
  319. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/MAC_MINI.md +0 -0
  320. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  321. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/NOTIFIER.md +0 -0
  322. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/OPENCODE_VERIFICATION.md +0 -0
  323. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/OPERATING_GOTCHAS.md +0 -0
  324. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/OPERATOR_GUIDES.md +0 -0
  325. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/ORACLE_LOOP.md +0 -0
  326. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/PHONE_WEBAPP.md +0 -0
  327. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/PIPELINE_V2.md +0 -0
  328. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/PLATFORM_EVOLUTION.md +0 -0
  329. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/SECOND_BACKEND.md +0 -0
  330. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/STORE_SERVICE.md +0 -0
  331. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  332. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/WEB_CONTROL_CENTER.md +0 -0
  333. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/WSL_WINDOWS_WORKER.md +0 -0
  334. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/README.md +0 -0
  335. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/_tokens.css +0 -0
  336. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/issue-detail.html +0 -0
  337. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/pipeline-narrow.html +0 -0
  338. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/docs/mocks/web/pipeline-wide.html +0 -0
  339. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/graphify-out/.gitignore +0 -0
  340. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/install-agent.sh +0 -0
  341. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/pyproject.toml +0 -0
  342. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/audit_review_verdict_overrides.py +0 -0
  343. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  344. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/build-worker-image.sh +0 -0
  345. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/coordinator-machine.py +0 -0
  346. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/epic-down.sh +0 -0
  347. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/epic-up.sh +0 -0
  348. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/preflight.sh +0 -0
  349. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/provision-worker.sh +0 -0
  350. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  351. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  352. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/azure-workers/verify-github-token.sh +0 -0
  353. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/check_gh_argv_containment.py +0 -0
  354. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/codegen.py +0 -0
  355. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/coord-test-runner.sh +0 -0
  356. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/coord-venv-rollback.sh +0 -0
  357. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/drive-batch.sh +0 -0
  358. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/fleet_watchdog.py +0 -0
  359. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/gen_board_fixture.py +0 -0
  360. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/gen_mock_index.py +0 -0
  361. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/next_release_tag.py +0 -0
  362. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/run_tests_in_populated_home.sh +0 -0
  363. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/run_tests_without_gh.sh +0 -0
  364. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/smoke_437_interactive.py +0 -0
  365. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/verify_878_review_capture.py +0 -0
  366. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/verify_release_published.py +0 -0
  367. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/scripts/verify_release_wheel.py +0 -0
  368. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/setup.cfg +0 -0
  369. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/SMOKE_SET.md +0 -0
  370. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/__init__.py +0 -0
  371. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/conftest.py +0 -0
  372. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/contract.md +0 -0
  373. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/manifest.yml +0 -0
  374. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  375. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  376. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/contract.md +0 -0
  377. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  378. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  379. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/manifest.yml +0 -0
  380. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  381. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-51/tsconfig.json +0 -0
  382. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  383. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/backends.py +0 -0
  384. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/conftest.py +0 -0
  385. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/board-pipeline-basic.json +0 -0
  386. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  387. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  388. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  389. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  390. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/all_pass.json +0 -0
  391. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  392. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/mixed_fail.json +0 -0
  393. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  394. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  395. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/skip.json +0 -0
  396. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/playwright/truncated.json +0 -0
  397. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  398. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  399. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  400. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  401. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  402. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  403. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  404. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  405. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_acceptance.py +0 -0
  406. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_acceptance_drivers.py +0 -0
  407. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent.py +0 -0
  408. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_api_error.py +0 -0
  409. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_app.py +0 -0
  410. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_branch_base.py +0 -0
  411. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_branch_capture.py +0 -0
  412. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_config_free_1712.py +0 -0
  413. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_deploy_units_endpoint.py +0 -0
  414. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_dirty_worktree.py +0 -0
  415. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  416. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_graph_self_heal.py +0 -0
  417. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_health_h3.py +0 -0
  418. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_idle_restart.py +0 -0
  419. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_push_failure.py +0 -0
  420. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_reap.py +0 -0
  421. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_repos_and_pull.py +0 -0
  422. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_restart_services_endpoint.py +0 -0
  423. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_skills_self_heal.py +0 -0
  424. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_startup_diagnostics.py +0 -0
  425. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_update.py +0 -0
  426. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_update_bluegreen.py +0 -0
  427. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_usage_limit.py +0 -0
  428. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_agent_zero_commit.py +0 -0
  429. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ambient_home_isolation.py +0 -0
  430. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_approve_dependency_busy_2804.py +0 -0
  431. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_approve_reject_plan.py +0 -0
  432. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_approve_usage_gate.py +0 -0
  433. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_approved_work_2532.py +0 -0
  434. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_assignment_already_recorded_daemon.py +0 -0
  435. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_audit_log.py +0 -0
  436. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_audit_outcome.py +0 -0
  437. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_audit_query.py +0 -0
  438. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_auto_loop.py +0 -0
  439. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_auto_release_publish_2035.py +0 -0
  440. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_backend_selection.py +0 -0
  441. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_base_checkout_restore.py +0 -0
  442. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_block_log.py +0 -0
  443. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_cap_762.py +0 -0
  444. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_fixture.py +0 -0
  445. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_read_path.py +0 -0
  446. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_schema.py +0 -0
  447. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_service.py +0 -0
  448. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_state.py +0 -0
  449. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_board_wire.py +0 -0
  450. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_brain.py +0 -0
  451. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_branch_model.py +0 -0
  452. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_bug_intake.py +0 -0
  453. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_build_worker_image_env_update.py +0 -0
  454. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cargo_cache.py +0 -0
  455. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_check_gh_argv_containment.py +0 -0
  456. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_acceptance_gate_1950.py +0 -0
  457. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_fix.py +0 -0
  458. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_gitlab.py +0 -0
  459. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_parity_2091.py +0 -0
  460. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_ci_store.py +0 -0
  461. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_claim.py +0 -0
  462. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_claude_md_budget.py +0 -0
  463. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_acceptance.py +0 -0
  464. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign.py +0 -0
  465. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  466. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign_interactive_remote.py +0 -0
  467. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign_provider.py +0 -0
  468. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  469. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_audit.py +0 -0
  470. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_chat_continue.py +0 -0
  471. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_decide.py +0 -0
  472. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_diagnose_config_provenance.py +0 -0
  473. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_diagnose_forge_availability.py +0 -0
  474. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_diagnose_graph.py +0 -0
  475. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_diagnose_self.py +0 -0
  476. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_doctor.py +0 -0
  477. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_doctor_config_free_1801.py +0 -0
  478. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  479. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_drive.py +0 -0
  480. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_drive_queue.py +0 -0
  481. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_escalate.py +0 -0
  482. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_fix_headless_review.py +0 -0
  483. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_gate_a.py +0 -0
  484. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_install_drift.py +0 -0
  485. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_install_skills.py +0 -0
  486. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_issue_comment.py +0 -0
  487. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_issue_create_label.py +0 -0
  488. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_issue_reopen.py +0 -0
  489. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_issue_view_list.py +0 -0
  490. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_merge.py +0 -0
  491. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_assign.py +0 -0
  492. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_capture.py +0 -0
  493. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_chat_add_child.py +0 -0
  494. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_dispatch.py +0 -0
  495. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_gate_b.py +0 -0
  496. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_gate_c.py +0 -0
  497. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_order.py +0 -0
  498. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  499. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_milestone_ship.py +0 -0
  500. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_network.py +0 -0
  501. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_new_issue_chat.py +0 -0
  502. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_plans.py +0 -0
  503. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_pr.py +0 -0
  504. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_pull_artifact.py +0 -0
  505. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_queue.py +0 -0
  506. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_reattach_sessions.py +0 -0
  507. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_refine_board.py +0 -0
  508. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_release_preflight.py +0 -0
  509. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_release_propagate.py +0 -0
  510. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_release_window.py +0 -0
  511. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_repo_2220.py +0 -0
  512. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  513. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_scorecard.py +0 -0
  514. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_set_review_findings.py +0 -0
  515. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_advisory_terminal.py +0 -0
  516. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_contested_tag.py +0 -0
  517. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_merge_queue.py +0 -0
  518. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_provider.py +0 -0
  519. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_review_finalizing.py +0 -0
  520. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_test_failed_tag.py +0 -0
  521. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_status_usage_limit.py +0 -0
  522. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_sync_comments_873.py +0 -0
  523. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_test_plan.py +0 -0
  524. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_track.py +0 -0
  525. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_tui_update.py +0 -0
  526. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cli_wait.py +0 -0
  527. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_client_base_install.py +0 -0
  528. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_commands_common.py +0 -0
  529. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_comments.py +0 -0
  530. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_completion_summary.py +0 -0
  531. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config.py +0 -0
  532. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_acceptance.py +0 -0
  533. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_audit.py +0 -0
  534. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_pricing.py +0 -0
  535. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  536. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_config_usage_gate.py +0 -0
  537. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_confirm_test.py +0 -0
  538. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_conflict_fix.py +0 -0
  539. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_conflict_fix_semantic.py +0 -0
  540. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  541. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test.py +0 -0
  542. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test_runner_baseline.py +0 -0
  543. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test_runner_populated_home.py +0 -0
  544. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test_runner_routing.py +0 -0
  545. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_test_runner_toolchain.py +0 -0
  546. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_uat.py +0 -0
  547. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coord_web_sse_restart_live.py +0 -0
  548. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_coordinator_machine.py +0 -0
  549. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_cross_platform_imports.py +0 -0
  550. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dao.py +0 -0
  551. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dashboard.py +0 -0
  552. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dashboard_fixture.py +0 -0
  553. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dashboard_terminal.py +0 -0
  554. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dashboard_terminal_live.py +0 -0
  555. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_db.py +0 -0
  556. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dead_end.py +0 -0
  557. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_coord_db_backup.py +0 -0
  558. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_coord_web_dist.py +0 -0
  559. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_coord_web_rollback.py +0 -0
  560. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_drive_queue_unit.py +0 -0
  561. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_failure_notify_unit.py +0 -0
  562. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_manifest.py +0 -0
  563. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_notify_unit.py +0 -0
  564. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_units_lane.py +0 -0
  565. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deploy_web_unit.py +0 -0
  566. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_deps.py +0 -0
  567. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_diagnose.py +0 -0
  568. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dispatch.py +0 -0
  569. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dispatch_target_validation.py +0 -0
  570. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_dist_name.py +0 -0
  571. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_done_housekeeping.py +0 -0
  572. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive.py +0 -0
  573. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue.py +0 -0
  574. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_blocked_rendering.py +0 -0
  575. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_launch_argv.py +0 -0
  576. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  577. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_roll_pending.py +0 -0
  578. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  579. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_state.py +0 -0
  580. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_drive_tmux.py +0 -0
  581. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_epic_up_capability_detection.py +0 -0
  582. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  583. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_epic_up_image_provenance.py +0 -0
  584. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_errors.py +0 -0
  585. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_events.py +0 -0
  586. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_failure_class.py +0 -0
  587. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_filelock.py +0 -0
  588. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  589. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fix_of_force_override.py +0 -0
  590. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fleet_config_health.py +0 -0
  591. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fleet_health_probes.py +0 -0
  592. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fleet_health_snapshot.py +0 -0
  593. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_fleet_watchdog.py +0 -0
  594. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_forge_availability.py +0 -0
  595. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_freshness.py +0 -0
  596. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gate_a.py +0 -0
  597. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gate_b.py +0 -0
  598. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gate_snapshot_staleness.py +0 -0
  599. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gates.py +0 -0
  600. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  601. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_gen_mock_index.py +0 -0
  602. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_generated_rust_fixture.py +0 -0
  603. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_generated_types_fixture.py +0 -0
  604. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_github_ops.py +0 -0
  605. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_github_throttle.py +0 -0
  606. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_goal.py +0 -0
  607. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_graph_health.py +0 -0
  608. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_graph_selfheal_absent_2237.py +0 -0
  609. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_handoff.py +0 -0
  610. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_checks.py +0 -0
  611. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_cli.py +0 -0
  612. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_cli_graph.py +0 -0
  613. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_config.py +0 -0
  614. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_context.py +0 -0
  615. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_coord_web_ci_pin.py +0 -0
  616. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_deploy_lane_facts.py +0 -0
  617. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_fix.py +0 -0
  618. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_incident_regression.py +0 -0
  619. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_issues_sync_staleness.py +0 -0
  620. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_pypi.py +0 -0
  621. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_registry.py +0 -0
  622. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_release_cordon_probe.py +0 -0
  623. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_timer_active.py +0 -0
  624. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_toolchain.py +0 -0
  625. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_unit_drift.py +0 -0
  626. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_health_unit_enablement.py +0 -0
  627. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_hooks.py +0 -0
  628. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_human_attended_437.py +0 -0
  629. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_init.py +0 -0
  630. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_integration.py +0 -0
  631. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_briefing_echo.py +0 -0
  632. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_pane_log_2541.py +0 -0
  633. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_prefill_state.py +0 -0
  634. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_session_relaunch.py +0 -0
  635. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_test_verdict_backstop.py +0 -0
  636. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_token_attribution.py +0 -0
  637. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_interactive_worktree.py +0 -0
  638. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_issue_store_seam.py +0 -0
  639. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_issues_sync_status.py +0 -0
  640. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_liveness_auditor.py +0 -0
  641. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_liveness_notify.py +0 -0
  642. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_lock_contention_ratchet.py +0 -0
  643. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_machine_pause.py +0 -0
  644. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_merge_verify.py +0 -0
  645. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_chat.py +0 -0
  646. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_dispatch.py +0 -0
  647. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_gate.py +0 -0
  648. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_order.py +0 -0
  649. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_milestone_seam.py +0 -0
  650. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_mock_author.py +0 -0
  651. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_model_tiering.py +0 -0
  652. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_models.py +0 -0
  653. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_models_config_labels.py +0 -0
  654. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_needs_attention.py +0 -0
  655. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_network.py +0 -0
  656. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_new_issue_chat.py +0 -0
  657. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_next_release_tag.py +0 -0
  658. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_node_shim.py +0 -0
  659. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_baseline.py +0 -0
  660. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_cli.py +0 -0
  661. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_collect.py +0 -0
  662. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_config.py +0 -0
  663. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_drive_seam.py +0 -0
  664. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_isolation.py +0 -0
  665. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_predicate.py +0 -0
  666. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_quiet_hours.py +0 -0
  667. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notifier_service.py +0 -0
  668. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notify.py +0 -0
  669. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_notify_drain.py +0 -0
  670. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_openapi.py +0 -0
  671. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_operational_defaults.py +0 -0
  672. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_overlap_fence.py +0 -0
  673. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_overlap_predict.py +0 -0
  674. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_packaged_deploy_units.py +0 -0
  675. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_parentage.py +0 -0
  676. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_paste_landed.py +0 -0
  677. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  678. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_pipeline.py +0 -0
  679. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_followup_approve_plan_command.py +0 -0
  680. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_followup_pr_command.py +0 -0
  681. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_followup_review_command.py +0 -0
  682. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_only.py +0 -0
  683. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_plan_parser.py +0 -0
  684. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_platform_paths.py +0 -0
  685. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_portal_bridge.py +0 -0
  686. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_pr_body_lint.py +0 -0
  687. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_prereqs.py +0 -0
  688. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_production_db_guard.py +0 -0
  689. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_progress.py +0 -0
  690. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_provider_seam.py +0 -0
  691. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_providers.py +0 -0
  692. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_providers_config_labels.py +0 -0
  693. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_providers_pty.py +0 -0
  694. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_quiet_hours.py +0 -0
  695. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_quiet_hours_store_2146.py +0 -0
  696. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reap_merged_sessions.py +0 -0
  697. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reap_stale_interactive_tick.py +0 -0
  698. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile.py +0 -0
  699. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_branch.py +0 -0
  700. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_completions.py +0 -0
  701. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  702. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_merges.py +0 -0
  703. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_no_agent_record.py +0 -0
  704. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_tick.py +0 -0
  705. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reconcile_usage_limit_done.py +0 -0
  706. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_refine_chat.py +0 -0
  707. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_cordon_2101.py +0 -0
  708. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  709. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_cordon_deadlock_2240.py +0 -0
  710. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_cordon_stuck_2490.py +0 -0
  711. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_propagate.py +0 -0
  712. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_propagate_threshold.py +0 -0
  713. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_roll_between_legs_2854.py +0 -0
  714. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_roll_window_handoff.py +0 -0
  715. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_unified_1242.py +0 -0
  716. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_verify.py +0 -0
  717. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_release_window.py +0 -0
  718. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_remote_auto_prune.py +0 -0
  719. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_remote_interactive_reaper.py +0 -0
  720. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_repo_add.py +0 -0
  721. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_repo_edit_2220.py +0 -0
  722. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_repo_graph_fleet_2237.py +0 -0
  723. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_repo_onboard_2220.py +0 -0
  724. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_report_result_push.py +0 -0
  725. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_reports.py +0 -0
  726. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_retry.py +0 -0
  727. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_retry_advisory_1606.py +0 -0
  728. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_retry_type_1636.py +0 -0
  729. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_revalidate.py +0 -0
  730. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review.py +0 -0
  731. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_end_review_without_verdict.py +0 -0
  732. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_parse_failure_diagnostic.py +0 -0
  733. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_reaffirm.py +0 -0
  734. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_state.py +0 -0
  735. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_verdict_backstop.py +0 -0
  736. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_verdict_override_audit.py +0 -0
  737. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_verdict_relay.py +0 -0
  738. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_review_zero_commits.py +0 -0
  739. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_scoped_review_wiring.py +0 -0
  740. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_scorecard.py +0 -0
  741. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_self_health.py +0 -0
  742. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_serve.py +0 -0
  743. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_serve_app_board_trim.py +0 -0
  744. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_serve_rest_routes.py +0 -0
  745. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_session.py +0 -0
  746. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_slice_issue_attribution.py +0 -0
  747. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_smoke.py +0 -0
  748. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_smoke_live_checkout_restore.py +0 -0
  749. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_smoke_workflow.py +0 -0
  750. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_spend_ceiling.py +0 -0
  751. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_spend_ceiling_coordinator.py +0 -0
  752. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_split.py +0 -0
  753. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_split_work.py +0 -0
  754. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_sql_dialect.py +0 -0
  755. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_sqlite_connect_ratchet.py +0 -0
  756. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stage_projection.py +0 -0
  757. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stale_busy_reviewer_697.py +0 -0
  758. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stalled_pipeline.py +0 -0
  759. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_state.py +0 -0
  760. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_state_review_findings_daemon.py +0 -0
  761. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_status_fleet_footer.py +0 -0
  762. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stop_1567.py +0 -0
  763. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_store_contract.py +0 -0
  764. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_store_migrate.py +0 -0
  765. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stuck.py +0 -0
  766. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  767. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_terminal_command.py +0 -0
  768. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_author.py +0 -0
  769. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_chat.py +0 -0
  770. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_orchestrator.py +0 -0
  771. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_report.py +0 -0
  772. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_verdict_parsing.py +0 -0
  773. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_test_verdict_transcript_floor.py +0 -0
  774. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_text_io_encoding_audit.py +0 -0
  775. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_thin_client_board_audit.py +0 -0
  776. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_thin_client_config_load_1080.py +0 -0
  777. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_thin_client_daemon_routing_906.py +0 -0
  778. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_tmux_host.py +0 -0
  779. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_tmux_session.py +0 -0
  780. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_transcript_floor.py +0 -0
  781. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_usage.py +0 -0
  782. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_usage_limits.py +0 -0
  783. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_usage_rollup.py +0 -0
  784. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_venv_live_install_2121.py +0 -0
  785. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_version_single_source.py +0 -0
  786. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_watch.py +0 -0
  787. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  788. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_env_venv_isolation.py +0 -0
  789. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_events.py +0 -0
  790. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_image_pin_sync.py +0 -0
  791. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_safety.py +0 -0
  792. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worker_test_scoping.py +0 -0
  793. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worktree.py +0 -0
  794. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  795. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/test_write_parity.py +0 -0
  796. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tests/write_parity.py +0 -0
  797. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/.github/workflows/release-tui.yml +0 -0
  798. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/Cargo.lock +0 -0
  799. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/Cargo.toml +0 -0
  800. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/cargo-config-local-quadraui.toml.example +0 -0
  801. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/approved.rs +0 -0
  802. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/audit.rs +0 -0
  803. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/chat.rs +0 -0
  804. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/data.rs +0 -0
  805. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/dialogs.rs +0 -0
  806. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/doc_tabs.rs +0 -0
  807. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/drive.rs +0 -0
  808. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/drive_queue.rs +0 -0
  809. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/escalation.rs +0 -0
  810. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/events.rs +0 -0
  811. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/fixtures.rs +0 -0
  812. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/fleet_health.rs +0 -0
  813. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/fleet_sessions.rs +0 -0
  814. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/fleet_terminals.rs +0 -0
  815. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/format.rs +0 -0
  816. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/milestone_dag.rs +0 -0
  817. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/mod.rs +0 -0
  818. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/msv.rs +0 -0
  819. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/pipeline.rs +0 -0
  820. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/plans.rs +0 -0
  821. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/render.rs +0 -0
  822. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/reports.rs +0 -0
  823. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/sessions.rs +0 -0
  824. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/settings_ui.rs +0 -0
  825. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/sidebar.rs +0 -0
  826. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/terminal.rs +0 -0
  827. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/tests.rs +0 -0
  828. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/types/generated.rs +0 -0
  829. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/types.rs +0 -0
  830. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/app/workspace.rs +0 -0
  831. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/bin/gtk.rs +0 -0
  832. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/commands.rs +0 -0
  833. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/lib.rs +0 -0
  834. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/main.rs +0 -0
  835. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/src/settings.rs +0 -0
  836. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
  837. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/contract.md +0 -0
  838. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
  839. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  840. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  841. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  842. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  843. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/contract.md +0 -0
  844. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
  845. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  846. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  847. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  848. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  849. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  850. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  851. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  852. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  853. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  854. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  855. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  856. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  857. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  858. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/contract.md +0 -0
  859. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  860. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
  861. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  862. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  863. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  864. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  865. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  866. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  867. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  868. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  869. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  870. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  871. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  872. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  873. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/contract.md +0 -0
  874. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  875. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
  876. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  877. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  878. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  879. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  880. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  881. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  882. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/acceptance.rs +0 -0
  883. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/tui/tests/cli.rs +0 -0
  884. {code_coordinator-0.5.280 → code_coordinator-0.5.282}/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.280
3
+ Version: 0.5.282
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.280
3
+ Version: 0.5.282
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.280",
2
+ "tag": "0.5.282",
3
3
  "distance": 0,
4
- "node": "g440329673aaafcfbce9c973d90c42a775bc081e0",
4
+ "node": "gda2b2a0369af364cc3ba8374fa1de8c185519951",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-29"
@@ -4067,7 +4067,11 @@ composer on the client's side pauses on the most recent question only, so \
4067
4067
  a scattershot list gets a partial answer at best. Then:
4068
4068
 
4069
4069
  coord portal enqueue-question <submission_id> "<question>"
4070
- coord portal enqueue-status <submission_id> needs-input
4070
+
4071
+ This one command queues the question AND announces it to the customer \
4072
+ (#2901) — `enqueue-question` queues its own `needs-input` status right \
4073
+ behind the question, so there is no separate announcement step to remember \
4074
+ or forget.
4071
4075
 
4072
4076
  and STOP — end your final turn summarizing the question and why, and run \
4073
4077
  nothing else this iteration (no filing, no decisions). IL-3's consumer \
@@ -16,8 +16,16 @@ operator see and drive it without waiting for a tick:
16
16
  that keeps a customer from being emailed toward an empty screen (#835);
17
17
  * ``requeue`` revives a row the drain retired after burning its retry budget.
18
18
 
19
+ #2903 (phase 1 of #2902) added the gate in front of all of that — the
20
+ ``draft`` outbox state, and with it ``drafts`` (read what is awaiting an
21
+ operator, in full) plus ``draft edit`` / ``draft approve`` / ``draft reject``
22
+ (the three ways a row leaves it). Under the default policy an agent-authored
23
+ ``design_round`` or ``question`` cannot reach a customer without someone
24
+ having read it.
25
+
19
26
  The state-touching commands (``sync``, ``outbox``, ``events``, ``enqueue-*``,
20
- ``requeue``, ``publish-mocks``, ``remirror``) read and write the daemon's own
27
+ ``requeue``, ``drafts``, ``draft *``, ``publish-mocks``, ``remirror``) read
28
+ and write the daemon's own
21
29
  ``~/.coord/coord.db`` and are therefore **daemon-host commands**. Run from a
22
30
  thin client they used to silently operate on that box's empty local DB, which
23
31
  is not where the bridge lives — producing a normal-looking "nothing pending"
@@ -55,6 +63,8 @@ import datetime
55
63
  import getpass
56
64
  import json
57
65
 
66
+ from typing import TYPE_CHECKING
67
+
58
68
  import click
59
69
 
60
70
  from coord.commands._common import _CONFIG_OPTION, _load_config
@@ -65,6 +75,9 @@ from coord.portal_bridge import (
65
75
  client_from_config,
66
76
  )
67
77
 
78
+ if TYPE_CHECKING: # import-cycle-free type-only reference (#2903)
79
+ from coord.portal_store import OutboxRow
80
+
68
81
 
69
82
  def _actor() -> str:
70
83
  try:
@@ -1154,6 +1167,11 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
1154
1167
  A `pending` row with a reason is HELD, not failing: the ordering guard is
1155
1168
  refusing to announce something to the customer before the thing it
1156
1169
  announces has been confirmed applied.
1170
+
1171
+ A `draft` row (#2903) is not queued at all yet — it is waiting for an
1172
+ operator to read it. Those are listed here too, so a queue that looks
1173
+ idle cannot secretly be a queue nobody has approved; `coord portal
1174
+ drafts` shows their full prose.
1157
1175
  """
1158
1176
  _refuse_if_thin_client("outbox")
1159
1177
 
@@ -1167,7 +1185,10 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
1167
1185
  for row in portal_store.outbox_for_submission(sub.submission_id)
1168
1186
  ]
1169
1187
  else:
1170
- rows = portal_store.pending_outbox()
1188
+ rows = sorted(
1189
+ portal_store.pending_outbox() + portal_store.draft_outbox(),
1190
+ key=lambda r: (r.submission_id, r.seq),
1191
+ )
1171
1192
 
1172
1193
  state = portal_store.get_sync_state()
1173
1194
  if as_json:
@@ -1223,7 +1244,13 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
1223
1244
  f"{r.submission_id} seq={r.seq} rev={r.revision} "
1224
1245
  f"{r.kind:<13} {r.state}"
1225
1246
  )
1226
- if held:
1247
+ if r.state == portal_store.STATE_DRAFT:
1248
+ click.secho(
1249
+ f"{line} DRAFT — awaiting approval "
1250
+ f"(`coord portal drafts` to read it)",
1251
+ fg="cyan",
1252
+ )
1253
+ elif held:
1227
1254
  click.secho(f"{line} HELD — {held}", fg="yellow")
1228
1255
  elif r.state == portal_store.STATE_REJECTED:
1229
1256
  click.secho(f"{line} {r.reason}", fg="red")
@@ -1266,6 +1293,27 @@ def portal_events(as_json: bool, limit: int) -> None:
1266
1293
  click.echo(f"{e.occurred_at or '-'} {e.submission_id} {e.kind} {e.event_id}")
1267
1294
 
1268
1295
 
1296
+ def _echo_enqueued(row: "OutboxRow", label: str) -> None:
1297
+ """Report one just-enqueued row, saying out loud when it is gated (#2903).
1298
+
1299
+ A row that landed in `draft` has NOT been queued and will never send on
1300
+ its own; an operator told "queued:" for one would wait forever for an
1301
+ email that is sitting behind the gate they themselves have to open.
1302
+ """
1303
+ from coord import portal_store # noqa: PLC0415
1304
+
1305
+ body = f"{row.submission_id} seq={row.seq} rev={row.revision} {label}"
1306
+ if row.state == portal_store.STATE_DRAFT:
1307
+ click.secho(
1308
+ f"drafted (awaiting approval): {body} — read it with "
1309
+ f"`coord portal drafts`, then `coord portal draft approve "
1310
+ f"{row.submission_id} {row.seq}`",
1311
+ fg="cyan",
1312
+ )
1313
+ return
1314
+ click.secho(f"queued: {body}", fg="green")
1315
+
1316
+
1269
1317
  @portal_group.command("enqueue-status")
1270
1318
  @click.argument("submission_id")
1271
1319
  @click.argument("status", type=click.Choice(SUBMISSION_STATUSES))
@@ -1285,10 +1333,7 @@ def portal_enqueue_status(submission_id: str, status: str) -> None:
1285
1333
  except PortalSyncError as exc:
1286
1334
  click.secho(str(exc), fg="red")
1287
1335
  raise SystemExit(1) from exc
1288
- click.secho(
1289
- f"queued: {row.submission_id} seq={row.seq} rev={row.revision} status={status}",
1290
- fg="green",
1291
- )
1336
+ _echo_enqueued(row, f"status={status}")
1292
1337
 
1293
1338
 
1294
1339
  @portal_group.command("enqueue-design-round")
@@ -1315,10 +1360,7 @@ def portal_enqueue_design_round(submission_id: str, payload_json: str) -> None:
1315
1360
  except PortalSyncError as exc:
1316
1361
  click.secho(str(exc), fg="red")
1317
1362
  raise SystemExit(1) from exc
1318
- click.secho(
1319
- f"queued: {row.submission_id} seq={row.seq} rev={row.revision} design_round",
1320
- fg="green",
1321
- )
1363
+ _echo_enqueued(row, "design_round")
1322
1364
 
1323
1365
 
1324
1366
  @portal_group.command("enqueue-preview")
@@ -1341,30 +1383,31 @@ def portal_enqueue_preview(submission_id: str, preview_url: str) -> None:
1341
1383
  except PortalSyncError as exc:
1342
1384
  click.secho(str(exc), fg="red")
1343
1385
  raise SystemExit(1) from exc
1344
- click.secho(
1345
- f"queued: {row.submission_id} seq={row.seq} rev={row.revision} preview",
1346
- fg="green",
1347
- )
1386
+ _echo_enqueued(row, "preview")
1348
1387
 
1349
1388
 
1350
1389
  @portal_group.command("enqueue-question")
1351
1390
  @click.argument("submission_id")
1352
1391
  @click.argument("question")
1353
1392
  def portal_enqueue_question(submission_id: str, question: str) -> None:
1354
- """Queue an open question for SUBMISSION_ID (sent on the next sync)."""
1393
+ """Queue an open question for SUBMISSION_ID (sent on the next sync).
1394
+
1395
+ Also queues the `needs-input` status that announces it (#2901) — a
1396
+ question with no status row behind it sends no email, so this command
1397
+ always queues both rows in one call rather than leaving the second one
1398
+ to a caller who might forget it.
1399
+ """
1355
1400
  _refuse_if_thin_client("enqueue-question")
1356
1401
 
1357
1402
  from coord.portal_sync import PortalSyncError, enqueue_question # noqa: PLC0415
1358
1403
 
1359
1404
  try:
1360
- row = enqueue_question(submission_id, question)
1405
+ question_row, status_row = enqueue_question(submission_id, question)
1361
1406
  except PortalSyncError as exc:
1362
1407
  click.secho(str(exc), fg="red")
1363
1408
  raise SystemExit(1) from exc
1364
- click.secho(
1365
- f"queued: {row.submission_id} seq={row.seq} rev={row.revision} question",
1366
- fg="green",
1367
- )
1409
+ _echo_enqueued(question_row, "question")
1410
+ _echo_enqueued(status_row, "status=needs-input")
1368
1411
 
1369
1412
 
1370
1413
  @portal_group.command("remirror")
@@ -1479,6 +1522,243 @@ def portal_requeue(submission_id: str, seq: int) -> None:
1479
1522
  )
1480
1523
 
1481
1524
 
1525
+ # ── #2903 (phase 1 of #2902): the draft gate ────────────────────────────────
1526
+ #
1527
+ # The operator surface for the `draft` outbox state: `drafts` lists what is
1528
+ # waiting with the FULL PROSE (a gate you cannot read through is a
1529
+ # rubber-stamp), and `draft edit`/`approve`/`reject` are the three ways a row
1530
+ # leaves it. All four are daemon-host commands like every other
1531
+ # outbox-touching command — the draft rows live in the daemon's own
1532
+ # ~/.coord/coord.db and a thin client would silently review an empty queue.
1533
+
1534
+
1535
+ def _draft_field_lines(row: "OutboxRow") -> list[str]:
1536
+ """The prose of one draft row, as lines, editable fields marked.
1537
+
1538
+ Prints the WHOLE payload, not just the editable slice: an operator
1539
+ approving a design round has to see the decomposition and bundle key
1540
+ they are signing off on even though neither can be rewritten here.
1541
+ """
1542
+ from coord.portal_store import EDITABLE_DRAFT_FIELDS # noqa: PLC0415
1543
+
1544
+ editable = set(EDITABLE_DRAFT_FIELDS.get(row.kind, ()))
1545
+ lines: list[str] = []
1546
+
1547
+ def _walk(value, prefix: str) -> None:
1548
+ if isinstance(value, dict):
1549
+ for key in sorted(value):
1550
+ _walk(value[key], f"{prefix}.{key}" if prefix else key)
1551
+ return
1552
+ mark = " (editable)" if prefix in editable else ""
1553
+ rendered = value if isinstance(value, str) else json.dumps(value, sort_keys=True)
1554
+ lines.append(f" {prefix}{mark}:")
1555
+ for line in str(rendered).splitlines() or [""]:
1556
+ lines.append(f" {line}")
1557
+
1558
+ _walk(row.fields, "")
1559
+ return lines
1560
+
1561
+
1562
+ @portal_group.command("drafts")
1563
+ @click.option("--json", "as_json", is_flag=True, default=False)
1564
+ @click.argument("submission_id", required=False, default=None)
1565
+ def portal_drafts(as_json: bool, submission_id: str | None) -> None:
1566
+ """List outbox rows awaiting operator approval, with their full prose.
1567
+
1568
+ Under the default policy (`portal.approval` in coordinator.yml) an
1569
+ agent-authored `design_round` or `question` lands in `draft` and no drain
1570
+ will ever send it. This is where you read it. Then:
1571
+
1572
+ \b
1573
+ coord portal draft edit <sub> <seq> rewrite the prose
1574
+ coord portal draft approve <sub> <seq> let it send
1575
+ coord portal draft reject <sub> <seq> --reason … kill it
1576
+ """
1577
+ _refuse_if_thin_client("drafts")
1578
+
1579
+ from coord import portal_store # noqa: PLC0415
1580
+
1581
+ rows = portal_store.draft_outbox(submission_id)
1582
+ if as_json:
1583
+ click.echo(
1584
+ json.dumps(
1585
+ {
1586
+ "drafts": [
1587
+ {
1588
+ "submission_id": r.submission_id,
1589
+ "seq": r.seq,
1590
+ "revision": r.revision,
1591
+ "kind": r.kind,
1592
+ "state": r.state,
1593
+ "fields": r.fields,
1594
+ "enqueued_at": r.enqueued_at,
1595
+ }
1596
+ for r in rows
1597
+ ]
1598
+ },
1599
+ indent=2,
1600
+ sort_keys=True,
1601
+ )
1602
+ )
1603
+ return
1604
+
1605
+ if not rows:
1606
+ click.echo("drafts: none awaiting approval")
1607
+ return
1608
+
1609
+ current = None
1610
+ for r in rows:
1611
+ if r.submission_id != current:
1612
+ current = r.submission_id
1613
+ click.secho(f"\n{current}", bold=True)
1614
+ click.secho(f" seq={r.seq} rev={r.revision} {r.kind}", fg="yellow")
1615
+ for line in _draft_field_lines(r):
1616
+ click.echo(line)
1617
+ click.echo(
1618
+ "\nApprove with `coord portal draft approve <sub> <seq>`, or reject "
1619
+ "with `--reason`."
1620
+ )
1621
+
1622
+
1623
+ @portal_group.group("draft")
1624
+ def portal_draft_group() -> None:
1625
+ """Review an unapproved outbox row: edit / approve / reject (#2903)."""
1626
+
1627
+
1628
+ @portal_draft_group.command("edit")
1629
+ @click.argument("submission_id")
1630
+ @click.argument("seq", type=int)
1631
+ @click.option(
1632
+ "--field", "field_path", default=None,
1633
+ help="Which editable field to rewrite (default: the row kind's only one).",
1634
+ )
1635
+ @click.option(
1636
+ "--text", default=None,
1637
+ help="New text, instead of opening $EDITOR. Makes the command scriptable.",
1638
+ )
1639
+ def portal_draft_edit(
1640
+ submission_id: str, seq: int, field_path: str | None, text: str | None
1641
+ ) -> None:
1642
+ """Rewrite an editable field of a draft row in $EDITOR.
1643
+
1644
+ Only while the row is still `draft`, and only the fields that are prose:
1645
+ a question's text, a design round's outcome_definition. `bundle_key`,
1646
+ `decomposition` and `revision` are refused — they are references to
1647
+ things that exist, not wording. Editing a mock bundle is
1648
+ `coord acceptance mock --amend`.
1649
+
1650
+ Both the agent's original text and your version are appended to the
1651
+ submission's ledger, so `coord portal ledger` can still tell them apart
1652
+ six weeks from now.
1653
+ """
1654
+ _refuse_if_thin_client("draft edit")
1655
+
1656
+ from coord import portal_store # noqa: PLC0415
1657
+
1658
+ row = portal_store.get_outbox_row(submission_id, seq)
1659
+ if row is None:
1660
+ raise click.ClickException(
1661
+ f"no outbox row for {submission_id} seq={seq} "
1662
+ f"(list them with `coord portal outbox --all`)"
1663
+ )
1664
+ editable = portal_store.EDITABLE_DRAFT_FIELDS.get(row.kind, ())
1665
+ if field_path is None:
1666
+ if len(editable) != 1:
1667
+ raise click.ClickException(
1668
+ f"a {row.kind} row has {len(editable)} editable field(s) "
1669
+ f"({', '.join(editable) or 'none'}) — name one with --field"
1670
+ )
1671
+ field_path = editable[0]
1672
+
1673
+ if text is None:
1674
+ current = portal_store.draft_field_value(row, field_path)
1675
+ edited = click.edit(str(current or ""))
1676
+ if edited is None:
1677
+ click.echo("unchanged — nothing written")
1678
+ return
1679
+ text = edited.strip()
1680
+
1681
+ try:
1682
+ updated = portal_store.edit_draft(
1683
+ submission_id, seq, field_path, text, actor=_actor()
1684
+ )
1685
+ except portal_store.DraftGateError as exc:
1686
+ raise click.ClickException(str(exc)) from exc
1687
+
1688
+ click.secho(
1689
+ f"edited: {updated.submission_id} seq={updated.seq} {updated.kind} "
1690
+ f"{field_path} (still draft — approve it to send)",
1691
+ fg="green",
1692
+ )
1693
+
1694
+
1695
+ @portal_draft_group.command("approve")
1696
+ @click.argument("submission_id")
1697
+ @click.argument("seq", type=int)
1698
+ def portal_draft_approve(submission_id: str, seq: int) -> None:
1699
+ """Flip a draft row to `pending`; the next sync sends it.
1700
+
1701
+ The row keeps its seq and revision, so approving changes only whether it
1702
+ is eligible to send — never its place in the queue.
1703
+ """
1704
+ _refuse_if_thin_client("draft approve")
1705
+
1706
+ from coord import portal_store # noqa: PLC0415
1707
+
1708
+ try:
1709
+ row = portal_store.approve_draft(submission_id, seq, actor=_actor())
1710
+ except portal_store.DraftGateError as exc:
1711
+ raise click.ClickException(str(exc)) from exc
1712
+
1713
+ click.secho(
1714
+ f"approved: {row.submission_id} seq={row.seq} rev={row.revision} "
1715
+ f"{row.kind} — now {row.state}, sends on the next `coord portal sync`",
1716
+ fg="green",
1717
+ )
1718
+
1719
+
1720
+ @portal_draft_group.command("reject")
1721
+ @click.argument("submission_id")
1722
+ @click.argument("seq", type=int)
1723
+ @click.option("--reason", required=True, help="Why. Mandatory — see #2749/#2903.")
1724
+ @click.option(
1725
+ "--no-cascade", is_flag=True, default=False,
1726
+ help="Refuse rather than also reject whatever announces this row.",
1727
+ )
1728
+ def portal_draft_reject(
1729
+ submission_id: str, seq: int, reason: str, no_cascade: bool
1730
+ ) -> None:
1731
+ """Reject a draft row. REASON is mandatory.
1732
+
1733
+ Also rejects whatever announces it. `ordering_block_reason` treats a
1734
+ rejected prerequisite as never-applied, so a bare reject would leave the
1735
+ `awaiting-signoff` / `needs-input` behind it held forever, in a state
1736
+ that reads like an ordinary hold. With `--no-cascade` the command
1737
+ refuses instead and names the rows to deal with first.
1738
+ """
1739
+ _refuse_if_thin_client("draft reject")
1740
+
1741
+ from coord import portal_store # noqa: PLC0415
1742
+
1743
+ try:
1744
+ row, also = portal_store.reject_draft(
1745
+ submission_id, seq, reason, cascade=not no_cascade, actor=_actor()
1746
+ )
1747
+ except portal_store.DraftGateError as exc:
1748
+ raise click.ClickException(str(exc)) from exc
1749
+
1750
+ click.secho(
1751
+ f"rejected: {row.submission_id} seq={row.seq} {row.kind} — {reason}",
1752
+ fg="yellow",
1753
+ )
1754
+ for dep in also:
1755
+ click.secho(
1756
+ f" also rejected: seq={dep.seq} {dep.announces or dep.kind} "
1757
+ f"(it announced the row above and would have been held forever)",
1758
+ fg="yellow",
1759
+ )
1760
+
1761
+
1482
1762
  # ── #2749 (IL-3, epic #2746): the running-context ledger ────────────────────
1483
1763
  #
1484
1764
  # `ledger` renders the four-layer briefing (issue #2749's design section —
@@ -2158,6 +2158,57 @@ class PortalProjectRepo:
2158
2158
  repos: list[str]
2159
2159
 
2160
2160
 
2161
+ #: Every outbox row kind :mod:`coord.portal_sync` can enqueue. Duplicated
2162
+ #: here as literals rather than imported from ``coord.portal_sync``'s
2163
+ #: ``KIND_*`` constants: that module imports ``coord.portal_store`` which
2164
+ #: imports ``coord.db``, and config must stay importable by everything.
2165
+ #: ``tests/test_portal_config.py`` pins the two lists together so the copy
2166
+ #: cannot silently drift.
2167
+ PORTAL_OUTBOX_KINDS = ("status", "design_round", "question", "preview")
2168
+
2169
+ #: The draft gate's default policy (#2903, phase 1 of #2902): the two kinds
2170
+ #: that carry **agent-authored prose to a customer** are held for an
2171
+ #: operator; the two mechanical kinds are not.
2172
+ #:
2173
+ #: ``status`` and ``preview`` are deliberately ungated. A status is one of a
2174
+ #: pinned vocabulary and a preview is a URL — neither is prose anybody would
2175
+ #: read and rewrite, and gating them would produce a rubber-stamp queue of
2176
+ #: "In progress" ×N that trains the operator to approve without reading,
2177
+ #: which is the failure mode this gate exists to prevent (see epic #2902).
2178
+ DEFAULT_PORTAL_APPROVAL: dict[str, bool] = {
2179
+ "status": False,
2180
+ "design_round": True,
2181
+ "question": True,
2182
+ "preview": False,
2183
+ }
2184
+
2185
+
2186
+ @dataclass
2187
+ class PortalApprovalConfig:
2188
+ """Which outbox kinds land in ``draft`` instead of ``pending`` (#2903).
2189
+
2190
+ An absent ``portal.approval`` block means :data:`DEFAULT_PORTAL_APPROVAL`
2191
+ exactly. A present block is **merged over** those defaults rather than
2192
+ replacing them, so ``approval: {question: false}`` still gates
2193
+ ``design_round`` — an operator relaxing one kind has not silently opened
2194
+ every other one.
2195
+ """
2196
+
2197
+ kinds: dict[str, bool] = field(
2198
+ default_factory=lambda: dict(DEFAULT_PORTAL_APPROVAL)
2199
+ )
2200
+
2201
+ def gates(self, kind: str) -> bool:
2202
+ """True when *kind* must be operator-approved before it can be sent.
2203
+
2204
+ An unknown kind is **not** gated: a kind this build has never heard
2205
+ of cannot be one of the two prose kinds the gate is for, and failing
2206
+ closed on it would wedge a queue on an unrecognised row nobody can
2207
+ approve (there is no CLI verb for a kind that does not exist).
2208
+ """
2209
+ return bool(self.kinds.get(kind, False))
2210
+
2211
+
2161
2212
  @dataclass
2162
2213
  class PortalConfig:
2163
2214
  """The outbound client to coord-portal's sync bridge (#2179, ``docs/CUSTOMER_PORTAL.md``).
@@ -2197,6 +2248,10 @@ class PortalConfig:
2197
2248
  # a blank cell. Mapping is *operator* knowledge (which repo a client's
2198
2249
  # project lands in), so it lives here and not in the portal's schema.
2199
2250
  project_repos: list[PortalProjectRepo] = field(default_factory=list)
2251
+ # #2903 — the draft gate. Absent block == DEFAULT_PORTAL_APPROVAL ==
2252
+ # design_round/question held for an operator, status/preview straight
2253
+ # through exactly as before.
2254
+ approval: PortalApprovalConfig = field(default_factory=PortalApprovalConfig)
2200
2255
 
2201
2256
  def repos_for_project(self, project_id: str) -> list[str]:
2202
2257
  """The coord repo name(s) *project_id* maps to — ``[]`` if unmapped.
@@ -4149,6 +4204,9 @@ def _parse_portal(raw: Any, repo_names: set[str] | None = None) -> PortalConfig:
4149
4204
  if "project_repos" in raw:
4150
4205
  cfg.project_repos = _parse_portal_project_repos(raw["project_repos"], repo_names)
4151
4206
 
4207
+ if "approval" in raw:
4208
+ cfg.approval = _parse_portal_approval(raw["approval"])
4209
+
4152
4210
  if cfg.enabled and not (cfg.base_url and cfg.bridge_client_id and cfg.bridge_client_secret):
4153
4211
  # Half a credential is not a credential — coord-portal's
4154
4212
  # isBridgeAuthorized takes the identical position and fails closed on
@@ -4161,6 +4219,38 @@ def _parse_portal(raw: Any, repo_names: set[str] | None = None) -> PortalConfig:
4161
4219
  return cfg
4162
4220
 
4163
4221
 
4222
+ def _parse_portal_approval(raw: Any) -> PortalApprovalConfig:
4223
+ """Parse ``portal.approval`` — the draft gate's per-kind policy (#2903).
4224
+
4225
+ ``None`` (key present but empty) and an absent key both mean
4226
+ :data:`DEFAULT_PORTAL_APPROVAL`. Anything present is merged OVER those
4227
+ defaults — see :class:`PortalApprovalConfig` for why merge and not
4228
+ replace. Every key must name a real outbox kind
4229
+ (:data:`PORTAL_OUTBOX_KINDS`) and every value must be a bool: a typo'd
4230
+ kind that parsed silently would read as "gated: no" and quietly send
4231
+ agent prose to a customer, which is precisely the outcome this block
4232
+ exists to prevent.
4233
+ """
4234
+ if raw is None:
4235
+ return PortalApprovalConfig()
4236
+ if not isinstance(raw, dict):
4237
+ raise ConfigError("'portal.approval' must be a mapping of kind -> boolean")
4238
+
4239
+ unknown = sorted(set(raw) - set(PORTAL_OUTBOX_KINDS))
4240
+ if unknown:
4241
+ raise ConfigError(
4242
+ f"unknown portal.approval kind(s): {', '.join(unknown)} "
4243
+ f"(valid: {', '.join(PORTAL_OUTBOX_KINDS)})"
4244
+ )
4245
+
4246
+ kinds = dict(DEFAULT_PORTAL_APPROVAL)
4247
+ for kind, value in raw.items():
4248
+ if not isinstance(value, bool):
4249
+ raise ConfigError(f"portal.approval.{kind} must be a boolean")
4250
+ kinds[kind] = value
4251
+ return PortalApprovalConfig(kinds=kinds)
4252
+
4253
+
4164
4254
  def _parse_portal_project_repos(
4165
4255
  raw: Any, repo_names: set[str] | None
4166
4256
  ) -> list[PortalProjectRepo]:
@@ -6064,12 +6064,27 @@ def _maybe_push_design_round(
6064
6064
  milestone_title=milestone.get("title") or f"ms-{milestone_number}",
6065
6065
  tracking_issue_title=issue_data.get("title") or "",
6066
6066
  tracking_issue_body=issue_data.get("body") or "",
6067
+ # #2903: the same Config this hook already holds, so the draft
6068
+ # gate's policy read does not re-resolve coordinator.yml from
6069
+ # disk and cannot disagree with the config this process was
6070
+ # started with (e.g. a `--config` override).
6071
+ config=config,
6067
6072
  )
6068
6073
  except PortalBridgeError as e:
6069
6074
  return MergeEvent(entry, "design_round_push_failed", f"bundle upload failed: {e}")
6070
6075
  except PortalSyncError as e:
6071
6076
  return MergeEvent(entry, "design_round_push_failed", f"enqueue failed: {e}")
6072
6077
 
6078
+ if row.state == portal_store.STATE_DRAFT:
6079
+ # #2903: it is NOT queued — it is waiting for an operator, and an
6080
+ # event that says "queued" would have somebody waiting for an email
6081
+ # that is sitting behind a gate only they can open.
6082
+ return MergeEvent(
6083
+ entry, "design_round_drafted",
6084
+ f"design round for portal submission {link.submission_id} is "
6085
+ f"awaiting operator approval (seq={row.seq}, "
6086
+ f"bundle_key={bundle_key}) — `coord portal drafts`",
6087
+ )
6073
6088
  return MergeEvent(
6074
6089
  entry, "design_round_queued",
6075
6090
  f"queued design round for portal submission {link.submission_id} "