code-coordinator 0.5.500__tar.gz → 0.5.502__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 (901) hide show
  1. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/agent.py +188 -0
  5. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/agent_app.py +38 -36
  6. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notify.py +15 -1
  7. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/reconcile.py +13 -1
  8. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/smoke.py +71 -0
  9. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent.py +237 -0
  10. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_smoke.py +110 -0
  11. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.claude/commands/board.md +0 -0
  12. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.claude/commands/complete-session.md +0 -0
  13. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.claude/commands/coordinator.md +0 -0
  14. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.githooks/_lib.sh +0 -0
  15. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.githooks/post-checkout +0 -0
  16. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.githooks/post-commit +0 -0
  17. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.githooks/post-merge +0 -0
  18. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.github/coord-ci-acceptance.yml +0 -0
  20. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.github/workflows/auto-release.yml +0 -0
  21. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.github/workflows/test.yml +0 -0
  23. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/.gitignore +0 -0
  24. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/CLAUDE.md +0 -0
  25. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/GOAL.md +0 -0
  26. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/LICENSE +0 -0
  27. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/MANIFEST.in +0 -0
  28. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/README.md +0 -0
  29. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/code_coordinator.egg-info/SOURCES.txt +0 -0
  30. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/code_coordinator.egg-info/dependency_links.txt +0 -0
  31. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/code_coordinator.egg-info/entry_points.txt +0 -0
  32. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/code_coordinator.egg-info/requires.txt +0 -0
  33. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/code_coordinator.egg-info/scm_file_list.json +0 -0
  34. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/agent_update.py +0 -0
  40. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/agents/opencode/.gitignore +0 -0
  41. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/agents/opencode/agents/work.md +0 -0
  42. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/agents/opencode/routing.jsonc +0 -0
  43. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/approved_work.py +0 -0
  44. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/audit.py +0 -0
  45. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/auto_loop.py +0 -0
  46. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/backup.py +0 -0
  47. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/block_log.py +0 -0
  48. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/board_schema.py +0 -0
  49. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/board_service.py +0 -0
  50. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/board_wire.py +0 -0
  51. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/brain.py +0 -0
  52. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/branch_model.py +0 -0
  53. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/bug_intake.py +0 -0
  54. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/cargo_cache.py +0 -0
  55. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/ci_fix.py +0 -0
  56. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/ci_gitlab.py +0 -0
  58. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/ci_store.py +0 -0
  59. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/claim.py +0 -0
  60. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/claude_setup_token.py +0 -0
  61. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/client.py +0 -0
  63. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/codegen.py +0 -0
  64. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/backup.py +0 -0
  70. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/codegen.py +0 -0
  72. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/dispatch.py +0 -0
  73. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/dispatch_workers.py +0 -0
  74. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/dr.py +0 -0
  75. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/drive.py +0 -0
  76. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/drive_queue.py +0 -0
  77. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/gate_a.py +0 -0
  78. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/gates.py +0 -0
  79. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/issues.py +0 -0
  80. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/lifecycle.py +0 -0
  81. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/machine.py +0 -0
  82. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/merge.py +0 -0
  83. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/milestone.py +0 -0
  84. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/portal.py +0 -0
  87. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/pr.py +0 -0
  88. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/release.py +0 -0
  89. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/repo.py +0 -0
  90. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/report.py +0 -0
  91. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/review.py +0 -0
  92. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/scorecard.py +0 -0
  93. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/sessions.py +0 -0
  94. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/setup.py +0 -0
  95. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/status.py +0 -0
  96. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/store_migrate.py +0 -0
  97. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/terminal.py +0 -0
  98. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/test_gate.py +0 -0
  99. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/commands/tui.py +0 -0
  100. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/comments.py +0 -0
  101. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/config.py +0 -0
  102. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/config_reload.py +0 -0
  103. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/confirm_test.py +0 -0
  104. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/conflict_fix.py +0 -0
  105. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dao.py +0 -0
  106. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dashboard/__init__.py +0 -0
  107. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dashboard/fixture.py +0 -0
  108. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dashboard/index.html +0 -0
  109. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dashboard/server.py +0 -0
  110. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dashboard/terminal.py +0 -0
  111. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/db.py +0 -0
  112. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dead_end.py +0 -0
  113. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/decomposition_chat.py +0 -0
  114. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/README.md +0 -0
  115. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-agent.service +0 -0
  116. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-backup.service +0 -0
  117. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-backup.timer +0 -0
  118. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-db-backup.service +0 -0
  119. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-db-backup.sh +0 -0
  120. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-db-backup.timer +0 -0
  121. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-dr-verify.service +0 -0
  122. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-dr-verify.timer +0 -0
  123. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-drive-queue.service +0 -0
  124. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-drive-queue.timer +0 -0
  125. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-failure-notify.service +0 -0
  126. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-fleet-watchdog.service +0 -0
  127. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  128. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-notify.service +0 -0
  129. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-notify.timer +0 -0
  130. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-release-propagate.service +0 -0
  131. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-release-propagate.timer +0 -0
  132. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-release-window.service +0 -0
  133. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-release-window.timer +0 -0
  134. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-serve.service +0 -0
  135. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-web-dist-build.service +0 -0
  136. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-web-dist-build.timer +0 -0
  137. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy/coord-web.service +0 -0
  138. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy_manifest.py +0 -0
  139. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deploy_units.py +0 -0
  140. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deprecation_telemetry.py +0 -0
  141. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/deps.py +0 -0
  142. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/diagnose.py +0 -0
  143. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dispatch.py +0 -0
  144. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dispatch_liveness.py +0 -0
  145. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dist_name.py +0 -0
  146. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dr_promote.py +0 -0
  147. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/dr_verify.py +0 -0
  148. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/drive.py +0 -0
  149. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/drive_queue.py +0 -0
  150. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/drive_state.py +0 -0
  151. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/events.py +0 -0
  152. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/failure_class.py +0 -0
  153. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/failure_classifier.py +0 -0
  154. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/filelock.py +0 -0
  155. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/fleet_config_health.py +0 -0
  156. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/forge_availability.py +0 -0
  157. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/freshness.py +0 -0
  158. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/gate_a.py +0 -0
  159. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/gate_b.py +0 -0
  160. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/gate_snapshot.py +0 -0
  161. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/gates.py +0 -0
  162. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/gen_board_fixture.py +0 -0
  163. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/github_ops.py +0 -0
  164. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/github_throttle.py +0 -0
  165. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/goal.py +0 -0
  166. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/graph_health.py +0 -0
  167. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/__init__.py +0 -0
  168. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/aggregate.py +0 -0
  169. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/__init__.py +0 -0
  170. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/_ci_pin.py +0 -0
  171. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/agent_install.py +0 -0
  172. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/cargo_targets.py +0 -0
  173. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/claude_binary.py +0 -0
  174. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/config_drift.py +0 -0
  175. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  176. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/coord_web_ci_pin.py +0 -0
  177. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/deploy_lane_facts.py +0 -0
  178. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/disk.py +0 -0
  179. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/fleet_board.py +0 -0
  180. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  181. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/fleet_phantom.py +0 -0
  182. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/fleet_unit_drift.py +0 -0
  183. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/graph.py +0 -0
  184. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/graphify_cli.py +0 -0
  185. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/index_lock.py +0 -0
  186. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/issues_sync_staleness.py +0 -0
  187. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/plan_usage.py +0 -0
  188. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/pr_churn.py +0 -0
  189. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/release_cordon.py +0 -0
  190. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/repo_state.py +0 -0
  191. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/spawned_coord.py +0 -0
  192. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/stalled_pipeline.py +0 -0
  193. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/timer_active.py +0 -0
  194. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/toolchain.py +0 -0
  195. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/unit_drift.py +0 -0
  196. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/unit_enablement.py +0 -0
  197. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/wedged_drive_queue.py +0 -0
  198. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/checks/worktrees.py +0 -0
  199. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/cli.py +0 -0
  200. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/context.py +0 -0
  201. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/fleet_snapshot.py +0 -0
  202. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/models.py +0 -0
  203. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/pypi.py +0 -0
  204. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/registry.py +0 -0
  205. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/render.py +0 -0
  206. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/health/units.py +0 -0
  207. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/hooks.py +0 -0
  208. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/housekeeping.py +0 -0
  209. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/interactive.py +0 -0
  210. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/invariant_alarms.py +0 -0
  211. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/issue_store.py +0 -0
  212. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/issues_sync_status.py +0 -0
  213. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/liveness_auditor.py +0 -0
  214. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/machine_fault.py +0 -0
  215. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/machine_metrics.py +0 -0
  216. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/machine_onboard.py +0 -0
  217. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/machine_pause.py +0 -0
  218. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/machine_stats.py +0 -0
  219. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/merge_queue.py +0 -0
  220. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/milestone_chat.py +0 -0
  221. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/milestone_dispatch.py +0 -0
  222. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/milestone_gate.py +0 -0
  223. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/milestone_order.py +0 -0
  224. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/mock_author.py +0 -0
  225. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/models.py +0 -0
  226. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/network.py +0 -0
  227. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/new_issue_chat.py +0 -0
  228. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/__init__.py +0 -0
  229. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/baseline.py +0 -0
  230. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/cli.py +0 -0
  231. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/collect.py +0 -0
  232. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/digest.py +0 -0
  233. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/models.py +0 -0
  234. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/predicate.py +0 -0
  235. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/service.py +0 -0
  236. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/store.py +0 -0
  237. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/notifier/transport.py +0 -0
  238. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/openapi.py +0 -0
  239. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/overlap_fence.py +0 -0
  240. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/overlap_predict.py +0 -0
  241. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/parentage.py +0 -0
  242. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/parentage_github.py +0 -0
  243. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/pipeline.py +0 -0
  244. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/plan_parser.py +0 -0
  245. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/plans.py +0 -0
  246. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/platform_paths.py +0 -0
  247. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/portal_bridge.py +0 -0
  248. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/portal_store.py +0 -0
  249. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/portal_sync.py +0 -0
  250. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/pr_body_lint.py +0 -0
  251. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/prereqs.py +0 -0
  252. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/progress.py +0 -0
  253. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/providers/__init__.py +0 -0
  254. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/providers/base.py +0 -0
  255. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/providers/claude.py +0 -0
  256. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/providers/claude_pty.py +0 -0
  257. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/providers/opencode.py +0 -0
  258. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/queue_diagnose.py +0 -0
  259. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/reconcile_tick.py +0 -0
  260. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/refine_chat.py +0 -0
  261. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/release_cordon.py +0 -0
  262. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/release_propagate.py +0 -0
  263. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/release_verify.py +0 -0
  264. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/release_window.py +0 -0
  265. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/repo_dormancy.py +0 -0
  266. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/repo_edit.py +0 -0
  267. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/repo_onboard.py +0 -0
  268. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/reports.py +0 -0
  269. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/rest_schema.py +0 -0
  270. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/restart_cmd.py +0 -0
  271. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/revalidate.py +0 -0
  272. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/review.py +0 -0
  273. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/scorecard.py +0 -0
  274. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/self_health.py +0 -0
  275. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/serve_app.py +0 -0
  276. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  277. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  278. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  279. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  280. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  281. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/portal-followup/SKILL.md +0 -0
  282. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/release-now/SKILL.md +0 -0
  283. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  284. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  285. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/skills/update-issue/SKILL.md +0 -0
  286. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/spend_ceiling.py +0 -0
  287. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/split_work.py +0 -0
  288. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/sql.py +0 -0
  289. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/stage_projection.py +0 -0
  290. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/state.py +0 -0
  291. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/store_migrate.py +0 -0
  292. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/store_parity.py +0 -0
  293. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/templates/deploy-cloudflare.node.yml +0 -0
  294. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/test_author.py +0 -0
  295. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/test_chat.py +0 -0
  296. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/test_orchestrator.py +0 -0
  297. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/test_report.py +0 -0
  298. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/tui_release.py +0 -0
  299. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/uat_checks.py +0 -0
  300. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/usage.py +0 -0
  301. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/usage_limits.py +0 -0
  302. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/usage_rollup.py +0 -0
  303. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coord/worker_events.py +0 -0
  304. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/coordinator.example.yml +0 -0
  305. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-agent.service +0 -0
  306. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-backup.service +0 -0
  307. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-backup.timer +0 -0
  308. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-db-backup.service +0 -0
  309. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-db-backup.sh +0 -0
  310. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-db-backup.timer +0 -0
  311. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-dr-verify.service +0 -0
  312. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-dr-verify.timer +0 -0
  313. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-drive-queue.service +0 -0
  314. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-drive-queue.timer +0 -0
  315. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-failure-notify.service +0 -0
  316. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-failure-notify.sh +0 -0
  317. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-fleet-watchdog.service +0 -0
  318. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-fleet-watchdog.timer +0 -0
  319. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-notify.service +0 -0
  320. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-notify.timer +0 -0
  321. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-release-propagate.service +0 -0
  322. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-release-propagate.timer +0 -0
  323. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-release-window.service +0 -0
  324. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-release-window.timer +0 -0
  325. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-serve.service +0 -0
  326. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-web-dist-build.service +0 -0
  327. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-web-dist-build.sh +0 -0
  328. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-web-dist-build.timer +0 -0
  329. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-web-rollback.sh +0 -0
  330. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/coord-web.service +0 -0
  331. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/deploy/node-shim.sh +0 -0
  332. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/ADR_COORD_TUI_CI.md +0 -0
  333. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  334. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/ADR_COORD_WEB_CI.md +0 -0
  335. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/ADR_COORD_WEB_DIST.md +0 -0
  336. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  337. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/AGENT_OPERATIONS.md +0 -0
  338. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/ARCHITECTURE.md +0 -0
  339. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/ARCH_SECURITY_GATES.md +0 -0
  340. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/COCKPIT.md +0 -0
  341. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/CONTROL_CENTER.md +0 -0
  342. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/COST_DISCIPLINE.md +0 -0
  343. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/CROSS_PLATFORM.md +0 -0
  344. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/CUSTOMER_FACING_APPS.md +0 -0
  345. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/CUSTOMER_PORTAL.md +0 -0
  346. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/DATA_STORE_SELECTION.md +0 -0
  347. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/DISASTER_RECOVERY.md +0 -0
  348. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/DRIVE_QUEUE.md +0 -0
  349. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/EPHEMERAL_WORKERS.md +0 -0
  350. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/FORGE_MIGRATION.md +0 -0
  351. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/GRAPHIFY_SETUP.md +0 -0
  352. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/ISSUE_GUIDANCE.md +0 -0
  353. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/MAC_MINI.md +0 -0
  354. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  355. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/NOTIFIER.md +0 -0
  356. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/OPENCODE_VERIFICATION.md +0 -0
  357. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/OPERATING_GOTCHAS.md +0 -0
  358. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/OPERATOR_GUIDES.md +0 -0
  359. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/ORACLE_LOOP.md +0 -0
  360. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/PHONE_WEBAPP.md +0 -0
  361. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/PIPELINE_V2.md +0 -0
  362. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/PLATFORM_EVOLUTION.md +0 -0
  363. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/SECOND_BACKEND.md +0 -0
  364. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/STORE_SERVICE.md +0 -0
  365. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  366. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/WEB_CONTROL_CENTER.md +0 -0
  367. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/WSL_WINDOWS_WORKER.md +0 -0
  368. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/mocks/web/README.md +0 -0
  369. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/mocks/web/_tokens.css +0 -0
  370. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/mocks/web/issue-detail.html +0 -0
  371. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/mocks/web/pipeline-narrow.html +0 -0
  372. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/docs/mocks/web/pipeline-wide.html +0 -0
  373. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/graphify-out/.gitignore +0 -0
  374. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/install-agent.sh +0 -0
  375. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/pyproject.toml +0 -0
  376. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/audit_review_verdict_overrides.py +0 -0
  377. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  378. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/build-worker-image.sh +0 -0
  379. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/coordinator-machine.py +0 -0
  380. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/dr-down.sh +0 -0
  381. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/dr-up.sh +0 -0
  382. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/epic-down.sh +0 -0
  383. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/epic-up.sh +0 -0
  384. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/preflight.sh +0 -0
  385. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/provision-server.sh +0 -0
  386. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/provision-worker.sh +0 -0
  387. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  388. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  389. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/throwaway-vm.sh +0 -0
  390. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/azure-workers/verify-github-token.sh +0 -0
  391. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/check_gh_argv_containment.py +0 -0
  392. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/codegen.py +0 -0
  393. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/coord-test-runner.sh +0 -0
  394. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  395. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  396. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  397. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  398. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/coord-venv-rollback.sh +0 -0
  399. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/drive-batch.sh +0 -0
  400. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/extract-coord-tui.sh +0 -0
  401. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/fleet_watchdog.py +0 -0
  402. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/gen_board_fixture.py +0 -0
  403. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/gen_mock_index.py +0 -0
  404. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/lib/provision-core.sh +0 -0
  405. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/next_release_tag.py +0 -0
  406. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/provision-machine.sh +0 -0
  407. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/run_tests_in_populated_home.sh +0 -0
  408. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/run_tests_without_gh.sh +0 -0
  409. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/setup-macmini.sh +0 -0
  410. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/smoke_437_interactive.py +0 -0
  411. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/verify-provision-noble.sh +0 -0
  412. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/verify_878_review_capture.py +0 -0
  413. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/verify_release_published.py +0 -0
  414. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/scripts/verify_release_wheel.py +0 -0
  415. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/setup.cfg +0 -0
  416. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/SMOKE_SET.md +0 -0
  417. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/__init__.py +0 -0
  418. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-37/conftest.py +0 -0
  419. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-37/contract.md +0 -0
  420. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-37/manifest.yml +0 -0
  421. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  422. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  423. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-51/contract.md +0 -0
  424. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  425. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  426. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-51/manifest.yml +0 -0
  427. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  428. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-51/tsconfig.json +0 -0
  429. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  430. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/backends.py +0 -0
  431. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/conftest.py +0 -0
  432. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/board-pipeline-basic.json +0 -0
  433. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  434. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  435. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  436. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  437. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/playwright/all_pass.json +0 -0
  438. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  439. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/playwright/mixed_fail.json +0 -0
  440. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  441. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  442. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/playwright/skip.json +0 -0
  443. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/playwright/truncated.json +0 -0
  444. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  445. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  446. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  447. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  448. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  449. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  450. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  451. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  452. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_acceptance.py +0 -0
  453. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_acceptance_drivers.py +0 -0
  454. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_api_error.py +0 -0
  455. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_app.py +0 -0
  456. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_branch_base.py +0 -0
  457. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_branch_capture.py +0 -0
  458. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_config_free_1712.py +0 -0
  459. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_deploy_units_endpoint.py +0 -0
  460. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_dirty_worktree.py +0 -0
  461. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  462. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_graph_self_heal.py +0 -0
  463. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_health_h3.py +0 -0
  464. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_idle_restart.py +0 -0
  465. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_push_failure.py +0 -0
  466. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_reap.py +0 -0
  467. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_repos_and_pull.py +0 -0
  468. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_restart_services_endpoint.py +0 -0
  469. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_skills_self_heal.py +0 -0
  470. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_startup_diagnostics.py +0 -0
  471. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_update.py +0 -0
  472. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_update_bluegreen.py +0 -0
  473. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_usage_limit.py +0 -0
  474. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_agent_zero_commit.py +0 -0
  475. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_ambient_home_isolation.py +0 -0
  476. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_approve_capability_reroute_3241.py +0 -0
  477. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_approve_dependency_busy_2804.py +0 -0
  478. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_approve_reject_plan.py +0 -0
  479. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_approve_usage_gate.py +0 -0
  480. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_approved_work_2532.py +0 -0
  481. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_approved_work_2996.py +0 -0
  482. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_assignment_already_recorded_daemon.py +0 -0
  483. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_audit_log.py +0 -0
  484. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_audit_outcome.py +0 -0
  485. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_audit_query.py +0 -0
  486. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_auto_loop.py +0 -0
  487. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_auto_release_publish_2035.py +0 -0
  488. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_backend_selection.py +0 -0
  489. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_backup.py +0 -0
  490. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_base_checkout_restore.py +0 -0
  491. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_block_log.py +0 -0
  492. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_board_cap_762.py +0 -0
  493. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_board_fixture.py +0 -0
  494. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_board_read_path.py +0 -0
  495. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_board_schema.py +0 -0
  496. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_board_service.py +0 -0
  497. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_board_state.py +0 -0
  498. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_board_wire.py +0 -0
  499. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_brain.py +0 -0
  500. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_branch_model.py +0 -0
  501. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_bug_intake.py +0 -0
  502. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_build_worker_image_env_update.py +0 -0
  503. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cargo_cache.py +0 -0
  504. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_check_gh_argv_containment.py +0 -0
  505. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_ci_acceptance_gate_1950.py +0 -0
  506. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_ci_fix.py +0 -0
  507. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_ci_github.py +0 -0
  508. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_ci_gitlab.py +0 -0
  509. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_ci_parity_2091.py +0 -0
  510. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_ci_store.py +0 -0
  511. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_claim.py +0 -0
  512. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_claude_md_budget.py +0 -0
  513. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_claude_setup_token.py +0 -0
  514. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_acceptance.py +0 -0
  515. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_assign.py +0 -0
  516. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  517. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_assign_interactive_remote.py +0 -0
  518. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_assign_provider.py +0 -0
  519. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  520. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_audit.py +0 -0
  521. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_chat_continue.py +0 -0
  522. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_codegen.py +0 -0
  523. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_decide.py +0 -0
  524. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_diagnose_capability_rules.py +0 -0
  525. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_diagnose_config_provenance.py +0 -0
  526. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_diagnose_forge_availability.py +0 -0
  527. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_diagnose_graph.py +0 -0
  528. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_diagnose_self.py +0 -0
  529. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_diagnose_test_coverage.py +0 -0
  530. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_doctor.py +0 -0
  531. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_doctor_config_free_1801.py +0 -0
  532. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  533. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  534. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_drive.py +0 -0
  535. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_drive_queue.py +0 -0
  536. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_escalate.py +0 -0
  537. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_fix_headless_review.py +0 -0
  538. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_gate_a.py +0 -0
  539. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_install_drift.py +0 -0
  540. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_install_skills.py +0 -0
  541. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_issue_comment.py +0 -0
  542. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_issue_create_label.py +0 -0
  543. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_issue_reopen.py +0 -0
  544. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_issue_view_list.py +0 -0
  545. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_merge.py +0 -0
  546. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_milestone_assign.py +0 -0
  547. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_milestone_capture.py +0 -0
  548. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_milestone_chat_add_child.py +0 -0
  549. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_milestone_dispatch.py +0 -0
  550. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_milestone_gate_b.py +0 -0
  551. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_milestone_gate_c.py +0 -0
  552. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_milestone_order.py +0 -0
  553. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  554. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_milestone_ship.py +0 -0
  555. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_network.py +0 -0
  556. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_new_issue_chat.py +0 -0
  557. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_plans.py +0 -0
  558. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_portal.py +0 -0
  559. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_pr.py +0 -0
  560. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_pull_artifact.py +0 -0
  561. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_queue.py +0 -0
  562. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_reattach_sessions.py +0 -0
  563. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_refine_board.py +0 -0
  564. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_release_preflight.py +0 -0
  565. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_release_propagate.py +0 -0
  566. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_release_window.py +0 -0
  567. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_repo_2220.py +0 -0
  568. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  569. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_scorecard.py +0 -0
  570. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_serve_store_backend_3084.py +0 -0
  571. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_set_review_findings.py +0 -0
  572. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_advisory_terminal.py +0 -0
  573. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_contested_tag.py +0 -0
  574. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_invariant_alarms.py +0 -0
  575. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_machine_fault.py +0 -0
  576. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_merge_queue.py +0 -0
  577. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_provider.py +0 -0
  578. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_retried_3340.py +0 -0
  579. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_review_finalizing.py +0 -0
  580. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_supervisor_3366.py +0 -0
  581. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_test_failed_tag.py +0 -0
  582. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_status_usage_limit.py +0 -0
  583. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_sync_comments_873.py +0 -0
  584. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_test_plan.py +0 -0
  585. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_track.py +0 -0
  586. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_tui_update.py +0 -0
  587. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cli_wait.py +0 -0
  588. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_client.py +0 -0
  589. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_client_base_install.py +0 -0
  590. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_client_config_cache_atomic_3052.py +0 -0
  591. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_client_resource_migration_1946.py +0 -0
  592. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_commands_common.py +0 -0
  593. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_comments.py +0 -0
  594. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_completion_summary.py +0 -0
  595. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_config.py +0 -0
  596. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_config_acceptance.py +0 -0
  597. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_config_audit.py +0 -0
  598. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_config_drift_check.py +0 -0
  599. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_config_pricing.py +0 -0
  600. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  601. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_config_usage_gate.py +0 -0
  602. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_confirm_test.py +0 -0
  603. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_conflict_fix.py +0 -0
  604. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_conflict_fix_semantic.py +0 -0
  605. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  606. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coord_test.py +0 -0
  607. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  608. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coord_test_runner_baseline.py +0 -0
  609. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coord_test_runner_populated_home.py +0 -0
  610. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coord_test_runner_routing.py +0 -0
  611. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coord_test_runner_toolchain.py +0 -0
  612. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coord_uat.py +0 -0
  613. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coord_web_sse_restart_live.py +0 -0
  614. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_coordinator_machine.py +0 -0
  615. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_cross_platform_imports.py +0 -0
  616. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dao.py +0 -0
  617. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dashboard.py +0 -0
  618. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dashboard_api.py +0 -0
  619. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dashboard_fixture.py +0 -0
  620. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dashboard_server.py +0 -0
  621. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dashboard_terminal.py +0 -0
  622. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dashboard_terminal_live.py +0 -0
  623. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_db.py +0 -0
  624. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dead_end.py +0 -0
  625. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_decomposition_chat.py +0 -0
  626. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_coord_db_backup.py +0 -0
  627. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_coord_web_dist.py +0 -0
  628. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_coord_web_rollback.py +0 -0
  629. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_db_backup_unit.py +0 -0
  630. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_drive_queue_unit.py +0 -0
  631. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_failure_notify_unit.py +0 -0
  632. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_manifest.py +0 -0
  633. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_notify_unit.py +0 -0
  634. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_units_lane.py +0 -0
  635. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deploy_web_unit.py +0 -0
  636. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deprecation_telemetry.py +0 -0
  637. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_deps.py +0 -0
  638. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_diagnose.py +0 -0
  639. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dispatch.py +0 -0
  640. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dispatch_liveness.py +0 -0
  641. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dispatch_target_validation.py +0 -0
  642. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dispatch_workers.py +0 -0
  643. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dist_name.py +0 -0
  644. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_done_housekeeping.py +0 -0
  645. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dr_azure_scripts.py +0 -0
  646. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dr_promote.py +0 -0
  647. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_dr_verify.py +0 -0
  648. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive.py +0 -0
  649. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_machine_fault.py +0 -0
  650. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_queue.py +0 -0
  651. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_queue_blocked_rendering.py +0 -0
  652. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_queue_launch_argv.py +0 -0
  653. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_queue_max_parallel_config.py +0 -0
  654. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  655. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_queue_roll_pending.py +0 -0
  656. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  657. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_state.py +0 -0
  658. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_drive_tmux.py +0 -0
  659. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_epic_up_capability_detection.py +0 -0
  660. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  661. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_epic_up_image_provenance.py +0 -0
  662. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_errors.py +0 -0
  663. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_events.py +0 -0
  664. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_failure_class.py +0 -0
  665. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_failure_classifier.py +0 -0
  666. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_filelock.py +0 -0
  667. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  668. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_fix_escalation_classifier.py +0 -0
  669. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_fix_of_force_override.py +0 -0
  670. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_fleet_config_health.py +0 -0
  671. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_fleet_health_probes.py +0 -0
  672. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_fleet_health_snapshot.py +0 -0
  673. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_fleet_watchdog.py +0 -0
  674. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_forge_availability.py +0 -0
  675. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_freshness.py +0 -0
  676. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_gate_a.py +0 -0
  677. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_gate_b.py +0 -0
  678. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_gate_snapshot_staleness.py +0 -0
  679. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_gates.py +0 -0
  680. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  681. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_gen_mock_index.py +0 -0
  682. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_generated_rust_fixture.py +0 -0
  683. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_generated_rust_requests.py +0 -0
  684. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_generated_types_fixture.py +0 -0
  685. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_github_ops.py +0 -0
  686. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_github_throttle.py +0 -0
  687. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_goal.py +0 -0
  688. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_graph_health.py +0 -0
  689. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_graph_selfheal_absent_2237.py +0 -0
  690. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_handoff.py +0 -0
  691. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_checks.py +0 -0
  692. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_cli.py +0 -0
  693. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_cli_graph.py +0 -0
  694. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_config.py +0 -0
  695. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_context.py +0 -0
  696. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_coord_tui_ci_pin.py +0 -0
  697. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_coord_web_ci_pin.py +0 -0
  698. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_deploy_lane_facts.py +0 -0
  699. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_fix.py +0 -0
  700. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_incident_regression.py +0 -0
  701. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_issues_sync_staleness.py +0 -0
  702. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_pr_churn.py +0 -0
  703. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_pypi.py +0 -0
  704. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_registry.py +0 -0
  705. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_release_cordon_probe.py +0 -0
  706. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_timer_active.py +0 -0
  707. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_toolchain.py +0 -0
  708. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_unit_drift.py +0 -0
  709. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_unit_enablement.py +0 -0
  710. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_health_wedged_drive_queue.py +0 -0
  711. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_hooks.py +0 -0
  712. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_housekeeping.py +0 -0
  713. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_human_attended_437.py +0 -0
  714. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_init.py +0 -0
  715. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_install_agent_venv_2911.py +0 -0
  716. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_integration.py +0 -0
  717. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_interactive_briefing_echo.py +0 -0
  718. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_interactive_pane_log_2541.py +0 -0
  719. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_interactive_prefill_state.py +0 -0
  720. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_interactive_session_relaunch.py +0 -0
  721. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_interactive_test_verdict_backstop.py +0 -0
  722. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_interactive_token_attribution.py +0 -0
  723. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_interactive_worktree.py +0 -0
  724. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_invariant_alarms.py +0 -0
  725. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_issue_store_seam.py +0 -0
  726. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_issues_sync_status.py +0 -0
  727. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_liveness_auditor.py +0 -0
  728. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_liveness_notify.py +0 -0
  729. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_lock_contention_ratchet.py +0 -0
  730. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_machine_fault.py +0 -0
  731. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_machine_metrics.py +0 -0
  732. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_machine_onboard.py +0 -0
  733. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_machine_pause.py +0 -0
  734. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_machine_stats.py +0 -0
  735. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_merge_queue.py +0 -0
  736. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_merge_verify.py +0 -0
  737. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_milestone_chat.py +0 -0
  738. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_milestone_dispatch.py +0 -0
  739. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_milestone_gate.py +0 -0
  740. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_milestone_order.py +0 -0
  741. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_milestone_seam.py +0 -0
  742. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_mock_author.py +0 -0
  743. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_model_tiering.py +0 -0
  744. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_models.py +0 -0
  745. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_models_config_labels.py +0 -0
  746. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_needs_attention.py +0 -0
  747. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_network.py +0 -0
  748. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_new_issue_chat.py +0 -0
  749. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_next_release_tag.py +0 -0
  750. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_node_shim.py +0 -0
  751. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notifier_baseline.py +0 -0
  752. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notifier_cli.py +0 -0
  753. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notifier_collect.py +0 -0
  754. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notifier_config.py +0 -0
  755. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notifier_drive_seam.py +0 -0
  756. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notifier_isolation.py +0 -0
  757. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notifier_predicate.py +0 -0
  758. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notifier_quiet_hours.py +0 -0
  759. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notifier_service.py +0 -0
  760. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notify.py +0 -0
  761. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_notify_drain.py +0 -0
  762. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_openapi.py +0 -0
  763. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_operational_defaults.py +0 -0
  764. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_overlap_fence.py +0 -0
  765. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_overlap_predict.py +0 -0
  766. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_packaged_deploy_units.py +0 -0
  767. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_parentage.py +0 -0
  768. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_paste_landed.py +0 -0
  769. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  770. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_pipeline.py +0 -0
  771. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_plan_followup_approve_plan_command.py +0 -0
  772. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_plan_followup_pr_command.py +0 -0
  773. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_plan_followup_review_command.py +0 -0
  774. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_plan_only.py +0 -0
  775. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_plan_parser.py +0 -0
  776. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_platform_paths.py +0 -0
  777. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_portal_bridge.py +0 -0
  778. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_portal_config.py +0 -0
  779. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_portal_store.py +0 -0
  780. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_portal_sync.py +0 -0
  781. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_pr_body_lint.py +0 -0
  782. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_prereqs.py +0 -0
  783. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_production_db_guard.py +0 -0
  784. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_progress.py +0 -0
  785. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_provider_seam.py +0 -0
  786. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_providers.py +0 -0
  787. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_providers_config_labels.py +0 -0
  788. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_providers_pty.py +0 -0
  789. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_provision_core.py +0 -0
  790. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_provision_machine.py +0 -0
  791. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_py_rust_mirror_inventory.py +0 -0
  792. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_quiet_hours.py +0 -0
  793. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_quiet_hours_store_2146.py +0 -0
  794. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reap_merged_sessions.py +0 -0
  795. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reap_stale_interactive_tick.py +0 -0
  796. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reconcile.py +0 -0
  797. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reconcile_branch.py +0 -0
  798. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reconcile_completions.py +0 -0
  799. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  800. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reconcile_merges.py +0 -0
  801. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reconcile_no_agent_record.py +0 -0
  802. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reconcile_tick.py +0 -0
  803. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reconcile_usage_limit_done.py +0 -0
  804. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_refine_chat.py +0 -0
  805. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_cordon_2101.py +0 -0
  806. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  807. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_cordon_deadlock_2240.py +0 -0
  808. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  809. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_cordon_stuck_2490.py +0 -0
  810. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_propagate.py +0 -0
  811. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_propagate_threshold.py +0 -0
  812. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_roll_between_legs_2854.py +0 -0
  813. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_roll_window_handoff.py +0 -0
  814. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_unified_1242.py +0 -0
  815. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_verify.py +0 -0
  816. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_release_window.py +0 -0
  817. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_remote_auto_prune.py +0 -0
  818. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_remote_interactive_reaper.py +0 -0
  819. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_repo_add.py +0 -0
  820. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_repo_dormancy.py +0 -0
  821. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_repo_edit_2220.py +0 -0
  822. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_repo_graph_fleet_2237.py +0 -0
  823. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_repo_onboard_2220.py +0 -0
  824. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_report_result_push.py +0 -0
  825. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_reports.py +0 -0
  826. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_restart_cmd.py +0 -0
  827. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_retry.py +0 -0
  828. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_retry_advisory_1606.py +0 -0
  829. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_retry_escalation_classify_3360.py +0 -0
  830. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_retry_type_1636.py +0 -0
  831. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_revalidate.py +0 -0
  832. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_review.py +0 -0
  833. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_review_end_review_without_verdict.py +0 -0
  834. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_review_parse_failure_diagnostic.py +0 -0
  835. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_review_reaffirm.py +0 -0
  836. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_review_state.py +0 -0
  837. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_review_verdict_backstop.py +0 -0
  838. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_review_verdict_override_audit.py +0 -0
  839. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_review_verdict_relay.py +0 -0
  840. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_review_zero_commits.py +0 -0
  841. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_scoped_review_wiring.py +0 -0
  842. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_scorecard.py +0 -0
  843. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_self_health.py +0 -0
  844. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_serve.py +0 -0
  845. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_serve_app.py +0 -0
  846. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_serve_app_board_trim.py +0 -0
  847. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_serve_rest_routes.py +0 -0
  848. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_session.py +0 -0
  849. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_slice_issue_attribution.py +0 -0
  850. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  851. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_smoke_live_checkout_restore.py +0 -0
  852. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_smoke_workflow.py +0 -0
  853. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_spend_ceiling.py +0 -0
  854. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_spend_ceiling_coordinator.py +0 -0
  855. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_split.py +0 -0
  856. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_split_work.py +0 -0
  857. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_sql_dialect.py +0 -0
  858. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_sqlite_connect_ratchet.py +0 -0
  859. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_stage_projection.py +0 -0
  860. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_stale_busy_reviewer_697.py +0 -0
  861. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_stalled_pipeline.py +0 -0
  862. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_state.py +0 -0
  863. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_state_review_findings_daemon.py +0 -0
  864. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_status_fleet_footer.py +0 -0
  865. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_stop_1567.py +0 -0
  866. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_store_contract.py +0 -0
  867. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_store_migrate.py +0 -0
  868. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_stuck.py +0 -0
  869. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  870. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_terminal_command.py +0 -0
  871. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_test_author.py +0 -0
  872. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_test_chat.py +0 -0
  873. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_test_orchestrator.py +0 -0
  874. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_test_report.py +0 -0
  875. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_test_verdict_parsing.py +0 -0
  876. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_test_verdict_transcript_floor.py +0 -0
  877. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_text_io_encoding_audit.py +0 -0
  878. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_thin_client_board_audit.py +0 -0
  879. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_thin_client_config_load_1080.py +0 -0
  880. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_thin_client_daemon_routing_906.py +0 -0
  881. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_throwaway_vm.py +0 -0
  882. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_tmux_host.py +0 -0
  883. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_tmux_session.py +0 -0
  884. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_transcript_floor.py +0 -0
  885. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_uat_checks.py +0 -0
  886. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_usage.py +0 -0
  887. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_usage_limits.py +0 -0
  888. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_usage_rollup.py +0 -0
  889. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_venv_live_install_2121.py +0 -0
  890. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_version_single_source.py +0 -0
  891. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_watch.py +0 -0
  892. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  893. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_worker_env_venv_isolation.py +0 -0
  894. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_worker_events.py +0 -0
  895. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_worker_image_pin_sync.py +0 -0
  896. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_worker_safety.py +0 -0
  897. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_worker_test_scoping.py +0 -0
  898. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_worktree.py +0 -0
  899. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  900. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/test_write_parity.py +0 -0
  901. {code_coordinator-0.5.500 → code_coordinator-0.5.502}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.500
