code-coordinator 0.5.200__tar.gz → 0.5.203__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.200 → code_coordinator-0.5.203}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/code_coordinator.egg-info/SOURCES.txt +3 -0
  4. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/code_coordinator.egg-info/scm_file_list.json +3 -0
  5. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/code_coordinator.egg-info/scm_version.json +2 -2
  6. code_coordinator-0.5.203/coord/ci_gitlab.py +489 -0
  7. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/ci_store.py +17 -1
  8. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/drive_queue.py +6 -2
  9. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/merge.py +11 -3
  10. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/plan_followup.py +3 -1
  11. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/portal.py +90 -0
  12. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/config.py +26 -7
  13. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/gate_snapshot.py +12 -5
  14. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/portal_bridge.py +7 -3
  15. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/portal_store.py +132 -0
  16. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/serve_app.py +3 -1
  17. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/state.py +98 -0
  18. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/ORACLE_LOOP.md +6 -4
  19. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_board_read_path.py +7 -7
  20. code_coordinator-0.5.203/tests/test_ci_gitlab.py +521 -0
  21. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_ci_parity_2091.py +9 -9
  22. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_drive_queue.py +1 -1
  23. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_fix_headless_review.py +6 -5
  24. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_portal.py +52 -1
  25. code_coordinator-0.5.203/tests/test_portal_store.py +176 -0
  26. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_serve.py +8 -8
  27. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/dialogs.rs +67 -2
  28. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/events.rs +32 -0
  29. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/fixtures.rs +1 -0
  30. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/mod.rs +8 -0
  31. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/pipeline.rs +85 -7
  32. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/sidebar.rs +4 -0
  33. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/tests.rs +173 -4
  34. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.claude/commands/board.md +0 -0
  35. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.claude/commands/complete-session.md +0 -0
  36. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.claude/commands/coordinator.md +0 -0
  37. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.githooks/_lib.sh +0 -0
  38. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.githooks/post-checkout +0 -0
  39. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.githooks/post-commit +0 -0
  40. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.githooks/post-merge +0 -0
  41. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  42. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.github/coord-ci-acceptance.yml +0 -0
  43. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.github/workflows/auto-release.yml +0 -0
  44. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.github/workflows/cargo-test.yml +0 -0
  45. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.github/workflows/publish.yml +0 -0
  46. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.github/workflows/release-tui.yml +0 -0
  47. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.github/workflows/test.yml +0 -0
  48. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/.gitignore +0 -0
  49. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/CLAUDE.md +0 -0
  50. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/GOAL.md +0 -0
  51. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/LICENSE +0 -0
  52. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/MANIFEST.in +0 -0
  53. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/README.md +0 -0
  54. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/code_coordinator.egg-info/dependency_links.txt +0 -0
  55. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/code_coordinator.egg-info/entry_points.txt +0 -0
  56. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/code_coordinator.egg-info/requires.txt +0 -0
  57. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/code_coordinator.egg-info/top_level.txt +0 -0
  58. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/__init__.py +0 -0
  59. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/_board_mapping.py +0 -0
  60. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/acceptance.py +0 -0
  61. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/acceptance_drivers.py +0 -0
  62. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/agent.py +0 -0
  63. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/agent_app.py +0 -0
  64. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/agent_update.py +0 -0
  65. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/agents/opencode/.gitignore +0 -0
  66. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/agents/opencode/agents/work.md +0 -0
  67. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/agents/opencode/routing.jsonc +0 -0
  68. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/audit.py +0 -0
  69. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/auto_loop.py +0 -0
  70. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/block_log.py +0 -0
  71. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/board_bool_guard.py +0 -0
  72. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/board_service.py +0 -0
  73. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/board_wire.py +0 -0
  74. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/brain.py +0 -0
  75. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/branch_model.py +0 -0
  76. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/bug_intake.py +0 -0
  77. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/cargo_cache.py +0 -0
  78. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/ci_github.py +0 -0
  79. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/claim.py +0 -0
  80. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/cli.py +0 -0
  81. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/client.py +0 -0
  82. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/__init__.py +0 -0
  83. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/_common.py +0 -0
  84. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/acceptance.py +0 -0
  85. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/agent_ops.py +0 -0
  86. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/audit.py +0 -0
  87. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/chat.py +0 -0
  88. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/dispatch.py +0 -0
  89. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/dispatch_workers.py +0 -0
  90. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/drive.py +0 -0
  91. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/gate_a.py +0 -0
  92. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/gates.py +0 -0
  93. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/issues.py +0 -0
  94. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/lifecycle.py +0 -0
  95. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/milestone.py +0 -0
  96. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/plans.py +0 -0
  97. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/release.py +0 -0
  98. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/repo.py +0 -0
  99. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/report.py +0 -0
  100. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/review.py +0 -0
  101. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/scorecard.py +0 -0
  102. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/sessions.py +0 -0
  103. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/setup.py +0 -0
  104. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/status.py +0 -0
  105. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/terminal.py +0 -0
  106. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/test_gate.py +0 -0
  107. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/commands/tui.py +0 -0
  108. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/comments.py +0 -0
  109. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/config_reload.py +0 -0
  110. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/confirm_test.py +0 -0
  111. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/conflict_fix.py +0 -0
  112. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/dao.py +0 -0
  113. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/dashboard/__init__.py +0 -0
  114. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/dashboard/fixture.py +0 -0
  115. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/dashboard/index.html +0 -0
  116. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/dashboard/server.py +0 -0
  117. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/dashboard/terminal.py +0 -0
  118. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/db.py +0 -0
  119. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/dead_end.py +0 -0
  120. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/README.md +0 -0
  121. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-agent.service +0 -0
  122. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-db-backup.service +0 -0
  123. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-db-backup.sh +0 -0
  124. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-db-backup.timer +0 -0
  125. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-drive-queue.service +0 -0
  126. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-drive-queue.timer +0 -0
  127. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-notify.service +0 -0
  128. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-notify.timer +0 -0
  129. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-release-propagate.service +0 -0
  130. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-release-propagate.timer +0 -0
  131. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-release-window.service +0 -0
  132. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-release-window.timer +0 -0
  133. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-serve.service +0 -0
  134. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-web-dist-build.service +0 -0
  135. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-web-dist-build.timer +0 -0
  136. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy/coord-web.service +0 -0
  137. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy_manifest.py +0 -0
  138. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deploy_units.py +0 -0
  139. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/deps.py +0 -0
  140. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/diagnose.py +0 -0
  141. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/dispatch.py +0 -0
  142. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/dist_name.py +0 -0
  143. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/drive.py +0 -0
  144. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/drive_queue.py +0 -0
  145. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/drive_state.py +0 -0
  146. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/events.py +0 -0
  147. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/failure_class.py +0 -0
  148. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/filelock.py +0 -0
  149. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/fleet_config_health.py +0 -0
  150. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/forge_availability.py +0 -0
  151. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/freshness.py +0 -0
  152. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/gate_a.py +0 -0
  153. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/gate_b.py +0 -0
  154. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/gates.py +0 -0
  155. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/github_ops.py +0 -0
  156. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/goal.py +0 -0
  157. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/graph_health.py +0 -0
  158. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/__init__.py +0 -0
  159. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/aggregate.py +0 -0
  160. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/__init__.py +0 -0
  161. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/agent_install.py +0 -0
  162. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/cargo_targets.py +0 -0
  163. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/claude_binary.py +0 -0
  164. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/coord_web_ci_pin.py +0 -0
  165. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/deploy_lane_facts.py +0 -0
  166. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/disk.py +0 -0
  167. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/fleet_board.py +0 -0
  168. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  169. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/fleet_phantom.py +0 -0
  170. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/fleet_unit_drift.py +0 -0
  171. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/graph.py +0 -0
  172. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/graphify_cli.py +0 -0
  173. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/index_lock.py +0 -0
  174. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/plan_usage.py +0 -0
  175. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/repo_state.py +0 -0
  176. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/spawned_coord.py +0 -0
  177. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/timer_active.py +0 -0
  178. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/toolchain.py +0 -0
  179. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/unit_drift.py +0 -0
  180. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/unit_enablement.py +0 -0
  181. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/checks/worktrees.py +0 -0
  182. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/cli.py +0 -0
  183. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/context.py +0 -0
  184. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/fleet_snapshot.py +0 -0
  185. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/models.py +0 -0
  186. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/pypi.py +0 -0
  187. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/registry.py +0 -0
  188. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/render.py +0 -0
  189. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/health/units.py +0 -0
  190. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/hooks.py +0 -0
  191. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/housekeeping.py +0 -0
  192. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/interactive.py +0 -0
  193. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/issue_store.py +0 -0
  194. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/liveness_auditor.py +0 -0
  195. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/machine_pause.py +0 -0
  196. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/merge_queue.py +0 -0
  197. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/milestone_chat.py +0 -0
  198. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/milestone_dispatch.py +0 -0
  199. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/milestone_gate.py +0 -0
  200. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/milestone_order.py +0 -0
  201. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/mock_author.py +0 -0
  202. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/models.py +0 -0
  203. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/network.py +0 -0
  204. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/new_issue_chat.py +0 -0
  205. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/__init__.py +0 -0
  206. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/baseline.py +0 -0
  207. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/cli.py +0 -0
  208. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/collect.py +0 -0
  209. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/digest.py +0 -0
  210. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/models.py +0 -0
  211. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/predicate.py +0 -0
  212. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/service.py +0 -0
  213. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/store.py +0 -0
  214. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notifier/transport.py +0 -0
  215. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/notify.py +0 -0
  216. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/openapi.py +0 -0
  217. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/overlap_fence.py +0 -0
  218. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/overlap_predict.py +0 -0
  219. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/parentage.py +0 -0
  220. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/parentage_github.py +0 -0
  221. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/pipeline.py +0 -0
  222. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/plan_parser.py +0 -0
  223. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/plans.py +0 -0
  224. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/platform_paths.py +0 -0
  225. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/portal_sync.py +0 -0
  226. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/pr_body_lint.py +0 -0
  227. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/prereqs.py +0 -0
  228. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/progress.py +0 -0
  229. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/providers/__init__.py +0 -0
  230. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/providers/base.py +0 -0
  231. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/providers/claude.py +0 -0
  232. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/providers/claude_pty.py +0 -0
  233. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/providers/opencode.py +0 -0
  234. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/queue_diagnose.py +0 -0
  235. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/reconcile.py +0 -0
  236. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/reconcile_tick.py +0 -0
  237. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/refine_chat.py +0 -0
  238. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/release_cordon.py +0 -0
  239. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/release_propagate.py +0 -0
  240. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/release_verify.py +0 -0
  241. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/release_window.py +0 -0
  242. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/repo_edit.py +0 -0
  243. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/repo_onboard.py +0 -0
  244. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/reports.py +0 -0
  245. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/revalidate.py +0 -0
  246. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/review.py +0 -0
  247. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/scorecard.py +0 -0
  248. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/self_health.py +0 -0
  249. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  250. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  251. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  252. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  253. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  254. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/skills/portal-followup/SKILL.md +0 -0
  255. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  256. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  257. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/skills/update-issue/SKILL.md +0 -0
  258. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/smoke.py +0 -0
  259. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/spend_ceiling.py +0 -0
  260. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/split_work.py +0 -0
  261. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/stage_projection.py +0 -0
  262. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/test_author.py +0 -0
  263. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/test_chat.py +0 -0
  264. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/test_orchestrator.py +0 -0
  265. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/test_report.py +0 -0
  266. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/tui_release.py +0 -0
  267. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/usage.py +0 -0
  268. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/usage_limits.py +0 -0
  269. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/usage_rollup.py +0 -0
  270. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coord/worker_events.py +0 -0
  271. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/coordinator.example.yml +0 -0
  272. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-agent.service +0 -0
  273. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-db-backup.service +0 -0
  274. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-db-backup.sh +0 -0
  275. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-db-backup.timer +0 -0
  276. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-drive-queue.service +0 -0
  277. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-drive-queue.timer +0 -0
  278. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-notify.service +0 -0
  279. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-notify.timer +0 -0
  280. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-release-propagate.service +0 -0
  281. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-release-propagate.timer +0 -0
  282. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-release-window.service +0 -0
  283. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-release-window.timer +0 -0
  284. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-serve.service +0 -0
  285. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-web-dist-build.service +0 -0
  286. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-web-dist-build.sh +0 -0
  287. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-web-dist-build.timer +0 -0
  288. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-web-rollback.sh +0 -0
  289. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/coord-web.service +0 -0
  290. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/deploy/node-shim.sh +0 -0
  291. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  292. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/ADR_COORD_WEB_CI.md +0 -0
  293. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/ADR_COORD_WEB_DIST.md +0 -0
  294. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/AGENT_OPERATIONS.md +0 -0
  295. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/ARCHITECTURE.md +0 -0
  296. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/ARCH_SECURITY_GATES.md +0 -0
  297. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/COCKPIT.md +0 -0
  298. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/CONTROL_CENTER.md +0 -0
  299. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/COST_DISCIPLINE.md +0 -0
  300. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/CROSS_PLATFORM.md +0 -0
  301. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/CUSTOMER_PORTAL.md +0 -0
  302. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/DRIVE_QUEUE.md +0 -0
  303. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/EPHEMERAL_WORKERS.md +0 -0
  304. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/FORGE_MIGRATION.md +0 -0
  305. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/GRAPHIFY_SETUP.md +0 -0
  306. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/ISSUE_GUIDANCE.md +0 -0
  307. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/MAC_MINI.md +0 -0
  308. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  309. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/NOTIFIER.md +0 -0
  310. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/OPENCODE_VERIFICATION.md +0 -0
  311. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/OPERATING_GOTCHAS.md +0 -0
  312. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/PHONE_WEBAPP.md +0 -0
  313. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/PIPELINE_V2.md +0 -0
  314. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/PLATFORM_EVOLUTION.md +0 -0
  315. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/SECOND_BACKEND.md +0 -0
  316. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/STORE_SERVICE.md +0 -0
  317. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  318. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/WEB_CONTROL_CENTER.md +0 -0
  319. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/WSL_WINDOWS_WORKER.md +0 -0
  320. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/mocks/web/README.md +0 -0
  321. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/mocks/web/_tokens.css +0 -0
  322. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/mocks/web/issue-detail.html +0 -0
  323. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/mocks/web/pipeline-narrow.html +0 -0
  324. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/docs/mocks/web/pipeline-wide.html +0 -0
  325. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/graphify-out/.gitignore +0 -0
  326. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/install-agent.sh +0 -0
  327. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/pyproject.toml +0 -0
  328. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/audit_review_verdict_overrides.py +0 -0
  329. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  330. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/build-worker-image.sh +0 -0
  331. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/coordinator-machine.py +0 -0
  332. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/epic-down.sh +0 -0
  333. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/epic-up.sh +0 -0
  334. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/preflight.sh +0 -0
  335. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/provision-worker.sh +0 -0
  336. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  337. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  338. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/azure-workers/verify-github-token.sh +0 -0
  339. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/check_gh_argv_containment.py +0 -0
  340. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/codegen.py +0 -0
  341. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/coord-test-runner.sh +0 -0
  342. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/drive-batch.sh +0 -0
  343. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/gen_board_fixture.py +0 -0
  344. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/next_release_tag.py +0 -0
  345. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/run_tests_in_populated_home.sh +0 -0
  346. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/run_tests_without_gh.sh +0 -0
  347. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/smoke_437_interactive.py +0 -0
  348. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/verify_878_review_capture.py +0 -0
  349. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/verify_release_published.py +0 -0
  350. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/scripts/verify_release_wheel.py +0 -0
  351. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/setup.cfg +0 -0
  352. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/SMOKE_SET.md +0 -0
  353. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/__init__.py +0 -0
  354. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  355. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-33/contract.md +0 -0
  356. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-33/manifest.yml +0 -0
  357. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  358. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  359. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  360. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  361. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-37/conftest.py +0 -0
  362. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-37/contract.md +0 -0
  363. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-37/manifest.yml +0 -0
  364. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  365. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  366. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/contract.md +0 -0
  367. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/manifest.yml +0 -0
  368. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  369. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  370. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  371. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  372. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  373. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  374. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  375. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  376. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  377. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  378. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-51/contract.md +0 -0
  379. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  380. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  381. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-51/manifest.yml +0 -0
  382. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  383. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-51/tsconfig.json +0 -0
  384. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  385. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  386. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  387. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/contract.md +0 -0
  388. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  389. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/manifest.yml +0 -0
  390. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  391. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  392. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  393. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  394. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  395. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  396. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  397. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  398. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  399. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  400. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  401. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  402. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/conftest.py +0 -0
  403. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/board-pipeline-basic.json +0 -0
  404. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  405. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  406. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  407. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  408. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/playwright/all_pass.json +0 -0
  409. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  410. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/playwright/mixed_fail.json +0 -0
  411. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  412. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  413. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/playwright/skip.json +0 -0
  414. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/playwright/truncated.json +0 -0
  415. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  416. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  417. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  418. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  419. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  420. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  421. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  422. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  423. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_acceptance.py +0 -0
  424. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_acceptance_drivers.py +0 -0
  425. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent.py +0 -0
  426. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_api_error.py +0 -0
  427. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_app.py +0 -0
  428. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_branch_base.py +0 -0
  429. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_branch_capture.py +0 -0
  430. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_config_free_1712.py +0 -0
  431. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_deploy_units_endpoint.py +0 -0
  432. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_dirty_worktree.py +0 -0
  433. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  434. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_graph_self_heal.py +0 -0
  435. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_health_h3.py +0 -0
  436. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_idle_restart.py +0 -0
  437. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_push_failure.py +0 -0
  438. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_reap.py +0 -0
  439. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_repos_and_pull.py +0 -0
  440. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_restart_services_endpoint.py +0 -0
  441. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_skills_self_heal.py +0 -0
  442. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_startup_diagnostics.py +0 -0
  443. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_update.py +0 -0
  444. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_update_bluegreen.py +0 -0
  445. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_usage_limit.py +0 -0
  446. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_agent_zero_commit.py +0 -0
  447. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_ambient_home_isolation.py +0 -0
  448. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_approve_reject_plan.py +0 -0
  449. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_approve_usage_gate.py +0 -0
  450. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_assignment_already_recorded_daemon.py +0 -0
  451. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_audit_log.py +0 -0
  452. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_audit_outcome.py +0 -0
  453. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_audit_query.py +0 -0
  454. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_auto_loop.py +0 -0
  455. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_auto_release_publish_2035.py +0 -0
  456. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_base_checkout_restore.py +0 -0
  457. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_block_log.py +0 -0
  458. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_board_cap_762.py +0 -0
  459. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_board_fixture.py +0 -0
  460. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_board_service.py +0 -0
  461. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_board_state.py +0 -0
  462. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_board_wire.py +0 -0
  463. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_brain.py +0 -0
  464. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_branch_model.py +0 -0
  465. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_bug_intake.py +0 -0
  466. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_build_worker_image_env_update.py +0 -0
  467. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cargo_cache.py +0 -0
  468. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_check_gh_argv_containment.py +0 -0
  469. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_ci_acceptance_gate_1950.py +0 -0
  470. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_ci_store.py +0 -0
  471. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_claim.py +0 -0
  472. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_acceptance.py +0 -0
  473. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_assign.py +0 -0
  474. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  475. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_assign_interactive_remote.py +0 -0
  476. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_assign_provider.py +0 -0
  477. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  478. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_audit.py +0 -0
  479. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_chat_continue.py +0 -0
  480. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_decide.py +0 -0
  481. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_diagnose_config_provenance.py +0 -0
  482. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_diagnose_forge_availability.py +0 -0
  483. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_diagnose_graph.py +0 -0
  484. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_diagnose_self.py +0 -0
  485. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_doctor.py +0 -0
  486. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_doctor_config_free_1801.py +0 -0
  487. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  488. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_drive.py +0 -0
  489. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_escalate.py +0 -0
  490. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_gate_a.py +0 -0
  491. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_install_drift.py +0 -0
  492. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_install_skills.py +0 -0
  493. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_issue_create_label.py +0 -0
  494. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_issue_reopen.py +0 -0
  495. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_merge.py +0 -0
  496. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_milestone_assign.py +0 -0
  497. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_milestone_capture.py +0 -0
  498. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_milestone_chat_add_child.py +0 -0
  499. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_milestone_dispatch.py +0 -0
  500. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_milestone_gate_b.py +0 -0
  501. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_milestone_gate_c.py +0 -0
  502. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_milestone_order.py +0 -0
  503. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  504. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_milestone_ship.py +0 -0
  505. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_network.py +0 -0
  506. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_new_issue_chat.py +0 -0
  507. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_plans.py +0 -0
  508. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_pull_artifact.py +0 -0
  509. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_queue.py +0 -0
  510. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_reattach_sessions.py +0 -0
  511. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_refine_board.py +0 -0
  512. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_release_preflight.py +0 -0
  513. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_release_propagate.py +0 -0
  514. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_release_window.py +0 -0
  515. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_repo_2220.py +0 -0
  516. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_scorecard.py +0 -0
  517. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_set_review_findings.py +0 -0
  518. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_status_advisory_terminal.py +0 -0
  519. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_status_merge_queue.py +0 -0
  520. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_status_provider.py +0 -0
  521. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_status_review_finalizing.py +0 -0
  522. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_status_test_failed_tag.py +0 -0
  523. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_status_usage_limit.py +0 -0
  524. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_sync_comments_873.py +0 -0
  525. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_test_plan.py +0 -0
  526. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_track.py +0 -0
  527. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_tui_update.py +0 -0
  528. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cli_wait.py +0 -0
  529. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_client_base_install.py +0 -0
  530. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_comments.py +0 -0
  531. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_completion_summary.py +0 -0
  532. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_config.py +0 -0
  533. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_config_acceptance.py +0 -0
  534. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_config_audit.py +0 -0
  535. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_config_pricing.py +0 -0
  536. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  537. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_config_usage_gate.py +0 -0
  538. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_confirm_test.py +0 -0
  539. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_conflict_fix.py +0 -0
  540. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_conflict_fix_semantic.py +0 -0
  541. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_coord_test.py +0 -0
  542. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_coord_test_runner_baseline.py +0 -0
  543. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_coord_test_runner_populated_home.py +0 -0
  544. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_coord_test_runner_routing.py +0 -0
  545. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_coord_test_runner_toolchain.py +0 -0
  546. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_coord_web_sse_restart_live.py +0 -0
  547. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_coordinator_machine.py +0 -0
  548. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_cross_platform_imports.py +0 -0
  549. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_dashboard.py +0 -0
  550. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_dashboard_fixture.py +0 -0
  551. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_dashboard_terminal.py +0 -0
  552. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_dashboard_terminal_live.py +0 -0
  553. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_db.py +0 -0
  554. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_dead_end.py +0 -0
  555. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_deploy_coord_db_backup.py +0 -0
  556. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_deploy_coord_web_dist.py +0 -0
  557. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_deploy_coord_web_rollback.py +0 -0
  558. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_deploy_drive_queue_unit.py +0 -0
  559. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_deploy_manifest.py +0 -0
  560. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_deploy_units_lane.py +0 -0
  561. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_deploy_web_unit.py +0 -0
  562. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_deps.py +0 -0
  563. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_diagnose.py +0 -0
  564. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_dispatch.py +0 -0
  565. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_dispatch_target_validation.py +0 -0
  566. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_dist_name.py +0 -0
  567. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_done_housekeeping.py +0 -0
  568. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_drive.py +0 -0
  569. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_drive_queue.py +0 -0
  570. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_drive_state.py +0 -0
  571. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_drive_tmux.py +0 -0
  572. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_epic_up_capability_detection.py +0 -0
  573. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  574. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_epic_up_image_provenance.py +0 -0
  575. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_errors.py +0 -0
  576. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_events.py +0 -0
  577. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_failure_class.py +0 -0
  578. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_filelock.py +0 -0
  579. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  580. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_fix_of_force_override.py +0 -0
  581. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_fleet_config_health.py +0 -0
  582. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_fleet_health_probes.py +0 -0
  583. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_fleet_health_snapshot.py +0 -0
  584. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_forge_availability.py +0 -0
  585. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_freshness.py +0 -0
  586. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_gate_a.py +0 -0
  587. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_gate_b.py +0 -0
  588. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_gate_snapshot_staleness.py +0 -0
  589. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_gates.py +0 -0
  590. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  591. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_generated_types_fixture.py +0 -0
  592. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_github_ops.py +0 -0
  593. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_goal.py +0 -0
  594. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_graph_health.py +0 -0
  595. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_graph_selfheal_absent_2237.py +0 -0
  596. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_handoff.py +0 -0
  597. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_checks.py +0 -0
  598. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_cli.py +0 -0
  599. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_cli_graph.py +0 -0
  600. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_config.py +0 -0
  601. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_context.py +0 -0
  602. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_coord_web_ci_pin.py +0 -0
  603. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_deploy_lane_facts.py +0 -0
  604. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_incident_regression.py +0 -0
  605. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_pypi.py +0 -0
  606. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_registry.py +0 -0
  607. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_timer_active.py +0 -0
  608. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_toolchain.py +0 -0
  609. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_unit_drift.py +0 -0
  610. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_health_unit_enablement.py +0 -0
  611. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_hooks.py +0 -0
  612. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_human_attended_437.py +0 -0
  613. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_init.py +0 -0
  614. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_integration.py +0 -0
  615. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_interactive_briefing_echo.py +0 -0
  616. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_interactive_prefill_state.py +0 -0
  617. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_interactive_session_relaunch.py +0 -0
  618. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_interactive_test_verdict_backstop.py +0 -0
  619. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_interactive_token_attribution.py +0 -0
  620. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_interactive_worktree.py +0 -0
  621. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_issue_store_seam.py +0 -0
  622. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_liveness_auditor.py +0 -0
  623. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_liveness_notify.py +0 -0
  624. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_machine_pause.py +0 -0
  625. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_merge_queue.py +0 -0
  626. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_merge_verify.py +0 -0
  627. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_milestone_chat.py +0 -0
  628. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_milestone_dispatch.py +0 -0
  629. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_milestone_gate.py +0 -0
  630. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_milestone_order.py +0 -0
  631. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_milestone_seam.py +0 -0
  632. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_mock_author.py +0 -0
  633. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_model_tiering.py +0 -0
  634. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_models.py +0 -0
  635. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_models_config_labels.py +0 -0
  636. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_needs_attention.py +0 -0
  637. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_network.py +0 -0
  638. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_new_issue_chat.py +0 -0
  639. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_next_release_tag.py +0 -0
  640. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_node_shim.py +0 -0
  641. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notifier_baseline.py +0 -0
  642. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notifier_cli.py +0 -0
  643. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notifier_collect.py +0 -0
  644. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notifier_config.py +0 -0
  645. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notifier_drive_seam.py +0 -0
  646. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notifier_isolation.py +0 -0
  647. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notifier_predicate.py +0 -0
  648. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notifier_quiet_hours.py +0 -0
  649. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notifier_service.py +0 -0
  650. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notify.py +0 -0
  651. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_notify_drain.py +0 -0
  652. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_openapi.py +0 -0
  653. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_operational_defaults.py +0 -0
  654. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_overlap_fence.py +0 -0
  655. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_overlap_predict.py +0 -0
  656. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_packaged_deploy_units.py +0 -0
  657. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_parentage.py +0 -0
  658. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_paste_landed.py +0 -0
  659. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_pipeline.py +0 -0
  660. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_plan_followup_approve_plan_command.py +0 -0
  661. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_plan_followup_pr_command.py +0 -0
  662. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_plan_followup_review_command.py +0 -0
  663. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_plan_only.py +0 -0
  664. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_plan_parser.py +0 -0
  665. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_platform_paths.py +0 -0
  666. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_portal_bridge.py +0 -0
  667. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_portal_config.py +0 -0
  668. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_portal_sync.py +0 -0
  669. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_pr_body_lint.py +0 -0
  670. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_prereqs.py +0 -0
  671. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_production_db_guard.py +0 -0
  672. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_progress.py +0 -0
  673. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_provider_seam.py +0 -0
  674. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_providers.py +0 -0
  675. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_providers_config_labels.py +0 -0
  676. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_providers_pty.py +0 -0
  677. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_quiet_hours.py +0 -0
  678. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_quiet_hours_store_2146.py +0 -0
  679. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reap_merged_sessions.py +0 -0
  680. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reap_stale_interactive_tick.py +0 -0
  681. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reconcile.py +0 -0
  682. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reconcile_branch.py +0 -0
  683. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reconcile_completions.py +0 -0
  684. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reconcile_merges.py +0 -0
  685. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reconcile_no_agent_record.py +0 -0
  686. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reconcile_tick.py +0 -0
  687. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reconcile_usage_limit_done.py +0 -0
  688. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_refine_chat.py +0 -0
  689. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_release_cordon_2101.py +0 -0
  690. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  691. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_release_cordon_deadlock_2240.py +0 -0
  692. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_release_cordon_stuck_2490.py +0 -0
  693. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_release_propagate.py +0 -0
  694. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_release_unified_1242.py +0 -0
  695. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_release_verify.py +0 -0
  696. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_release_window.py +0 -0
  697. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_remote_auto_prune.py +0 -0
  698. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_remote_interactive_reaper.py +0 -0
  699. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_repo_edit_2220.py +0 -0
  700. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_repo_graph_fleet_2237.py +0 -0
  701. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_repo_onboard_2220.py +0 -0
  702. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_report_result_push.py +0 -0
  703. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_reports.py +0 -0
  704. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_retry.py +0 -0
  705. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_retry_advisory_1606.py +0 -0
  706. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_retry_type_1636.py +0 -0
  707. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_revalidate.py +0 -0
  708. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_review.py +0 -0
  709. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_review_end_review_without_verdict.py +0 -0
  710. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_review_parse_failure_diagnostic.py +0 -0
  711. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_review_reaffirm.py +0 -0
  712. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_review_state.py +0 -0
  713. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_review_verdict_backstop.py +0 -0
  714. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_review_verdict_override_audit.py +0 -0
  715. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_review_verdict_relay.py +0 -0
  716. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_review_zero_commits.py +0 -0
  717. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_scoped_review_wiring.py +0 -0
  718. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_scorecard.py +0 -0
  719. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_self_health.py +0 -0
  720. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_serve_app_board_trim.py +0 -0
  721. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_session.py +0 -0
  722. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_slice_issue_attribution.py +0 -0
  723. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_smoke.py +0 -0
  724. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_smoke_live_checkout_restore.py +0 -0
  725. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_smoke_workflow.py +0 -0
  726. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_spend_ceiling.py +0 -0
  727. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_spend_ceiling_coordinator.py +0 -0
  728. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_split.py +0 -0
  729. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_split_work.py +0 -0
  730. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_stage_projection.py +0 -0
  731. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_stalled_pipeline.py +0 -0
  732. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_state.py +0 -0
  733. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_state_review_findings_daemon.py +0 -0
  734. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_status_fleet_footer.py +0 -0
  735. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_stop_1567.py +0 -0
  736. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_stuck.py +0 -0
  737. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_terminal_command.py +0 -0
  738. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_test_author.py +0 -0
  739. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_test_chat.py +0 -0
  740. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_test_orchestrator.py +0 -0
  741. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_test_report.py +0 -0
  742. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_test_verdict_parsing.py +0 -0
  743. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_test_verdict_transcript_floor.py +0 -0
  744. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_thin_client_board_audit.py +0 -0
  745. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_thin_client_config_load_1080.py +0 -0
  746. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_thin_client_daemon_routing_906.py +0 -0
  747. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_tmux_host.py +0 -0
  748. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_tmux_session.py +0 -0
  749. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_transcript_floor.py +0 -0
  750. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_usage.py +0 -0
  751. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_usage_limits.py +0 -0
  752. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_usage_rollup.py +0 -0
  753. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_venv_live_install_2121.py +0 -0
  754. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_version_single_source.py +0 -0
  755. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_watch.py +0 -0
  756. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  757. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_worker_events.py +0 -0
  758. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_worker_image_pin_sync.py +0 -0
  759. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_worker_safety.py +0 -0
  760. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_worker_test_scoping.py +0 -0
  761. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_worktree.py +0 -0
  762. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  763. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/Cargo.lock +0 -0
  764. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/Cargo.toml +0 -0
  765. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/cargo-config-local-quadraui.toml.example +0 -0
  766. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/audit.rs +0 -0
  767. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/chat.rs +0 -0
  768. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/data.rs +0 -0
  769. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/doc_tabs.rs +0 -0
  770. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/drive.rs +0 -0
  771. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/drive_queue.rs +0 -0
  772. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/escalation.rs +0 -0
  773. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/fleet_health.rs +0 -0
  774. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/fleet_sessions.rs +0 -0
  775. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/fleet_terminals.rs +0 -0
  776. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/format.rs +0 -0
  777. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/milestone_dag.rs +0 -0
  778. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/msv.rs +0 -0
  779. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/plans.rs +0 -0
  780. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/render.rs +0 -0
  781. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/reports.rs +0 -0
  782. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/sessions.rs +0 -0
  783. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/settings_ui.rs +0 -0
  784. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/terminal.rs +0 -0
  785. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/types.rs +0 -0
  786. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/app/workspace.rs +0 -0
  787. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/bin/gtk.rs +0 -0
  788. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/commands.rs +0 -0
  789. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/lib.rs +0 -0
  790. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/main.rs +0 -0
  791. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/src/settings.rs +0 -0
  792. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/tests/acceptance.rs +0 -0
  793. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/tui/tests/cli.rs +0 -0
  794. {code_coordinator-0.5.200 → code_coordinator-0.5.203}/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.200
