code-coordinator 0.5.275__tar.gz → 0.5.277__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 (886) hide show
  1. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. code_coordinator-0.5.277/code_coordinator.egg-info/scm_version.json +8 -0
  4. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/drive_queue.py +198 -11
  5. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/release.py +199 -10
  6. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-release-window.service +35 -0
  7. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/drive_queue.py +117 -1
  8. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/release_window.py +47 -2
  9. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/serve_app.py +135 -0
  10. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/state.py +134 -13
  11. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-release-window.service +35 -0
  12. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/conftest.py +20 -0
  13. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_release_window.py +49 -0
  14. code_coordinator-0.5.277/tests/test_drive_queue_roll_pending.py +540 -0
  15. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_roll_window_handoff.py +48 -0
  16. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_window.py +10 -0
  17. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_serve.py +228 -0
  18. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/Cargo.lock +0 -74
  19. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/Cargo.toml +0 -1
  20. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/data.rs +174 -686
  21. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/dialogs.rs +1 -1
  22. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/events.rs +11 -3
  23. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/fixtures.rs +3 -0
  24. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/mod.rs +29 -3
  25. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/pipeline.rs +1 -1
  26. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/settings_ui.rs +43 -126
  27. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/sidebar.rs +12 -2
  28. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/tests.rs +230 -190
  29. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/types.rs +52 -35
  30. code_coordinator-0.5.275/code_coordinator.egg-info/scm_version.json +0 -8
  31. code_coordinator-0.5.275/tests/test_drive_queue_roll_pending.py +0 -261
  32. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.claude/commands/board.md +0 -0
  33. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.claude/commands/complete-session.md +0 -0
  34. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.claude/commands/coordinator.md +0 -0
  35. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.githooks/_lib.sh +0 -0
  36. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.githooks/post-checkout +0 -0
  37. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.githooks/post-commit +0 -0
  38. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.githooks/post-merge +0 -0
  39. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  40. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.github/coord-ci-acceptance.yml +0 -0
  41. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.github/workflows/auto-release.yml +0 -0
  42. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.github/workflows/cargo-test.yml +0 -0
  43. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.github/workflows/publish.yml +0 -0
  44. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.github/workflows/release-tui.yml +0 -0
  45. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.github/workflows/test.yml +0 -0
  46. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/.gitignore +0 -0
  47. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/CLAUDE.md +0 -0
  48. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/GOAL.md +0 -0
  49. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/LICENSE +0 -0
  50. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/MANIFEST.in +0 -0
  51. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/README.md +0 -0
  52. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/code_coordinator.egg-info/SOURCES.txt +0 -0
  53. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/code_coordinator.egg-info/dependency_links.txt +0 -0
  54. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/code_coordinator.egg-info/entry_points.txt +0 -0
  55. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/code_coordinator.egg-info/requires.txt +0 -0
  56. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/code_coordinator.egg-info/scm_file_list.json +0 -0
  57. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/code_coordinator.egg-info/top_level.txt +0 -0
  58. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/__init__.py +0 -0
  59. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/_board_mapping.py +0 -0
  60. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/acceptance.py +0 -0
  61. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/acceptance_drivers.py +0 -0
  62. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/agent.py +0 -0
  63. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/agent_app.py +0 -0
  64. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/agent_update.py +0 -0
  65. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/agents/opencode/.gitignore +0 -0
  66. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/agents/opencode/agents/work.md +0 -0
  67. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/agents/opencode/routing.jsonc +0 -0
  68. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/approved_work.py +0 -0
  69. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/audit.py +0 -0
  70. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/auto_loop.py +0 -0
  71. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/block_log.py +0 -0
  72. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/board_bool_guard.py +0 -0
  73. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/board_schema.py +0 -0
  74. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/board_service.py +0 -0
  75. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/board_wire.py +0 -0
  76. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/brain.py +0 -0
  77. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/branch_model.py +0 -0
  78. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/bug_intake.py +0 -0
  79. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/cargo_cache.py +0 -0
  80. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/ci_fix.py +0 -0
  81. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/ci_github.py +0 -0
  82. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/ci_gitlab.py +0 -0
  83. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/ci_store.py +0 -0
  84. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/claim.py +0 -0
  85. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/cli.py +0 -0
  86. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/client.py +0 -0
  87. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/__init__.py +0 -0
  88. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/_common.py +0 -0
  89. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/acceptance.py +0 -0
  90. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/agent_ops.py +0 -0
  91. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/audit.py +0 -0
  92. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/chat.py +0 -0
  93. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/dispatch.py +0 -0
  94. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/dispatch_workers.py +0 -0
  95. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/drive.py +0 -0
  96. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/gate_a.py +0 -0
  97. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/gates.py +0 -0
  98. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/issues.py +0 -0
  99. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/lifecycle.py +0 -0
  100. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/merge.py +0 -0
  101. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/milestone.py +0 -0
  102. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/plan_followup.py +0 -0
  103. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/plans.py +0 -0
  104. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/portal.py +0 -0
  105. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/pr.py +0 -0
  106. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/repo.py +0 -0
  107. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/report.py +0 -0
  108. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/review.py +0 -0
  109. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/scorecard.py +0 -0
  110. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/sessions.py +0 -0
  111. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/setup.py +0 -0
  112. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/status.py +0 -0
  113. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/store_migrate.py +0 -0
  114. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/terminal.py +0 -0
  115. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/test_gate.py +0 -0
  116. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/commands/tui.py +0 -0
  117. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/comments.py +0 -0
  118. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/config.py +0 -0
  119. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/config_reload.py +0 -0
  120. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/confirm_test.py +0 -0
  121. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/conflict_fix.py +0 -0
  122. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/dao.py +0 -0
  123. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/dashboard/__init__.py +0 -0
  124. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/dashboard/fixture.py +0 -0
  125. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/dashboard/index.html +0 -0
  126. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/dashboard/server.py +0 -0
  127. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/dashboard/terminal.py +0 -0
  128. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/db.py +0 -0
  129. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/dead_end.py +0 -0
  130. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/decomposition_chat.py +0 -0
  131. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/README.md +0 -0
  132. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-agent.service +0 -0
  133. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-db-backup.service +0 -0
  134. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-db-backup.sh +0 -0
  135. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-db-backup.timer +0 -0
  136. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-drive-queue.service +0 -0
  137. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-drive-queue.timer +0 -0
  138. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-failure-notify.service +0 -0
  139. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-fleet-watchdog.service +0 -0
  140. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  141. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-notify.service +0 -0
  142. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-notify.timer +0 -0
  143. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-release-propagate.service +0 -0
  144. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-release-propagate.timer +0 -0
  145. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-release-window.timer +0 -0
  146. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-serve.service +0 -0
  147. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-web-dist-build.service +0 -0
  148. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-web-dist-build.timer +0 -0
  149. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy/coord-web.service +0 -0
  150. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy_manifest.py +0 -0
  151. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deploy_units.py +0 -0
  152. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/deps.py +0 -0
  153. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/diagnose.py +0 -0
  154. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/dispatch.py +0 -0
  155. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/dist_name.py +0 -0
  156. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/drive.py +0 -0
  157. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/drive_state.py +0 -0
  158. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/events.py +0 -0
  159. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/failure_class.py +0 -0
  160. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/filelock.py +0 -0
  161. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/fleet_config_health.py +0 -0
  162. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/forge_availability.py +0 -0
  163. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/freshness.py +0 -0
  164. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/gate_a.py +0 -0
  165. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/gate_b.py +0 -0
  166. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/gate_snapshot.py +0 -0
  167. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/gates.py +0 -0
  168. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/github_ops.py +0 -0
  169. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/github_throttle.py +0 -0
  170. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/goal.py +0 -0
  171. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/graph_health.py +0 -0
  172. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/__init__.py +0 -0
  173. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/aggregate.py +0 -0
  174. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/__init__.py +0 -0
  175. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/agent_install.py +0 -0
  176. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/cargo_targets.py +0 -0
  177. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/claude_binary.py +0 -0
  178. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/coord_web_ci_pin.py +0 -0
  179. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/deploy_lane_facts.py +0 -0
  180. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/disk.py +0 -0
  181. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/fleet_board.py +0 -0
  182. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  183. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/fleet_phantom.py +0 -0
  184. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/fleet_unit_drift.py +0 -0
  185. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/graph.py +0 -0
  186. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/graphify_cli.py +0 -0
  187. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/index_lock.py +0 -0
  188. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/issues_sync_staleness.py +0 -0
  189. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/plan_usage.py +0 -0
  190. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/release_cordon.py +0 -0
  191. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/repo_state.py +0 -0
  192. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/spawned_coord.py +0 -0
  193. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/stalled_pipeline.py +0 -0
  194. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/timer_active.py +0 -0
  195. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/toolchain.py +0 -0
  196. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/unit_drift.py +0 -0
  197. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/unit_enablement.py +0 -0
  198. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/checks/worktrees.py +0 -0
  199. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/cli.py +0 -0
  200. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/context.py +0 -0
  201. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/fleet_snapshot.py +0 -0
  202. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/models.py +0 -0
  203. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/pypi.py +0 -0
  204. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/registry.py +0 -0
  205. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/render.py +0 -0
  206. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/health/units.py +0 -0
  207. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/hooks.py +0 -0
  208. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/housekeeping.py +0 -0
  209. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/interactive.py +0 -0
  210. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/issue_store.py +0 -0
  211. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/issues_sync_status.py +0 -0
  212. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/liveness_auditor.py +0 -0
  213. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/machine_pause.py +0 -0
  214. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/merge_queue.py +0 -0
  215. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/milestone_chat.py +0 -0
  216. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/milestone_dispatch.py +0 -0
  217. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/milestone_gate.py +0 -0
  218. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/milestone_order.py +0 -0
  219. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/mock_author.py +0 -0
  220. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/models.py +0 -0
  221. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/network.py +0 -0
  222. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/new_issue_chat.py +0 -0
  223. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/__init__.py +0 -0
  224. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/baseline.py +0 -0
  225. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/cli.py +0 -0
  226. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/collect.py +0 -0
  227. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/digest.py +0 -0
  228. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/models.py +0 -0
  229. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/predicate.py +0 -0
  230. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/service.py +0 -0
  231. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/store.py +0 -0
  232. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notifier/transport.py +0 -0
  233. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/notify.py +0 -0
  234. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/openapi.py +0 -0
  235. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/overlap_fence.py +0 -0
  236. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/overlap_predict.py +0 -0
  237. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/parentage.py +0 -0
  238. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/parentage_github.py +0 -0
  239. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/pipeline.py +0 -0
  240. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/plan_parser.py +0 -0
  241. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/plans.py +0 -0
  242. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/platform_paths.py +0 -0
  243. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/portal_bridge.py +0 -0
  244. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/portal_store.py +0 -0
  245. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/portal_sync.py +0 -0
  246. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/pr_body_lint.py +0 -0
  247. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/prereqs.py +0 -0
  248. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/progress.py +0 -0
  249. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/providers/__init__.py +0 -0
  250. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/providers/base.py +0 -0
  251. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/providers/claude.py +0 -0
  252. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/providers/claude_pty.py +0 -0
  253. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/providers/opencode.py +0 -0
  254. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/queue_diagnose.py +0 -0
  255. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/reconcile.py +0 -0
  256. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/reconcile_tick.py +0 -0
  257. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/refine_chat.py +0 -0
  258. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/release_cordon.py +0 -0
  259. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/release_propagate.py +0 -0
  260. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/release_verify.py +0 -0
  261. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/repo_edit.py +0 -0
  262. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/repo_onboard.py +0 -0
  263. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/reports.py +0 -0
  264. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/rest_schema.py +0 -0
  265. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/revalidate.py +0 -0
  266. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/review.py +0 -0
  267. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/scorecard.py +0 -0
  268. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/self_health.py +0 -0
  269. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  270. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  271. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  272. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  273. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  274. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/portal-followup/SKILL.md +0 -0
  275. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/release-now/SKILL.md +0 -0
  276. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  277. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  278. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/skills/update-issue/SKILL.md +0 -0
  279. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/smoke.py +0 -0
  280. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/spend_ceiling.py +0 -0
  281. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/split_work.py +0 -0
  282. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/sql.py +0 -0
  283. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/stage_projection.py +0 -0
  284. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/store_migrate.py +0 -0
  285. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/test_author.py +0 -0
  286. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/test_chat.py +0 -0
  287. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/test_orchestrator.py +0 -0
  288. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/test_report.py +0 -0
  289. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/tui_release.py +0 -0
  290. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/usage.py +0 -0
  291. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/usage_limits.py +0 -0
  292. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/usage_rollup.py +0 -0
  293. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coord/worker_events.py +0 -0
  294. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/coordinator.example.yml +0 -0
  295. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-agent.service +0 -0
  296. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-db-backup.service +0 -0
  297. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-db-backup.sh +0 -0
  298. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-db-backup.timer +0 -0
  299. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-drive-queue.service +0 -0
  300. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-drive-queue.timer +0 -0
  301. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-failure-notify.service +0 -0
  302. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-failure-notify.sh +0 -0
  303. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-fleet-watchdog.service +0 -0
  304. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-fleet-watchdog.timer +0 -0
  305. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-notify.service +0 -0
  306. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-notify.timer +0 -0
  307. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-release-propagate.service +0 -0
  308. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-release-propagate.timer +0 -0
  309. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-release-window.timer +0 -0
  310. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-serve.service +0 -0
  311. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-web-dist-build.service +0 -0
  312. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-web-dist-build.sh +0 -0
  313. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-web-dist-build.timer +0 -0
  314. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-web-rollback.sh +0 -0
  315. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/coord-web.service +0 -0
  316. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/deploy/node-shim.sh +0 -0
  317. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  318. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/ADR_COORD_WEB_CI.md +0 -0
  319. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/ADR_COORD_WEB_DIST.md +0 -0
  320. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/AGENT_OPERATIONS.md +0 -0
  321. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/ARCHITECTURE.md +0 -0
  322. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/ARCH_SECURITY_GATES.md +0 -0
  323. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/COCKPIT.md +0 -0
  324. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/CONTROL_CENTER.md +0 -0
  325. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/COST_DISCIPLINE.md +0 -0
  326. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/CROSS_PLATFORM.md +0 -0
  327. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/CUSTOMER_FACING_APPS.md +0 -0
  328. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/CUSTOMER_PORTAL.md +0 -0
  329. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/DRIVE_QUEUE.md +0 -0
  330. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/EPHEMERAL_WORKERS.md +0 -0
  331. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/FORGE_MIGRATION.md +0 -0
  332. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/GRAPHIFY_SETUP.md +0 -0
  333. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/ISSUE_GUIDANCE.md +0 -0
  334. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/MAC_MINI.md +0 -0
  335. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  336. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/NOTIFIER.md +0 -0
  337. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/OPENCODE_VERIFICATION.md +0 -0
  338. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/OPERATING_GOTCHAS.md +0 -0
  339. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/OPERATOR_GUIDES.md +0 -0
  340. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/ORACLE_LOOP.md +0 -0
  341. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/PHONE_WEBAPP.md +0 -0
  342. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/PIPELINE_V2.md +0 -0
  343. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/PLATFORM_EVOLUTION.md +0 -0
  344. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/SECOND_BACKEND.md +0 -0
  345. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/STORE_SERVICE.md +0 -0
  346. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  347. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/WEB_CONTROL_CENTER.md +0 -0
  348. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/WSL_WINDOWS_WORKER.md +0 -0
  349. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/mocks/web/README.md +0 -0
  350. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/mocks/web/_tokens.css +0 -0
  351. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/mocks/web/issue-detail.html +0 -0
  352. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/mocks/web/pipeline-narrow.html +0 -0
  353. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/docs/mocks/web/pipeline-wide.html +0 -0
  354. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/graphify-out/.gitignore +0 -0
  355. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/install-agent.sh +0 -0
  356. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/pyproject.toml +0 -0
  357. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/audit_review_verdict_overrides.py +0 -0
  358. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  359. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/build-worker-image.sh +0 -0
  360. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/coordinator-machine.py +0 -0
  361. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/epic-down.sh +0 -0
  362. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/epic-up.sh +0 -0
  363. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/preflight.sh +0 -0
  364. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/provision-worker.sh +0 -0
  365. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  366. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  367. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/azure-workers/verify-github-token.sh +0 -0
  368. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/check_gh_argv_containment.py +0 -0
  369. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/codegen.py +0 -0
  370. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/coord-test-runner.sh +0 -0
  371. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/coord-venv-rollback.sh +0 -0
  372. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/drive-batch.sh +0 -0
  373. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/fleet_watchdog.py +0 -0
  374. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/gen_board_fixture.py +0 -0
  375. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/gen_mock_index.py +0 -0
  376. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/next_release_tag.py +0 -0
  377. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/run_tests_in_populated_home.sh +0 -0
  378. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/run_tests_without_gh.sh +0 -0
  379. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/smoke_437_interactive.py +0 -0
  380. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/verify_878_review_capture.py +0 -0
  381. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/verify_release_published.py +0 -0
  382. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/scripts/verify_release_wheel.py +0 -0
  383. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/setup.cfg +0 -0
  384. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/SMOKE_SET.md +0 -0
  385. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/__init__.py +0 -0
  386. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  387. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-33/contract.md +0 -0
  388. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-33/manifest.yml +0 -0
  389. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  390. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  391. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  392. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  393. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-37/conftest.py +0 -0
  394. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-37/contract.md +0 -0
  395. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-37/manifest.yml +0 -0
  396. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  397. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  398. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/contract.md +0 -0
  399. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/manifest.yml +0 -0
  400. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  401. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  402. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  403. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  404. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  405. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  406. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  407. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  408. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  409. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  410. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-51/contract.md +0 -0
  411. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  412. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  413. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-51/manifest.yml +0 -0
  414. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  415. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-51/tsconfig.json +0 -0
  416. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  417. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  418. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  419. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/contract.md +0 -0
  420. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  421. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/manifest.yml +0 -0
  422. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  423. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  424. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  425. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  426. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  427. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  428. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  429. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  430. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  431. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  432. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  433. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  434. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/contract.md +0 -0
  435. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  436. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/manifest.yml +0 -0
  437. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  438. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  439. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  440. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  441. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  442. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  443. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  444. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/backends.py +0 -0
  445. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/board-pipeline-basic.json +0 -0
  446. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  447. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  448. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  449. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  450. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/playwright/all_pass.json +0 -0
  451. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  452. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/playwright/mixed_fail.json +0 -0
  453. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  454. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  455. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/playwright/skip.json +0 -0
  456. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/playwright/truncated.json +0 -0
  457. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  458. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  459. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  460. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  461. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  462. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  463. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  464. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  465. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_acceptance.py +0 -0
  466. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_acceptance_drivers.py +0 -0
  467. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent.py +0 -0
  468. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_api_error.py +0 -0
  469. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_app.py +0 -0
  470. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_branch_base.py +0 -0
  471. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_branch_capture.py +0 -0
  472. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_config_free_1712.py +0 -0
  473. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_deploy_units_endpoint.py +0 -0
  474. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_dirty_worktree.py +0 -0
  475. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  476. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_graph_self_heal.py +0 -0
  477. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_health_h3.py +0 -0
  478. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_idle_restart.py +0 -0
  479. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_push_failure.py +0 -0
  480. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_reap.py +0 -0
  481. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_repos_and_pull.py +0 -0
  482. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_restart_services_endpoint.py +0 -0
  483. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_skills_self_heal.py +0 -0
  484. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_startup_diagnostics.py +0 -0
  485. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_update.py +0 -0
  486. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_update_bluegreen.py +0 -0
  487. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_usage_limit.py +0 -0
  488. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_agent_zero_commit.py +0 -0
  489. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_ambient_home_isolation.py +0 -0
  490. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_approve_dependency_busy_2804.py +0 -0
  491. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_approve_reject_plan.py +0 -0
  492. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_approve_usage_gate.py +0 -0
  493. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_approved_work_2532.py +0 -0
  494. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_assignment_already_recorded_daemon.py +0 -0
  495. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_audit_log.py +0 -0
  496. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_audit_outcome.py +0 -0
  497. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_audit_query.py +0 -0
  498. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_auto_loop.py +0 -0
  499. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_auto_release_publish_2035.py +0 -0
  500. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_backend_selection.py +0 -0
  501. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_base_checkout_restore.py +0 -0
  502. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_block_log.py +0 -0
  503. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_board_cap_762.py +0 -0
  504. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_board_fixture.py +0 -0
  505. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_board_read_path.py +0 -0
  506. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_board_schema.py +0 -0
  507. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_board_service.py +0 -0
  508. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_board_state.py +0 -0
  509. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_board_wire.py +0 -0
  510. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_brain.py +0 -0
  511. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_branch_model.py +0 -0
  512. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_bug_intake.py +0 -0
  513. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_build_worker_image_env_update.py +0 -0
  514. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cargo_cache.py +0 -0
  515. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_check_gh_argv_containment.py +0 -0
  516. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_ci_acceptance_gate_1950.py +0 -0
  517. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_ci_fix.py +0 -0
  518. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_ci_gitlab.py +0 -0
  519. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_ci_parity_2091.py +0 -0
  520. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_ci_store.py +0 -0
  521. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_claim.py +0 -0
  522. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_claude_md_budget.py +0 -0
  523. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_acceptance.py +0 -0
  524. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_assign.py +0 -0
  525. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  526. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_assign_interactive_remote.py +0 -0
  527. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_assign_provider.py +0 -0
  528. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  529. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_audit.py +0 -0
  530. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_chat_continue.py +0 -0
  531. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_decide.py +0 -0
  532. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_diagnose_config_provenance.py +0 -0
  533. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_diagnose_forge_availability.py +0 -0
  534. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_diagnose_graph.py +0 -0
  535. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_diagnose_self.py +0 -0
  536. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_doctor.py +0 -0
  537. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_doctor_config_free_1801.py +0 -0
  538. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  539. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_drive.py +0 -0
  540. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_drive_queue.py +0 -0
  541. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_escalate.py +0 -0
  542. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_fix_headless_review.py +0 -0
  543. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_gate_a.py +0 -0
  544. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_install_drift.py +0 -0
  545. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_install_skills.py +0 -0
  546. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_issue_comment.py +0 -0
  547. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_issue_create_label.py +0 -0
  548. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_issue_reopen.py +0 -0
  549. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_issue_view_list.py +0 -0
  550. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_merge.py +0 -0
  551. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_milestone_assign.py +0 -0
  552. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_milestone_capture.py +0 -0
  553. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_milestone_chat_add_child.py +0 -0
  554. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_milestone_dispatch.py +0 -0
  555. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_milestone_gate_b.py +0 -0
  556. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_milestone_gate_c.py +0 -0
  557. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_milestone_order.py +0 -0
  558. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  559. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_milestone_ship.py +0 -0
  560. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_network.py +0 -0
  561. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_new_issue_chat.py +0 -0
  562. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_plans.py +0 -0
  563. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_portal.py +0 -0
  564. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_pr.py +0 -0
  565. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_pull_artifact.py +0 -0
  566. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_queue.py +0 -0
  567. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_reattach_sessions.py +0 -0
  568. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_refine_board.py +0 -0
  569. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_release_preflight.py +0 -0
  570. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_release_propagate.py +0 -0
  571. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_repo_2220.py +0 -0
  572. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  573. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_scorecard.py +0 -0
  574. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_set_review_findings.py +0 -0
  575. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_status_advisory_terminal.py +0 -0
  576. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_status_contested_tag.py +0 -0
  577. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_status_merge_queue.py +0 -0
  578. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_status_provider.py +0 -0
  579. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_status_review_finalizing.py +0 -0
  580. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_status_test_failed_tag.py +0 -0
  581. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_status_usage_limit.py +0 -0
  582. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_sync_comments_873.py +0 -0
  583. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_test_plan.py +0 -0
  584. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_track.py +0 -0
  585. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_tui_update.py +0 -0
  586. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cli_wait.py +0 -0
  587. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_client_base_install.py +0 -0
  588. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_commands_common.py +0 -0
  589. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_comments.py +0 -0
  590. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_completion_summary.py +0 -0
  591. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_config.py +0 -0
  592. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_config_acceptance.py +0 -0
  593. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_config_audit.py +0 -0
  594. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_config_pricing.py +0 -0
  595. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  596. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_config_usage_gate.py +0 -0
  597. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_confirm_test.py +0 -0
  598. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_conflict_fix.py +0 -0
  599. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_conflict_fix_semantic.py +0 -0
  600. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  601. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_coord_test.py +0 -0
  602. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_coord_test_runner_baseline.py +0 -0
  603. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_coord_test_runner_populated_home.py +0 -0
  604. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_coord_test_runner_routing.py +0 -0
  605. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_coord_test_runner_toolchain.py +0 -0
  606. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_coord_uat.py +0 -0
  607. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_coord_web_sse_restart_live.py +0 -0
  608. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_coordinator_machine.py +0 -0
  609. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_cross_platform_imports.py +0 -0
  610. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_dao.py +0 -0
  611. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_dashboard.py +0 -0
  612. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_dashboard_fixture.py +0 -0
  613. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_dashboard_terminal.py +0 -0
  614. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_dashboard_terminal_live.py +0 -0
  615. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_db.py +0 -0
  616. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_dead_end.py +0 -0
  617. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_decomposition_chat.py +0 -0
  618. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deploy_coord_db_backup.py +0 -0
  619. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deploy_coord_web_dist.py +0 -0
  620. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deploy_coord_web_rollback.py +0 -0
  621. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deploy_drive_queue_unit.py +0 -0
  622. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deploy_failure_notify_unit.py +0 -0
  623. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deploy_manifest.py +0 -0
  624. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deploy_notify_unit.py +0 -0
  625. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deploy_units_lane.py +0 -0
  626. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deploy_web_unit.py +0 -0
  627. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_deps.py +0 -0
  628. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_diagnose.py +0 -0
  629. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_dispatch.py +0 -0
  630. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_dispatch_target_validation.py +0 -0
  631. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_dist_name.py +0 -0
  632. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_done_housekeeping.py +0 -0
  633. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_drive.py +0 -0
  634. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_drive_queue.py +0 -0
  635. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_drive_queue_blocked_rendering.py +0 -0
  636. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_drive_queue_launch_argv.py +0 -0
  637. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  638. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  639. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_drive_state.py +0 -0
  640. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_drive_tmux.py +0 -0
  641. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_epic_up_capability_detection.py +0 -0
  642. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  643. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_epic_up_image_provenance.py +0 -0
  644. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_errors.py +0 -0
  645. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_events.py +0 -0
  646. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_failure_class.py +0 -0
  647. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_filelock.py +0 -0
  648. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  649. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_fix_of_force_override.py +0 -0
  650. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_fleet_config_health.py +0 -0
  651. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_fleet_health_probes.py +0 -0
  652. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_fleet_health_snapshot.py +0 -0
  653. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_fleet_watchdog.py +0 -0
  654. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_forge_availability.py +0 -0
  655. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_freshness.py +0 -0
  656. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_gate_a.py +0 -0
  657. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_gate_b.py +0 -0
  658. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_gate_snapshot_staleness.py +0 -0
  659. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_gates.py +0 -0
  660. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  661. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_gen_mock_index.py +0 -0
  662. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_generated_rust_fixture.py +0 -0
  663. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_generated_types_fixture.py +0 -0
  664. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_github_ops.py +0 -0
  665. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_github_throttle.py +0 -0
  666. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_goal.py +0 -0
  667. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_graph_health.py +0 -0
  668. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_graph_selfheal_absent_2237.py +0 -0
  669. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_handoff.py +0 -0
  670. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_checks.py +0 -0
  671. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_cli.py +0 -0
  672. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_cli_graph.py +0 -0
  673. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_config.py +0 -0
  674. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_context.py +0 -0
  675. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_coord_web_ci_pin.py +0 -0
  676. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_deploy_lane_facts.py +0 -0
  677. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_fix.py +0 -0
  678. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_incident_regression.py +0 -0
  679. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_issues_sync_staleness.py +0 -0
  680. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_pypi.py +0 -0
  681. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_registry.py +0 -0
  682. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_release_cordon_probe.py +0 -0
  683. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_timer_active.py +0 -0
  684. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_toolchain.py +0 -0
  685. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_unit_drift.py +0 -0
  686. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_health_unit_enablement.py +0 -0
  687. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_hooks.py +0 -0
  688. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_human_attended_437.py +0 -0
  689. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_init.py +0 -0
  690. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_integration.py +0 -0
  691. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_interactive_briefing_echo.py +0 -0
  692. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_interactive_pane_log_2541.py +0 -0
  693. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_interactive_prefill_state.py +0 -0
  694. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_interactive_session_relaunch.py +0 -0
  695. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_interactive_test_verdict_backstop.py +0 -0
  696. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_interactive_token_attribution.py +0 -0
  697. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_interactive_worktree.py +0 -0
  698. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_issue_store_seam.py +0 -0
  699. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_issues_sync_status.py +0 -0
  700. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_liveness_auditor.py +0 -0
  701. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_liveness_notify.py +0 -0
  702. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_lock_contention_ratchet.py +0 -0
  703. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_machine_pause.py +0 -0
  704. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_merge_queue.py +0 -0
  705. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_merge_verify.py +0 -0
  706. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_milestone_chat.py +0 -0
  707. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_milestone_dispatch.py +0 -0
  708. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_milestone_gate.py +0 -0
  709. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_milestone_order.py +0 -0
  710. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_milestone_seam.py +0 -0
  711. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_mock_author.py +0 -0
  712. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_model_tiering.py +0 -0
  713. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_models.py +0 -0
  714. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_models_config_labels.py +0 -0
  715. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_needs_attention.py +0 -0
  716. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_network.py +0 -0
  717. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_new_issue_chat.py +0 -0
  718. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_next_release_tag.py +0 -0
  719. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_node_shim.py +0 -0
  720. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notifier_baseline.py +0 -0
  721. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notifier_cli.py +0 -0
  722. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notifier_collect.py +0 -0
  723. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notifier_config.py +0 -0
  724. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notifier_drive_seam.py +0 -0
  725. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notifier_isolation.py +0 -0
  726. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notifier_predicate.py +0 -0
  727. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notifier_quiet_hours.py +0 -0
  728. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notifier_service.py +0 -0
  729. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notify.py +0 -0
  730. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_notify_drain.py +0 -0
  731. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_openapi.py +0 -0
  732. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_operational_defaults.py +0 -0
  733. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_overlap_fence.py +0 -0
  734. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_overlap_predict.py +0 -0
  735. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_packaged_deploy_units.py +0 -0
  736. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_parentage.py +0 -0
  737. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_paste_landed.py +0 -0
  738. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  739. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_pipeline.py +0 -0
  740. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_plan_followup_approve_plan_command.py +0 -0
  741. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_plan_followup_pr_command.py +0 -0
  742. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_plan_followup_review_command.py +0 -0
  743. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_plan_only.py +0 -0
  744. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_plan_parser.py +0 -0
  745. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_platform_paths.py +0 -0
  746. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_portal_bridge.py +0 -0
  747. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_portal_config.py +0 -0
  748. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_portal_store.py +0 -0
  749. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_portal_sync.py +0 -0
  750. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_pr_body_lint.py +0 -0
  751. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_prereqs.py +0 -0
  752. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_production_db_guard.py +0 -0
  753. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_progress.py +0 -0
  754. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_provider_seam.py +0 -0
  755. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_providers.py +0 -0
  756. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_providers_config_labels.py +0 -0
  757. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_providers_pty.py +0 -0
  758. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_quiet_hours.py +0 -0
  759. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_quiet_hours_store_2146.py +0 -0
  760. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reap_merged_sessions.py +0 -0
  761. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reap_stale_interactive_tick.py +0 -0
  762. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reconcile.py +0 -0
  763. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reconcile_branch.py +0 -0
  764. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reconcile_completions.py +0 -0
  765. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  766. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reconcile_merges.py +0 -0
  767. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reconcile_no_agent_record.py +0 -0
  768. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reconcile_tick.py +0 -0
  769. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reconcile_usage_limit_done.py +0 -0
  770. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_refine_chat.py +0 -0
  771. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_cordon_2101.py +0 -0
  772. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  773. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_cordon_deadlock_2240.py +0 -0
  774. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_cordon_stuck_2490.py +0 -0
  775. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_propagate.py +0 -0
  776. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_propagate_threshold.py +0 -0
  777. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_roll_between_legs_2854.py +0 -0
  778. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_unified_1242.py +0 -0
  779. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_release_verify.py +0 -0
  780. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_remote_auto_prune.py +0 -0
  781. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_remote_interactive_reaper.py +0 -0
  782. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_repo_add.py +0 -0
  783. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_repo_edit_2220.py +0 -0
  784. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_repo_graph_fleet_2237.py +0 -0
  785. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_repo_onboard_2220.py +0 -0
  786. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_report_result_push.py +0 -0
  787. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_reports.py +0 -0
  788. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_retry.py +0 -0
  789. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_retry_advisory_1606.py +0 -0
  790. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_retry_type_1636.py +0 -0
  791. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_revalidate.py +0 -0
  792. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_review.py +0 -0
  793. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_review_end_review_without_verdict.py +0 -0
  794. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_review_parse_failure_diagnostic.py +0 -0
  795. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_review_reaffirm.py +0 -0
  796. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_review_state.py +0 -0
  797. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_review_verdict_backstop.py +0 -0
  798. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_review_verdict_override_audit.py +0 -0
  799. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_review_verdict_relay.py +0 -0
  800. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_review_zero_commits.py +0 -0
  801. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_scoped_review_wiring.py +0 -0
  802. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_scorecard.py +0 -0
  803. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_self_health.py +0 -0
  804. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_serve_app_board_trim.py +0 -0
  805. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_serve_rest_routes.py +0 -0
  806. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_session.py +0 -0
  807. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_slice_issue_attribution.py +0 -0
  808. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_smoke.py +0 -0
  809. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_smoke_live_checkout_restore.py +0 -0
  810. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_smoke_workflow.py +0 -0
  811. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_spend_ceiling.py +0 -0
  812. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_spend_ceiling_coordinator.py +0 -0
  813. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_split.py +0 -0
  814. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_split_work.py +0 -0
  815. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_sql_dialect.py +0 -0
  816. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_sqlite_connect_ratchet.py +0 -0
  817. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_stage_projection.py +0 -0
  818. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_stale_busy_reviewer_697.py +0 -0
  819. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_stalled_pipeline.py +0 -0
  820. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_state.py +0 -0
  821. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_state_review_findings_daemon.py +0 -0
  822. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_status_fleet_footer.py +0 -0
  823. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_stop_1567.py +0 -0
  824. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_store_contract.py +0 -0
  825. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_store_migrate.py +0 -0
  826. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_stuck.py +0 -0
  827. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  828. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_terminal_command.py +0 -0
  829. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_test_author.py +0 -0
  830. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_test_chat.py +0 -0
  831. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_test_orchestrator.py +0 -0
  832. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_test_report.py +0 -0
  833. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_test_verdict_parsing.py +0 -0
  834. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_test_verdict_transcript_floor.py +0 -0
  835. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_text_io_encoding_audit.py +0 -0
  836. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_thin_client_board_audit.py +0 -0
  837. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_thin_client_config_load_1080.py +0 -0
  838. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_thin_client_daemon_routing_906.py +0 -0
  839. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_tmux_host.py +0 -0
  840. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_tmux_session.py +0 -0
  841. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_transcript_floor.py +0 -0
  842. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_usage.py +0 -0
  843. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_usage_limits.py +0 -0
  844. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_usage_rollup.py +0 -0
  845. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_venv_live_install_2121.py +0 -0
  846. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_version_single_source.py +0 -0
  847. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_watch.py +0 -0
  848. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  849. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_worker_env_venv_isolation.py +0 -0
  850. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_worker_events.py +0 -0
  851. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_worker_image_pin_sync.py +0 -0
  852. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_worker_safety.py +0 -0
  853. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_worker_test_scoping.py +0 -0
  854. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_worktree.py +0 -0
  855. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  856. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/test_write_parity.py +0 -0
  857. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tests/write_parity.py +0 -0
  858. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/cargo-config-local-quadraui.toml.example +0 -0
  859. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/approved.rs +0 -0
  860. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/audit.rs +0 -0
  861. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/chat.rs +0 -0
  862. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/doc_tabs.rs +0 -0
  863. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/drive.rs +0 -0
  864. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/drive_queue.rs +0 -0
  865. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/escalation.rs +0 -0
  866. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/fleet_health.rs +0 -0
  867. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/fleet_sessions.rs +0 -0
  868. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/fleet_terminals.rs +0 -0
  869. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/format.rs +0 -0
  870. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/milestone_dag.rs +0 -0
  871. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/msv.rs +0 -0
  872. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/plans.rs +0 -0
  873. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/render.rs +0 -0
  874. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/reports.rs +0 -0
  875. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/sessions.rs +0 -0
  876. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/terminal.rs +0 -0
  877. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/types/generated.rs +0 -0
  878. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/app/workspace.rs +0 -0
  879. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/bin/gtk.rs +0 -0
  880. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/commands.rs +0 -0
  881. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/lib.rs +0 -0
  882. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/main.rs +0 -0
  883. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/src/settings.rs +0 -0
  884. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/tests/acceptance.rs +0 -0
  885. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/tui/tests/cli.rs +0 -0
  886. {code_coordinator-0.5.275 → code_coordinator-0.5.277}/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.275