3
+ Version: 0.5.502
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.500
3
+ Version: 0.5.502
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.500",
2
+ "tag": "0.5.502",
3
3
  "distance": 0,
4
- "node": "gd2476088b8684b908e08f1fbde1d3d82d3f02271",
4
+ "node": "g1215b2a207119f23b06fb38bbb2e77c613c7062e",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-19"
@@ -450,6 +450,45 @@ HOST_SLEEP_EXIT = 127
450
450
  # #2638.
451
451
  _DEFAULT_RUNTIME_CEILING_S = 6.0 * 60.0 * 60.0 # 6 hours
452
452
 
453
+ # #3363: safety margin added on top of the resolved runtime ceiling before
454
+ # `AgentServer._phantom_age_ceiling_s` treats a PENDING/RUNNING record's
455
+ # timestamp as stale enough to investigate. Kept as its own constant so the
456
+ # margin itself doesn't have to be re-derived at both the class-default and
457
+ # per-instance/per-assignment call sites.
458
+ _PHANTOM_AGE_MARGIN_S = 60.0 * 60.0 # 1 hour
459
+
460
+ # #3363: DEFAULT max age a PENDING/RUNNING assignment record is trusted at
461
+ # face value before it is even a *candidate* for phantom finalization —
462
+ # i.e. the floor `AgentServer._phantom_age_ceiling_s` applies when neither
463
+ # this agent's own configured `runtime_ceiling_s` nor the assignment's own
464
+ # `spec.runtime_ceiling_s` raises it further. Nothing but a process restart
465
+ # ever clears `_assignments` — so an entry that never reaches a terminal
466
+ # status (worker killed out from under it, dispatch crashed between insert
467
+ # and spawn, a stop that didn't write back) stays "active" forever, which
468
+ # is exactly what makes it dangerous: every restart path (`/update`,
469
+ # `/rollback`, the #2139 idle watcher) refuses to act while ANY assignment
470
+ # looks active, so a single phantom permanently blocks the one thing — a
471
+ # restart — that would clear it.
472
+ #
473
+ # #3363 review: this constant alone is NOT the last word on whether a
474
+ # record is a phantom, for two reasons `_phantom_age_ceiling_s` and
475
+ # `AgentServer._active_assignment_ids` handle explicitly:
476
+ # 1. An operator can legitimately raise or disable the runtime ceiling
477
+ # per agent (`self.runtime_ceiling_s`) or per leg
478
+ # (`AssignmentSpec.runtime_ceiling_s`) — both documented, supported
479
+ # overrides (`coord/config.py:252-263`). A hardcoded module constant
480
+ # here would silently override that choice and finalize a real,
481
+ # healthy, still-running leg. `_phantom_age_ceiling_s` resolves the
482
+ # actual per-assignment ceiling instead of trusting this default
483
+ # unconditionally.
484
+ # 2. Age is unconfirmed death, never proof of it. `_active_assignment_ids`
485
+ # only finalizes a record whose process is CONFIRMED not alive
486
+ # (`self._processes.get(aid)` is missing or `proc.poll() is not None`)
487
+ # — a record whose process is still alive is left alone regardless of
488
+ # how stale its timestamp looks, exactly the ground-truth check
489
+ # `cancel()`/`_reap` already use elsewhere in this class.
490
+ _PHANTOM_ASSIGNMENT_MAX_AGE_S = _DEFAULT_RUNTIME_CEILING_S + _PHANTOM_AGE_MARGIN_S # 7 hours
491
+
453
492
  # Minimum wall-vs-monotonic divergence measured over a SINGLE poll interval