3
+ Version: 0.5.203
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.200
3
+ Version: 0.5.203
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
@@ -47,6 +47,7 @@ coord/branch_model.py
47
47
  coord/bug_intake.py
48
48
  coord/cargo_cache.py
49
49
  coord/ci_github.py
50
+ coord/ci_gitlab.py
50
51
  coord/ci_store.py
51
52
  coord/claim.py
52
53
  coord/cli.py
@@ -382,6 +383,7 @@ tests/test_build_worker_image_env_update.py
382
383
  tests/test_cargo_cache.py
383
384
  tests/test_check_gh_argv_containment.py
384
385
  tests/test_ci_acceptance_gate_1950.py
386
+ tests/test_ci_gitlab.py
385
387
  tests/test_ci_parity_2091.py
386
388
  tests/test_ci_store.py
387
389
  tests/test_claim.py
@@ -584,6 +586,7 @@ tests/test_plan_parser.py
584
586
  tests/test_platform_paths.py
585
587
  tests/test_portal_bridge.py
586
588
  tests/test_portal_config.py
589
+ tests/test_portal_store.py
587
590
  tests/test_portal_sync.py
588
591
  tests/test_pr_body_lint.py
589
592
  tests/test_prereqs.py
@@ -41,6 +41,7 @@
41
41
  "coord/bug_intake.py",