3
+ Version: 0.5.277
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.275
3
+ Version: 0.5.277
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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.277",
3
+ "distance": 0,
4
+ "node": "ga1b2068ad0c1dc506226ba5fbe7adb8fd566702b",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-29"
8
+ }
@@ -53,6 +53,7 @@ from coord.drive_queue import (
53
53
  QUEUE_ALERT_REPO,
54
54
  QUEUE_ALERT_STAGE,
55
55
  RESUME_PROBE_TIMEOUT_SECONDS,
56
+ ROLL_LEDGER_CUMULATIVE_BOUND_SECONDS,
56
57
  ROLL_PENDING_DEFAULT_MAX_DEFERRALS,
57
58
  ROLL_PENDING_DEFAULT_TTL_SECONDS,
58
59
  STATE_BLOCKED,
@@ -66,6 +67,7 @@ from coord.drive_queue import (
66
67
  ProbeResult,
67
68
  QueueEntry,
68
69
  QueueError,
70
+ RollLedger,
69
71
  RollPending,
70
72
  TickPlan,
71
73
  add_preflight_notice,
@@ -1628,10 +1630,22 @@ def drive_queue_cancel_roll(output_json: bool) -> None:
1628
1630
  Does NOT change the target: the next `coord release propagate`/
1629
1631
  `nightly-window` run re-arms a marker from scratch if the fleet is still
1630
1632
  behind. This only stops the CURRENT wait.
1633
+
1634
+ #2889: also resets the roll LEDGER (`RollLedger`) — the cumulative
1635
+ frozen-time bookkeeping a fresh marker's own arm now checks — so an
1636
+ operator clearing a stuck marker also clears whatever run-up of
1637
+ cumulative frozen time and fresh-arm history led to it, exactly the
1638
+ "operator intervenes" escape hatch item 1's cumulative bound requires.
1639
+ Reset unconditionally, even when there is no LIVE marker to cancel: a
1640
+ ledger can be `escalated` (refusing every fresh arm) with nothing
1641
+ currently pending — its last marker already expired and cleared on its
1642
+ own — and that state needs the SAME override.
1631
1643
  """
1632
1644
  from coord.machine_pause import clear_cordon, cordons as read_cordons # noqa: PLC0415
1633
1645
 
1634
1646
  pending = read_roll_pending()
1647
+ ledger = read_roll_ledger()
1648
+ ledger_had_history = ledger.marker_count > 0 or ledger.cumulative_frozen_seconds > 0
1635
1649
  cleared_cordons: list[str] = []
1636
1650
  if pending is not None:
1637
1651
  try:
@@ -1647,6 +1661,8 @@ def drive_queue_cancel_roll(output_json: bool) -> None:
1647
1661
  except Exception: # noqa: BLE001 — best-effort; never block the marker clear on this
1648
1662
  pass
1649
1663
  clear_roll_pending()
1664
+ if ledger_had_history:
1665
+ reset_roll_ledger()
1650
1666
 
1651
1667
  if output_json:
1652
1668
  click.echo(
@@ -1654,29 +1670,45 @@ def drive_queue_cancel_roll(output_json: bool) -> None:
1654
1670
  {
1655
1671
  "cancelled": pending.to_dict() if pending is not None else None,
1656
1672
  "cleared_cordons": sorted(cleared_cordons),
1673
+ "ledger_reset": ledger.to_dict() if ledger_had_history else None,
1657
1674
  },
1658
1675
  sort_keys=True,
1659
1676
  )
1660
1677
  )
1661
1678
  return
1662
1679
 
1663
- if pending is None:
1680
+ if pending is None and not ledger_had_history:
1664
1681
  click.echo("no roll-pending marker to cancel — the queue is not held for a roll")
1665
1682
  return
1666
- click.echo(
1667
- f"cancelled {pending.describe()} — the drive-queue tick resumes "
1668
- "launching immediately"
1669
- )
1683
+ if pending is not None:
1684
+ click.echo(
1685
+ f"cancelled {pending.describe()} — the drive-queue tick resumes "
1686
+ "launching immediately"
1687
+ )
1688
+ else:
1689
+ click.echo(
1690
+ "no roll-pending marker to cancel, but the roll ledger had "
1691
+ f"{ledger.cumulative_frozen_seconds:.0f}s cumulative frozen time "
1692
+ f"across {ledger.marker_count} marker generation(s)"
1693
+ )
1670
1694
  if cleared_cordons:
1671
1695
  click.echo(
1672
1696
  "also cleared cordon(s) still open for this target: "
1673
1697
  + ", ".join(sorted(cleared_cordons))
1674
1698
  )
1675
- click.echo(
1676
- "note: this only stops the current wait — the next `coord release "
1677
- "propagate`/`nightly-window` run re-arms a fresh marker if the "
1678
- "fleet is still behind"
1679
- )
1699
+ if ledger_had_history:
1700
+ click.echo(
1701
+ "also reset the #2889 roll ledger "
1702
+ f"({ledger.cumulative_frozen_seconds:.0f}s cumulative frozen time / "
1703
+ f"{ledger.marker_count} marker generation(s)) — a fresh arm is no "
1704
+ "longer refused for having run up that history"
1705
+ )
1706
+ if pending is not None:
1707
+ click.echo(
1708
+ "note: this only stops the current wait — the next `coord release "
1709
+ "propagate`/`nightly-window` run re-arms a fresh marker if the "
1710
+ "fleet is still behind"
1711
+ )
1680
1712
 
1681
1713
 
1682
1714
  # ── block-log (#2235 Phase 0) ────────────────────────────────────────────────
@@ -2587,6 +2619,136 @@ def clear_roll_pending() -> None:
2587
2619
  pass
2588
2620
 
2589
2621
 
2622
+ # ── #2889: the roll ledger — memory that survives a marker's own clear ──────
2623
+
2624
+ _ROLL_LEDGER_FILENAME = "roll_pending_ledger.json"
2625
+
2626
+
2627
+ def roll_pending_ledger_path() -> Path:
2628
+ """Absolute path to the #2889 roll ledger.
2629
+
2630
+ ``$COORD_ROLL_PENDING_LEDGER_STATE`` overrides it — same test-isolation
2631
+ seam as :func:`roll_pending_path`; never let a test write the operator's
2632
+ real ``~/.coord/roll_pending_ledger.json``.
2633
+ """
2634
+ import os # noqa: PLC0415
2635
+
2636
+ from coord.platform_paths import default_coord_dir # noqa: PLC0415
2637
+
2638
+ override = os.environ.get("COORD_ROLL_PENDING_LEDGER_STATE")
2639
+ if override:
2640
+ return Path(override).expanduser()
2641
+ return default_coord_dir() / _ROLL_LEDGER_FILENAME
2642
+
2643
+
2644
+ def read_roll_ledger() -> RollLedger:
2645
+ """The current ledger — never ``None``: an absent/corrupt/hand-edited
2646
+ file reads as a fresh, empty ``RollLedger()``, the same fail-soft
2647
+ posture :func:`read_roll_pending` takes on its own file, and for the
2648
+ same reason — a ledger this cannot make sense of must never wedge future
2649
+ arms forever.
2650
+ """
2651
+ path = roll_pending_ledger_path()
2652
+ try:
2653
+ raw = path.read_text(encoding="utf-8")
2654
+ except OSError:
2655
+ return RollLedger()
2656
+ if not raw.strip():
2657
+ return RollLedger()
2658
+ try:
2659
+ data = _json.loads(raw)
2660
+ except ValueError:
2661
+ return RollLedger()
2662
+ if not isinstance(data, dict):
2663
+ return RollLedger()
2664
+ return RollLedger.from_dict(data)
2665
+
2666
+
2667
+ def write_roll_ledger(ledger: RollLedger) -> None:
2668
+ """Persist *ledger*, overwriting whatever was there before. Same atomic
2669
+ tempfile-then-rename pattern as :func:`write_roll_pending`."""
2670
+ import os # noqa: PLC0415
2671
+ import tempfile # noqa: PLC0415
2672
+
2673
+ path = roll_pending_ledger_path()
2674
+ path.parent.mkdir(parents=True, exist_ok=True)
2675
+ payload = _json.dumps(ledger.to_dict(), sort_keys=True)
2676
+ fd, tmp_name = tempfile.mkstemp(prefix=".roll-ledger.", suffix=".tmp", dir=path.parent)
2677
+ try:
2678
+ with os.fdopen(fd, "w", encoding="utf-8") as fh:
2679
+ fh.write(payload)
2680
+ os.replace(tmp_name, path)
2681
+ except Exception:
2682
+ try:
2683
+ os.unlink(tmp_name)
2684
+ except OSError:
2685
+ pass
2686
+ raise
2687
+
2688
+
2689
+ def reset_roll_ledger() -> None:
2690
+ """Drop the ledger — a CONFIRMED roll or explicit operator intervention
2691
+ (`coord drive-queue cancel-roll`) both mean "clean slate": whatever ran
2692
+ up the cumulative bound is over. A no-op when there was nothing to
2693
+ reset."""
2694
+ path = roll_pending_ledger_path()
2695
+ try:
2696
+ path.unlink()
2697
+ except FileNotFoundError:
2698
+ pass
2699
+
2700
+
2701
+ #: #2889's own escalation key — deliberately distinct from
2702
+ #: `ROLL_PENDING_ALERT_STAGE` (a single expired marker) so the two can
2703
+ #: coexist as separate rows: a marker expiring is routine (bounded by design,
2704
+ #: #2587's whole point); the LEDGER crossing its cumulative bound is the
2705
+ #: escalation that means "this has now failed to roll unattended several
2706
+ #: times in a row — an operator needs to look, not just wait for the next
2707
+ #: gap."
2708
+ ROLL_LEDGER_ALERT_REPO = "(roll-pending)"
2709
+ ROLL_LEDGER_ALERT_ISSUE = 0
2710
+ ROLL_LEDGER_ALERT_STAGE = "roll-ledger-escalated"
2711
+
2712
+
2713
+ def _escalate_roll_ledger(ledger: RollLedger, *, now: float) -> None:
2714
+ """Surface a ledger that just crossed its cumulative bound (#2889 item
2715
+ 1's "escalate loudly") — mirrors `_escalate_roll_pending_expired` one
2716
+ level up: that one is routine (a single marker hit ITS OWN bound, exactly
2717
+ as designed); this one means the SAME target has now failed to roll
2718
+ unattended across `ledger.marker_count` separate marker generations, and
2719
+ arming a fresh one is refused until `coord drive-queue cancel-roll`
2720
+ clears this ledger.
2721
+ """
2722
+ from coord.state import record_drive_escalation # noqa: PLC0415
2723
+
2724
+ reason = (
2725
+ f"roll-pending ledger escalated: {ledger.cumulative_frozen_seconds:.0f}s "
2726
+ f"cumulative frozen time across {ledger.marker_count} marker "
2727
+ "generation(s), none of them confirming a roll — refusing to arm a "
2728
+ "fresh marker until `coord drive-queue cancel-roll` clears this "
2729
+ "ledger (#2889: a per-marker TTL bounds one marker; this bounds the "
2730
+ "RATE of fresh ones that follow)"
2731
+ )
2732
+ click.echo(f"warning: {reason}", err=True)
2733
+ try:
2734
+ record_drive_escalation(
2735
+ ROLL_LEDGER_ALERT_REPO,
2736
+ ROLL_LEDGER_ALERT_ISSUE,
2737
+ stage=ROLL_LEDGER_ALERT_STAGE,
2738
+ reason=reason,
2739
+ gate_readings=(
2740
+ f"cumulative_frozen_seconds={ledger.cumulative_frozen_seconds:.0f} | "
2741
+ f"bound={ROLL_LEDGER_CUMULATIVE_BOUND_SECONDS:.0f} | "
2742
+ f"marker_count={ledger.marker_count}"
2743
+ ),
2744
+ proposed_command="coord drive-queue cancel-roll",
2745
+ )
2746
+ except Exception as exc: # noqa: BLE001 — the stderr line above is the
2747
+ # floor; an escalation table that cannot be written must not take
2748
+ # the message down with it.
2749
+ click.echo(f" (could not record the roll-ledger escalation: {exc})", err=True)
2750
+
2751
+
2590
2752
  def _roll_pending_may_fire(*, occupied: int, now: float, queue_rows) -> tuple[bool, str]:
2591
2753
  """Is it worth attempting to fire a pending roll THIS tick? (#2870 part 2)
2592
2754
 
@@ -2664,12 +2826,25 @@ def _fire_pending_roll(*, dry_run: bool = False) -> tuple[bool, str]:
2664
2826
  Returns ``(fired, detail)``, never raises — a `systemctl` this host
2665
2827
  cannot run (no systemd, PATH issue, unit not installed) must be a
2666
2828
  deferral the marker survives to retry next tick, not a crashed tick.
2829
+
2830
+ #2889 item 4: ``--setenv=COORD_ROLL_INVOKER=drive-queue-tick`` tags THIS
2831
+ specific start with a caller identity `coord release nightly-window`
2832
+ (the spawned unit's `ExecStart=`) reads back and journals as
2833
+ `WindowRecord.invoked_by` — overriding the unit file's own static
2834
+ `Environment=` default for just this one invocation (systemd layers a
2835
+ transient `--setenv=` on top of a unit's static `Environment=`), so
2836
+ "what invoked this run" is answerable from `coord release
2837
+ window-history` instead of requiring a live reproduction.
2667
2838
  """
2668
2839
  if dry_run:
2669
2840
  return True, "--dry-run: would run `systemctl --user start --no-block coord-release-window.service`"
2670
2841
  try:
2671
2842
  proc = subprocess.run( # noqa: S603, S607 — fixed argv, no shell
2672
- ["systemctl", "--user", "start", "--no-block", "coord-release-window.service"],
2843
+ [
2844
+ "systemctl", "--user", "start", "--no-block",
2845
+ "--setenv=COORD_ROLL_INVOKER=drive-queue-tick",
2846
+ "coord-release-window.service",
2847
+ ],
2673
2848
  capture_output=True,
2674
2849
  text=True,
2675
2850
  timeout=30,
@@ -4483,10 +4658,22 @@ def drive_queue_tick(
4483
4658
  # is dropped right here, loudly (`_escalate_roll_pending_expired`),
4484
4659
  # and this tick proceeds exactly as if no marker had ever been set —
4485
4660
  # the #2587 "never hold the queue down indefinitely" requirement.
4661
+ # #2889: before it is dropped, its lived duration is folded into the
4662
+ # roll LEDGER (`RollLedger`, `roll_pending_ledger.json`) — memory
4663
+ # that survives THIS clear, unlike the marker itself, so a fresh arm
4664
+ # right after this one cannot dodge the cumulative bound the way a
4665
+ # brand new `RollPending` dodges a single marker's own TTL. Crossing
4666
+ # that bound is its own, separate, louder escalation.
4486
4667
  now = time.time()
4487
4668
  roll_pending = read_roll_pending()
4488
4669
  if roll_pending is not None and roll_pending.expired(now):
4489
4670
  _escalate_roll_pending_expired(roll_pending, now=now)
4671
+ ledger = read_roll_ledger()
4672
+ was_escalated = ledger.escalated
4673
+ ledger = ledger.record_expiry(roll_pending, now=now)
4674
+ write_roll_ledger(ledger)
4675
+ if ledger.escalated and not was_escalated:
4676
+ _escalate_roll_ledger(ledger, now=now)
4490
4677
  clear_roll_pending()
4491
4678
  roll_pending = None
4492
4679
  if roll_pending is not None:
@@ -653,13 +653,96 @@ def _lane_versions_by_host(report) -> dict[str, list[str | None]]:
653
653
  return out
654
654
 
655
655
 
656
+ def _queue_provably_busy(quiescence, daemon_name: str | None) -> bool:
657
+ """#2889 item 2: does *quiescence* name a genuine `drive_queue` row (not
658
+ some OTHER busy reason — an interactive session, a paused machine, an
659
+ in-flight confirmation) actively occupying *daemon_name* right now?
660
+
661
+ Deliberately narrower than "the daemon is busy" (`daemon_name in
662
+ busy_hosts`, this module's existing arm TRIGGER — see
663
+ `_ensure_roll_pending_marker`'s call site): a genuine drive-queue entry
664
+ is the one busy reason a freshly-armed marker cannot do anything about
665
+ faster than `coord drive-queue tick`'s own reconciliation already will
666
+ on its normal ~3-minute cadence — arming one anyway just spends up to a
667
+ full TTL (#2587's own hour-long bound) learning that for free, exactly
668
+ the "10 fresh arms, 49 ticks refused to launch" pathology #2889 reports.
669
+ A busy signal of any OTHER kind (`Quiescence.busy`'s `kind` field —
670
+ `coord.release_propagate.assess_quiescence`'s own vocabulary:
671
+ "confirmation/notify drain running", "live RUNNING assignment", a paused
672
+ machine) is exactly the case a marker's capacity-0 freeze DOES help:
673
+ nothing NEW should launch onto the daemon host while it clears, and
674
+ nothing here can predict when it will on its own.
675
+
676
+ Unattributable signals (``b.host is None`` — `Quiescence.fleet_wide_busy`)
677
+ are included: an unreadable board or an unattributed drive-queue row
678
+ means "busy somewhere unknown", which must be read as busy everywhere,
679
+ the same rule `Quiescence.rollable_hosts` already applies.
680
+ """
681
+ return any(
682
+ b.kind == "drive-queue entry running" and (b.host is None or b.host == daemon_name)
683
+ for b in quiescence.busy
684
+ )
685
+
686
+
687
+ def _fresh_arm_refusal_reason(ledger, *, now: float, queue_provably_busy: bool) -> str:
688
+ """Empty string when a FRESH `RollPending` arm (no existing marker at
689
+ all) may proceed; otherwise the reason it must not, in priority order —
690
+ escalated ledger, then the rate limit, then a provably busy queue.
691
+
692
+ Shared by `_ensure_roll_pending_marker` and `release_nightly_window`'s
693
+ own arm site (#2587 section 3) so the three #2889 checks can never drift
694
+ between the two places a fresh marker gets armed — #2096's "two
695
+ surfaces, one function" rule, one level up from `_drain`'s own reuse of
696
+ `release_propagate.assess_quiescence` for the identical reason.
697
+
698
+ Pure — takes a `coord.drive_queue.RollLedger` and the caller's own
699
+ already-computed *queue_provably_busy* rather than reading a clock or a
700
+ board itself, so it stays trivially testable and every call site decides
701
+ for itself how loud to be about the result (only the ESCALATED reason is
702
+ meant to also trigger a recorded escalation — see both callers).
703
+ """
704
+ if ledger.escalated:
705
+ return (
706
+ f"the #2889 roll ledger has escalated "
707
+ f"({ledger.cumulative_frozen_seconds:.0f}s cumulative frozen time across "
708
+ f"{ledger.marker_count} marker generation(s)) — run `coord drive-queue "
709
+ "cancel-roll` to clear it before arming again"
710
+ )
711
+ wait = ledger.seconds_until_next_arm(now)
712
+ if wait > 0:
713
+ return (
714
+ f"under the #2889 rate limit ({wait:.0f}s remaining since the last "
715
+ "fresh arm)"
716
+ )
717
+ if queue_provably_busy:
718
+ return (
719
+ "a genuine drive-queue entry is actively occupying the daemon host "
720
+ "right now (#2889 item 2) — a fresh marker cannot roll any faster "
721
+ "than the tick's own reconciliation already will"
722
+ )
723
+ return ""
724
+
725
+
656
726
  def _ensure_roll_pending_marker(
657
727
  target_version: str, *, reason: str, min_releases_behind: int | None = None,
658
- dry_run: bool = False,
659
- ) -> None:
728
+ dry_run: bool = False, queue_provably_busy: bool = False,
729
+ ) -> bool:
660
730
  """#2587: make sure a roll-pending marker exists for *target_version*,
661
731
  without resetting an already-live one's clock.
662
732
 
733
+ #2889: returns whether a marker is live as a result of this call
734
+ (existing/updated/freshly armed) — ``False`` only for a REFUSED fresh
735
+ arm (see the three checks below). Every existing call site predates this
736
+ return value and simply ignores it — a refused arm is already, on its
737
+ own, an ordinary deferral from the caller's point of view, exactly like
738
+ a still-busy fleet. *queue_provably_busy* (see
739
+ :func:`_queue_provably_busy`) only ever affects a FRESH arm (no existing
740
+ marker at all): a re-arm of an already-live marker (same OR different
741
+ target) is a continuation of a campaign already in progress and proceeds
742
+ regardless — refusing THAT would just reintroduce #2607's own bug by a
743
+ different door, since a marker that cannot be kept current would then
744
+ fire against a target it no longer names.
745
+
663
746
  #2870: *min_releases_behind* is the effective `propagation.
664
747
  min_releases_behind`/`--min-behind` threshold THIS run resolved and
665
748
  already gated on before reaching this call (see the #2583 gate just
@@ -710,12 +793,17 @@ def _ensure_roll_pending_marker(
710
793
  import dataclasses as _dataclasses # noqa: PLC0415
711
794
  import time as _time # noqa: PLC0415
712
795
 
713
- from coord.commands.drive_queue import read_roll_pending, write_roll_pending # noqa: PLC0415
796
+ from coord.commands.drive_queue import ( # noqa: PLC0415
797
+ _escalate_roll_ledger,
798
+ read_roll_ledger,
799
+ read_roll_pending,
800
+ write_roll_pending,
801
+ )
714
802
  from coord.drive_queue import RollPending # noqa: PLC0415
715
803
 
716
804
  existing = read_roll_pending()
717
805
  if existing is not None and existing.target_version == target_version:
718
- return
806
+ return True
719
807
  if existing is not None:
720
808
  if dry_run:
721
809
  click.echo(
@@ -723,27 +811,56 @@ def _ensure_roll_pending_marker(
723
811
  f"({existing.describe()}) with v{target_version} (reason="
724
812
  f"{reason!r}), preserving its original set_at/deferrals (#2607)"
725
813
  )
726
- return
814
+ return True
727
815
  write_roll_pending(
728
816
  _dataclasses.replace(
729
817
  existing, target_version=target_version, reason=reason,
730
818
  min_releases_behind=min_releases_behind,
731
819
  )
732
820
  )
733
- return
821
+ return True
822
+
823
+ # #2889: a genuinely FRESH arm — no existing marker at all — is the one
824
+ # case the RATE of markers can run away (#2889's own report: ten fresh
825
+ # arms in ~15 hours, each one individually well-behaved).
826
+ now = _time.time()
827
+ ledger = read_roll_ledger()
828
+ refusal = _fresh_arm_refusal_reason(
829
+ ledger, now=now, queue_provably_busy=queue_provably_busy,
830
+ )
831
+ if refusal:
832
+ message = f"declining to arm a roll-pending marker for v{target_version} — {refusal}"
833
+ if dry_run:
834
+ click.echo(f"--dry-run: would refuse to arm — {refusal}")
835
+ return False
836
+ click.echo(message, err=True)
837
+ if ledger.escalated:
838
+ # Re-recorded on every refused attempt, same "quiet re-record
839
+ # keeps the escalation fresh" posture the #2572 self-cordon
840
+ # escalation already documents — cheap (an upsert) and means an
841
+ # operator checking `coord drive-queue status` mid-day sees this
842
+ # is still live, not a one-time blip from hours ago.
843
+ _escalate_roll_ledger(ledger, now=now)
844
+ return False
845
+
734
846
  if dry_run:
735
847
  click.echo(
736
848
  f"--dry-run: would set a roll-pending marker for v{target_version} "
737
849
  f"(reason={reason!r}) — the drive-queue tick would then hold "
738
850
  "capacity at 0 until the queue drains"
739
851
  )
740
- return
852
+ return True
741
853
  write_roll_pending(
742
854
  RollPending(
743
- target_version=target_version, set_at=_time.time(), reason=reason,
855
+ target_version=target_version, set_at=now, reason=reason,
744
856
  min_releases_behind=min_releases_behind,
745
857
  )
746
858
  )
859
+ # Nothing to write to the ledger here — only an EXPIRY moves its
860
+ # rate-limit clock (`RollLedger.record_expiry`), never an arm. See that
861
+ # method's own docstring for why measuring from the arm, not the clear,
862
+ # would let the exact re-arm-right-after-TTL-expiry case through.
863
+ return True
747
864
 
748
865
 
749
866
  @release_group.command(
@@ -1146,9 +1263,15 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
1146
1263
  # (resolved above, 3a) onto the marker, so whatever discharges it is
1147
1264
  # gated at the threshold that armed it, not a threshold re-resolved
1148
1265
  # from scratch later.
1266
+ # #2889 item 2: `quiescence` was already computed above (3) — reuse
1267
+ # it rather than re-fetching the board, to tell a genuine
1268
+ # drive-queue occupancy apart from the OTHER busy reasons that put
1269
+ # the daemon in `busy_hosts` (see `_queue_provably_busy`'s
1270
+ # docstring). Only affects a genuinely FRESH arm.
1149
1271
  _ensure_roll_pending_marker(
1150
1272
  record.target_version, reason="propagate",
1151
1273
  min_releases_behind=effective_min_behind, dry_run=dry_run,
1274
+ queue_provably_busy=_queue_provably_busy(quiescence, daemon_name),
1152
1275
  )
1153
1276
  _finish(rp.STATUS_DEFERRED, 0)
1154
1277
 
@@ -3088,7 +3211,9 @@ def release_nightly_window(
3088
3211
  from coord.commands._common import _load_config # noqa: PLC0415
3089
3212
  from coord.commands.drive_queue import ( # noqa: PLC0415
3090
3213
  clear_roll_pending,
3214
+ read_roll_ledger,
3091
3215
  read_roll_pending,
3216
+ reset_roll_ledger,
3092
3217
  write_roll_pending,
3093
3218
  )
3094
3219
  from coord.drive_queue import RollPending # noqa: PLC0415
@@ -3100,8 +3225,20 @@ def release_nightly_window(
3100
3225
 
3101
3226
  config = _load_config(config_path)
3102
3227
  state_dir = _state_dir()
3228
+ # #2889 item 4: "what invoked this?" straight from the journal —
3229
+ # `$COORD_ROLL_INVOKER` is set on the process environment by whichever
3230
+ # trigger started `coord-release-window.service`: the unit's own static
3231
+ # `Environment=` default (its timer, or a human running `systemctl
3232
+ # --user start` by hand — systemd cannot tell those two apart, see the
3233
+ # unit's own "INVOKER" section) or `_fire_pending_roll`'s explicit
3234
+ # `--setenv=` override when the drive-queue tick is the one firing it.
3235
+ # Empty for a bare CLI invocation outside the unit (a test, an
3236
+ # operator's own shell) — nothing set the env var at all.
3237
+ import os as _os # noqa: PLC0415
3238
+
3103
3239
  record = rw.WindowRecord(
3104
- started_at=time.time(), dry_run=dry_run, queue_timer=queue_timer
3240
+ started_at=time.time(), dry_run=dry_run, queue_timer=queue_timer,
3241
+ invoked_by=_os.environ.get("COORD_ROLL_INVOKER", ""),
3105
3242
  )
3106
3243
 
3107
3244
  def _finish(status: str, exit_code: int = 0) -> None:
@@ -3185,6 +3322,11 @@ def release_nightly_window(
3185
3322
  if not rw.needs_roll(record.daemon_version, record.target_version):
3186
3323
  if read_roll_pending() is not None:
3187
3324
  clear_roll_pending()
3325
+ # #2889: the goal is reached without needing the marker at all —
3326
+ # a clean slate, same as a CONFIRMED roll below. Whatever
3327
+ # cumulative frozen time/fresh-arm history the ledger carried is
3328
+ # over; a FUTURE delta starts counting fresh.
3329
+ reset_roll_ledger()
3188
3330
  _finish(rw.STATUS_UP_TO_DATE, 0)
3189
3331
 
3190
3332
  # ── 2b. #2583 min-releases-behind gate ────────────────────────────────
@@ -3296,6 +3438,11 @@ def release_nightly_window(
3296
3438
  rp.STATUS_VERIFIED, rp.STATUS_UP_TO_DATE, rp.STATUS_ROLLED,
3297
3439
  ):
3298
3440
  clear_roll_pending()
3441
+ # #2889: a CONFIRMED roll (or a race that found it already
3442
+ # current) is the clean-slate outcome — reset the ledger so a
3443
+ # FUTURE delta starts counting fresh rather than inheriting
3444
+ # whatever run-up this campaign accumulated on its way here.
3445
+ reset_roll_ledger()
3299
3446
  status = (
3300
3447
  rw.STATUS_UP_TO_DATE if prop_status == rp.STATUS_UP_TO_DATE
3301
3448
  else rw.STATUS_ROLLED
@@ -3381,14 +3528,56 @@ def release_nightly_window(
3381
3528
  )
3382
3529
  )
3383
3530
  else:
3531
+ # #2889: a genuinely FRESH arm — no existing marker for this
3532
+ # campaign at all — is the one case the RATE of markers can run
3533
+ # away. Same three checks `_ensure_roll_pending_marker` applies to
3534
+ # `coord release propagate`'s own arm site (#2096: one function, not
3535
+ # two definitions that could drift) — `_queue_provably_busy` needs
3536
+ # its own board read here since this command does not otherwise
3537
+ # compute a `Quiescence` (unlike `release_propagate`, which already
3538
+ # has one to reuse).
3539
+ arm_now = time.time()
3540
+ ledger = read_roll_ledger()
3541
+ board, board_error = _fetch_board()
3542
+ if board_error:
3543
+ # Cannot prove the queue non-empty either way — the #2889 item 2
3544
+ # check contributes nothing this run; the ledger's own
3545
+ # escalation/rate-limit checks still apply regardless.
3546
+ queue_provably_busy = False
3547
+ else:
3548
+ quiescence = rp.assess_quiescence(
3549
+ queue_entries=board.get("drive_queue") or [],
3550
+ assignments=board.get("assignments") or [],
3551
+ issues=board.get("issues") or [],
3552
+ now=arm_now,
3553
+ )
3554
+ queue_provably_busy = _queue_provably_busy(quiescence, daemon_name)
3555
+ refusal = _fresh_arm_refusal_reason(
3556
+ ledger, now=arm_now, queue_provably_busy=queue_provably_busy,
3557
+ )
3558
+ if refusal:
3559
+ record.error = (
3560
+ f"declined to arm a roll-pending marker for v{record.target_version} "
3561
+ f"— {refusal}"
3562
+ )
3563
+ click.echo(f"note: {record.error}")
3564
+ if ledger.escalated:
3565
+ from coord.commands.drive_queue import _escalate_roll_ledger # noqa: PLC0415
3566
+
3567
+ _escalate_roll_ledger(ledger, now=arm_now)
3568
+ _escalate_window(record, reason=record.error)
3569
+ _finish(rw.STATUS_LEDGER_ESCALATED, 1)
3570
+ _finish(rw.STATUS_ARM_DEFERRED, 0)
3384
3571
  write_roll_pending(
3385
3572
  RollPending(
3386
3573
  target_version=record.target_version,
3387
- set_at=time.time(),
3574
+ set_at=arm_now,
3388
3575
  reason="nightly-window",
3389
3576
  min_releases_behind=effective_min_behind,
3390
3577
  )
3391
3578
  )
3579
+ # Nothing to write to the ledger here — only an EXPIRY moves its
3580
+ # rate-limit clock (`RollLedger.record_expiry`), never an arm.
3392
3581
  click.echo(
3393
3582
  f"roll pending: v{record.target_version} — the drive-queue tick will "
3394
3583
  f"fire `coord release propagate` at the next inter-drive gap "
@@ -173,6 +173,36 @@
173
173
  # since it was added but would NOT have survived a from-scratch rebuild of
174
174
  # this host — the whole reason this is now the packaged default instead of
175
175
  # operator-local state.
176
+ #
177
+ # INVOKER (#2889 item 4) — ANSWERS "WHAT STARTED THIS?", HONESTLY BOUNDED
178
+ # --------------------------------------------------------------------------
179
+ # 2026-08-28's #2889 report found this unit starting ~10 times with BOTH
180
+ # release timers masked, and could rule out every trigger this codebase
181
+ # actually controls (`coord-release-window.timer` masked, the tick's own
182
+ # `_fire_pending_roll` only fires when a marker already exists, the watchdog
183
+ # only restarts `failed` units, no cron entry) without ever identifying the
184
+ # real cause — because `systemd` does not record a `systemctl start`'s
185
+ # CALLING process anywhere this unit (or its journal) can read.
186
+ #
187
+ # `$COORD_ROLL_INVOKER`, read by `coord release nightly-window` itself and
188
+ # journalled as `WindowRecord.invoked_by` (`coord release window-history`),
189
+ # is the closest honest answer available without deeper systemd
190
+ # instrumentation:
191
+ # * `Environment=` below sets the STATIC default, "timer-or-manual" —
192
+ # covers BOTH this unit's own `.timer` firing it AND a human running
193
+ # `systemctl --user start coord-release-window.service` by hand; those
194
+ # two genuinely cannot be told apart from inside the unit.
195
+ # * `coord.commands.drive_queue._fire_pending_roll` (the tick's own
196
+ # trigger — see "TWO TRIGGERS" above) overrides it with
197
+ # `--setenv=COORD_ROLL_INVOKER=drive-queue-tick` on that ONE start
198
+ # request — a transient per-invocation override, layered on top of this
199
+ # unit's static default by systemd itself, never touching this file.
200
+ # A future THIRD trigger (the open question #2889 could not close) will
201
+ # show up as "timer-or-manual" here too, same as a human running it by
202
+ # hand — this narrows the search space (it did NOT come from the tick) but
203
+ # does not, on its own, distinguish the timer from a person. If that
204
+ # distinction becomes necessary, `coord-release-window.timer`'s own unit can
205
+ # set a THIRD value via its own `Environment=`/`--setenv=` the same way.
176
206
 
177
207
  [Unit]
178
208
  Description=Release window: set/fire the #2587 roll-pending marker on the daemon host
@@ -181,6 +211,11 @@ Wants=network-online.target
181
211
 
182
212
  [Service]
183
213
  Type=oneshot
214
+ # #2889 item 4: the static default this run's `$COORD_ROLL_INVOKER` reads
215
+ # back as `WindowRecord.invoked_by` unless `_fire_pending_roll`'s own
216
+ # `--setenv=` overrides it for that one invocation — see the "INVOKER"
217
+ # section above for the full mechanism and its honest limits.
218
+ Environment=COORD_ROLL_INVOKER=timer-or-manual
184
219
  # No --force, ever (trap 1) — coord/commands/release.py's
185
220
  # release_nightly_window never passes it to the `coord release propagate`
186
221
  # it shells out to when firing an already-pending marker. A fleet that is