454
493
  # that is unambiguously a host suspend rather than ordinary thread-scheduling
455
494
  # jitter, a GC pause, or a loaded box briefly starving this thread. Comfortably
@@ -3402,6 +3441,15 @@ class AgentAssignment:
3402
3441
  spec: AssignmentSpec
3403
3442
  status: str = PENDING
3404
3443
  pid: int | None = None
3444
+ # #3363: stamped once, at construction, so a PENDING assignment (no
3445
+ # `started_at` yet — that's only set once it reaches RUNNING) still has
3446
+ # an age `active_assignment_count()`'s phantom check can measure.
3447
+ # Reloaded PENDING/RUNNING entries from a persisted state file never
3448
+ # keep this value in practice: `_load_state` already force-fails any
3449
+ # PENDING/RUNNING record it finds (the owning subprocess is provably
3450
+ # gone across a restart), so a missing/stale `created_at` on an old
3451
+ # state file is harmless.
3452
+ created_at: float = field(default_factory=time.time)
3405
3453
  started_at: float | None = None
3406
3454
  finished_at: float | None = None
3407
3455
  exit_code: int | None = None
@@ -7356,6 +7404,146 @@ class AgentServer:
7356
7404
  cargo_cache.write_gc_status(self.state_dir, result)
7357
7405
  return result