42
42
  "coord/cargo_cache.py",
43
43
  "coord/ci_github.py",
44
+ "coord/ci_gitlab.py",
44
45
  "coord/ci_store.py",
45
46
  "coord/claim.py",
46
47
  "coord/cli.py",
@@ -444,6 +445,7 @@
444
445
  "tests/test_cargo_cache.py",
445
446
  "tests/test_check_gh_argv_containment.py",
446
447
  "tests/test_ci_acceptance_gate_1950.py",
448
+ "tests/test_ci_gitlab.py",
447
449
  "tests/test_ci_parity_2091.py",
448
450
  "tests/test_ci_store.py",
449
451
  "tests/test_claim.py",
@@ -646,6 +648,7 @@
646
648
  "tests/test_platform_paths.py",
647
649
  "tests/test_portal_bridge.py",
648
650
  "tests/test_portal_config.py",
651
+ "tests/test_portal_store.py",
649
652
  "tests/test_portal_sync.py",
650
653
  "tests/test_pr_body_lint.py",
651
654
  "tests/test_prereqs.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.200",
2
+ "tag": "0.5.203",
3
3
  "distance": 0,
4
- "node": "gc8878ff7b1ebea74a3711aba656f4ccbb265122e",
4
+ "node": "gdac58130113c138d2461927553c0e5039233000e",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-21"
@@ -0,0 +1,489 @@
1
+ """GitLab CI backend for :mod:`coord.ci_store` (#1897, Phase 1 of the Forge
2
+ Independence program, #239).
3
+
4
+ Talks to GitLab's Pipelines/Jobs REST API (``/api/v4``) via ``httpx`` — no
5
+ new SDK. Selected with ``ci_store: {type: gitlab, host: ..., token_env:
6
+ ...}`` in ``coordinator.yml`` (see :class:`coord.config.CiStoreConfig`);
7
+ ``token_env`` names an environment variable holding a GitLab personal/
8
+ project access token (``read_api`` scope is enough to read; a token able to
9
+ retry pipelines needs write access too). The token itself is never accepted
10
+ in ``coordinator.yml`` — same reasoning as the existing ``github``/``gh``
11
+ backend, which relies on the ambient ``gh`` auth rather than a config value.
12
+
13
+ Concept mapping (mirrors :mod:`coord.ci_github`'s ``gh pr checks`` mapping):
14
+
15
+ ======================== =================================================
16
+ ``CiStore`` concept GitLab equivalent
17
+ ======================== =================================================
18
+ ``CheckRun`` a pipeline **job**
19
+ ``list_checks_for_pr`` jobs of the pipelines behind an MR's HEAD
20
+ (``GET .../merge_requests/:iid/pipelines`` then
21
+ ``GET .../pipelines/:id/jobs`` per pipeline)
22
+ ``rerun_for_pr`` retry every pipeline behind the MR
23
+ (``POST .../pipelines/:id/retry`` — GitLab's own
24
+ retry endpoint only ever retries failed/canceled
25
+ jobs, never re-runs jobs that already passed, so
26
+ this and ``rerun_failed_for_pr`` below end up
27
+ calling the identical endpoint)
28
+ ``rerun_failed_for_pr`` retry only the pipelines with a currently-failing
29
+ job (same endpoint, narrower pipeline-id set)
30
+ ``is_available`` token configured AND a cheap reachability probe
31
+ succeeds (never raises)
32
+ ======================== =================================================
33
+
34
+ Status mapping (do NOT widen ``_PASSING_CONCLUSIONS``, #1897's own warning):
35
+ see :func:`_map_status` and the table above it. Only GitLab's ``success``
36
+ and ``skipped`` map to a conclusion in
37
+ :data:`coord.ci_store._PASSING_CONCLUSIONS`; every other known status, and
38
+ any status this module has never seen, maps to something that blocks.
39
+ """
40
+
41
+ from __future__ import annotations
42
+
43
+ import os
44
+ import time
45
+ import urllib.parse
46
+ from collections import Counter
47
+ from dataclasses import dataclass, field
48
+ from datetime import datetime
49
+
50
+ import httpx
51
+
52
+ from coord.ci_store import CheckRun, JobRun, failed_checks
53
+ from coord.forge_availability import record_ci_check_fetch
54
+
55
+ DEFAULT_HOST = "gitlab.com"
56
+ DEFAULT_TOKEN_ENV = "GITLAB_TOKEN"
57
+ _REQUEST_TIMEOUT = 15.0
58
+
59
+ # ── status mapping (#1897) ──────────────────────────────────────────────────
60
+ #
61
+ # GitLab job statuses (https://docs.gitlab.com/ee/api/jobs.html and the
62
+ # pipeline status enum): created, pending, running, failed, success,
63
+ # canceled, skipped, manual, waiting_for_resource, preparing, scheduled.
64
+ #
65
+ # `coord.ci_store._PASSING_CONCLUSIONS` is a fail-closed ALLOW-list
66
+ # (success/skipped/neutral, #1525) — this table maps INTO that vocabulary,
67
+ # never widens it:
68
+ #
69
+ # - `success` -> completed/"success" (passing)
70
+ # - `skipped` -> completed/"skipped" (passing — matches GitHub's own
71
+ # `skipped` treatment: a job the pipeline config chose not
72
+ # to run at all isn't a code failure)
73
+ # - `failed` -> completed/"failure" (blocking)
74
+ # - `canceled` -> completed/"cancelled" (blocking — same spelling `_gh`'s
75
+ # own "cancel" bucket maps to, so both backends agree)
76
+ # - `manual` -> completed/"action_required" (blocking — #1897's own
77
+ # warning: "a job awaiting manual trigger has produced no
78
+ # verdict"; GitHub's own "action_required" conclusion is
79
+ # already outside `_PASSING_CONCLUSIONS`, so reusing that
80
+ # word keeps the two backends' non-passing vocabularies
81
+ # aligned instead of inventing a GitLab-only string)
82
+ # - `created` -> completed/"action_required" (blocking — same reasoning:
83
+ # a job GitLab hasn't even scheduled yet has produced no
84
+ # verdict either, and treating it as perpetually "pending"
85
+ # would let it sit forever without ever registering as a
86
+ # block a caller who only inspects `failed_checks()` sees)
87
+ # - `pending`/`running`/`waiting_for_resource`/`preparing`/`scheduled`
88
+ # -> in_progress (genuinely in-flight — GitHub's own
89
+ # "queued"/"in_progress" analogue)
90
+ #
91
+ # Anything else (a future GitLab status this module has never seen) maps to
92
+ # completed + conclusion=<the raw status string> — which is, by
93
+ # construction, never in `_PASSING_CONCLUSIONS`, so it blocks exactly like
94
+ # every other unrecognised conclusion. This is the literal analogue of
95
+ # #1525's rule for `coord.ci_github`'s synthetic `"unknown"` conclusion.
96
+ _GITLAB_COMPLETED_CONCLUSIONS: dict[str, str] = {
97
+ "success": "success",
98
+ "skipped": "skipped",
99
+ "failed": "failure",
100
+ "canceled": "cancelled",
101
+ "manual": "action_required",
102
+ "created": "action_required",
103
+ }
104
+
105
+ _GITLAB_IN_FLIGHT_STATUSES = frozenset({
106
+ "pending", "running", "waiting_for_resource", "preparing", "scheduled",
107
+ })
108
+
109
+
110
+ def _map_status(gitlab_status: str) -> tuple[str, str | None]:
111
+ """Map a GitLab job ``status`` string to a ``(CheckRun.status,
112
+ CheckRun.conclusion)`` pair — see the module docstring's table."""
113
+ if gitlab_status in _GITLAB_COMPLETED_CONCLUSIONS:
114
+ return "completed", _GITLAB_COMPLETED_CONCLUSIONS[gitlab_status]
115
+ if gitlab_status in _GITLAB_IN_FLIGHT_STATUSES:
116
+ return "in_progress", None
117
+ return "completed", gitlab_status
118
+
119
+
120
+ def _parse_ts(raw: str | None) -> float | None:
121
+ """Parse an ISO-8601 timestamp as GitLab emits it (e.g.
122
+ ``2026-05-24T12:34:56.789Z``). Returns ``None`` for empty/unparseable
123
+ input, mirroring :func:`coord.ci_github._parse_ts`."""
124
+ if not raw:
125
+ return None
126
+ try:
127
+ return datetime.fromisoformat(raw.replace("Z", "+00:00")).timestamp()
128
+ except (ValueError, TypeError):
129
+ return None
130
+
131
+
132
+ def _project_path(repo: str) -> str:
133
+ """URL-encode *repo* (``group/subgroup/project``) as a GitLab project
134
+ id per the API's ``:id`` convention — a namespaced path with every
135
+ ``/`` percent-encoded."""
136
+ return urllib.parse.quote(repo, safe="")
137
+
138
+
139
+ @dataclass
140
+ class GitLabCi:
141
+ """Talk to GitLab's Pipelines/Jobs API and cache results briefly.
142
+
143
+ Mirrors :class:`coord.ci_github.GitHubCi`'s shape (per-(repo, number)
144
+ check cache with ``cache_ttl``, best-effort rerun, fail-closed synthetic
145
+ checks on a read failure) so the merge gate treats both backends
146
+ identically wherever the mapping allows.
147
+ """
148
+
149
+ host: str = DEFAULT_HOST
150
+ token_env: str = DEFAULT_TOKEN_ENV
151
+ cache_ttl: float = 10.0
152
+ timeout: float = _REQUEST_TIMEOUT
153
+ _cache: dict[tuple[str, int], tuple[float, list[CheckRun]]] = field(
154
+ default_factory=dict, repr=False
155
+ )
156
+ # repo -> (fetched_at, expects_checks) — mirrors GitHubCi's
157
+ # `_workflow_cache`: whether a project has ANY pipelines at all is a
158
+ # repo-wide property, not a per-MR one.
159
+ _pipelines_cache: dict[str, tuple[float, bool]] = field(default_factory=dict, repr=False)
160
+ # Cached separately from `_cache` (a different TTL clock than the check
161
+ # data) since `is_available` is read far more often, in far hotter loops
162
+ # (see its own docstring), than any single PR's checks.
163
+ _availability_cache: tuple[float, bool] | None = field(default=None, init=False, repr=False)
164
+
165
+ @property
166
+ def _token(self) -> str:
167
+ return os.environ.get(self.token_env, "") or ""
168
+
169
+ def _api_base(self) -> str:
170
+ return f"https://{self.host}/api/v4"
171
+
172
+ def _client(self) -> httpx.Client:
173
+ return httpx.Client(
174
+ base_url=self._api_base(),
175
+ headers={"PRIVATE-TOKEN": self._token},
176
+ timeout=self.timeout,
177
+ )
178
+
179
+ @property
180
+ def is_available(self) -> bool:
181
+ """True when a token is configured AND a cheap reachability probe
182
+ to *host* succeeds (#1897).
183
+
184
+ Cached for ``cache_ttl`` seconds: this property is read on nearly
185
+ every merge-gate evaluation (see ``coord.merge_queue``'s several
186
+ ``ci_store.is_available`` guards, each potentially iterating many
187
+ pending PRs per tick) — an uncached network round trip here would
188
+ turn a cheap in-memory check into a per-PR network call. Never
189
+ raises: any exception talking to GitLab (DNS, TLS, timeout, a 5xx)
190
+ reads as unavailable, same as a missing token — the merge gate then
191
+ skips the CI block entirely for this backend, exactly as it does
192
+ when ``ci_store: {type: none}``.
193
+ """
194
+ if not self._token:
195
+ return False
196
+ now = time.time()
197
+ cached = self._availability_cache
198
+ if cached is not None and (now - cached[0]) < self.cache_ttl:
199
+ return cached[1]
200
+ available = self._probe_reachable()
201
+ self._availability_cache = (now, available)
202
+ return available
203
+
204
+ def _probe_reachable(self) -> bool:
205
+ try:
206
+ with self._client() as client:
207
+ resp = client.get("/version")
208
+ except httpx.HTTPError:
209
+ return False
210
+ return resp.status_code < 500
211
+
212
+ # ── reads ────────────────────────────────────────────────────────────
213
+
214
+ def list_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
215
+ """Jobs of every pipeline behind MR ``!``\\ *number* in *repo*.
216
+
217
+ GitLab has no direct analogue of GitHub's branch-protection
218
+ "required status checks" narrowing (:meth:`coord.ci_github.
219
+ GitHubCi.list_checks_for_pr`) — every backend's ``CiStore`` contract
220
+ only requires the two views to *exist*, not to differ, so this
221
+ returns the same set :meth:`list_all_checks_for_pr` does.
222
+ """
223
+ return self._all_checks(repo, number)
224
+
225
+ def list_all_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
226
+ """Every job GitLab reports for *repo*'s MR *number* (#2446's
227
+ unfiltered view) — see :meth:`list_checks_for_pr`'s docstring for
228
+ why this backend has nothing narrower to offer yet."""
229
+ return self._all_checks(repo, number)
230
+
231
+ def _all_checks(self, repo: str, number: int) -> list[CheckRun]:
232
+ key = (repo, number)
233
+ now = time.time()
234
+ cached = self._cache.get(key)
235
+ if cached is not None and (now - cached[0]) < self.cache_ttl:
236
+ return cached[1]
237
+ checks = self._fetch(repo, number)
238
+ self._cache[key] = (now, checks)
239
+ return checks
240
+
241
+ def _fetch(self, repo: str, number: int) -> list[CheckRun]:
242
+ _t0 = time.monotonic()
243
+ token = self._token
244
+ if not token:
245
+ record_ci_check_fetch(
246
+ repo, number, outcome="unreachable", duration_s=0.0,
247
+ detail=f"{self.token_env} not set",
248
+ )
249
+ return [_unconfigured_check(repo, number, self.token_env)]
250
+ project = _project_path(repo)
251
+ try:
252
+ checks: list[CheckRun] = []
253
+ with self._client() as client:
254
+ resp = client.get(f"/projects/{project}/merge_requests/{number}/pipelines")
255
+ resp.raise_for_status()
256
+ pipelines = resp.json()
257
+ if not isinstance(pipelines, list):
258
+ raise ValueError("non-list pipelines JSON")
259
+ for pipeline in pipelines:
260
+ if not isinstance(pipeline, dict):
261
+ continue
262
+ pipeline_id = pipeline.get("id")
263
+ if pipeline_id is None:
264
+ continue
265
+ jobs_resp = client.get(
266
+ f"/projects/{project}/pipelines/{pipeline_id}/jobs",
267
+ params={"per_page": 100},
268
+ )
269
+ jobs_resp.raise_for_status()
270
+ jobs = jobs_resp.json()
271
+ if not isinstance(jobs, list):
272
+ continue
273
+ for job in jobs:
274
+ if isinstance(job, dict):
275
+ checks.append(_job_to_check(job, pipeline_id))
276
+ except (httpx.HTTPError, ValueError) as e:
277
+ # #1525's rule applied to GitLab: a read that outright failed
278
+ # (network down, bad token, malformed JSON) must never silently
279
+ # read as "no checks" — that is exactly the fail-open shape
280
+ # that let PR #1521 merge over a red check. Return a synthetic
281
+ # failing check instead.
282
+ record_ci_check_fetch(
283
+ repo, number, outcome="unreachable",
284
+ duration_s=time.monotonic() - _t0, detail=str(e),
285
+ )
286
+ return [_unreadable_check(repo, number, str(e))]
287
+ duration = time.monotonic() - _t0
288
+ conclusions = Counter(c.conclusion or "pending" for c in checks)
289
+ record_ci_check_fetch(repo, number, outcome="ok", duration_s=duration,
290
+ conclusions=dict(conclusions))
291
+ return checks
292
+
293
+ def expects_checks(self, repo: str, number: int) -> bool:
294
+ """True when *repo* has at least one recorded GitLab pipeline
295
+ (#1904's "was CI ever configured for this repo" question).
296
+
297
+ *number* is accepted only to satisfy :class:`coord.ci_store.
298
+ CiStore`'s shape — like :meth:`coord.ci_github.GitHubCi.
299
+ expects_checks`, the answer is repo-wide, not per-MR, and cached as
300
+ such. Fails closed (returns ``True``) on any read failure or a
301
+ missing token — unknown must read as "checks were expected", never
302
+ as the free pass that let an empty ``checks`` list merge untested
303
+ code in the first place (#1525).
304
+ """
305
+ now = time.time()
306
+ cached = self._pipelines_cache.get(repo)
307
+ if cached is not None and (now - cached[0]) < self.cache_ttl:
308
+ return cached[1]
309
+ result = self._fetch_expects_checks(repo)
310
+ self._pipelines_cache[repo] = (now, result)
311
+ return result
312
+
313
+ def _fetch_expects_checks(self, repo: str) -> bool:
314
+ token = self._token
315
+ if not token:
316
+ return True # fail closed — see expects_checks' docstring
317
+ try:
318
+ with self._client() as client:
319
+ resp = client.get(
320
+ f"/projects/{_project_path(repo)}/pipelines",
321
+ params={"per_page": 1},
322
+ )
323
+ resp.raise_for_status()
324
+ data = resp.json()
325
+ except (httpx.HTTPError, ValueError):
326
+ return True # fail closed
327
+ return bool(isinstance(data, list) and len(data) > 0)
328
+
329
+ def list_jobs_for_run(self, repo: str, run_id: str) -> list[JobRun]:
330
+ """Best-effort job list for GitLab pipeline *run_id* (#1897/#1892).
331
+
332
+ GitLab's Jobs API has no per-step breakdown the way GitHub Actions
333
+ does (see :class:`coord.ci_store.JobRun`/``JobStep``) — every
334
+ ``JobRun`` returned here has ``steps=[]``. Callers (``coord.
335
+ merge_queue``'s ``is_verdictless_job`` classification) already treat
336
+ "no job/step data" as the safe false-negative default ("not
337
+ verdictless"), so this is a faithful best-effort answer, not a
338
+ stub — see that function's own docstring for the bias. Any read
339
+ failure (missing token, network error, malformed JSON, an expired
340
+ pipeline id) returns ``[]`` rather than raising.
341
+ """
342
+ token = self._token
343
+ if not token:
344
+ return []
345
+ try:
346
+ with self._client() as client:
347
+ resp = client.get(
348
+ f"/projects/{_project_path(repo)}/pipelines/{run_id}/jobs",
349
+ params={"per_page": 100},
350
+ )
351
+ resp.raise_for_status()
352
+ jobs = resp.json()
353
+ except (httpx.HTTPError, ValueError):
354
+ return []
355
+ if not isinstance(jobs, list):
356
+ return []
357
+ out: list[JobRun] = []
358
+ for job in jobs:
359
+ if not isinstance(job, dict):
360
+ continue
361
+ _, conclusion = _map_status(str(job.get("status", "")))
362
+ out.append(JobRun(
363
+ name=str(job.get("name", "")), conclusion=conclusion,
364
+ runner_name="", steps=[],
365
+ ))
366
+ return out
367
+
368
+ # ── writes ───────────────────────────────────────────────────────────
369
+
370
+ def rerun_for_pr(self, repo: str, number: int) -> bool:
371
+ """Retry every pipeline behind *repo*'s MR *number* (#1897/#1851).
372
+
373
+ See the module docstring: GitLab's own pipeline-retry endpoint only
374
+ ever retries failed/canceled jobs, so this and
375
+ :meth:`rerun_failed_for_pr` differ only in which pipeline ids they
376
+ target — every pipeline with any check here, vs only pipelines with
377
+ a currently-failing check there.
378
+ """
379
+ return self._retry_pipelines(repo, number, only_failed=False)
380
+
381
+ def rerun_failed_for_pr(self, repo: str, number: int) -> bool:
382
+ """Retry only the pipelines with a currently-failing job behind
383
+ *repo*'s MR *number* (#1897/#2252)."""
384
+ return self._retry_pipelines(repo, number, only_failed=True)
385
+
386
+ def _retry_pipelines(self, repo: str, number: int, *, only_failed: bool) -> bool:
387
+ token = self._token
388
+ if not token:
389
+ return False
390
+ checks = self.list_checks_for_pr(repo, number)
391
+ if only_failed:
392
+ checks = failed_checks(checks)
393
+ pipeline_ids = sorted({c.run_id for c in checks if c.run_id})
394
+ if not pipeline_ids:
395
+ return False
396
+ project = _project_path(repo)
397
+ all_ok = True
398
+ any_ok = False
399
+ try:
400
+ with self._client() as client:
401
+ for pipeline_id in pipeline_ids:
402
+ try:
403
+ resp = client.post(
404
+ f"/projects/{project}/pipelines/{pipeline_id}/retry"
405
+ )
406
+ except httpx.HTTPError:
407
+ all_ok = False
408
+ continue
409
+ if resp.status_code < 400:
410
+ any_ok = True
411
+ else:
412
+ all_ok = False
413
+ except httpx.HTTPError:
414
+ return False
415
+ if any_ok:
416
+ self.invalidate(repo, number)
417
+ return all_ok and any_ok
418
+
419
+ def invalidate(self, repo: str | None = None, number: int | None = None) -> None:
420
+ """Drop cached check entries — pass nothing to clear everything.
421
+
422
+ Mirrors :meth:`coord.ci_github.GitHubCi.invalidate`; consumed by
423
+ :func:`coord.ci_store.wait_for_ci_settle` after a rerun.
424
+ """
425
+ if repo is None and number is None:
426
+ self._cache.clear()
427
+ return
428
+ for key in list(self._cache):
429
+ if repo is not None and key[0] != repo:
430
+ continue
431
+ if number is not None and key[1] != number:
432
+ continue
433
+ del self._cache[key]
434
+
435
+
436
+ def _job_to_check(job: dict, pipeline_id: object) -> CheckRun:
437
+ status, conclusion = _map_status(str(job.get("status", "")))
438
+ return CheckRun(
439
+ name=str(job.get("name", "")),
440
+ status=status,
441
+ conclusion=conclusion,
442
+ url=str(job.get("web_url", "") or ""),
443
+ run_id=str(pipeline_id),
444
+ started_at=_parse_ts(job.get("started_at")),
445
+ completed_at=_parse_ts(job.get("finished_at")),
446
+ )
447
+
448
+
449
+ def _unreadable_check(repo: str, number: int, detail: str) -> CheckRun:
450
+ """Synthetic :class:`CheckRun` standing in for "could not read CI"
451
+ (#1897, mirroring #1525's :func:`coord.ci_github._unreadable_check`).
452
+
453
+ ``conclusion="unknown"`` is not in
454
+ :data:`coord.ci_store._PASSING_CONCLUSIONS`, so ``failed_checks`` picks
455
+ this up like any other hard failure. The name deliberately reuses the
456
+ exact "could not read CI status" / "coord: " phrasing
457
+ :func:`coord.ci_store.is_unreadable_check` matches on, so this backend's
458
+ unreadable checks are recognised by that shared classifier too.
459
+ """
460
+ return CheckRun(
461
+ name=f"coord: could not read CI status for {repo}#{number} ({detail})",
462
+ status="completed",
463
+ conclusion="unknown",
464
+ url="",
465
+ run_id="",
466
+ started_at=None,
467
+ completed_at=None,
468
+ )
469
+
470
+
471
+ def _unconfigured_check(repo: str, number: int, token_env: str) -> CheckRun:
472
+ """Synthetic :class:`CheckRun` for "no GitLab token configured" (#1897).
473
+
474
+ Defence in depth alongside :attr:`GitLabCi.is_available` (which already
475
+ reads ``False`` when the token is missing, so the merge gate's own
476
+ ``ci_store.is_available`` guards skip the CI block before ever calling
477
+ this) — any direct caller of :meth:`GitLabCi.list_checks_for_pr` that
478
+ bypasses that guard still gets a fail-closed blocking check rather than
479
+ a silent empty list.
480
+ """
481
+ return CheckRun(
482
+ name=f"coord: GitLab CI not configured for {repo}#{number} (${token_env} not set)",
483
+ status="completed",
484
+ conclusion="unknown",
485
+ url="",
486
+ run_id="",
487
+ started_at=None,
488
+ completed_at=None,
489
+ )
@@ -564,16 +564,32 @@ def checks_are_stale(checks: list[CheckRun], base_commit_time: float | None) ->
564
564
  return any(c.started_at is None or c.started_at < base_commit_time for c in checks)
