code-coordinator 0.5.202__tar.gz → 0.5.204__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 (794) hide show
  1. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/portal.py +90 -0
  7. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/merge_queue.py +127 -0
  8. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/mock_author.py +102 -0
  9. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/portal_bridge.py +52 -6
  10. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/portal_store.py +132 -0
  11. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/portal_sync.py +10 -5
  12. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/state.py +98 -0
  13. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_portal.py +52 -1
  14. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_merge_queue.py +200 -0
  15. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_mock_author.py +88 -1
  16. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_portal_bridge.py +38 -0
  17. code_coordinator-0.5.204/tests/test_portal_store.py +176 -0
  18. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.claude/commands/board.md +0 -0
  19. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.claude/commands/complete-session.md +0 -0
  20. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.claude/commands/coordinator.md +0 -0
  21. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.githooks/_lib.sh +0 -0
  22. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.githooks/post-checkout +0 -0
  23. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.githooks/post-commit +0 -0
  24. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.githooks/post-merge +0 -0
  25. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  26. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/coord-ci-acceptance.yml +0 -0
  27. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/auto-release.yml +0 -0
  28. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/cargo-test.yml +0 -0
  29. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/publish.yml +0 -0
  30. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/release-tui.yml +0 -0
  31. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/test.yml +0 -0
  32. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.gitignore +0 -0
  33. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/CLAUDE.md +0 -0
  34. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/GOAL.md +0 -0
  35. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/LICENSE +0 -0
  36. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/MANIFEST.in +0 -0
  37. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/README.md +0 -0
  38. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/dependency_links.txt +0 -0
  39. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/entry_points.txt +0 -0
  40. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/requires.txt +0 -0
  41. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/top_level.txt +0 -0
  42. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/__init__.py +0 -0
  43. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/_board_mapping.py +0 -0
  44. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/acceptance.py +0 -0
  45. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/acceptance_drivers.py +0 -0
  46. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agent.py +0 -0
  47. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agent_app.py +0 -0
  48. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agent_update.py +0 -0
  49. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agents/opencode/.gitignore +0 -0
  50. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agents/opencode/agents/work.md +0 -0
  51. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agents/opencode/routing.jsonc +0 -0
  52. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/audit.py +0 -0
  53. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/auto_loop.py +0 -0
  54. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/block_log.py +0 -0
  55. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/board_bool_guard.py +0 -0
  56. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/board_service.py +0 -0
  57. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/board_wire.py +0 -0
  58. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/brain.py +0 -0
  59. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/branch_model.py +0 -0
  60. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/bug_intake.py +0 -0
  61. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/cargo_cache.py +0 -0
  62. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/ci_github.py +0 -0
  63. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/ci_gitlab.py +0 -0
  64. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/ci_store.py +0 -0
  65. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/claim.py +0 -0
  66. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/cli.py +0 -0
  67. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/client.py +0 -0
  68. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/_common.py +0 -0
  70. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/acceptance.py +0 -0
  71. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/agent_ops.py +0 -0
  72. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/audit.py +0 -0
  73. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/dispatch.py +0 -0
  75. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/dispatch_workers.py +0 -0
  76. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/drive.py +0 -0
  77. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/drive_queue.py +0 -0
  78. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/gate_a.py +0 -0
  79. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/gates.py +0 -0
  80. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/issues.py +0 -0
  81. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/lifecycle.py +0 -0
  82. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/merge.py +0 -0
  83. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/milestone.py +0 -0
  84. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/release.py +0 -0
  87. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/repo.py +0 -0
  88. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/report.py +0 -0
  89. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/review.py +0 -0
  90. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/scorecard.py +0 -0
  91. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/sessions.py +0 -0
  92. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/setup.py +0 -0
  93. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/status.py +0 -0
  94. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/terminal.py +0 -0
  95. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/test_gate.py +0 -0
  96. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/tui.py +0 -0
  97. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/comments.py +0 -0
  98. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/config.py +0 -0
  99. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/config_reload.py +0 -0
  100. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/confirm_test.py +0 -0
  101. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/conflict_fix.py +0 -0
  102. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dao.py +0 -0
  103. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/__init__.py +0 -0
  104. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/fixture.py +0 -0
  105. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/index.html +0 -0
  106. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/server.py +0 -0
  107. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/terminal.py +0 -0
  108. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/db.py +0 -0
  109. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dead_end.py +0 -0
  110. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/README.md +0 -0
  111. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-agent.service +0 -0
  112. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-db-backup.service +0 -0
  113. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-db-backup.sh +0 -0
  114. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-db-backup.timer +0 -0
  115. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-drive-queue.service +0 -0
  116. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-drive-queue.timer +0 -0
  117. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-notify.service +0 -0
  118. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-notify.timer +0 -0
  119. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-release-propagate.service +0 -0
  120. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-release-propagate.timer +0 -0
  121. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-release-window.service +0 -0
  122. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-release-window.timer +0 -0
  123. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-serve.service +0 -0
  124. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-web-dist-build.service +0 -0
  125. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-web-dist-build.timer +0 -0
  126. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-web.service +0 -0
  127. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy_manifest.py +0 -0
  128. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy_units.py +0 -0
  129. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deps.py +0 -0
  130. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/diagnose.py +0 -0
  131. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dispatch.py +0 -0
  132. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dist_name.py +0 -0
  133. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/drive.py +0 -0
  134. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/drive_queue.py +0 -0
  135. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/drive_state.py +0 -0
  136. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/events.py +0 -0
  137. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/failure_class.py +0 -0
  138. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/filelock.py +0 -0
  139. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/fleet_config_health.py +0 -0
  140. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/forge_availability.py +0 -0
  141. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/freshness.py +0 -0
  142. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/gate_a.py +0 -0
  143. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/gate_b.py +0 -0
  144. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/gate_snapshot.py +0 -0
  145. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/gates.py +0 -0
  146. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/github_ops.py +0 -0
  147. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/goal.py +0 -0
  148. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/graph_health.py +0 -0
  149. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/__init__.py +0 -0
  150. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/aggregate.py +0 -0
  151. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/__init__.py +0 -0
  152. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/agent_install.py +0 -0
  153. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/cargo_targets.py +0 -0
  154. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/claude_binary.py +0 -0
  155. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/coord_web_ci_pin.py +0 -0
  156. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/deploy_lane_facts.py +0 -0
  157. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/disk.py +0 -0
  158. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/fleet_board.py +0 -0
  159. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  160. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/fleet_phantom.py +0 -0
  161. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/fleet_unit_drift.py +0 -0
  162. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/graph.py +0 -0
  163. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/graphify_cli.py +0 -0
  164. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/index_lock.py +0 -0
  165. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/plan_usage.py +0 -0
  166. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/repo_state.py +0 -0
  167. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/spawned_coord.py +0 -0
  168. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/timer_active.py +0 -0
  169. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/toolchain.py +0 -0
  170. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/unit_drift.py +0 -0
  171. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/unit_enablement.py +0 -0
  172. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/worktrees.py +0 -0
  173. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/cli.py +0 -0
  174. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/context.py +0 -0
  175. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/fleet_snapshot.py +0 -0
  176. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/models.py +0 -0
  177. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/pypi.py +0 -0
  178. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/registry.py +0 -0
  179. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/render.py +0 -0
  180. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/units.py +0 -0
  181. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/hooks.py +0 -0
  182. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/housekeeping.py +0 -0
  183. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/interactive.py +0 -0
  184. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/issue_store.py +0 -0
  185. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/liveness_auditor.py +0 -0
  186. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/machine_pause.py +0 -0
  187. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/milestone_chat.py +0 -0
  188. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/milestone_dispatch.py +0 -0
  189. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/milestone_gate.py +0 -0
  190. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/milestone_order.py +0 -0
  191. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/models.py +0 -0
  192. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/network.py +0 -0
  193. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/new_issue_chat.py +0 -0
  194. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/__init__.py +0 -0
  195. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/baseline.py +0 -0
  196. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/cli.py +0 -0
  197. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/collect.py +0 -0
  198. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/digest.py +0 -0
  199. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/models.py +0 -0
  200. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/predicate.py +0 -0
  201. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/service.py +0 -0
  202. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/store.py +0 -0
  203. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/transport.py +0 -0
  204. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notify.py +0 -0
  205. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/openapi.py +0 -0
  206. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/overlap_fence.py +0 -0
  207. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/overlap_predict.py +0 -0
  208. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/parentage.py +0 -0
  209. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/parentage_github.py +0 -0
  210. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/pipeline.py +0 -0
  211. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/plan_parser.py +0 -0
  212. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/plans.py +0 -0
  213. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/platform_paths.py +0 -0
  214. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/pr_body_lint.py +0 -0
  215. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/prereqs.py +0 -0
  216. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/progress.py +0 -0
  217. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/__init__.py +0 -0
  218. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/base.py +0 -0
  219. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/claude.py +0 -0
  220. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/claude_pty.py +0 -0
  221. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/opencode.py +0 -0
  222. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/queue_diagnose.py +0 -0
  223. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/reconcile.py +0 -0
  224. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/reconcile_tick.py +0 -0
  225. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/refine_chat.py +0 -0
  226. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/release_cordon.py +0 -0
  227. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/release_propagate.py +0 -0
  228. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/release_verify.py +0 -0
  229. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/release_window.py +0 -0
  230. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/repo_edit.py +0 -0
  231. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/repo_onboard.py +0 -0
  232. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/reports.py +0 -0
  233. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/revalidate.py +0 -0
  234. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/review.py +0 -0
  235. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/scorecard.py +0 -0
  236. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/self_health.py +0 -0
  237. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/serve_app.py +0 -0
  238. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  239. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  240. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  241. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  242. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  243. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/portal-followup/SKILL.md +0 -0
  244. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  245. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  246. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/update-issue/SKILL.md +0 -0
  247. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/smoke.py +0 -0
  248. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/spend_ceiling.py +0 -0
  249. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/split_work.py +0 -0
  250. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/stage_projection.py +0 -0
  251. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/test_author.py +0 -0
  252. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/test_chat.py +0 -0
  253. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/test_orchestrator.py +0 -0
  254. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/test_report.py +0 -0
  255. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/tui_release.py +0 -0
  256. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/usage.py +0 -0
  257. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/usage_limits.py +0 -0
  258. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/usage_rollup.py +0 -0
  259. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/worker_events.py +0 -0
  260. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coordinator.example.yml +0 -0
  261. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-agent.service +0 -0
  262. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-db-backup.service +0 -0
  263. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-db-backup.sh +0 -0
  264. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-db-backup.timer +0 -0
  265. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-drive-queue.service +0 -0
  266. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-drive-queue.timer +0 -0
  267. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-notify.service +0 -0
  268. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-notify.timer +0 -0
  269. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-release-propagate.service +0 -0
  270. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-release-propagate.timer +0 -0
  271. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-release-window.service +0 -0
  272. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-release-window.timer +0 -0
  273. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-serve.service +0 -0
  274. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web-dist-build.service +0 -0
  275. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web-dist-build.sh +0 -0
  276. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web-dist-build.timer +0 -0
  277. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web-rollback.sh +0 -0
  278. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web.service +0 -0
  279. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/node-shim.sh +0 -0
  280. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  281. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ADR_COORD_WEB_CI.md +0 -0
  282. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ADR_COORD_WEB_DIST.md +0 -0
  283. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/AGENT_OPERATIONS.md +0 -0
  284. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ARCHITECTURE.md +0 -0
  285. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ARCH_SECURITY_GATES.md +0 -0
  286. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/COCKPIT.md +0 -0
  287. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/CONTROL_CENTER.md +0 -0
  288. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/COST_DISCIPLINE.md +0 -0
  289. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/CROSS_PLATFORM.md +0 -0
  290. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/CUSTOMER_PORTAL.md +0 -0
  291. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/DRIVE_QUEUE.md +0 -0
  292. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/EPHEMERAL_WORKERS.md +0 -0
  293. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/FORGE_MIGRATION.md +0 -0
  294. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/GRAPHIFY_SETUP.md +0 -0
  295. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ISSUE_GUIDANCE.md +0 -0
  296. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/MAC_MINI.md +0 -0
  297. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  298. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/NOTIFIER.md +0 -0
  299. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/OPENCODE_VERIFICATION.md +0 -0
  300. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/OPERATING_GOTCHAS.md +0 -0
  301. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ORACLE_LOOP.md +0 -0
  302. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/PHONE_WEBAPP.md +0 -0
  303. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/PIPELINE_V2.md +0 -0
  304. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/PLATFORM_EVOLUTION.md +0 -0
  305. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/SECOND_BACKEND.md +0 -0
  306. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/STORE_SERVICE.md +0 -0
  307. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  308. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/WEB_CONTROL_CENTER.md +0 -0
  309. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/WSL_WINDOWS_WORKER.md +0 -0
  310. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/README.md +0 -0
  311. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/_tokens.css +0 -0
  312. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/issue-detail.html +0 -0
  313. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/pipeline-narrow.html +0 -0
  314. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/pipeline-wide.html +0 -0
  315. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/graphify-out/.gitignore +0 -0
  316. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/install-agent.sh +0 -0
  317. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/pyproject.toml +0 -0
  318. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/audit_review_verdict_overrides.py +0 -0
  319. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  320. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/build-worker-image.sh +0 -0
  321. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/coordinator-machine.py +0 -0
  322. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/epic-down.sh +0 -0
  323. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/epic-up.sh +0 -0
  324. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/preflight.sh +0 -0
  325. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/provision-worker.sh +0 -0
  326. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  327. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  328. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/verify-github-token.sh +0 -0
  329. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/check_gh_argv_containment.py +0 -0
  330. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/codegen.py +0 -0
  331. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/coord-test-runner.sh +0 -0
  332. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/drive-batch.sh +0 -0
  333. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/gen_board_fixture.py +0 -0
  334. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/next_release_tag.py +0 -0
  335. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/run_tests_in_populated_home.sh +0 -0
  336. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/run_tests_without_gh.sh +0 -0
  337. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/smoke_437_interactive.py +0 -0
  338. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/verify_878_review_capture.py +0 -0
  339. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/verify_release_published.py +0 -0
  340. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/verify_release_wheel.py +0 -0
  341. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/setup.cfg +0 -0
  342. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/SMOKE_SET.md +0 -0
  343. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/__init__.py +0 -0
  344. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  345. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/contract.md +0 -0
  346. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/manifest.yml +0 -0
  347. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  348. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  349. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  350. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  351. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/conftest.py +0 -0
  352. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/contract.md +0 -0
  353. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/manifest.yml +0 -0
  354. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  355. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  356. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/contract.md +0 -0
  357. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/manifest.yml +0 -0
  358. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  359. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  360. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  361. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  362. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  363. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  364. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  365. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  366. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  367. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  368. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/contract.md +0 -0
  369. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  370. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  371. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/manifest.yml +0 -0
  372. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  373. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/tsconfig.json +0 -0
  374. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  375. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  376. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  377. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/contract.md +0 -0
  378. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  379. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/manifest.yml +0 -0
  380. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  381. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  382. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  383. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  384. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  385. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  386. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  387. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  388. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  389. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  390. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  391. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  392. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/conftest.py +0 -0
  393. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/board-pipeline-basic.json +0 -0
  394. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  395. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  396. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  397. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  398. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/all_pass.json +0 -0
  399. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  400. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/mixed_fail.json +0 -0
  401. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  402. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  403. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/skip.json +0 -0
  404. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/truncated.json +0 -0
  405. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  406. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  407. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  408. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  409. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  410. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  411. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  412. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  413. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_acceptance.py +0 -0
  414. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_acceptance_drivers.py +0 -0
  415. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent.py +0 -0
  416. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_api_error.py +0 -0
  417. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_app.py +0 -0
  418. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_branch_base.py +0 -0
  419. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_branch_capture.py +0 -0
  420. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_config_free_1712.py +0 -0
  421. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_deploy_units_endpoint.py +0 -0
  422. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_dirty_worktree.py +0 -0
  423. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  424. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_graph_self_heal.py +0 -0
  425. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_health_h3.py +0 -0
  426. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_idle_restart.py +0 -0
  427. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_push_failure.py +0 -0
  428. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_reap.py +0 -0
  429. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_repos_and_pull.py +0 -0
  430. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_restart_services_endpoint.py +0 -0
  431. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_skills_self_heal.py +0 -0
  432. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_startup_diagnostics.py +0 -0
  433. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_update.py +0 -0
  434. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_update_bluegreen.py +0 -0
  435. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_usage_limit.py +0 -0
  436. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_zero_commit.py +0 -0
  437. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ambient_home_isolation.py +0 -0
  438. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_approve_reject_plan.py +0 -0
  439. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_approve_usage_gate.py +0 -0
  440. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_assignment_already_recorded_daemon.py +0 -0
  441. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_audit_log.py +0 -0
  442. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_audit_outcome.py +0 -0
  443. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_audit_query.py +0 -0
  444. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_auto_loop.py +0 -0
  445. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_auto_release_publish_2035.py +0 -0
  446. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_base_checkout_restore.py +0 -0
  447. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_block_log.py +0 -0
  448. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_cap_762.py +0 -0
  449. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_fixture.py +0 -0
  450. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_read_path.py +0 -0
  451. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_service.py +0 -0
  452. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_state.py +0 -0
  453. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_wire.py +0 -0
  454. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_brain.py +0 -0
  455. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_branch_model.py +0 -0
  456. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_bug_intake.py +0 -0
  457. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_build_worker_image_env_update.py +0 -0
  458. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cargo_cache.py +0 -0
  459. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_check_gh_argv_containment.py +0 -0
  460. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ci_acceptance_gate_1950.py +0 -0
  461. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ci_gitlab.py +0 -0
  462. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ci_parity_2091.py +0 -0
  463. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ci_store.py +0 -0
  464. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_claim.py +0 -0
  465. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_acceptance.py +0 -0
  466. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign.py +0 -0
  467. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  468. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign_interactive_remote.py +0 -0
  469. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign_provider.py +0 -0
  470. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  471. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_audit.py +0 -0
  472. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_chat_continue.py +0 -0
  473. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_decide.py +0 -0
  474. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_diagnose_config_provenance.py +0 -0
  475. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_diagnose_forge_availability.py +0 -0
  476. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_diagnose_graph.py +0 -0
  477. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_diagnose_self.py +0 -0
  478. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_doctor.py +0 -0
  479. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_doctor_config_free_1801.py +0 -0
  480. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  481. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_drive.py +0 -0
  482. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_drive_queue.py +0 -0
  483. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_escalate.py +0 -0
  484. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_fix_headless_review.py +0 -0
  485. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_gate_a.py +0 -0
  486. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_install_drift.py +0 -0
  487. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_install_skills.py +0 -0
  488. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_issue_create_label.py +0 -0
  489. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_issue_reopen.py +0 -0
  490. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_merge.py +0 -0
  491. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_assign.py +0 -0
  492. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_capture.py +0 -0
  493. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_chat_add_child.py +0 -0
  494. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_dispatch.py +0 -0
  495. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_gate_b.py +0 -0
  496. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_gate_c.py +0 -0
  497. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_order.py +0 -0
  498. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  499. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_ship.py +0 -0
  500. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_network.py +0 -0
  501. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_new_issue_chat.py +0 -0
  502. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_plans.py +0 -0
  503. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_pull_artifact.py +0 -0
  504. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_queue.py +0 -0
  505. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_reattach_sessions.py +0 -0
  506. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_refine_board.py +0 -0
  507. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_release_preflight.py +0 -0
  508. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_release_propagate.py +0 -0
  509. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_release_window.py +0 -0
  510. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_repo_2220.py +0 -0
  511. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_scorecard.py +0 -0
  512. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_set_review_findings.py +0 -0
  513. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_advisory_terminal.py +0 -0
  514. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_merge_queue.py +0 -0
  515. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_provider.py +0 -0
  516. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_review_finalizing.py +0 -0
  517. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_test_failed_tag.py +0 -0
  518. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_usage_limit.py +0 -0
  519. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_sync_comments_873.py +0 -0
  520. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_test_plan.py +0 -0
  521. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_track.py +0 -0
  522. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_tui_update.py +0 -0
  523. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_wait.py +0 -0
  524. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_client_base_install.py +0 -0
  525. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_comments.py +0 -0
  526. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_completion_summary.py +0 -0
  527. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config.py +0 -0
  528. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_acceptance.py +0 -0
  529. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_audit.py +0 -0
  530. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_pricing.py +0 -0
  531. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  532. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_usage_gate.py +0 -0
  533. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_confirm_test.py +0 -0
  534. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_conflict_fix.py +0 -0
  535. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_conflict_fix_semantic.py +0 -0
  536. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test.py +0 -0
  537. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test_runner_baseline.py +0 -0
  538. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test_runner_populated_home.py +0 -0
  539. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test_runner_routing.py +0 -0
  540. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test_runner_toolchain.py +0 -0
  541. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_web_sse_restart_live.py +0 -0
  542. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coordinator_machine.py +0 -0
  543. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cross_platform_imports.py +0 -0
  544. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dashboard.py +0 -0
  545. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dashboard_fixture.py +0 -0
  546. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dashboard_terminal.py +0 -0
  547. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dashboard_terminal_live.py +0 -0
  548. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_db.py +0 -0
  549. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dead_end.py +0 -0
  550. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_coord_db_backup.py +0 -0
  551. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_coord_web_dist.py +0 -0
  552. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_coord_web_rollback.py +0 -0
  553. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_drive_queue_unit.py +0 -0
  554. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_manifest.py +0 -0
  555. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_units_lane.py +0 -0
  556. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_web_unit.py +0 -0
  557. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deps.py +0 -0
  558. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_diagnose.py +0 -0
  559. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dispatch.py +0 -0
  560. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dispatch_target_validation.py +0 -0
  561. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dist_name.py +0 -0
  562. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_done_housekeeping.py +0 -0
  563. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_drive.py +0 -0
  564. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_drive_queue.py +0 -0
  565. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_drive_state.py +0 -0
  566. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_drive_tmux.py +0 -0
  567. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_epic_up_capability_detection.py +0 -0
  568. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  569. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_epic_up_image_provenance.py +0 -0
  570. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_errors.py +0 -0
  571. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_events.py +0 -0
  572. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_failure_class.py +0 -0
  573. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_filelock.py +0 -0
  574. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  575. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_fix_of_force_override.py +0 -0
  576. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_fleet_config_health.py +0 -0
  577. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_fleet_health_probes.py +0 -0
  578. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_fleet_health_snapshot.py +0 -0
  579. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_forge_availability.py +0 -0
  580. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_freshness.py +0 -0
  581. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gate_a.py +0 -0
  582. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gate_b.py +0 -0
  583. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gate_snapshot_staleness.py +0 -0
  584. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gates.py +0 -0
  585. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  586. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_generated_types_fixture.py +0 -0
  587. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_github_ops.py +0 -0
  588. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_goal.py +0 -0
  589. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_graph_health.py +0 -0
  590. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_graph_selfheal_absent_2237.py +0 -0
  591. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_handoff.py +0 -0
  592. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_checks.py +0 -0
  593. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_cli.py +0 -0
  594. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_cli_graph.py +0 -0
  595. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_config.py +0 -0
  596. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_context.py +0 -0
  597. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_coord_web_ci_pin.py +0 -0
  598. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_deploy_lane_facts.py +0 -0
  599. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_incident_regression.py +0 -0
  600. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_pypi.py +0 -0
  601. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_registry.py +0 -0
  602. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_timer_active.py +0 -0
  603. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_toolchain.py +0 -0
  604. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_unit_drift.py +0 -0
  605. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_unit_enablement.py +0 -0
  606. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_hooks.py +0 -0
  607. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_human_attended_437.py +0 -0
  608. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_init.py +0 -0
  609. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_integration.py +0 -0
  610. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_briefing_echo.py +0 -0
  611. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_prefill_state.py +0 -0
  612. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_session_relaunch.py +0 -0
  613. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_test_verdict_backstop.py +0 -0
  614. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_token_attribution.py +0 -0
  615. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_worktree.py +0 -0
  616. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_issue_store_seam.py +0 -0
  617. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_liveness_auditor.py +0 -0
  618. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_liveness_notify.py +0 -0
  619. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_machine_pause.py +0 -0
  620. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_merge_verify.py +0 -0
  621. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_chat.py +0 -0
  622. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_dispatch.py +0 -0
  623. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_gate.py +0 -0
  624. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_order.py +0 -0
  625. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_seam.py +0 -0
  626. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_model_tiering.py +0 -0
  627. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_models.py +0 -0
  628. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_models_config_labels.py +0 -0
  629. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_needs_attention.py +0 -0
  630. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_network.py +0 -0
  631. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_new_issue_chat.py +0 -0
  632. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_next_release_tag.py +0 -0
  633. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_node_shim.py +0 -0
  634. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_baseline.py +0 -0
  635. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_cli.py +0 -0
  636. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_collect.py +0 -0
  637. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_config.py +0 -0
  638. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_drive_seam.py +0 -0
  639. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_isolation.py +0 -0
  640. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_predicate.py +0 -0
  641. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_quiet_hours.py +0 -0
  642. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_service.py +0 -0
  643. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notify.py +0 -0
  644. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notify_drain.py +0 -0
  645. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_openapi.py +0 -0
  646. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_operational_defaults.py +0 -0
  647. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_overlap_fence.py +0 -0
  648. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_overlap_predict.py +0 -0
  649. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_packaged_deploy_units.py +0 -0
  650. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_parentage.py +0 -0
  651. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_paste_landed.py +0 -0
  652. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_pipeline.py +0 -0
  653. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_followup_approve_plan_command.py +0 -0
  654. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_followup_pr_command.py +0 -0
  655. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_followup_review_command.py +0 -0
  656. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_only.py +0 -0
  657. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_parser.py +0 -0
  658. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_platform_paths.py +0 -0
  659. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_portal_config.py +0 -0
  660. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_portal_sync.py +0 -0
  661. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_pr_body_lint.py +0 -0
  662. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_prereqs.py +0 -0
  663. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_production_db_guard.py +0 -0
  664. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_progress.py +0 -0
  665. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_provider_seam.py +0 -0
  666. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_providers.py +0 -0
  667. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_providers_config_labels.py +0 -0
  668. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_providers_pty.py +0 -0
  669. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_quiet_hours.py +0 -0
  670. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_quiet_hours_store_2146.py +0 -0
  671. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reap_merged_sessions.py +0 -0
  672. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reap_stale_interactive_tick.py +0 -0
  673. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile.py +0 -0
  674. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_branch.py +0 -0
  675. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_completions.py +0 -0
  676. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_merges.py +0 -0
  677. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_no_agent_record.py +0 -0
  678. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_tick.py +0 -0
  679. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_usage_limit_done.py +0 -0
  680. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_refine_chat.py +0 -0
  681. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_cordon_2101.py +0 -0
  682. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  683. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_cordon_deadlock_2240.py +0 -0
  684. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_cordon_stuck_2490.py +0 -0
  685. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_propagate.py +0 -0
  686. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_unified_1242.py +0 -0
  687. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_verify.py +0 -0
  688. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_window.py +0 -0
  689. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_remote_auto_prune.py +0 -0
  690. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_remote_interactive_reaper.py +0 -0
  691. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_repo_edit_2220.py +0 -0
  692. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_repo_graph_fleet_2237.py +0 -0
  693. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_repo_onboard_2220.py +0 -0
  694. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_report_result_push.py +0 -0
  695. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reports.py +0 -0
  696. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_retry.py +0 -0
  697. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_retry_advisory_1606.py +0 -0
  698. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_retry_type_1636.py +0 -0
  699. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_revalidate.py +0 -0
  700. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review.py +0 -0
  701. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_end_review_without_verdict.py +0 -0
  702. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_parse_failure_diagnostic.py +0 -0
  703. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_reaffirm.py +0 -0
  704. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_state.py +0 -0
  705. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_verdict_backstop.py +0 -0
  706. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_verdict_override_audit.py +0 -0
  707. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_verdict_relay.py +0 -0
  708. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_zero_commits.py +0 -0
  709. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_scoped_review_wiring.py +0 -0
  710. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_scorecard.py +0 -0
  711. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_self_health.py +0 -0
  712. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_serve.py +0 -0
  713. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_serve_app_board_trim.py +0 -0
  714. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_session.py +0 -0
  715. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_slice_issue_attribution.py +0 -0
  716. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_smoke.py +0 -0
  717. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_smoke_live_checkout_restore.py +0 -0
  718. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_smoke_workflow.py +0 -0
  719. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_spend_ceiling.py +0 -0
  720. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_spend_ceiling_coordinator.py +0 -0
  721. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_split.py +0 -0
  722. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_split_work.py +0 -0
  723. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_stage_projection.py +0 -0
  724. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_stalled_pipeline.py +0 -0
  725. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_state.py +0 -0
  726. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_state_review_findings_daemon.py +0 -0
  727. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_status_fleet_footer.py +0 -0
  728. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_stop_1567.py +0 -0
  729. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_stuck.py +0 -0
  730. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_terminal_command.py +0 -0
  731. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_author.py +0 -0
  732. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_chat.py +0 -0
  733. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_orchestrator.py +0 -0
  734. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_report.py +0 -0
  735. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_verdict_parsing.py +0 -0
  736. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_verdict_transcript_floor.py +0 -0
  737. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_thin_client_board_audit.py +0 -0
  738. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_thin_client_config_load_1080.py +0 -0
  739. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_thin_client_daemon_routing_906.py +0 -0
  740. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_tmux_host.py +0 -0
  741. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_tmux_session.py +0 -0
  742. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_transcript_floor.py +0 -0
  743. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_usage.py +0 -0
  744. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_usage_limits.py +0 -0
  745. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_usage_rollup.py +0 -0
  746. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_venv_live_install_2121.py +0 -0
  747. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_version_single_source.py +0 -0
  748. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_watch.py +0 -0
  749. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  750. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worker_events.py +0 -0
  751. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worker_image_pin_sync.py +0 -0
  752. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worker_safety.py +0 -0
  753. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worker_test_scoping.py +0 -0
  754. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worktree.py +0 -0
  755. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  756. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/Cargo.lock +0 -0
  757. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/Cargo.toml +0 -0
  758. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/cargo-config-local-quadraui.toml.example +0 -0
  759. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/audit.rs +0 -0
  760. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/chat.rs +0 -0
  761. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/data.rs +0 -0
  762. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/dialogs.rs +0 -0
  763. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/doc_tabs.rs +0 -0
  764. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/drive.rs +0 -0
  765. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/drive_queue.rs +0 -0
  766. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/escalation.rs +0 -0
  767. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/events.rs +0 -0
  768. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/fixtures.rs +0 -0
  769. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/fleet_health.rs +0 -0
  770. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/fleet_sessions.rs +0 -0
  771. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/fleet_terminals.rs +0 -0
  772. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/format.rs +0 -0
  773. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/milestone_dag.rs +0 -0
  774. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/mod.rs +0 -0
  775. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/msv.rs +0 -0
  776. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/pipeline.rs +0 -0
  777. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/plans.rs +0 -0
  778. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/render.rs +0 -0
  779. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/reports.rs +0 -0
  780. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/sessions.rs +0 -0
  781. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/settings_ui.rs +0 -0
  782. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/sidebar.rs +0 -0
  783. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/terminal.rs +0 -0
  784. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/tests.rs +0 -0
  785. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/types.rs +0 -0
  786. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/workspace.rs +0 -0
  787. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/bin/gtk.rs +0 -0
  788. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/commands.rs +0 -0
  789. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/lib.rs +0 -0
  790. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/main.rs +0 -0
  791. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/settings.rs +0 -0
  792. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/tests/acceptance.rs +0 -0
  793. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/tests/cli.rs +0 -0
  794. {code_coordinator-0.5.202 → code_coordinator-0.5.204}/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.202
