code-coordinator 0.5.197__tar.gz → 0.5.202__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 (793) hide show
  1. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/code_coordinator.egg-info/scm_version.json +2 -2
  6. code_coordinator-0.5.202/coord/ci_gitlab.py +489 -0
  7. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/ci_store.py +17 -1
  8. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/drive_queue.py +6 -2
  9. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/merge.py +11 -3
  10. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/plan_followup.py +3 -1
  11. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/config.py +26 -7
  12. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/gate_snapshot.py +12 -5
  13. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/pipeline.py +62 -7
  14. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/serve_app.py +3 -1
  15. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/ORACLE_LOOP.md +6 -4
  16. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_board_read_path.py +7 -7
  17. code_coordinator-0.5.202/tests/test_ci_gitlab.py +521 -0
  18. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_ci_parity_2091.py +9 -9
  19. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_drive_queue.py +1 -1
  20. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_fix_headless_review.py +6 -5
  21. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_pipeline.py +96 -0
  22. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_serve.py +8 -8
  23. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/data.rs +49 -0
  24. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/dialogs.rs +121 -8
  25. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/doc_tabs.rs +6 -0
  26. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/drive.rs +2 -0
  27. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/drive_queue.rs +2 -0
  28. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/escalation.rs +2 -0
  29. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/events.rs +32 -0
  30. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/fixtures.rs +5 -0
  31. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/milestone_dag.rs +40 -3
  32. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/mod.rs +27 -0
  33. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/pipeline.rs +140 -7
  34. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/render.rs +28 -2
  35. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/reports.rs +4 -0
  36. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/settings_ui.rs +38 -0
  37. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/sidebar.rs +4 -0
  38. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/tests.rs +1148 -7
  39. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/types.rs +22 -0
  40. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/workspace.rs +2 -0
  41. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.claude/commands/board.md +0 -0
  42. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.claude/commands/complete-session.md +0 -0
  43. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.claude/commands/coordinator.md +0 -0
  44. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.githooks/_lib.sh +0 -0
  45. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.githooks/post-checkout +0 -0
  46. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.githooks/post-commit +0 -0
  47. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.githooks/post-merge +0 -0
  48. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  49. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.github/coord-ci-acceptance.yml +0 -0
  50. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.github/workflows/auto-release.yml +0 -0
  51. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.github/workflows/cargo-test.yml +0 -0
  52. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.github/workflows/publish.yml +0 -0
  53. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.github/workflows/release-tui.yml +0 -0
  54. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.github/workflows/test.yml +0 -0
  55. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/.gitignore +0 -0
  56. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/CLAUDE.md +0 -0
  57. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/GOAL.md +0 -0
  58. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/LICENSE +0 -0
  59. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/MANIFEST.in +0 -0
  60. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/README.md +0 -0
  61. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/code_coordinator.egg-info/dependency_links.txt +0 -0
  62. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/code_coordinator.egg-info/entry_points.txt +0 -0
  63. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/code_coordinator.egg-info/requires.txt +0 -0
  64. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/code_coordinator.egg-info/top_level.txt +0 -0
  65. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/__init__.py +0 -0
  66. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/_board_mapping.py +0 -0
  67. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/acceptance.py +0 -0
  68. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/acceptance_drivers.py +0 -0
  69. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/agent.py +0 -0
  70. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/agent_app.py +0 -0
  71. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/agent_update.py +0 -0
  72. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/agents/opencode/.gitignore +0 -0
  73. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/agents/opencode/agents/work.md +0 -0
  74. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/agents/opencode/routing.jsonc +0 -0
  75. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/audit.py +0 -0
  76. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/auto_loop.py +0 -0
  77. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/block_log.py +0 -0
  78. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/board_bool_guard.py +0 -0
  79. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/board_service.py +0 -0
  80. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/board_wire.py +0 -0
  81. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/brain.py +0 -0
  82. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/branch_model.py +0 -0
  83. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/bug_intake.py +0 -0
  84. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/cargo_cache.py +0 -0
  85. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/ci_github.py +0 -0
  86. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/claim.py +0 -0
  87. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/cli.py +0 -0
  88. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/client.py +0 -0
  89. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/__init__.py +0 -0
  90. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/_common.py +0 -0
  91. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/acceptance.py +0 -0
  92. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/agent_ops.py +0 -0
  93. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/audit.py +0 -0
  94. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/chat.py +0 -0
  95. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/dispatch.py +0 -0
  96. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/dispatch_workers.py +0 -0
  97. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/drive.py +0 -0
  98. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/gate_a.py +0 -0
  99. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/gates.py +0 -0
  100. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/issues.py +0 -0
  101. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/lifecycle.py +0 -0
  102. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/milestone.py +0 -0
  103. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/plans.py +0 -0
  104. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/portal.py +0 -0
  105. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/release.py +0 -0
  106. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/repo.py +0 -0
  107. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/report.py +0 -0
  108. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/review.py +0 -0
  109. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/scorecard.py +0 -0
  110. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/sessions.py +0 -0
  111. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/setup.py +0 -0
  112. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/status.py +0 -0
  113. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/terminal.py +0 -0
  114. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/test_gate.py +0 -0
  115. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/commands/tui.py +0 -0
  116. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/comments.py +0 -0
  117. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/config_reload.py +0 -0
  118. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/confirm_test.py +0 -0
  119. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/conflict_fix.py +0 -0
  120. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/dao.py +0 -0
  121. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/dashboard/__init__.py +0 -0
  122. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/dashboard/fixture.py +0 -0
  123. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/dashboard/index.html +0 -0
  124. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/dashboard/server.py +0 -0
  125. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/dashboard/terminal.py +0 -0
  126. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/db.py +0 -0
  127. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/dead_end.py +0 -0
  128. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/README.md +0 -0
  129. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-agent.service +0 -0
  130. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-db-backup.service +0 -0
  131. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-db-backup.sh +0 -0
  132. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-db-backup.timer +0 -0
  133. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-drive-queue.service +0 -0
  134. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-drive-queue.timer +0 -0
  135. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-notify.service +0 -0
  136. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-notify.timer +0 -0
  137. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-release-propagate.service +0 -0
  138. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-release-propagate.timer +0 -0
  139. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-release-window.service +0 -0
  140. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-release-window.timer +0 -0
  141. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-serve.service +0 -0
  142. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-web-dist-build.service +0 -0
  143. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-web-dist-build.timer +0 -0
  144. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy/coord-web.service +0 -0
  145. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy_manifest.py +0 -0
  146. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deploy_units.py +0 -0
  147. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/deps.py +0 -0
  148. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/diagnose.py +0 -0
  149. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/dispatch.py +0 -0
  150. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/dist_name.py +0 -0
  151. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/drive.py +0 -0
  152. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/drive_queue.py +0 -0
  153. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/drive_state.py +0 -0
  154. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/events.py +0 -0
  155. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/failure_class.py +0 -0
  156. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/filelock.py +0 -0
  157. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/fleet_config_health.py +0 -0
  158. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/forge_availability.py +0 -0
  159. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/freshness.py +0 -0
  160. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/gate_a.py +0 -0
  161. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/gate_b.py +0 -0
  162. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/gates.py +0 -0
  163. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/github_ops.py +0 -0
  164. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/goal.py +0 -0
  165. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/graph_health.py +0 -0
  166. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/__init__.py +0 -0
  167. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/aggregate.py +0 -0
  168. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/__init__.py +0 -0
  169. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/agent_install.py +0 -0
  170. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/cargo_targets.py +0 -0
  171. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/claude_binary.py +0 -0
  172. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/coord_web_ci_pin.py +0 -0
  173. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/deploy_lane_facts.py +0 -0
  174. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/disk.py +0 -0
  175. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/fleet_board.py +0 -0
  176. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  177. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/fleet_phantom.py +0 -0
  178. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/fleet_unit_drift.py +0 -0
  179. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/graph.py +0 -0
  180. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/graphify_cli.py +0 -0
  181. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/index_lock.py +0 -0
  182. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/plan_usage.py +0 -0
  183. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/repo_state.py +0 -0
  184. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/spawned_coord.py +0 -0
  185. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/timer_active.py +0 -0
  186. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/toolchain.py +0 -0
  187. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/unit_drift.py +0 -0
  188. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/unit_enablement.py +0 -0
  189. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/checks/worktrees.py +0 -0
  190. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/cli.py +0 -0
  191. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/context.py +0 -0
  192. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/fleet_snapshot.py +0 -0
  193. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/models.py +0 -0
  194. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/pypi.py +0 -0
  195. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/registry.py +0 -0
  196. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/render.py +0 -0
  197. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/health/units.py +0 -0
  198. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/hooks.py +0 -0
  199. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/housekeeping.py +0 -0
  200. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/interactive.py +0 -0
  201. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/issue_store.py +0 -0
  202. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/liveness_auditor.py +0 -0
  203. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/machine_pause.py +0 -0
  204. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/merge_queue.py +0 -0
  205. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/milestone_chat.py +0 -0
  206. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/milestone_dispatch.py +0 -0
  207. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/milestone_gate.py +0 -0
  208. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/milestone_order.py +0 -0
  209. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/mock_author.py +0 -0
  210. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/models.py +0 -0
  211. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/network.py +0 -0
  212. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/new_issue_chat.py +0 -0
  213. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/__init__.py +0 -0
  214. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/baseline.py +0 -0
  215. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/cli.py +0 -0
  216. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/collect.py +0 -0
  217. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/digest.py +0 -0
  218. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/models.py +0 -0
  219. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/predicate.py +0 -0
  220. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/service.py +0 -0
  221. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/store.py +0 -0
  222. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notifier/transport.py +0 -0
  223. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/notify.py +0 -0
  224. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/openapi.py +0 -0
  225. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/overlap_fence.py +0 -0
  226. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/overlap_predict.py +0 -0
  227. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/parentage.py +0 -0
  228. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/parentage_github.py +0 -0
  229. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/plan_parser.py +0 -0
  230. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/plans.py +0 -0
  231. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/platform_paths.py +0 -0
  232. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/portal_bridge.py +0 -0
  233. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/portal_store.py +0 -0
  234. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/portal_sync.py +0 -0
  235. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/pr_body_lint.py +0 -0
  236. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/prereqs.py +0 -0
  237. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/progress.py +0 -0
  238. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/providers/__init__.py +0 -0
  239. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/providers/base.py +0 -0
  240. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/providers/claude.py +0 -0
  241. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/providers/claude_pty.py +0 -0
  242. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/providers/opencode.py +0 -0
  243. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/queue_diagnose.py +0 -0
  244. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/reconcile.py +0 -0
  245. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/reconcile_tick.py +0 -0
  246. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/refine_chat.py +0 -0
  247. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/release_cordon.py +0 -0
  248. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/release_propagate.py +0 -0
  249. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/release_verify.py +0 -0
  250. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/release_window.py +0 -0
  251. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/repo_edit.py +0 -0
  252. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/repo_onboard.py +0 -0
  253. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/reports.py +0 -0
  254. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/revalidate.py +0 -0
  255. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/review.py +0 -0
  256. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/scorecard.py +0 -0
  257. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/self_health.py +0 -0
  258. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  259. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  260. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  261. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  262. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  263. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/skills/portal-followup/SKILL.md +0 -0
  264. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  265. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  266. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/skills/update-issue/SKILL.md +0 -0
  267. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/smoke.py +0 -0
  268. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/spend_ceiling.py +0 -0
  269. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/split_work.py +0 -0
  270. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/stage_projection.py +0 -0
  271. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/state.py +0 -0
  272. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/test_author.py +0 -0
  273. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/test_chat.py +0 -0
  274. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/test_orchestrator.py +0 -0
  275. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/test_report.py +0 -0
  276. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/tui_release.py +0 -0
  277. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/usage.py +0 -0
  278. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/usage_limits.py +0 -0
  279. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/usage_rollup.py +0 -0
  280. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coord/worker_events.py +0 -0
  281. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/coordinator.example.yml +0 -0
  282. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-agent.service +0 -0
  283. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-db-backup.service +0 -0
  284. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-db-backup.sh +0 -0
  285. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-db-backup.timer +0 -0
  286. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-drive-queue.service +0 -0
  287. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-drive-queue.timer +0 -0
  288. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-notify.service +0 -0
  289. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-notify.timer +0 -0
  290. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-release-propagate.service +0 -0
  291. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-release-propagate.timer +0 -0
  292. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-release-window.service +0 -0
  293. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-release-window.timer +0 -0
  294. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-serve.service +0 -0
  295. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-web-dist-build.service +0 -0
  296. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-web-dist-build.sh +0 -0
  297. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-web-dist-build.timer +0 -0
  298. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-web-rollback.sh +0 -0
  299. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/coord-web.service +0 -0
  300. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/deploy/node-shim.sh +0 -0
  301. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  302. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/ADR_COORD_WEB_CI.md +0 -0
  303. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/ADR_COORD_WEB_DIST.md +0 -0
  304. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/AGENT_OPERATIONS.md +0 -0
  305. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/ARCHITECTURE.md +0 -0
  306. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/ARCH_SECURITY_GATES.md +0 -0
  307. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/COCKPIT.md +0 -0
  308. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/CONTROL_CENTER.md +0 -0
  309. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/COST_DISCIPLINE.md +0 -0
  310. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/CROSS_PLATFORM.md +0 -0
  311. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/CUSTOMER_PORTAL.md +0 -0
  312. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/DRIVE_QUEUE.md +0 -0
  313. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/EPHEMERAL_WORKERS.md +0 -0
  314. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/FORGE_MIGRATION.md +0 -0
  315. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/GRAPHIFY_SETUP.md +0 -0
  316. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/ISSUE_GUIDANCE.md +0 -0
  317. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/MAC_MINI.md +0 -0
  318. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  319. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/NOTIFIER.md +0 -0
  320. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/OPENCODE_VERIFICATION.md +0 -0
  321. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/OPERATING_GOTCHAS.md +0 -0
  322. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/PHONE_WEBAPP.md +0 -0
  323. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/PIPELINE_V2.md +0 -0
  324. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/PLATFORM_EVOLUTION.md +0 -0
  325. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/SECOND_BACKEND.md +0 -0
  326. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/STORE_SERVICE.md +0 -0
  327. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  328. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/WEB_CONTROL_CENTER.md +0 -0
  329. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/WSL_WINDOWS_WORKER.md +0 -0
  330. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/mocks/web/README.md +0 -0
  331. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/mocks/web/_tokens.css +0 -0
  332. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/mocks/web/issue-detail.html +0 -0
  333. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/mocks/web/pipeline-narrow.html +0 -0
  334. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/docs/mocks/web/pipeline-wide.html +0 -0
  335. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/graphify-out/.gitignore +0 -0
  336. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/install-agent.sh +0 -0
  337. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/pyproject.toml +0 -0
  338. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/audit_review_verdict_overrides.py +0 -0
  339. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  340. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/build-worker-image.sh +0 -0
  341. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/coordinator-machine.py +0 -0
  342. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/epic-down.sh +0 -0
  343. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/epic-up.sh +0 -0
  344. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/preflight.sh +0 -0
  345. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/provision-worker.sh +0 -0
  346. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  347. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  348. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/azure-workers/verify-github-token.sh +0 -0
  349. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/check_gh_argv_containment.py +0 -0
  350. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/codegen.py +0 -0
  351. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/coord-test-runner.sh +0 -0
  352. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/drive-batch.sh +0 -0
  353. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/gen_board_fixture.py +0 -0
  354. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/next_release_tag.py +0 -0
  355. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/run_tests_in_populated_home.sh +0 -0
  356. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/run_tests_without_gh.sh +0 -0
  357. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/smoke_437_interactive.py +0 -0
  358. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/verify_878_review_capture.py +0 -0
  359. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/verify_release_published.py +0 -0
  360. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/scripts/verify_release_wheel.py +0 -0
  361. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/setup.cfg +0 -0
  362. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/SMOKE_SET.md +0 -0
  363. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/__init__.py +0 -0
  364. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  365. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-33/contract.md +0 -0
  366. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-33/manifest.yml +0 -0
  367. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  368. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  369. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  370. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  371. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-37/conftest.py +0 -0
  372. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-37/contract.md +0 -0
  373. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-37/manifest.yml +0 -0
  374. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  375. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  376. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/contract.md +0 -0
  377. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/manifest.yml +0 -0
  378. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  379. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  380. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  381. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  382. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  383. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  384. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  385. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  386. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  387. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  388. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-51/contract.md +0 -0
  389. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  390. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  391. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-51/manifest.yml +0 -0
  392. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  393. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-51/tsconfig.json +0 -0
  394. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  395. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  396. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  397. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/contract.md +0 -0
  398. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  399. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/manifest.yml +0 -0
  400. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  401. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  402. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  403. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  404. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  405. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  406. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  407. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  408. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  409. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  410. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  411. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  412. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/conftest.py +0 -0
  413. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/board-pipeline-basic.json +0 -0
  414. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  415. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  416. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  417. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  418. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/playwright/all_pass.json +0 -0
  419. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  420. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/playwright/mixed_fail.json +0 -0
  421. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  422. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  423. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/playwright/skip.json +0 -0
  424. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/playwright/truncated.json +0 -0
  425. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  426. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  427. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  428. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  429. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  430. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  431. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  432. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  433. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_acceptance.py +0 -0
  434. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_acceptance_drivers.py +0 -0
  435. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent.py +0 -0
  436. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_api_error.py +0 -0
  437. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_app.py +0 -0
  438. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_branch_base.py +0 -0
  439. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_branch_capture.py +0 -0
  440. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_config_free_1712.py +0 -0
  441. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_deploy_units_endpoint.py +0 -0
  442. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_dirty_worktree.py +0 -0
  443. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  444. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_graph_self_heal.py +0 -0
  445. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_health_h3.py +0 -0
  446. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_idle_restart.py +0 -0
  447. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_push_failure.py +0 -0
  448. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_reap.py +0 -0
  449. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_repos_and_pull.py +0 -0
  450. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_restart_services_endpoint.py +0 -0
  451. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_skills_self_heal.py +0 -0
  452. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_startup_diagnostics.py +0 -0
  453. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_update.py +0 -0
  454. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_update_bluegreen.py +0 -0
  455. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_usage_limit.py +0 -0
  456. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_agent_zero_commit.py +0 -0
  457. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_ambient_home_isolation.py +0 -0
  458. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_approve_reject_plan.py +0 -0
  459. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_approve_usage_gate.py +0 -0
  460. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_assignment_already_recorded_daemon.py +0 -0
  461. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_audit_log.py +0 -0
  462. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_audit_outcome.py +0 -0
  463. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_audit_query.py +0 -0
  464. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_auto_loop.py +0 -0
  465. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_auto_release_publish_2035.py +0 -0
  466. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_base_checkout_restore.py +0 -0
  467. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_block_log.py +0 -0
  468. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_board_cap_762.py +0 -0
  469. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_board_fixture.py +0 -0
  470. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_board_service.py +0 -0
  471. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_board_state.py +0 -0
  472. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_board_wire.py +0 -0
  473. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_brain.py +0 -0
  474. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_branch_model.py +0 -0
  475. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_bug_intake.py +0 -0
  476. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_build_worker_image_env_update.py +0 -0
  477. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cargo_cache.py +0 -0
  478. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_check_gh_argv_containment.py +0 -0
  479. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_ci_acceptance_gate_1950.py +0 -0
  480. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_ci_store.py +0 -0
  481. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_claim.py +0 -0
  482. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_acceptance.py +0 -0
  483. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_assign.py +0 -0
  484. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  485. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_assign_interactive_remote.py +0 -0
  486. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_assign_provider.py +0 -0
  487. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  488. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_audit.py +0 -0
  489. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_chat_continue.py +0 -0
  490. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_decide.py +0 -0
  491. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_diagnose_config_provenance.py +0 -0
  492. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_diagnose_forge_availability.py +0 -0
  493. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_diagnose_graph.py +0 -0
  494. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_diagnose_self.py +0 -0
  495. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_doctor.py +0 -0
  496. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_doctor_config_free_1801.py +0 -0
  497. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  498. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_drive.py +0 -0
  499. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_escalate.py +0 -0
  500. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_gate_a.py +0 -0
  501. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_install_drift.py +0 -0
  502. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_install_skills.py +0 -0
  503. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_issue_create_label.py +0 -0
  504. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_issue_reopen.py +0 -0
  505. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_merge.py +0 -0
  506. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_milestone_assign.py +0 -0
  507. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_milestone_capture.py +0 -0
  508. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_milestone_chat_add_child.py +0 -0
  509. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_milestone_dispatch.py +0 -0
  510. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_milestone_gate_b.py +0 -0
  511. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_milestone_gate_c.py +0 -0
  512. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_milestone_order.py +0 -0
  513. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  514. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_milestone_ship.py +0 -0
  515. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_network.py +0 -0
  516. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_new_issue_chat.py +0 -0
  517. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_plans.py +0 -0
  518. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_portal.py +0 -0
  519. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_pull_artifact.py +0 -0
  520. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_queue.py +0 -0
  521. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_reattach_sessions.py +0 -0
  522. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_refine_board.py +0 -0
  523. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_release_preflight.py +0 -0
  524. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_release_propagate.py +0 -0
  525. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_release_window.py +0 -0
  526. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_repo_2220.py +0 -0
  527. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_scorecard.py +0 -0
  528. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_set_review_findings.py +0 -0
  529. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_status_advisory_terminal.py +0 -0
  530. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_status_merge_queue.py +0 -0
  531. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_status_provider.py +0 -0
  532. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_status_review_finalizing.py +0 -0
  533. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_status_test_failed_tag.py +0 -0
  534. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_status_usage_limit.py +0 -0
  535. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_sync_comments_873.py +0 -0
  536. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_test_plan.py +0 -0
  537. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_track.py +0 -0
  538. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_tui_update.py +0 -0
  539. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cli_wait.py +0 -0
  540. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_client_base_install.py +0 -0
  541. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_comments.py +0 -0
  542. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_completion_summary.py +0 -0
  543. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_config.py +0 -0
  544. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_config_acceptance.py +0 -0
  545. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_config_audit.py +0 -0
  546. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_config_pricing.py +0 -0
  547. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  548. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_config_usage_gate.py +0 -0
  549. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_confirm_test.py +0 -0
  550. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_conflict_fix.py +0 -0
  551. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_conflict_fix_semantic.py +0 -0
  552. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_coord_test.py +0 -0
  553. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_coord_test_runner_baseline.py +0 -0
  554. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_coord_test_runner_populated_home.py +0 -0
  555. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_coord_test_runner_routing.py +0 -0
  556. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_coord_test_runner_toolchain.py +0 -0
  557. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_coord_web_sse_restart_live.py +0 -0
  558. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_coordinator_machine.py +0 -0
  559. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_cross_platform_imports.py +0 -0
  560. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_dashboard.py +0 -0
  561. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_dashboard_fixture.py +0 -0
  562. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_dashboard_terminal.py +0 -0
  563. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_dashboard_terminal_live.py +0 -0
  564. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_db.py +0 -0
  565. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_dead_end.py +0 -0
  566. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_deploy_coord_db_backup.py +0 -0
  567. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_deploy_coord_web_dist.py +0 -0
  568. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_deploy_coord_web_rollback.py +0 -0
  569. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_deploy_drive_queue_unit.py +0 -0
  570. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_deploy_manifest.py +0 -0
  571. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_deploy_units_lane.py +0 -0
  572. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_deploy_web_unit.py +0 -0
  573. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_deps.py +0 -0
  574. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_diagnose.py +0 -0
  575. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_dispatch.py +0 -0
  576. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_dispatch_target_validation.py +0 -0
  577. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_dist_name.py +0 -0
  578. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_done_housekeeping.py +0 -0
  579. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_drive.py +0 -0
  580. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_drive_queue.py +0 -0
  581. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_drive_state.py +0 -0
  582. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_drive_tmux.py +0 -0
  583. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_epic_up_capability_detection.py +0 -0
  584. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  585. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_epic_up_image_provenance.py +0 -0
  586. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_errors.py +0 -0
  587. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_events.py +0 -0
  588. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_failure_class.py +0 -0
  589. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_filelock.py +0 -0
  590. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  591. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_fix_of_force_override.py +0 -0
  592. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_fleet_config_health.py +0 -0
  593. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_fleet_health_probes.py +0 -0
  594. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_fleet_health_snapshot.py +0 -0
  595. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_forge_availability.py +0 -0
  596. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_freshness.py +0 -0
  597. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_gate_a.py +0 -0
  598. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_gate_b.py +0 -0
  599. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_gate_snapshot_staleness.py +0 -0
  600. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_gates.py +0 -0
  601. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  602. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_generated_types_fixture.py +0 -0
  603. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_github_ops.py +0 -0
  604. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_goal.py +0 -0
  605. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_graph_health.py +0 -0
  606. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_graph_selfheal_absent_2237.py +0 -0
  607. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_handoff.py +0 -0
  608. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_checks.py +0 -0
  609. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_cli.py +0 -0
  610. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_cli_graph.py +0 -0
  611. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_config.py +0 -0
  612. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_context.py +0 -0
  613. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_coord_web_ci_pin.py +0 -0
  614. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_deploy_lane_facts.py +0 -0
  615. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_incident_regression.py +0 -0
  616. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_pypi.py +0 -0
  617. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_registry.py +0 -0
  618. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_timer_active.py +0 -0
  619. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_toolchain.py +0 -0
  620. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_unit_drift.py +0 -0
  621. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_health_unit_enablement.py +0 -0
  622. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_hooks.py +0 -0
  623. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_human_attended_437.py +0 -0
  624. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_init.py +0 -0
  625. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_integration.py +0 -0
  626. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_interactive_briefing_echo.py +0 -0
  627. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_interactive_prefill_state.py +0 -0
  628. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_interactive_session_relaunch.py +0 -0
  629. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_interactive_test_verdict_backstop.py +0 -0
  630. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_interactive_token_attribution.py +0 -0
  631. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_interactive_worktree.py +0 -0
  632. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_issue_store_seam.py +0 -0
  633. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_liveness_auditor.py +0 -0
  634. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_liveness_notify.py +0 -0
  635. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_machine_pause.py +0 -0
  636. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_merge_queue.py +0 -0
  637. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_merge_verify.py +0 -0
  638. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_milestone_chat.py +0 -0
  639. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_milestone_dispatch.py +0 -0
  640. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_milestone_gate.py +0 -0
  641. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_milestone_order.py +0 -0
  642. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_milestone_seam.py +0 -0
  643. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_mock_author.py +0 -0
  644. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_model_tiering.py +0 -0
  645. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_models.py +0 -0
  646. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_models_config_labels.py +0 -0
  647. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_needs_attention.py +0 -0
  648. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_network.py +0 -0
  649. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_new_issue_chat.py +0 -0
  650. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_next_release_tag.py +0 -0
  651. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_node_shim.py +0 -0
  652. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notifier_baseline.py +0 -0
  653. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notifier_cli.py +0 -0
  654. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notifier_collect.py +0 -0
  655. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notifier_config.py +0 -0
  656. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notifier_drive_seam.py +0 -0
  657. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notifier_isolation.py +0 -0
  658. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notifier_predicate.py +0 -0
  659. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notifier_quiet_hours.py +0 -0
  660. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notifier_service.py +0 -0
  661. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notify.py +0 -0
  662. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_notify_drain.py +0 -0
  663. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_openapi.py +0 -0
  664. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_operational_defaults.py +0 -0
  665. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_overlap_fence.py +0 -0
  666. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_overlap_predict.py +0 -0
  667. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_packaged_deploy_units.py +0 -0
  668. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_parentage.py +0 -0
  669. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_paste_landed.py +0 -0
  670. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_plan_followup_approve_plan_command.py +0 -0
  671. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_plan_followup_pr_command.py +0 -0
  672. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_plan_followup_review_command.py +0 -0
  673. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_plan_only.py +0 -0
  674. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_plan_parser.py +0 -0
  675. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_platform_paths.py +0 -0
  676. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_portal_bridge.py +0 -0
  677. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_portal_config.py +0 -0
  678. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_portal_sync.py +0 -0
  679. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_pr_body_lint.py +0 -0
  680. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_prereqs.py +0 -0
  681. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_production_db_guard.py +0 -0
  682. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_progress.py +0 -0
  683. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_provider_seam.py +0 -0
  684. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_providers.py +0 -0
  685. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_providers_config_labels.py +0 -0
  686. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_providers_pty.py +0 -0
  687. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_quiet_hours.py +0 -0
  688. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_quiet_hours_store_2146.py +0 -0
  689. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reap_merged_sessions.py +0 -0
  690. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reap_stale_interactive_tick.py +0 -0
  691. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reconcile.py +0 -0
  692. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reconcile_branch.py +0 -0
  693. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reconcile_completions.py +0 -0
  694. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reconcile_merges.py +0 -0
  695. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reconcile_no_agent_record.py +0 -0
  696. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reconcile_tick.py +0 -0
  697. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reconcile_usage_limit_done.py +0 -0
  698. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_refine_chat.py +0 -0
  699. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_release_cordon_2101.py +0 -0
  700. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  701. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_release_cordon_deadlock_2240.py +0 -0
  702. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_release_cordon_stuck_2490.py +0 -0
  703. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_release_propagate.py +0 -0
  704. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_release_unified_1242.py +0 -0
  705. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_release_verify.py +0 -0
  706. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_release_window.py +0 -0
  707. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_remote_auto_prune.py +0 -0
  708. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_remote_interactive_reaper.py +0 -0
  709. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_repo_edit_2220.py +0 -0
  710. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_repo_graph_fleet_2237.py +0 -0
  711. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_repo_onboard_2220.py +0 -0
  712. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_report_result_push.py +0 -0
  713. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_reports.py +0 -0
  714. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_retry.py +0 -0
  715. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_retry_advisory_1606.py +0 -0
  716. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_retry_type_1636.py +0 -0
  717. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_revalidate.py +0 -0
  718. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_review.py +0 -0
  719. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_review_end_review_without_verdict.py +0 -0
  720. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_review_parse_failure_diagnostic.py +0 -0
  721. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_review_reaffirm.py +0 -0
  722. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_review_state.py +0 -0
  723. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_review_verdict_backstop.py +0 -0
  724. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_review_verdict_override_audit.py +0 -0
  725. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_review_verdict_relay.py +0 -0
  726. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_review_zero_commits.py +0 -0
  727. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_scoped_review_wiring.py +0 -0
  728. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_scorecard.py +0 -0
  729. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_self_health.py +0 -0
  730. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_serve_app_board_trim.py +0 -0
  731. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_session.py +0 -0
  732. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_slice_issue_attribution.py +0 -0
  733. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_smoke.py +0 -0
  734. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_smoke_live_checkout_restore.py +0 -0
  735. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_smoke_workflow.py +0 -0
  736. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_spend_ceiling.py +0 -0
  737. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_spend_ceiling_coordinator.py +0 -0
  738. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_split.py +0 -0
  739. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_split_work.py +0 -0
  740. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_stage_projection.py +0 -0
  741. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_stalled_pipeline.py +0 -0
  742. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_state.py +0 -0
  743. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_state_review_findings_daemon.py +0 -0
  744. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_status_fleet_footer.py +0 -0
  745. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_stop_1567.py +0 -0
  746. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_stuck.py +0 -0
  747. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_terminal_command.py +0 -0
  748. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_test_author.py +0 -0
  749. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_test_chat.py +0 -0
  750. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_test_orchestrator.py +0 -0
  751. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_test_report.py +0 -0
  752. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_test_verdict_parsing.py +0 -0
  753. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_test_verdict_transcript_floor.py +0 -0
  754. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_thin_client_board_audit.py +0 -0
  755. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_thin_client_config_load_1080.py +0 -0
  756. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_thin_client_daemon_routing_906.py +0 -0
  757. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_tmux_host.py +0 -0
  758. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_tmux_session.py +0 -0
  759. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_transcript_floor.py +0 -0
  760. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_usage.py +0 -0
  761. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_usage_limits.py +0 -0
  762. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_usage_rollup.py +0 -0
  763. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_venv_live_install_2121.py +0 -0
  764. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_version_single_source.py +0 -0
  765. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_watch.py +0 -0
  766. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  767. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_worker_events.py +0 -0
  768. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_worker_image_pin_sync.py +0 -0
  769. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_worker_safety.py +0 -0
  770. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_worker_test_scoping.py +0 -0
  771. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_worktree.py +0 -0
  772. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  773. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/Cargo.lock +0 -0
  774. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/Cargo.toml +0 -0
  775. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/cargo-config-local-quadraui.toml.example +0 -0
  776. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/audit.rs +0 -0
  777. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/chat.rs +0 -0
  778. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/fleet_health.rs +0 -0
  779. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/fleet_sessions.rs +0 -0
  780. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/fleet_terminals.rs +0 -0
  781. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/format.rs +0 -0
  782. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/msv.rs +0 -0
  783. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/plans.rs +0 -0
  784. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/sessions.rs +0 -0
  785. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/app/terminal.rs +0 -0
  786. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/bin/gtk.rs +0 -0
  787. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/commands.rs +0 -0
  788. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/lib.rs +0 -0
  789. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/main.rs +0 -0
  790. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/src/settings.rs +0 -0
  791. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/tests/acceptance.rs +0 -0
  792. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/tui/tests/cli.rs +0 -0
  793. {code_coordinator-0.5.197 → code_coordinator-0.5.202}/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.197
3
+ Version: 0.5.202
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.197
3
+ Version: 0.5.202
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
@@ -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",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.197",
2
+ "tag": "0.5.202",
3
3
  "distance": 0,
4
- "node": "gac6cd7be56630a9693710286586d56b6c59bc767",
4
+ "node": "ga9e29961ca26348c484ecee55a737e8c98826ac8",
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=(