565
565
 
566
566
 
567
- def build_ci_store(ci_store_type: str) -> CiStore:
567
+ def build_ci_store(
568
+ ci_store_type: str, *, host: str | None = None, token_env: str | None = None
569
+ ) -> CiStore:
568
570
  """Construct the CiStore backend named by ``ci_store_type``.
569
571
 
570
572
  Centralised here so callers (merge gate, TUI fetcher, tests) don't need to
571
573
  branch on the config value themselves. Unknown types fall back to NoOpCi
572
574
  so a typo in coordinator.yml doesn't crash the merge command.
575
+
576
+ ``host``/``token_env`` (#1897) are only consumed by the ``gitlab``
577
+ backend — every other backend ignores them, so existing callers that
578
+ only ever pass ``ci_store_type`` keep working unmodified. Falsy values
579
+ (``None`` or ``""``) are treated as "use the backend's own default"
580
+ rather than forwarded as an explicit override.
573
581
  """
574
582
  if ci_store_type == "github":
575
583
  from coord.ci_github import GitHubCi # noqa: PLC0415
576
584
  return GitHubCi()
585
+ if ci_store_type == "gitlab":
586
+ from coord.ci_gitlab import GitLabCi # noqa: PLC0415
587
+ kwargs: dict[str, str] = {}
588
+ if host:
589
+ kwargs["host"] = host
590
+ if token_env:
591
+ kwargs["token_env"] = token_env
592
+ return GitLabCi(**kwargs)
577
593
  return NoOpCi()