3
+ Version: 0.5.204
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.202
3
+ Version: 0.5.204
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
@@ -586,6 +586,7 @@ tests/test_plan_parser.py
586
586
  tests/test_platform_paths.py
587
587
  tests/test_portal_bridge.py
588
588
  tests/test_portal_config.py
589
+ tests/test_portal_store.py
589
590
  tests/test_portal_sync.py
590
591
  tests/test_pr_body_lint.py
591
592
  tests/test_prereqs.py
@@ -648,6 +648,7 @@
648
648
  "tests/test_platform_paths.py",
649
649
  "tests/test_portal_bridge.py",
650
650
  "tests/test_portal_config.py",
651
+ "tests/test_portal_store.py",
651
652
  "tests/test_portal_sync.py",
652
653
  "tests/test_pr_body_lint.py",
653
654
  "tests/test_prereqs.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.202",
2
+ "tag": "0.5.204",
3
3
  "distance": 0,
4
- "node": "ga9e29961ca26348c484ecee55a737e8c98826ac8",
4
+ "node": "g471c14e8906b4f0ebf43a5b08365c101a0b02156",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-21"
@@ -31,6 +31,8 @@ follow-up); this is the "fail loud instead of running wrong" half.
31
31
 
32
32
  from __future__ import annotations
33
33
 