7358
7406
 
7407
+ def active_assignment_count(self, *, now: float | None = None) -> int:
7408
+ """How many assignments are genuinely still in flight right now.
7409
+
7410
+ #3363: the ONE predicate every "is this host busy" surface must
7411
+ call. Before this, `_idle_restart_target`, `/update`'s post-swap
7412
+ busy check, and `/rollback`'s busy check (all in
7413
+ `coord/agent_app.py`) each independently re-derived
7414
+ ``status in (PENDING, RUNNING)`` straight off ``self._assignments``
7415
+ — three copies of the same question, agreeing right up until one of
7416
+ them needed to disagree. A PENDING/RUNNING entry that never reaches
7417
+ a terminal status (worker killed out from under it, a dispatch that
7418
+ crashed between insert and spawn, a stop that didn't write back) is
7419
+ "active" by that raw predicate forever, since nothing but a process
7420
+ restart clears ``_assignments`` — and every restart path above
7421
+ refuses to act while count > 0, so the phantom permanently blocks
7422
+ the one thing that would clear it (see #3363's six-day macmini
7423
+ deadlock).
7424
+
7425
+ Delegates the actual scan (and phantom finalization) to
7426
+ :meth:`_active_assignment_ids`.
7427
+ """
7428
+ return len(self._active_assignment_ids(now=now))
7429
+
7430
+ def _phantom_age_ceiling_s(self, assignment: AgentAssignment) -> float:
7431
+ """Resolve the phantom-age ceiling for *this specific* assignment.
7432
+
7433
+ #3363 review: the ceiling used to be the hardcoded module constant
7434
+ ``_PHANTOM_ASSIGNMENT_MAX_AGE_S``, sized only off the compile-time
7435
+ ``_DEFAULT_RUNTIME_CEILING_S``. That ignored an operator who
7436
+ legitimately raised (or disabled) the runtime ceiling — either
7437
+ fleet-wide (``self.runtime_ceiling_s``) or for this one leg
7438
+ (``AssignmentSpec.runtime_ceiling_s``), both documented, supported
7439
+ overrides (`coord/config.py:252-263`). Mirrors ``_reap``'s own
7440
+ per-leg resolution (~line 9588): a positive ``spec.runtime_ceiling_s``
7441
+ raises the base above this agent's own configured default, then the
7442
+ result is floored at ``_DEFAULT_RUNTIME_CEILING_S`` and the same
7443
+ margin is added — so a higher configured ceiling only ever pushes
7444
+ this watchdog further OUT, never in.
7445
+
7446
+ This only bounds how stale a record is allowed to look before it
7447
+ even becomes a *candidate* for phantom finalization — a record
7448
+ whose process is confirmed still alive is never finalized by
7449
+ ``_active_assignment_ids`` regardless of this value (see there), so
7450
+ a leg that legitimately disables its own runtime ceiling is still
7451
+ protected even though this method always returns a finite number.
7452
+ """
7453
+ base = self.runtime_ceiling_s or 0.0
7454
+ raw_spec_ceiling = getattr(
7455
+ getattr(assignment, "spec", None), "runtime_ceiling_s", None
7456
+ )
7457
+ if isinstance(raw_spec_ceiling, (int, float)) and raw_spec_ceiling > 0:
7458
+ base = max(base, float(raw_spec_ceiling))
7459
+ return max(base, _DEFAULT_RUNTIME_CEILING_S) + _PHANTOM_AGE_MARGIN_S
7460
+
7461
+ def _active_assignment_ids(self, *, now: float | None = None) -> list[str]:
7462
+ """IDs of assignments still genuinely active, aging out phantoms.
7463
+
7464
+ A PENDING/RUNNING entry older than
7465
+ :meth:`_phantom_age_ceiling_s` (measured from ``started_at`` once
7466
+ RUNNING, ``created_at`` while still PENDING) is a *candidate* for
7467
+ being a leaked bookkeeping record rather than live work — but age
7468
+ alone is never proof of death (#2096: an unconfirmed verdict, in
7469
+ either direction, is a defect). Before finalizing, this consults
7470
+ the same ground truth ``cancel()``/``_reap`` already use elsewhere
7471
+ in this class: ``self._processes.get(aid)``. Only when the process
7472
+ is CONFIRMED not alive (no entry, or ``proc.poll()`` returns a real
7473
+ exit code) is the record excluded from the returned IDs AND
7474
+ finalized in place (flipped to FAILED with an explanatory
7475
+ ``error``, ``finished_at`` stamped) so it stops looking active on
7476
+ every other surface too — `/status`, `coord usage`, the board
7477
+ reconciler — not merely in this count. A stale-looking record whose
7478
+ process is still confirmed alive is left completely alone (still
7479
+ counted active, status untouched) — force-finalizing it here would
7480
+ orphan the real subprocess with no WIP push, since a FAILED record
7481
+ no longer shows up in `/restart`'s `pending_ids` scan that would
7482
+ otherwise `cancel(aid, push_mode="branch")` it gracefully.
7483
+
7484
+ Logged at ERROR so it shows up in the agent's own log, since
7485
+ finalizing a phantom is itself a symptom worth an operator noticing
7486
+ (see #3363 suggested fix item 3 — persistent phantoms should
7487
+ eventually surface in `coord release verify`, not just here).
7488
+ """
7489
+ now = time.time() if now is None else now
7490
+ active: list[str] = []
7491
+ # #3363 review: iterate `.items()` and key off the DICT key, not
7492
+ # `a.id` — a couple of existing tests plant a bare status-only stand-
7493
+ # in object straight into `_assignments` (no `id`/`started_at`/
7494
+ # `created_at` at all) to exercise the busy-veto in isolation.
7495
+ # `getattr(..., None)` below is the same defensiveness applied to
7496
+ # the timestamp reads: a stand-in with no age info reads as age 0
7497
+ # (never a phantom), which preserves every pre-#3363 test's
7498
+ # "PENDING/RUNNING always counts as busy" expectation unchanged.
7499
+ to_finalize: list[tuple[str, AgentAssignment, str, float]] = []
7500
+ with self._lock:
7501
+ for aid, a in self._assignments.items():
7502
+ if a.status not in (PENDING, RUNNING):
7503
+ continue
7504
+ age_ref = (
7505
+ getattr(a, "started_at", None) if a.status == RUNNING
7506
+ else getattr(a, "created_at", None)
7507
+ )
7508
+ age = now - age_ref if age_ref is not None else 0.0
7509
+ if age <= self._phantom_age_ceiling_s(a):
7510
+ active.append(aid)
7511
+ continue
7512
+ # #3363 review: unconfirmed death is the same anti-pattern
7513
+ # (epic #2096) as unconfirmed success — consult the actual
7514
+ # process before declaring this record dead. A live PID
7515
+ # here means real work is still in flight no matter how
7516
+ # stale the bookkeeping timestamp looks, so it stays active
7517
+ # and untouched; the normal `_reap` thread watching that
7518
+ # same process (with its own correctly-resolved runtime
7519
+ # ceiling) remains the one path that ever finalizes it.
7520
+ proc = self._processes.get(aid)
7521
+ if proc is not None and proc.poll() is None:
7522
+ active.append(aid)
7523
+ continue
7524
+ to_finalize.append((aid, a, a.status, age))
7525
+ for _aid, a, _prior_status, age in to_finalize:
7526
+ ceiling = self._phantom_age_ceiling_s(a)
7527
+ a.status = FAILED
7528
+ a.finished_at = now
7529
+ a.error = (
7530
+ f"phantom assignment (#3363): stuck in {_prior_status!r} "
7531
+ f"for {age / 3600.0:.1f}h with no live process behind it, "
7532
+ f"past the {ceiling / 3600.0:.1f}h bookkeeping ceiling "
7533
+ "with no terminal status update — finalized "
7534
+ "automatically so it stops blocking restart"
7535
+ )
7536
+ if to_finalize:
7537
+ for aid, a, prior_status, age in to_finalize:
7538
+ _log.error(
7539
+ "finalizing phantom assignment %s (was %s for %.0fs, "
7540
+ "repo=%s) so it stops blocking restart (#3363)",
7541
+ aid, prior_status, age,
7542
+ getattr(getattr(a, "spec", None), "repo_name", "?"),
7543
+ )
7544
+ self._persist()
7545
+ return active
7546
+
7359
7547
  def list_assignments(self) -> dict:
7360
7548
  from coord.worker_events import is_stream_json, parse_log
7361
7549
 
@@ -593,11 +593,12 @@ def _idle_restart_target(server: "AgentServer", venv_dir: Path) -> Path | None:
593
593
  # or it's already running the slot the symlink points at — no swap
594
594
  # is waiting.
595
595
  return None
596
- with server._lock:
597
- active_count = sum(
598
- 1 for a in server._assignments.values() if a.status in (PENDING, RUNNING)
599
- )
600
- if active_count:
596
+ # #3363: shared predicate — see `AgentServer.active_assignment_count`'s
597
+ # docstring for why this must never be re-derived independently here.
598
+ # It also ages out (and finalizes) any phantom PENDING/RUNNING entry,
599
+ # so a leaked bookkeeping record can no longer keep this watcher —
600
+ # the deferred restart's own advertised fallback — permanently idle.
601
+ if server.active_assignment_count():
601
602
  return None
602
603
  if _host_has_live_interactive_session():
603
604
  # #2139 blocking review fix: an interactive pane is not an
@@ -1538,12 +1539,14 @@ def build_app(
1538
1539
  # started. Re-read fresh: `perform_update` above can take
1539
1540
  # tens of seconds (venv creation, pip, smoke check), so the
1540
1541
  # count at the top of this request is stale by now.
1541
- with server._lock:
1542
- still_active = sum(
1543
- 1
1544
- for a in server._assignments.values()
1545
- if a.status in (PENDING, RUNNING)
1546
- )
1542
+ #
1543
+ # #3363: `active_assignment_count()` is the single shared
1544
+ # predicate (also used by `/rollback` and the idle
1545
+ # watcher's `_idle_restart_target`) — it ages out and
1546
+ # finalizes any phantom PENDING/RUNNING entry instead of
1547
+ # trusting raw status forever, which is what let a single
1548
+ # leaked assignment defer this restart for six days.
1549
+ still_active = server.active_assignment_count()
1547
1550
  if still_active and not force:
1548
1551
  payload["result"] = "staged"
1549
1552
  payload["error"] = (
@@ -1815,12 +1818,9 @@ def build_app(
1815
1818
  body = {}
1816
1819
  force = bool(body.get("force"))
1817
1820
 
1818
- with server._lock:
1819
- active_count = sum(
1820
- 1
1821
- for a in server._assignments.values()
1822
- if a.status in (PENDING, RUNNING)
1823
- )
1821
+ # #3363: shared predicate with `/update` and the idle watcher — see
1822
+ # `AgentServer.active_assignment_count`'s docstring.
1823
+ active_count = server.active_assignment_count()
1824
1824
  if active_count and not force:
1825
1825
  payload = {
1826
1826
  "mode": "rollback",
@@ -1999,34 +1999,36 @@ def build_app(
1999
1999
  cancel_timeout = float(body.get("cancel_timeout", 30))
2000
2000
  saved_argv = list(sys.argv)
2001
2001
 
2002
- with server._lock:
2003
- active_count = sum(
2004
- 1
2005
- for a in server._assignments.values()
2006
- if a.status in (PENDING, RUNNING)
2007
- )
2002
+ # #3363: shared predicate with `/update`/`/rollback`/the idle
2003
+ # watcher — see `AgentServer.active_assignment_count`'s docstring.
2004
+ # A side benefit here specifically: a phantom entry gets finalized
2005
+ # (flipped to FAILED) the first time this is called, so it no
2006
+ # longer shows up in `pending_ids` below either — this restart
2007
+ # stops trying to `cancel()` a record with no real process behind
2008
+ # it.
2009
+ active_count = server.active_assignment_count()
2008
2010
 
2009
2011
  def _do_restart() -> None:
2010
2012
  # Wait for workers to drain.
2011
2013
  deadline = time.time() + cancel_timeout
2012
2014
  while time.time() < deadline:
2013
- with server._lock:
2014
- still_active = sum(
2015
- 1
2016
- for a in server._assignments.values()
2017
- if a.status in (PENDING, RUNNING)
2018
- )
2015
+ still_active = server.active_assignment_count()
2019
2016
  if still_active == 0:
2020
2017
  break
2021
2018
  time.sleep(1)
2022
2019
 
2023
- # Cancel any workers that are still running.
2024
- with server._lock:
2025
- pending_ids = [
2026
- aid
2027
- for aid, a in server._assignments.items()
2028
- if a.status in (PENDING, RUNNING)
2029
- ]
2020
+ # Cancel any workers that are still running. #3363 review: reuse
2021
+ # the shared predicate rather than re-deriving PENDING/RUNNING
2022
+ # via a second raw scan over `server._assignments` — by now any
2023
+ # true phantom (confirmed-dead process, no terminal status) has
2024
+ # already been finalized to FAILED by the `active_assignment_count()`
2025
+ # polls above, so a raw scan would agree with this today, but a
2026
+ # second copy of the same question right next to the shared
2027
+ # predicate is exactly the split `active_assignment_count()` was
2028
+ # introduced to eliminate — and `_active_assignment_ids()` is the
2029
+ # one that also knows to leave a still-alive process's record
2030
+ # alone rather than mis-scan it as gone.
2031
+ pending_ids = list(server._active_assignment_ids())
2030
2032
  for aid in pending_ids:
2031
2033
  try:
2032
2034
  # #1567: this is an infra-triggered restart, not an
@@ -4171,12 +4171,26 @@ def _dispatch_board_pending_smoke(config: Config) -> None:
4171
4171
  passed/failed/skipped verdict and re-dispatch instead of skipping it
4172
4172
  forever — without it, the staleness check fails open and this call would
4173
4173
  be no more capable than before that fix.
4174
+
4175
+ #3375: also passes a real *issue_liveness_fetcher*
4176
+ (`coord.dispatch_liveness.github_issue_liveness_fetcher`) so the Test
4177
+ stage — which dispatches over `httpx` directly rather than through
4178
+ `coord.dispatch.dispatch()` — gets the SAME "is this issue closed / has
4179
+ this branch already merged" precondition #3376 wired into every other
4180
+ dispatch chokepoint. Without it, this stage stays the one path #3376
4181
+ missed, and the five-smoke-agents-after-merge incident can still recur.
4174
4182
  """
4175
4183
  from coord.board_service import read_board, write_board
4184
+ from coord.dispatch_liveness import github_issue_liveness_fetcher
4176
4185
  from coord.smoke import dispatch_pending_smoke
4177
4186
 
4178
4187
  board = read_board()
4179
- dispatched = dispatch_pending_smoke(board, config, gh_ops=github_ops)
4188
+ dispatched = dispatch_pending_smoke(
4189
+ board,
4190
+ config,
4191
+ gh_ops=github_ops,
4192
+ issue_liveness_fetcher=github_issue_liveness_fetcher(config),
4193
+ )
4180
4194
  if dispatched:
4181
4195
  write_board(board)
4182
4196
 
@@ -2699,10 +2699,22 @@ def reconcile(board: Board, config: Config) -> list[str]:
2699
2699
  # passed/failed/skipped verdict (a rebase moved the base or branch out
2700
2700
  # from under it) is re-dispatched instead of skipped forever — without
2701
2701
  # it, the staleness check inside `dispatch_pending_smoke` fails open.
2702
+ #
2703
+ # #3375: also passes a real *issue_liveness_fetcher* so `coord resume`
2704
+ # gets the same "issue closed / branch already merged" precondition
2705
+ # #3376 wired into every other dispatch chokepoint — the Test stage
2706
+ # bypasses `coord.dispatch.dispatch()` entirely (a direct `httpx` POST
2707
+ # to `/assign`), so it was the one path #3376 didn't reach.
2702
2708
  from coord import github_ops # noqa: PLC0415
2709
+ from coord.dispatch_liveness import github_issue_liveness_fetcher # noqa: PLC0415
2703
2710
  from coord.smoke import dispatch_pending_smoke
2704
2711
 
2705
- for smoke in dispatch_pending_smoke(board, config, gh_ops=github_ops):
2712
+ for smoke in dispatch_pending_smoke(
2713
+ board,
2714
+ config,
2715
+ gh_ops=github_ops,
2716
+ issue_liveness_fetcher=github_issue_liveness_fetcher(config),
2717
+ ):
2706
2718
  if smoke.assignment_id is not None:
2707
2719
  changed.append(smoke.assignment_id)
2708
2720
 
@@ -3033,6 +3033,7 @@ def dispatch_pending_smoke(
3033
3033
  *,
3034
3034
  now: float | None = None,
3035
3035
  gh_ops: "GhOps | None" = None,
3036
+ issue_liveness_fetcher: Callable[[str, int], tuple[bool, bool]] | None = None,
3036
3037
  ) -> list[Assignment]:
3037
3038
  """Bulk Test-stage dispatch — the smoke analogue of
3038
3039
  :func:`coord.review.dispatch_pending_reviews`.
@@ -3064,6 +3065,23 @@ def dispatch_pending_smoke(
3064
3065
  real :mod:`coord.github_ops` explicitly, the same module every other
3065
3066
  live gate check in this codebase hands `merge_queue`'s gate functions.
3066
3067
 
3068
+ #3375: *issue_liveness_fetcher* is the SAME opt-in
3069
+ ``(repo_name, issue_number) -> (issue_closed, branch_merged)`` contract
3070
+ `coord.dispatch_liveness.check_dispatch_liveness` already gates
3071
+ `coord.dispatch.dispatch()` with (#3376) — but this stage never went
3072
+ through that call path. `dispatch_smoke`/`_dispatch_smoke_legs` POST
3073
+ straight to a machine's `/assign` over `httpx`, so #3376's dispatch-time
3074
+ gate never saw a Test-stage dispatch at all, and the five-smoke-agents
3075
+ incident that motivated both issues could still reproduce after #3376
3076
+ landed. Checked once per eligible row here, BEFORE any candidate is
3077
+ walked or any machine chosen (`_dispatch_smoke_legs` needs no machine
3078
+ name to know the issue is closed or the branch already merged) — a hit
3079
+ records a `skipped` verdict (there is nothing left to gate) via
3080
+ `record_test_verdict` and an audit row via
3081
+ `coord.dispatch_liveness.record_dispatch_refusal`, and the row is left
3082
+ alone rather than walking the candidate list for nothing. Default
3083
+ ``None`` refuses nothing — identical to every pre-#3375 caller.
3084
+
3067
3085
  A confirmed-stale verdict is **cleared** (``record_test_verdict(...,
3068
3086
  test_state=None)``, mirrored in-memory on ``completed.test_state``)
3069
3087
  *before* the re-dispatch, not left in place — so the row reads
@@ -3264,6 +3282,59 @@ def dispatch_pending_smoke(
3264
3282
  )
3265
3283
  continue
3266
3284
 
3285
+ # #3375: refuse to dispatch a Test stage for a row whose issue has
3286
+ # already closed or whose branch has already merged — the liveness
3287
+ # precondition #3376 built for `coord.dispatch.dispatch()` but never
3288
+ # reached this stage, because smoke dispatch never calls it (see the
3289
+ # docstring above). Checked here, right before candidate walking,
3290
+ # because it needs no machine selection to answer. A hit records a
3291
+ # `skipped` verdict (there is nothing left for a Test verdict to
3292
+ # gate) instead of `None`/leaving it unset — leaving it unset would
3293
+ # re-enter this exact row on the very next tick and re-probe GitHub
3294
+ # forever for an answer that cannot change back.
3295
+ if issue_liveness_fetcher is not None:
3296
+ from coord.dispatch_liveness import ( # noqa: PLC0415
3297
+ check_dispatch_liveness,
3298
+ record_dispatch_refusal,
3299
+ )
3300
+
3301
+ issue_closed, branch_merged = issue_liveness_fetcher(
3302
+ completed.repo_name, completed.issue_number
3303
+ )
3304
+ refusal = check_dispatch_liveness(
3305
+ repo_name=completed.repo_name,
3306
+ issue_number=completed.issue_number,
3307
+ machine_name="(smoke: no machine selected yet)",
3308
+ issue_closed=issue_closed,
3309
+ branch_merged=branch_merged,
3310
+ )
3311
+ if refusal is not None:
3312
+ if completed.assignment_id is not None:
3313
+ from coord.state import record_test_verdict # noqa: PLC0415
3314
+
3315
+ record_test_verdict(
3316
+ assignment_id=completed.assignment_id,
3317
+ test_state="skipped",
3318
+ test_reason=(
3319
+ f"Test stage skipped — {refusal.reason} (#3375)"
3320
+ ),
3321
+ )
3322
+ completed.test_state = "skipped"
3323
+ record_dispatch_refusal(
3324
+ refusal,
3325
+ repo_name=completed.repo_name,
3326
+ issue_number=completed.issue_number,
3327
+ machine_name="(smoke: no machine selected yet)",
3328
+ assignment_type="smoke",
3329
+ )
3330
+ logger.info(
3331
+ "dispatch_pending_smoke: refused to dispatch for %s#%s "
3332
+ "row %s — %s",
3333
+ completed.repo_name, completed.issue_number,
3334
+ completed.assignment_id, refusal.reason,
3335
+ )
3336
+ continue
3337
+
3267
3338
  # #3182: the full-list implementation — a capability fan-out
3268
3339
  # dispatches more than one leg per completion, so this loop cannot
3269
3340
  # go through the compat-wrapping `dispatch_smoke` (which only ever