578
594
 
579
595
 
@@ -2001,7 +2001,9 @@ def _fetch_live_ci_gate(
2001
2001
 
2002
2002
  cfg = _load_config(config_path)
2003
2003
  board = _load_board()
2004
- ci_store = build_ci_store(cfg.ci_store.type)
2004
+ ci_store = build_ci_store(
2005
+ cfg.ci_store.type, host=cfg.ci_store.host, token_env=cfg.ci_store.token_env
2006
+ )
2005
2007
  queue_by_key = {
2006
2008
  entry_key(q.repo_name, q.issue_number): q for q in _mq.load_queue()
2007
2009
  }
@@ -2089,7 +2091,9 @@ def _fetch_live_blocked_gate(
2089
2091
 
2090
2092
  cfg = _load_config(config_path)
2091
2093
  board = _load_board()
2092
- ci_store = build_ci_store(cfg.ci_store.type)
2094
+ ci_store = build_ci_store(
2095
+ cfg.ci_store.type, host=cfg.ci_store.host, token_env=cfg.ci_store.token_env
2096
+ )
2093
2097
  queue_by_key = {
2094
2098
  entry_key(q.repo_name, q.issue_number): q for q in _mq.load_queue()
2095
2099
  }
@@ -1657,7 +1657,9 @@ def merge(
1657
1657
 
1658
1658
  _cfg = _load_config(config_path)
1659
1659
  _board = _load_board()
1660
- _ci = _build_ci_store(_cfg.ci_store.type)
1660
+ _ci = _build_ci_store(
1661
+ _cfg.ci_store.type, host=_cfg.ci_store.host, token_env=_cfg.ci_store.token_env
1662
+ )
1661
1663
 
1662
1664
  # #1477: re-test any parked CONFLICT entry against GitHub's own
1663
1665
  # mergeability computation before building the plan — otherwise a
@@ -1852,7 +1854,11 @@ def merge(
1852
1854
  from coord.models import Board as _Board # noqa: PLC0415
1853
1855
  _raw_board_only = load_board()
1854
1856
  board_only = _raw_board_only if _raw_board_only is not None else _Board(active=[], completed=[])
1855
- ci_store_only = build_ci_store(cfg_only.ci_store.type)
1857
+ ci_store_only = build_ci_store(
1858
+ cfg_only.ci_store.type,
1859
+ host=cfg_only.ci_store.host,
1860
+ token_env=cfg_only.ci_store.token_env,
1861
+ )
1856
1862
  # #1695: name the blocking gate(s) up front. Under #1695 a gate-blocked
1857
1863
  # row IS enqueued (visibly BLOCKED) instead of being dropped, so
1858
1864
  # `--only` now resolves it — and the operator needs to be told, before
@@ -2195,7 +2201,9 @@ def merge(
2195
2201
  click.echo(f" [{x.state}] {x.repo_name} #{x.issue_number} ({x.branch})")
2196
2202
  return
2197
2203
 
2198
- ci_store = build_ci_store(cfg.ci_store.type)
2204
+ ci_store = build_ci_store(
2205
+ cfg.ci_store.type, host=cfg.ci_store.host, token_env=cfg.ci_store.token_env
2206
+ )
2199
2207
  if skip_review:
2200
2208
  click.echo(" --skip-review: review-approval gate bypassed (#253)")
2201
2209
  if skip_smoke:
@@ -559,7 +559,9 @@ def _read_ci(cfg: Config, assignment) -> CiRead:
559
559
  # Availability first (#2091): `_resolve_pr_number`'s branch fallback can
560
560
  # shell out to `gh`, and there is no point paying for that when the store
561
561
  # will refuse to read anything anyway.
562
- store = build_ci_store(cfg.ci_store.type)
562
+ store = build_ci_store(
563
+ cfg.ci_store.type, host=cfg.ci_store.host, token_env=cfg.ci_store.token_env
564
+ )
563
565
  if not store.is_available:
564
566
  return CiRead(
565
567
  unread_reason=(