34
+ import datetime
35
+ import getpass
34
36
  import json
35
37
 
36
38
  import click
@@ -44,6 +46,13 @@ from coord.portal_bridge import (
44
46
  )
45
47
 
46
48
 
49
+ def _actor() -> str:
50
+ try:
51
+ return getpass.getuser()
52
+ except Exception: # noqa: BLE001 — no passwd entry in some containers
53
+ return "unknown"
54
+
55
+
47
56
  def _refuse_if_thin_client(cmd_name: str) -> None:
48
57
  """Refuse *cmd_name* when this machine isn't the daemon host (#2336).
49
58
 
@@ -194,6 +203,87 @@ def portal_push(config_path, submission_id: str, revision: int, status: str) ->
194
203
  raise SystemExit(1)
195
204
 
196
205
 
206
+ # ── #2507: milestone ↔ portal submission linkage ────────────────────────────
207
+
208
+
209
+ @portal_group.command("link")
210
+ @_CONFIG_OPTION
211
+ @click.argument("repo")
212
+ @click.argument("milestone_number", type=int)
213
+ @click.argument("submission_id", required=False)
214
+ def portal_link(
215
+ config_path, repo: str, milestone_number: int, submission_id: str | None
216
+ ) -> None:
217
+ """Record, or read, one milestone's portal submission_id link (#2507).
218
+
219
+ With SUBMISSION_ID: link REPO's milestone MILESTONE_NUMBER to it.
220
+ Operator-run — submission creation is driven by the portal's own intake
221
+ flow, not by coord, so there is currently no automatic way for coord to
222
+ learn a submission exists at all.
223
+
224
+ Without SUBMISSION_ID: report the current link, mirroring `coord gate-a`'s
225
+ read/write dual-mode shape.
226
+
227
+ Nothing downstream resolves this automatically yet — PDR-3's auto-push
228
+ and PDR-4's verdict consumer (the epic's later legs, #2506) are what will
229
+ read it once they exist.
230
+ """
231
+ _refuse_if_thin_client("link")
232
+
233
+ from coord import portal_store # noqa: PLC0415
234
+ from coord.audit import record_audit # noqa: PLC0415
235
+
236
+ cfg = _load_config(config_path)
237
+ repo_cfg = cfg.repo(repo)
238
+ if repo_cfg is None:
239
+ click.secho(f"error: unknown repo {repo!r}", fg="red")
240
+ raise SystemExit(2)
241
+
242
+ if submission_id is None:
243
+ link = portal_store.get_milestone_link(
244
+ repo_name=repo_cfg.name, milestone_number=milestone_number
245
+ )
246
+ if link is None:
247
+ click.echo(f"{repo_cfg.name} ms-{milestone_number}: not linked")
248
+ raise SystemExit(1)
249
+ when = datetime.datetime.fromtimestamp(
250
+ link.linked_at, tz=datetime.timezone.utc
251
+ ).strftime("%Y-%m-%d %H:%M UTC")
252
+ click.echo(
253
+ f"{repo_cfg.name} ms-{milestone_number}: "
254
+ f"submission_id={link.submission_id} "
255
+ f"(linked by {link.actor or 'unknown'} at {when})"
256
+ )
257
+ return
258
+
259
+ link = portal_store.link_milestone(
260
+ repo_name=repo_cfg.name,
261
+ milestone_number=milestone_number,
262
+ submission_id=submission_id,
263
+ actor=_actor(),
264
+ )
265
+ record_audit(
266
+ tier="business",
267
+ category="portal",
268
+ event_type="portal_link",
269
+ actor=link.actor,
270
+ summary=(
271
+ f"linked {repo_cfg.name} ms-{milestone_number} to portal "
272
+ f"submission {submission_id}"
273
+ ),
274
+ repo=repo_cfg.name,
275
+ details={
276
+ "milestone_number": milestone_number,
277
+ "submission_id": submission_id,
278
+ },
279
+ )
280
+ click.secho(
281
+ f"linked: {repo_cfg.name} ms-{milestone_number} -> "
282
+ f"submission_id={submission_id}",
283
+ fg="green",
284
+ )
285
+
286
+
197
287
  # ── #1982: the sync loop's operator surface ─────────────────────────────────
198
288
 
199
289
 
@@ -4981,6 +4981,119 @@ def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> Merge
4981
4981
  return MergeEvent(entry, event_type, msg)
4982
4982
 
4983
4983
 
4984
+ def _maybe_push_design_round(
4985
+ entry: QueuedMerge, config, gh_ops: GhOps
4986
+ ) -> "MergeEvent | None":
4987
+ """PDR-3 (#2508): right after a `type="mock-author"` (Gate A) PR has
4988
+ actually merged into ``entry.target_branch``, push its rendered mock
4989
+ bundle + contract to the portal as a design round — the epic-#2506
4990
+ bridge's third leg, wiring PDR-1's link (``coord portal link``,
4991
+ #2507) and PDR-2's upload route (coord-portal#120) into the one signal
4992
+ ``coord/merge_queue.py`` already fires for any assignment type: a real
4993
+ merge.
4994
+
4995
+ Returns ``None`` for every "nothing to do" reason — not a `mock-author`
4996
+ entry, no ``portal:`` block configured, the tracking issue isn't under
4997
+ a milestone, or (the common case pre-#2508) the milestone has no portal
4998
+ link on file. That last one is the fail-open posture
4999
+ ``coord.portal_bridge``'s module docstring already states for the rest
5000
+ of this bridge: "a portal outage must never block a merge or a
5001
+ dispatch" applies just as much to "there's simply no portal submission
5002
+ for this milestone yet" — until an operator runs ``coord portal link``,
5003
+ this is silently, correctly, a no-op. Every other failure (can't fetch
5004
+ the tracking issue, can't collect the bundle, upload/enqueue rejected)
5005
+ degrades to a ``design_round_push_failed`` event rather than raising —
5006
+ called from ``process()`` inside its own try/except, same discipline as
5007
+ :func:`_maybe_clear_expected_red` right above it, but belt-and-braces
5008
+ here too since this reaches out to two different externals (GitHub's
5009
+ Contents API and the portal itself).
5010
+ """
5011
+ if entry.assignment_type != "mock-author":
5012
+ return None
5013
+ portal_cfg = getattr(config, "portal", None)
5014
+ if portal_cfg is None or not portal_cfg.enabled:
5015
+ return None
5016
+
5017
+ # #1467-style optional probe: `get_issue` isn't part of the GhOps
5018
+ # Protocol proper (most stubs in tests never need it), so a stub that
5019
+ # doesn't implement it degrades to "nothing to do" rather than an
5020
+ # AttributeError — mirrors `branch_has_merge_commit`'s optional-probe
5021
+ # pattern used for the rebase→squash fallback above.
5022
+ get_issue = getattr(gh_ops, "get_issue", None)
5023
+ if get_issue is None:
5024
+ return None
5025
+ try:
5026
+ issue_data = get_issue(entry.repo_github, entry.issue_number)
5027
+ except Exception as e: # noqa: BLE001 — best-effort, see docstring
5028
+ return MergeEvent(
5029
+ entry, "design_round_push_failed",
5030
+ f"could not fetch tracking issue #{entry.issue_number}: {e}",
5031
+ )
5032
+ milestone = (issue_data or {}).get("milestone") or {}
5033
+ milestone_number = milestone.get("number")
5034
+ if milestone_number is None:
5035
+ # A "mock-author" entry not scoped to a milestone at all (shouldn't
5036
+ # happen via `coord acceptance mock`, which always resolves one —
5037
+ # but this hook must survive a hand-dispatched entry that skips it).
5038
+ return None
5039
+
5040
+ from coord import portal_store # noqa: PLC0415
5041
+
5042
+ link = portal_store.get_milestone_link(
5043
+ repo_name=entry.repo_name, milestone_number=milestone_number
5044
+ )
5045
+ if link is None:
5046
+ # PDR-1: no `coord portal link` recorded for this milestone yet —
5047
+ # the whole point of the fail-open posture (see docstring above).
5048
+ return None
5049
+
5050
+ from coord.mock_author import build_design_round, collect_mock_bundle_files # noqa: PLC0415
5051
+ from coord.portal_bridge import PortalBridgeError, client_from_config # noqa: PLC0415
5052
+ from coord.portal_sync import PortalSyncError, enqueue_design_round # noqa: PLC0415
5053
+
5054
+ client = client_from_config(portal_cfg)
5055
+ if client is None:
5056
+ return None
5057
+
5058
+ try:
5059
+ files = collect_mock_bundle_files(
5060
+ entry.repo_github, milestone_number, entry.target_branch
5061
+ )
5062
+ except Exception as e: # noqa: BLE001 — best-effort, see docstring
5063
+ return MergeEvent(
5064
+ entry, "design_round_push_failed",
5065
+ f"could not collect mock bundle: {e}",
5066
+ )
5067
+ if not files:
5068
+ return MergeEvent(
5069
+ entry, "design_round_push_skipped",
5070
+ f"no rendered mock bundle found on {entry.target_branch} for "
5071
+ f"ms-{milestone_number} — nothing to push",
5072
+ )
5073
+
5074
+ try:
5075
+ bundle_key = client.upload_bundle(link.submission_id, files)
5076
+ except PortalBridgeError as e:
5077
+ return MergeEvent(entry, "design_round_push_failed", f"bundle upload failed: {e}")
5078
+
5079
+ design_round = build_design_round(
5080
+ milestone_title=milestone.get("title") or f"ms-{milestone_number}",
5081
+ tracking_issue_title=issue_data.get("title") or "",
5082
+ tracking_issue_body=issue_data.get("body") or "",
5083
+ bundle_key=bundle_key,
5084
+ )
5085
+ try:
5086
+ row = enqueue_design_round(link.submission_id, design_round)
5087
+ except PortalSyncError as e:
5088
+ return MergeEvent(entry, "design_round_push_failed", f"enqueue failed: {e}")
5089
+
5090
+ return MergeEvent(
5091
+ entry, "design_round_queued",
5092
+ f"queued design round for portal submission {link.submission_id} "
5093
+ f"(seq={row.seq}, bundle_key={bundle_key})",
5094
+ )
5095
+
5096
+
4984
5097
  def process(
4985
5098
  items: list[QueuedMerge],
4986
5099
  gh_ops: GhOps,
@@ -6205,6 +6318,20 @@ def process(
6205
6318
  clear_event = MergeEvent(entry, "expected_red_clear_failed", str(e))
6206
6319
  if clear_event is not None:
6207
6320
  events.append(clear_event)
6321
+ # PDR-3 (#2508): a merged Gate-A (`type="mock-author"`)
6322
+ # branch auto-pushes a design round to the portal, if (and
6323
+ # only if) its milestone has a portal link on file. Best
6324
+ # effort, same as the expected_red clear above — a portal
6325
+ # outage, or simply no `coord portal link` recorded, must
6326
+ # never undo a real merge.
6327
+ try:
6328
+ design_round_event = _maybe_push_design_round(entry, config, gh_ops)
6329
+ except Exception as e: # noqa: BLE001 — bookkeeping, never undoes a real merge
6330
+ design_round_event = MergeEvent(
6331
+ entry, "design_round_push_failed", str(e)
6332
+ )
6333
+ if design_round_event is not None:
6334
+ events.append(design_round_event)
6208
6335
  continue
6209
6336
  entry.state = CONFLICT
6210
6337
  entry.error = msg
@@ -25,10 +25,18 @@ TYPES``) and the matching exemption from the acceptance-dir auto-forbid in
25
25
  Work → Test → Review → Merge pipeline as any other branch (`required_gates`
26
26
  is the repo's normal `default_gates`) — Gate A produces a normal reviewed
27
27
  commit, not a special-cased one.
28
+
29
+ **PDR-3 (#2508):** :func:`collect_mock_bundle_files` and
30
+ :func:`build_design_round` are the other end of Gate A's output — read back
31
+ off a merged mock-author branch and reshaped into a portal design round by
32
+ ``coord.merge_queue``'s post-merge hook, so a Gate-A merge auto-pushes a
33
+ design round to any milestone with a portal link (`coord portal link`,
34
+ PDR-1/#2507) instead of that link sitting unread.
28
35
  """
29
36
  from __future__ import annotations
30
37
 
31
38
  import uuid
39
+ from typing import Any
32
40
 
33
41
  import httpx
34
42
 
@@ -332,3 +340,97 @@ def dispatch_acceptance_mock(
332
340
  pass
333
341
 
334
342
  return assignment_id, machine.name
343
+
344
+
345
+ # ── PDR-3 (#2508): reading a merged Gate-A branch back into a design round ──
346
+
347
+
348
+ def collect_mock_bundle_files(
349
+ repo_github: str, milestone_number: int, branch: str
350
+ ) -> dict[str, str]:
351
+ """Read a rendered Gate-A bundle off *branch* (post-merge) via the
352
+ GitHub Contents API — no local checkout, the same "gh-only wire layer"
353
+ posture the merge queue's other post-merge reads already use (see e.g.
354
+ ``coord.acceptance.clear_expected_red_via_pr``'s docstring).
355
+
356
+ Returns a ``{relative_path: content}`` mapping — ``"contract.md"`` plus
357
+ every ``mocks/*.html`` fixture under
358
+ ``tests/acceptance/ms-<milestone_number>/`` — ready to hand straight to
359
+ :meth:`coord.portal_bridge.PortalBridgeClient.upload_bundle`. Empty
360
+ when the directory doesn't exist on *branch* (Gate A hasn't merged
361
+ anything there yet, or the repo's acceptance driver renders to a
362
+ different mock glob than ``*.html``) — callers treat that as "nothing
363
+ to push", not an error.
364
+ """
365
+ ms_dir = f"tests/acceptance/{ms_dirname(milestone_number)}"
366
+ files: dict[str, str] = {}
367
+ if github_ops.repo_file_exists(repo_github, f"{ms_dir}/contract.md", branch):
368
+ files["contract.md"] = github_ops.get_repo_file(
369
+ repo_github, f"{ms_dir}/contract.md", branch
370
+ )
371
+ try:
372
+ mock_names = github_ops.list_repo_dir(repo_github, f"{ms_dir}/mocks", branch)
373
+ except RuntimeError:
374
+ # No `mocks/` dir on this branch at all — same "nothing to push"
375
+ # case list_repo_dir already returns [] for a missing path; the
376
+ # explicit catch is only for a `gh` error shaped differently.
377
+ mock_names = []
378
+ for name in mock_names:
379
+ if name.endswith(".html"):
380
+ files[f"mocks/{name}"] = github_ops.get_repo_file(
381
+ repo_github, f"{ms_dir}/mocks/{name}", branch
382
+ )
383
+ return files
384
+
385
+
386
+ def build_design_round(
387
+ *,
388
+ milestone_title: str,
389
+ tracking_issue_title: str,
390
+ tracking_issue_body: str,
391
+ bundle_key: str,
392
+ round_number: int = 1,
393
+ ) -> dict[str, Any]:
394
+ """Build the D1 metadata half of a design round from the same inputs
395
+ `coord milestone chat`'s steward already reads: the tracking issue's
396
+ title/body (source of the plain-language ``outcome_definition``) and its
397
+ ``## Work order`` block (source of the ``decomposition``).
398
+
399
+ *bundle_key* is the R2 object key
400
+ :meth:`coord.portal_bridge.PortalBridgeClient.upload_bundle` returned
401
+ for this round's rendered mock bundle + contract — see that method's
402
+ docstring and :func:`coord.portal_sync.enqueue_design_round`'s for why
403
+ the bundle itself is never inlined into this payload.
404
+
405
+ A missing/malformed ``## Work order`` block degrades to an empty
406
+ ``decomposition`` rather than raising — a milestone that hasn't written
407
+ one yet (or has a stale one that fails validation) should still get a
408
+ design round pushed with whatever plain-language description its
409
+ tracking issue carries; the portal shows a design round with no listed
410
+ decomposition just fine.
411
+ """
412
+ from coord.milestone_order import WorkOrderError, parse_work_order # noqa: PLC0415
413
+
414
+ try:
415
+ work_order = parse_work_order(tracking_issue_body)
416
+ except WorkOrderError:
417
+ work_order = None
418
+ decomposition = [
419
+ {
420
+ "issue_number": node.issue_number,
421
+ "group": node.group,
422
+ "after": list(node.after),
423
+ }
424
+ for node in (work_order.nodes if work_order is not None else ())
425
+ ]
426
+ outcome_definition = (
427
+ tracking_issue_body.strip()
428
+ or tracking_issue_title.strip()
429
+ or milestone_title
430
+ )
431
+ return {
432
+ "round": round_number,
433
+ "outcome_definition": outcome_definition,
434
+ "decomposition": decomposition,
435
+ "bundle_key": bundle_key,
436
+ }
@@ -3,9 +3,12 @@
3
3
  **The gap this closes.** coord-portal has offered ``POST /api/bridge/push``
4
4
  since ms-1, and the entire ms-3 mail pipeline (``docs/CUSTOMER_PORTAL.md``) is
5
5
  live and waiting downstream of a queued outbox row — but nothing on this side
6
- has ever called it. This module is that client: a thin wrapper over the three
7
- bridge routes (``push``, ``pull``, ``heartbeat``), matching the wire contract
8
- coord-portal's ``src/bridge/*`` and ``src/routes/bridge.ts`` define.
6
+ has ever called it. This module is that client: a thin wrapper over
7
+ coord-portal's bridge routes (``push``, ``pull``, ``heartbeat``, and — as of
8
+ PDR-3/#2508 — ``upload``), matching the wire contract coord-portal's
9
+ ``src/bridge/*`` and ``src/routes/bridge.ts`` define. ``upload`` is the one
10
+ route that carries a bundle's raw content rather than D1 metadata — see
11
+ :meth:`PortalBridgeClient.upload_bundle`.
9
12
 
10
13
  **What this module deliberately does NOT do**, per #2179's own framing —
11
14
  those are separate, harder design questions and belong to follow-up issues:
@@ -13,9 +16,13 @@ those are separate, harder design questions and belong to follow-up issues:
13
16
  * It does not decide **when** to push. Nothing here reads coord's board or
14
17
  watches assignment status transitions. Callers hand it
15
18
  ``(submission_id, revision, status)`` and it sends that; where those three
16
- values come from — the submission↔work association, and the mapping from
17
- coord's internal states to the portal's pinned customer vocabulary — is
18
- out of scope here.
19
+ values come from is out of scope here. The submission↔work association is
20
+ now resolvable — :func:`coord.portal_store.get_milestone_link` reads the
21
+ durable ``(repo, milestone_number) -> submission_id`` mapping an operator
22
+ records with ``coord portal link`` (#2507) — but nothing in this module
23
+ calls it: this client still just sends whatever ``submission_id`` a caller
24
+ hands it. The mapping from coord's internal states to the portal's pinned
25
+ customer vocabulary is a separate, still-unaddressed question.
19
26
  * It does not persist a revision counter. The portal is idempotent by
20
27
  ``(submission_id, revision)`` and ignores anything at or below its stored
21
28
  watermark (see ``applyUpdate`` in coord-portal's ``src/bridge/updates.ts``),
@@ -315,6 +322,45 @@ class PortalBridgeClient:
315
322
  except ValueError as exc:
316
323
  raise PortalBridgeError(f"GET /api/bridge/pull: non-JSON response: {exc}") from exc
317
324
 
325
+ def upload_bundle(self, submission_id: str, files: dict[str, str]) -> str:
326
+ """``POST /api/bridge/upload`` — store a design round's rendered
327
+ mock bundle + contract in the portal's R2 (coord-portal#120, PDR-2).
328
+
329
+ Deliberately a fourth route, not folded into :meth:`push`: the
330
+ three ``/api/bridge/*`` routes this module otherwise speaks
331
+ (``push``/``pull``/``heartbeat``) carry only D1 metadata —
332
+ :func:`coord.portal_sync.enqueue_design_round`'s own docstring
333
+ already says the mock bundle itself "is not uploaded here". This is
334
+ that upload, kept separate so a bundle (arbitrarily large HTML) is
335
+ never accidentally routed through :data:`MAX_PUSH_UPDATES`-bounded
336
+ ``push`` batching.
337
+
338
+ *files* maps a path relative to the bundle root — e.g.
339
+ ``"contract.md"``, ``"mocks/index.html"`` — to its text content; see
340
+ :func:`coord.mock_author.collect_mock_bundle_files`, which builds
341
+ exactly this mapping by reading a merged Gate-A branch back off
342
+ GitHub. Returns the R2 object key the portal assigns the bundle —
343
+ callers thread that straight into the ``design_round`` payload
344
+ :func:`coord.portal_sync.enqueue_design_round` queues, so the
345
+ customer's browser has something to fetch. Raises
346
+ :class:`PortalBridgeError` the same way every other method here
347
+ does: a transport failure, a 401, a 4xx/5xx, or a response with no
348
+ usable ``bundle_key``.
349
+ """
350
+ if not files:
351
+ raise PortalBridgeError("upload_bundle() got an empty files mapping")
352
+ data = self._post(
353
+ "/api/bridge/upload",
354
+ {"submission_id": submission_id, "files": files},
355
+ )
356
+ bundle_key = data.get("bundle_key")
357
+ if not isinstance(bundle_key, str) or not bundle_key:
358
+ raise PortalBridgeError(
359
+ f"POST /api/bridge/upload: response had no 'bundle_key' "
360
+ f"string: {data!r}"
361
+ )
362
+ return bundle_key
363
+
318
364
 
319
365
  def _utcnow_iso() -> str:
320
366
  return (
@@ -762,3 +762,135 @@ def note_error(error: str) -> None:
762
762
 
763
763
  def clear_error() -> None:
764
764
  _update_sync_state(last_error="")
765
+
766
+
767
+ # ── #2507: milestone ↔ portal submission linkage ────────────────────────────
768
+ #
769
+ # Every table above is part of the sync bridge's own SQLite schema
770
+ # (``coord.db``'s ``_ensure_schema``) and, per the module docstring, is
771
+ # deliberately daemon-host-only. The link between a coord milestone and a
772
+ # portal ``submission_id`` is a DIFFERENT kind of fact — nothing here creates
773
+ # or drives it (the portal's own intake flow does, out of coord's sight) —
774
+ # but it still needs the same durability and the same "read anywhere, write
775
+ # on the daemon host" story, so it is persisted through
776
+ # :mod:`coord.state`'s ``portal_links`` board_meta seam (same shape as
777
+ # ``coord.gate_a``'s ``GateAApproval`` / ``gate_a_approvals``) rather than a
778
+ # fifth table here. This is the domain half — :mod:`coord.state` only knows
779
+ # plain dicts, this is where the dict shape is pinned down and given a
780
+ # tolerant decoder.
781
+ #
782
+ # Consumers: PDR-3's auto-push (resolve a milestone's outbox destination) and
783
+ # PDR-4's verdict consumer (resolve an inbound portal event back to a
784
+ # milestone) both need exactly this lookup and have nowhere else to get it
785
+ # (#2507 — confirmed by grep, ``submission_id`` appeared in neither
786
+ # ``coord/config.py``, ``coord/milestone*.py``, nor ``coord/gate_a.py``
787
+ # before this).
788
+
789
+ _LINK_SCHEMA = 1
790
+
791
+
792
+ @dataclass(frozen=True)
793
+ class PortalLink:
794
+ """One durable ``(repo_name, milestone_number)`` → portal ``submission_id``
795
+ mapping, set by an operator with ``coord portal link`` once a submission
796
+ exists on the portal side.
797
+ """
798
+
799
+ repo_name: str
800
+ milestone_number: int
801
+ submission_id: str
802
+ linked_at: float = 0.0
803
+ actor: str = ""
804
+ schema: int = _LINK_SCHEMA
805
+
806
+ def to_dict(self) -> dict[str, Any]:
807
+ return {
808
+ "repo_name": self.repo_name,
809
+ "milestone_number": self.milestone_number,
810
+ "submission_id": self.submission_id,
811
+ "linked_at": self.linked_at,
812
+ "actor": self.actor,
813
+ "schema": self.schema,
814
+ }
815
+
816
+ @classmethod
817
+ def from_dict(cls, raw: Any) -> "PortalLink | None":
818
+ """Tolerant decode — ``None`` for anything this build can't read.
819
+
820
+ Same posture as :meth:`coord.gate_a.GateAApproval.from_dict`: a
821
+ record written by a newer schema, or a corrupt one, degrades to "no
822
+ link recorded" rather than crashing a caller that resolves one
823
+ milestone at a time.
824
+ """
825
+ if not isinstance(raw, dict):
826
+ return None
827
+ if int(raw.get("schema", _LINK_SCHEMA) or _LINK_SCHEMA) != _LINK_SCHEMA:
828
+ return None
829
+ repo_name = raw.get("repo_name")
830
+ if not isinstance(repo_name, str) or not repo_name:
831
+ return None
832
+ milestone_number = _as_int_or_none(raw.get("milestone_number"))
833
+ if milestone_number is None:
834
+ return None
835
+ submission_id = raw.get("submission_id")
836
+ if not isinstance(submission_id, str) or not submission_id:
837
+ return None
838
+ return cls(
839
+ repo_name=repo_name,
840
+ milestone_number=milestone_number,
841
+ submission_id=submission_id,
842
+ linked_at=float(raw.get("linked_at") or 0.0),
843
+ actor=str(raw.get("actor") or ""),
844
+ )
845
+
846
+
847
+ def _as_int_or_none(value: Any) -> int | None:
848
+ try:
849
+ return int(value)
850
+ except (TypeError, ValueError):
851
+ return None
852
+
853
+
854
+ def link_milestone(
855
+ *,
856
+ repo_name: str,
857
+ milestone_number: int,
858
+ submission_id: str,
859
+ actor: str = "",
860
+ now: float | None = None,
861
+ ) -> PortalLink:
862
+ """Record (or overwrite) the portal submission_id for one milestone.
863
+
864
+ Overwrite, not append: there is exactly one live submission_id per
865
+ milestone, matching :func:`coord.state.save_gate_a_approval`'s semantics
866
+ for the same reason. Relinking is expected — an operator fixing a typo'd
867
+ submission_id, or correcting an id entered against the wrong milestone —
868
+ not an error case.
869
+ """
870
+ from coord import state # noqa: PLC0415
871
+
872
+ record = PortalLink(
873
+ repo_name=repo_name,
874
+ milestone_number=int(milestone_number),
875
+ submission_id=submission_id,
876
+ linked_at=time.time() if now is None else now,
877
+ actor=actor,
878
+ )
879
+ state.save_portal_link(record.to_dict())
880
+ return record
881
+
882
+
883
+ def get_milestone_link(*, repo_name: str, milestone_number: int) -> PortalLink | None:
884
+ """The current portal link for one milestone, or ``None`` if unlinked."""
885
+ from coord import state # noqa: PLC0415
886
+
887
+ raw = state.get_portal_link(repo_name=repo_name, milestone_number=milestone_number)
888
+ return PortalLink.from_dict(raw) if raw is not None else None
889
+
890
+
891
+ def list_milestone_links() -> list[PortalLink]:
892
+ """Every recorded milestone ↔ submission link."""
893
+ from coord import state # noqa: PLC0415
894
+
895
+ links = [PortalLink.from_dict(raw) for raw in state.list_portal_links()]
896
+ return [link for link in links if link is not None]
@@ -177,11 +177,16 @@ def enqueue_design_round(
177
177
  ) -> portal_store.OutboxRow:
178
178
  """Queue a design round (the D1 metadata half) for *submission_id*.
179
179
 
180
- The mock bundle itself is an R2 object and is **not** uploaded here: the
181
- portal's upload route is not part of the three bridge routes this side
182
- speaks (:mod:`coord.portal_bridge`), so *design_round* is expected to
183
- already carry whatever reference the customer's browser will follow. What
184
- this function guarantees is the ordering — see :func:`enqueue_status`.
180
+ The mock bundle itself is an R2 object and is **not** uploaded here:
181
+ that goes through :meth:`coord.portal_bridge.PortalBridgeClient.
182
+ upload_bundle` (coord-portal#120, PDR-2) — a separate call from the
183
+ three ``push``/``pull``/``heartbeat`` D1-metadata routes this queue
184
+ drains — so *design_round* is expected to already carry whatever
185
+ reference (the returned bundle key) the customer's browser will follow.
186
+ The auto-push caller (:mod:`coord.merge_queue`'s post-merge hook,
187
+ PDR-3/#2508) uploads first and passes the resulting key through
188
+ :func:`coord.mock_author.build_design_round`. What this function
189
+ guarantees is the ordering — see :func:`enqueue_status`.
185
190
  """
186
191
  if not isinstance(design_round, dict) or not design_round:
187
192
  raise PortalSyncError("design_round payload must be a non-empty mapping")