code-coordinator 0.5.501__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.501 → code_coordinator-0.5.502}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/agent.py +188 -0
  5. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/agent_app.py +38 -36
  6. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent.py +237 -0
  7. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.claude/commands/board.md +0 -0
  8. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.claude/commands/complete-session.md +0 -0
  9. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.claude/commands/coordinator.md +0 -0
  10. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.githooks/_lib.sh +0 -0
  11. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.githooks/post-checkout +0 -0
  12. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.githooks/post-commit +0 -0
  13. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.githooks/post-merge +0 -0
  14. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.github/coord-ci-acceptance.yml +0 -0
  16. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.github/workflows/auto-release.yml +0 -0
  17. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.github/workflows/publish.yml +0 -0
  18. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.github/workflows/test.yml +0 -0
  19. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/.gitignore +0 -0
  20. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/CLAUDE.md +0 -0
  21. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/GOAL.md +0 -0
  22. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/LICENSE +0 -0
  23. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/MANIFEST.in +0 -0
  24. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/README.md +0 -0
  25. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/code_coordinator.egg-info/SOURCES.txt +0 -0
  26. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/code_coordinator.egg-info/dependency_links.txt +0 -0
  27. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/code_coordinator.egg-info/entry_points.txt +0 -0
  28. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/code_coordinator.egg-info/requires.txt +0 -0
  29. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/code_coordinator.egg-info/scm_file_list.json +0 -0
  30. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/code_coordinator.egg-info/top_level.txt +0 -0
  31. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/__init__.py +0 -0
  32. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/_board_mapping.py +0 -0
  33. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/acceptance.py +0 -0
  34. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/acceptance_drivers.py +0 -0
  35. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/agent_update.py +0 -0
  36. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/agents/opencode/.gitignore +0 -0
  37. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/agents/opencode/agents/work.md +0 -0
  38. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/agents/opencode/routing.jsonc +0 -0
  39. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/approved_work.py +0 -0
  40. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/audit.py +0 -0
  41. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/auto_loop.py +0 -0
  42. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/backup.py +0 -0
  43. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/block_log.py +0 -0
  44. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/board_schema.py +0 -0
  45. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/board_service.py +0 -0
  46. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/board_wire.py +0 -0
  47. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/brain.py +0 -0
  48. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/branch_model.py +0 -0
  49. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/bug_intake.py +0 -0
  50. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/cargo_cache.py +0 -0
  51. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/ci_fix.py +0 -0
  52. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/ci_github.py +0 -0
  53. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/ci_gitlab.py +0 -0
  54. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/ci_store.py +0 -0
  55. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/claim.py +0 -0
  56. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/claude_setup_token.py +0 -0
  57. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/cli.py +0 -0
  58. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/client.py +0 -0
  59. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/codegen.py +0 -0
  60. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/__init__.py +0 -0
  61. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/_common.py +0 -0
  62. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/acceptance.py +0 -0
  63. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/agent_ops.py +0 -0
  64. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/audit.py +0 -0
  65. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/backup.py +0 -0
  66. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/chat.py +0 -0
  67. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/codegen.py +0 -0
  68. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/dispatch.py +0 -0
  69. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/dispatch_workers.py +0 -0
  70. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/dr.py +0 -0
  71. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/drive_queue.py +0 -0
  73. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/gate_a.py +0 -0
  74. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/gates.py +0 -0
  75. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/issues.py +0 -0
  76. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/lifecycle.py +0 -0
  77. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/machine.py +0 -0
  78. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/merge.py +0 -0
  79. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/milestone.py +0 -0
  80. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/plan_followup.py +0 -0
  81. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/plans.py +0 -0
  82. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/portal.py +0 -0
  83. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/pr.py +0 -0
  84. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/release.py +0 -0
  85. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/repo.py +0 -0
  86. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/report.py +0 -0
  87. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/review.py +0 -0
  88. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/scorecard.py +0 -0
  89. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/sessions.py +0 -0
  90. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/setup.py +0 -0
  91. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/status.py +0 -0
  92. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/store_migrate.py +0 -0
  93. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/terminal.py +0 -0
  94. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/test_gate.py +0 -0
  95. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/commands/tui.py +0 -0
  96. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/comments.py +0 -0
  97. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/config.py +0 -0
  98. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/config_reload.py +0 -0
  99. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/confirm_test.py +0 -0
  100. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/conflict_fix.py +0 -0
  101. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dao.py +0 -0
  102. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dashboard/__init__.py +0 -0
  103. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dashboard/fixture.py +0 -0
  104. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dashboard/index.html +0 -0
  105. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dashboard/server.py +0 -0
  106. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dashboard/terminal.py +0 -0
  107. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/db.py +0 -0
  108. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dead_end.py +0 -0
  109. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/decomposition_chat.py +0 -0
  110. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/README.md +0 -0
  111. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-agent.service +0 -0
  112. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-backup.service +0 -0
  113. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-backup.timer +0 -0
  114. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-db-backup.service +0 -0
  115. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-db-backup.sh +0 -0
  116. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-db-backup.timer +0 -0
  117. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-dr-verify.service +0 -0
  118. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-dr-verify.timer +0 -0
  119. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-drive-queue.service +0 -0
  120. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-drive-queue.timer +0 -0
  121. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-failure-notify.service +0 -0
  122. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-fleet-watchdog.service +0 -0
  123. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  124. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-notify.service +0 -0
  125. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-notify.timer +0 -0
  126. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-release-propagate.service +0 -0
  127. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-release-propagate.timer +0 -0
  128. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-release-window.service +0 -0
  129. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-release-window.timer +0 -0
  130. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-serve.service +0 -0
  131. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-web-dist-build.service +0 -0
  132. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-web-dist-build.timer +0 -0
  133. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy/coord-web.service +0 -0
  134. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy_manifest.py +0 -0
  135. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deploy_units.py +0 -0
  136. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deprecation_telemetry.py +0 -0
  137. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/deps.py +0 -0
  138. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/diagnose.py +0 -0
  139. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dispatch.py +0 -0
  140. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dispatch_liveness.py +0 -0
  141. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dist_name.py +0 -0
  142. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dr_promote.py +0 -0
  143. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/dr_verify.py +0 -0
  144. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/drive.py +0 -0
  145. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/drive_queue.py +0 -0
  146. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/drive_state.py +0 -0
  147. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/events.py +0 -0
  148. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/failure_class.py +0 -0
  149. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/failure_classifier.py +0 -0
  150. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/filelock.py +0 -0
  151. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/fleet_config_health.py +0 -0
  152. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/forge_availability.py +0 -0
  153. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/freshness.py +0 -0
  154. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/gate_a.py +0 -0
  155. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/gate_b.py +0 -0
  156. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/gate_snapshot.py +0 -0
  157. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/gates.py +0 -0
  158. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/gen_board_fixture.py +0 -0
  159. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/github_ops.py +0 -0
  160. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/github_throttle.py +0 -0
  161. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/goal.py +0 -0
  162. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/graph_health.py +0 -0
  163. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/__init__.py +0 -0
  164. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/aggregate.py +0 -0
  165. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/__init__.py +0 -0
  166. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/_ci_pin.py +0 -0
  167. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/agent_install.py +0 -0
  168. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/cargo_targets.py +0 -0
  169. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/claude_binary.py +0 -0
  170. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/config_drift.py +0 -0
  171. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  172. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/coord_web_ci_pin.py +0 -0
  173. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/deploy_lane_facts.py +0 -0
  174. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/disk.py +0 -0
  175. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/fleet_board.py +0 -0
  176. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  177. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/fleet_phantom.py +0 -0
  178. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/fleet_unit_drift.py +0 -0
  179. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/graph.py +0 -0
  180. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/graphify_cli.py +0 -0
  181. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/index_lock.py +0 -0
  182. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/issues_sync_staleness.py +0 -0
  183. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/plan_usage.py +0 -0
  184. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/pr_churn.py +0 -0
  185. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/release_cordon.py +0 -0
  186. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/repo_state.py +0 -0
  187. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/spawned_coord.py +0 -0
  188. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/stalled_pipeline.py +0 -0
  189. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/timer_active.py +0 -0
  190. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/toolchain.py +0 -0
  191. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/unit_drift.py +0 -0
  192. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/unit_enablement.py +0 -0
  193. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/wedged_drive_queue.py +0 -0
  194. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/checks/worktrees.py +0 -0
  195. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/cli.py +0 -0
  196. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/context.py +0 -0
  197. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/fleet_snapshot.py +0 -0
  198. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/models.py +0 -0
  199. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/pypi.py +0 -0
  200. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/registry.py +0 -0
  201. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/render.py +0 -0
  202. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/health/units.py +0 -0
  203. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/hooks.py +0 -0
  204. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/housekeeping.py +0 -0
  205. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/interactive.py +0 -0
  206. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/invariant_alarms.py +0 -0
  207. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/issue_store.py +0 -0
  208. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/issues_sync_status.py +0 -0
  209. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/liveness_auditor.py +0 -0
  210. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/machine_fault.py +0 -0
  211. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/machine_metrics.py +0 -0
  212. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/machine_onboard.py +0 -0
  213. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/machine_pause.py +0 -0
  214. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/machine_stats.py +0 -0
  215. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/merge_queue.py +0 -0
  216. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/milestone_chat.py +0 -0
  217. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/milestone_dispatch.py +0 -0
  218. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/milestone_gate.py +0 -0
  219. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/milestone_order.py +0 -0
  220. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/mock_author.py +0 -0
  221. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/models.py +0 -0
  222. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/network.py +0 -0
  223. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/new_issue_chat.py +0 -0
  224. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/__init__.py +0 -0
  225. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/baseline.py +0 -0
  226. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/cli.py +0 -0
  227. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/collect.py +0 -0
  228. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/digest.py +0 -0
  229. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/models.py +0 -0
  230. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/predicate.py +0 -0
  231. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/service.py +0 -0
  232. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/store.py +0 -0
  233. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notifier/transport.py +0 -0
  234. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/notify.py +0 -0
  235. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/openapi.py +0 -0
  236. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/overlap_fence.py +0 -0
  237. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/overlap_predict.py +0 -0
  238. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/parentage.py +0 -0
  239. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/parentage_github.py +0 -0
  240. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/pipeline.py +0 -0
  241. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/plan_parser.py +0 -0
  242. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/plans.py +0 -0
  243. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/platform_paths.py +0 -0
  244. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/portal_bridge.py +0 -0
  245. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/portal_store.py +0 -0
  246. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/portal_sync.py +0 -0
  247. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/pr_body_lint.py +0 -0
  248. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/prereqs.py +0 -0
  249. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/progress.py +0 -0
  250. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/providers/__init__.py +0 -0
  251. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/providers/base.py +0 -0
  252. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/providers/claude.py +0 -0
  253. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/providers/claude_pty.py +0 -0
  254. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/providers/opencode.py +0 -0
  255. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/queue_diagnose.py +0 -0
  256. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/reconcile.py +0 -0
  257. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/reconcile_tick.py +0 -0
  258. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/refine_chat.py +0 -0
  259. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/release_cordon.py +0 -0
  260. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/release_propagate.py +0 -0
  261. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/release_verify.py +0 -0
  262. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/release_window.py +0 -0
  263. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/repo_dormancy.py +0 -0
  264. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/repo_edit.py +0 -0
  265. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/repo_onboard.py +0 -0
  266. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/reports.py +0 -0
  267. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/rest_schema.py +0 -0
  268. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/restart_cmd.py +0 -0
  269. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/revalidate.py +0 -0
  270. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/review.py +0 -0
  271. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/scorecard.py +0 -0
  272. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/self_health.py +0 -0
  273. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/serve_app.py +0 -0
  274. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  275. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  276. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  277. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  278. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  279. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/portal-followup/SKILL.md +0 -0
  280. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/release-now/SKILL.md +0 -0
  281. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  282. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  283. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/skills/update-issue/SKILL.md +0 -0
  284. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/smoke.py +0 -0
  285. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/spend_ceiling.py +0 -0
  286. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/split_work.py +0 -0
  287. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/sql.py +0 -0
  288. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/stage_projection.py +0 -0
  289. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/state.py +0 -0
  290. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/store_migrate.py +0 -0
  291. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/store_parity.py +0 -0
  292. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/templates/deploy-cloudflare.node.yml +0 -0
  293. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/test_author.py +0 -0
  294. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/test_chat.py +0 -0
  295. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/test_orchestrator.py +0 -0
  296. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/test_report.py +0 -0
  297. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/tui_release.py +0 -0
  298. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/uat_checks.py +0 -0
  299. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/usage.py +0 -0
  300. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/usage_limits.py +0 -0
  301. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/usage_rollup.py +0 -0
  302. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coord/worker_events.py +0 -0
  303. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/coordinator.example.yml +0 -0
  304. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-agent.service +0 -0
  305. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-backup.service +0 -0
  306. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-backup.timer +0 -0
  307. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-db-backup.service +0 -0
  308. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-db-backup.sh +0 -0
  309. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-db-backup.timer +0 -0
  310. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-dr-verify.service +0 -0
  311. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-dr-verify.timer +0 -0
  312. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-drive-queue.service +0 -0
  313. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-drive-queue.timer +0 -0
  314. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-failure-notify.service +0 -0
  315. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-failure-notify.sh +0 -0
  316. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-fleet-watchdog.service +0 -0
  317. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-fleet-watchdog.timer +0 -0
  318. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-notify.service +0 -0
  319. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-notify.timer +0 -0
  320. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-release-propagate.service +0 -0
  321. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-release-propagate.timer +0 -0
  322. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-release-window.service +0 -0
  323. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-release-window.timer +0 -0
  324. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-serve.service +0 -0
  325. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-web-dist-build.service +0 -0
  326. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-web-dist-build.sh +0 -0
  327. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-web-dist-build.timer +0 -0
  328. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-web-rollback.sh +0 -0
  329. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/coord-web.service +0 -0
  330. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/deploy/node-shim.sh +0 -0
  331. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/ADR_COORD_TUI_CI.md +0 -0
  332. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  333. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/ADR_COORD_WEB_CI.md +0 -0
  334. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/ADR_COORD_WEB_DIST.md +0 -0
  335. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  336. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/AGENT_OPERATIONS.md +0 -0
  337. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/ARCHITECTURE.md +0 -0
  338. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/ARCH_SECURITY_GATES.md +0 -0
  339. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/COCKPIT.md +0 -0
  340. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/CONTROL_CENTER.md +0 -0
  341. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/COST_DISCIPLINE.md +0 -0
  342. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/CROSS_PLATFORM.md +0 -0
  343. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/CUSTOMER_FACING_APPS.md +0 -0
  344. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/CUSTOMER_PORTAL.md +0 -0
  345. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/DATA_STORE_SELECTION.md +0 -0
  346. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/DISASTER_RECOVERY.md +0 -0
  347. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/DRIVE_QUEUE.md +0 -0
  348. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/EPHEMERAL_WORKERS.md +0 -0
  349. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/FORGE_MIGRATION.md +0 -0
  350. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/GRAPHIFY_SETUP.md +0 -0
  351. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/ISSUE_GUIDANCE.md +0 -0
  352. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/MAC_MINI.md +0 -0
  353. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  354. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/NOTIFIER.md +0 -0
  355. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/OPENCODE_VERIFICATION.md +0 -0
  356. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/OPERATING_GOTCHAS.md +0 -0
  357. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/OPERATOR_GUIDES.md +0 -0
  358. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/ORACLE_LOOP.md +0 -0
  359. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/PHONE_WEBAPP.md +0 -0
  360. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/PIPELINE_V2.md +0 -0
  361. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/PLATFORM_EVOLUTION.md +0 -0
  362. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/SECOND_BACKEND.md +0 -0
  363. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/STORE_SERVICE.md +0 -0
  364. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  365. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/WEB_CONTROL_CENTER.md +0 -0
  366. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/WSL_WINDOWS_WORKER.md +0 -0
  367. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/mocks/web/README.md +0 -0
  368. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/mocks/web/_tokens.css +0 -0
  369. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/mocks/web/issue-detail.html +0 -0
  370. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/mocks/web/pipeline-narrow.html +0 -0
  371. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/docs/mocks/web/pipeline-wide.html +0 -0
  372. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/graphify-out/.gitignore +0 -0
  373. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/install-agent.sh +0 -0
  374. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/pyproject.toml +0 -0
  375. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/audit_review_verdict_overrides.py +0 -0
  376. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  377. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/build-worker-image.sh +0 -0
  378. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/coordinator-machine.py +0 -0
  379. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/dr-down.sh +0 -0
  380. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/dr-up.sh +0 -0
  381. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/epic-down.sh +0 -0
  382. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/epic-up.sh +0 -0
  383. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/preflight.sh +0 -0
  384. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/provision-server.sh +0 -0
  385. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/provision-worker.sh +0 -0
  386. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  387. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  388. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/throwaway-vm.sh +0 -0
  389. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/azure-workers/verify-github-token.sh +0 -0
  390. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/check_gh_argv_containment.py +0 -0
  391. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/codegen.py +0 -0
  392. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/coord-test-runner.sh +0 -0
  393. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  394. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  395. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  396. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  397. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/coord-venv-rollback.sh +0 -0
  398. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/drive-batch.sh +0 -0
  399. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/extract-coord-tui.sh +0 -0
  400. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/fleet_watchdog.py +0 -0
  401. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/gen_board_fixture.py +0 -0
  402. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/gen_mock_index.py +0 -0
  403. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/lib/provision-core.sh +0 -0
  404. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/next_release_tag.py +0 -0
  405. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/provision-machine.sh +0 -0
  406. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/run_tests_in_populated_home.sh +0 -0
  407. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/run_tests_without_gh.sh +0 -0
  408. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/setup-macmini.sh +0 -0
  409. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/smoke_437_interactive.py +0 -0
  410. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/verify-provision-noble.sh +0 -0
  411. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/verify_878_review_capture.py +0 -0
  412. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/verify_release_published.py +0 -0
  413. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/scripts/verify_release_wheel.py +0 -0
  414. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/setup.cfg +0 -0
  415. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/SMOKE_SET.md +0 -0
  416. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/__init__.py +0 -0
  417. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-37/conftest.py +0 -0
  418. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-37/contract.md +0 -0
  419. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-37/manifest.yml +0 -0
  420. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  421. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  422. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-51/contract.md +0 -0
  423. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  424. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  425. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-51/manifest.yml +0 -0
  426. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  427. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-51/tsconfig.json +0 -0
  428. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  429. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/backends.py +0 -0
  430. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/conftest.py +0 -0
  431. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/board-pipeline-basic.json +0 -0
  432. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  433. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  434. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  435. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  436. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/playwright/all_pass.json +0 -0
  437. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  438. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/playwright/mixed_fail.json +0 -0
  439. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  440. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  441. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/playwright/skip.json +0 -0
  442. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/playwright/truncated.json +0 -0
  443. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  444. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  445. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  446. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  447. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  448. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  449. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  450. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  451. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_acceptance.py +0 -0
  452. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_acceptance_drivers.py +0 -0
  453. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_api_error.py +0 -0
  454. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_app.py +0 -0
  455. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_branch_base.py +0 -0
  456. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_branch_capture.py +0 -0
  457. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_config_free_1712.py +0 -0
  458. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_deploy_units_endpoint.py +0 -0
  459. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_dirty_worktree.py +0 -0
  460. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  461. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_graph_self_heal.py +0 -0
  462. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_health_h3.py +0 -0
  463. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_idle_restart.py +0 -0
  464. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_push_failure.py +0 -0
  465. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_reap.py +0 -0
  466. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_repos_and_pull.py +0 -0
  467. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_restart_services_endpoint.py +0 -0
  468. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_skills_self_heal.py +0 -0
  469. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_startup_diagnostics.py +0 -0
  470. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_update.py +0 -0
  471. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_update_bluegreen.py +0 -0
  472. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_usage_limit.py +0 -0
  473. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_agent_zero_commit.py +0 -0
  474. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_ambient_home_isolation.py +0 -0
  475. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_approve_capability_reroute_3241.py +0 -0
  476. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_approve_dependency_busy_2804.py +0 -0
  477. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_approve_reject_plan.py +0 -0
  478. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_approve_usage_gate.py +0 -0
  479. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_approved_work_2532.py +0 -0
  480. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_approved_work_2996.py +0 -0
  481. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_assignment_already_recorded_daemon.py +0 -0
  482. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_audit_log.py +0 -0
  483. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_audit_outcome.py +0 -0
  484. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_audit_query.py +0 -0
  485. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_auto_loop.py +0 -0
  486. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_auto_release_publish_2035.py +0 -0
  487. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_backend_selection.py +0 -0
  488. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_backup.py +0 -0
  489. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_base_checkout_restore.py +0 -0
  490. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_block_log.py +0 -0
  491. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_board_cap_762.py +0 -0
  492. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_board_fixture.py +0 -0
  493. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_board_read_path.py +0 -0
  494. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_board_schema.py +0 -0
  495. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_board_service.py +0 -0
  496. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_board_state.py +0 -0
  497. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_board_wire.py +0 -0
  498. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_brain.py +0 -0
  499. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_branch_model.py +0 -0
  500. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_bug_intake.py +0 -0
  501. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_build_worker_image_env_update.py +0 -0
  502. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cargo_cache.py +0 -0
  503. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_check_gh_argv_containment.py +0 -0
  504. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_ci_acceptance_gate_1950.py +0 -0
  505. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_ci_fix.py +0 -0
  506. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_ci_github.py +0 -0
  507. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_ci_gitlab.py +0 -0
  508. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_ci_parity_2091.py +0 -0
  509. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_ci_store.py +0 -0
  510. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_claim.py +0 -0
  511. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_claude_md_budget.py +0 -0
  512. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_claude_setup_token.py +0 -0
  513. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_acceptance.py +0 -0
  514. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_assign.py +0 -0
  515. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  516. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_assign_interactive_remote.py +0 -0
  517. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_assign_provider.py +0 -0
  518. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  519. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_audit.py +0 -0
  520. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_chat_continue.py +0 -0
  521. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_codegen.py +0 -0
  522. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_decide.py +0 -0
  523. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_diagnose_capability_rules.py +0 -0
  524. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_diagnose_config_provenance.py +0 -0
  525. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_diagnose_forge_availability.py +0 -0
  526. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_diagnose_graph.py +0 -0
  527. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_diagnose_self.py +0 -0
  528. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_diagnose_test_coverage.py +0 -0
  529. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_doctor.py +0 -0
  530. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_doctor_config_free_1801.py +0 -0
  531. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  532. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  533. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_drive.py +0 -0
  534. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_drive_queue.py +0 -0
  535. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_escalate.py +0 -0
  536. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_fix_headless_review.py +0 -0
  537. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_gate_a.py +0 -0
  538. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_install_drift.py +0 -0
  539. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_install_skills.py +0 -0
  540. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_issue_comment.py +0 -0
  541. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_issue_create_label.py +0 -0
  542. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_issue_reopen.py +0 -0
  543. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_issue_view_list.py +0 -0
  544. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_merge.py +0 -0
  545. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_milestone_assign.py +0 -0
  546. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_milestone_capture.py +0 -0
  547. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_milestone_chat_add_child.py +0 -0
  548. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_milestone_dispatch.py +0 -0
  549. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_milestone_gate_b.py +0 -0
  550. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_milestone_gate_c.py +0 -0
  551. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_milestone_order.py +0 -0
  552. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  553. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_milestone_ship.py +0 -0
  554. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_network.py +0 -0
  555. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_new_issue_chat.py +0 -0
  556. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_plans.py +0 -0
  557. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_portal.py +0 -0
  558. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_pr.py +0 -0
  559. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_pull_artifact.py +0 -0
  560. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_queue.py +0 -0
  561. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_reattach_sessions.py +0 -0
  562. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_refine_board.py +0 -0
  563. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_release_preflight.py +0 -0
  564. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_release_propagate.py +0 -0
  565. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_release_window.py +0 -0
  566. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_repo_2220.py +0 -0
  567. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  568. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_scorecard.py +0 -0
  569. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_serve_store_backend_3084.py +0 -0
  570. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_set_review_findings.py +0 -0
  571. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_advisory_terminal.py +0 -0
  572. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_contested_tag.py +0 -0
  573. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_invariant_alarms.py +0 -0
  574. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_machine_fault.py +0 -0
  575. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_merge_queue.py +0 -0
  576. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_provider.py +0 -0
  577. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_retried_3340.py +0 -0
  578. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_review_finalizing.py +0 -0
  579. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_supervisor_3366.py +0 -0
  580. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_test_failed_tag.py +0 -0
  581. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_status_usage_limit.py +0 -0
  582. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_sync_comments_873.py +0 -0
  583. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_test_plan.py +0 -0
  584. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_track.py +0 -0
  585. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_tui_update.py +0 -0
  586. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cli_wait.py +0 -0
  587. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_client.py +0 -0
  588. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_client_base_install.py +0 -0
  589. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_client_config_cache_atomic_3052.py +0 -0
  590. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_client_resource_migration_1946.py +0 -0
  591. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_commands_common.py +0 -0
  592. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_comments.py +0 -0
  593. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_completion_summary.py +0 -0
  594. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_config.py +0 -0
  595. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_config_acceptance.py +0 -0
  596. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_config_audit.py +0 -0
  597. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_config_drift_check.py +0 -0
  598. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_config_pricing.py +0 -0
  599. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  600. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_config_usage_gate.py +0 -0
  601. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_confirm_test.py +0 -0
  602. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_conflict_fix.py +0 -0
  603. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_conflict_fix_semantic.py +0 -0
  604. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  605. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coord_test.py +0 -0
  606. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  607. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coord_test_runner_baseline.py +0 -0
  608. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coord_test_runner_populated_home.py +0 -0
  609. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coord_test_runner_routing.py +0 -0
  610. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coord_test_runner_toolchain.py +0 -0
  611. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coord_uat.py +0 -0
  612. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coord_web_sse_restart_live.py +0 -0
  613. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_coordinator_machine.py +0 -0
  614. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_cross_platform_imports.py +0 -0
  615. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dao.py +0 -0
  616. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dashboard.py +0 -0
  617. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dashboard_api.py +0 -0
  618. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dashboard_fixture.py +0 -0
  619. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dashboard_server.py +0 -0
  620. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dashboard_terminal.py +0 -0
  621. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dashboard_terminal_live.py +0 -0
  622. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_db.py +0 -0
  623. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dead_end.py +0 -0
  624. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_decomposition_chat.py +0 -0
  625. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_coord_db_backup.py +0 -0
  626. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_coord_web_dist.py +0 -0
  627. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_coord_web_rollback.py +0 -0
  628. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_db_backup_unit.py +0 -0
  629. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_drive_queue_unit.py +0 -0
  630. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_failure_notify_unit.py +0 -0
  631. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_manifest.py +0 -0
  632. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_notify_unit.py +0 -0
  633. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_units_lane.py +0 -0
  634. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deploy_web_unit.py +0 -0
  635. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deprecation_telemetry.py +0 -0
  636. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_deps.py +0 -0
  637. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_diagnose.py +0 -0
  638. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dispatch.py +0 -0
  639. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dispatch_liveness.py +0 -0
  640. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dispatch_target_validation.py +0 -0
  641. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dispatch_workers.py +0 -0
  642. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dist_name.py +0 -0
  643. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_done_housekeeping.py +0 -0
  644. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dr_azure_scripts.py +0 -0
  645. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dr_promote.py +0 -0
  646. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_dr_verify.py +0 -0
  647. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive.py +0 -0
  648. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_machine_fault.py +0 -0
  649. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_queue.py +0 -0
  650. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_queue_blocked_rendering.py +0 -0
  651. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_queue_launch_argv.py +0 -0
  652. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_queue_max_parallel_config.py +0 -0
  653. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  654. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_queue_roll_pending.py +0 -0
  655. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  656. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_state.py +0 -0
  657. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_drive_tmux.py +0 -0
  658. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_epic_up_capability_detection.py +0 -0
  659. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  660. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_epic_up_image_provenance.py +0 -0
  661. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_errors.py +0 -0
  662. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_events.py +0 -0
  663. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_failure_class.py +0 -0
  664. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_failure_classifier.py +0 -0
  665. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_filelock.py +0 -0
  666. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  667. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_fix_escalation_classifier.py +0 -0
  668. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_fix_of_force_override.py +0 -0
  669. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_fleet_config_health.py +0 -0
  670. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_fleet_health_probes.py +0 -0
  671. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_fleet_health_snapshot.py +0 -0
  672. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_fleet_watchdog.py +0 -0
  673. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_forge_availability.py +0 -0
  674. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_freshness.py +0 -0
  675. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_gate_a.py +0 -0
  676. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_gate_b.py +0 -0
  677. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_gate_snapshot_staleness.py +0 -0
  678. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_gates.py +0 -0
  679. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  680. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_gen_mock_index.py +0 -0
  681. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_generated_rust_fixture.py +0 -0
  682. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_generated_rust_requests.py +0 -0
  683. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_generated_types_fixture.py +0 -0
  684. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_github_ops.py +0 -0
  685. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_github_throttle.py +0 -0
  686. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_goal.py +0 -0
  687. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_graph_health.py +0 -0
  688. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_graph_selfheal_absent_2237.py +0 -0
  689. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_handoff.py +0 -0
  690. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_checks.py +0 -0
  691. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_cli.py +0 -0
  692. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_cli_graph.py +0 -0
  693. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_config.py +0 -0
  694. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_context.py +0 -0
  695. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_coord_tui_ci_pin.py +0 -0
  696. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_coord_web_ci_pin.py +0 -0
  697. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_deploy_lane_facts.py +0 -0
  698. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_fix.py +0 -0
  699. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_incident_regression.py +0 -0
  700. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_issues_sync_staleness.py +0 -0
  701. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_pr_churn.py +0 -0
  702. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_pypi.py +0 -0
  703. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_registry.py +0 -0
  704. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_release_cordon_probe.py +0 -0
  705. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_timer_active.py +0 -0
  706. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_toolchain.py +0 -0
  707. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_unit_drift.py +0 -0
  708. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_unit_enablement.py +0 -0
  709. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_health_wedged_drive_queue.py +0 -0
  710. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_hooks.py +0 -0
  711. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_housekeeping.py +0 -0
  712. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_human_attended_437.py +0 -0
  713. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_init.py +0 -0
  714. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_install_agent_venv_2911.py +0 -0
  715. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_integration.py +0 -0
  716. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_interactive_briefing_echo.py +0 -0
  717. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_interactive_pane_log_2541.py +0 -0
  718. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_interactive_prefill_state.py +0 -0
  719. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_interactive_session_relaunch.py +0 -0
  720. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_interactive_test_verdict_backstop.py +0 -0
  721. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_interactive_token_attribution.py +0 -0
  722. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_interactive_worktree.py +0 -0
  723. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_invariant_alarms.py +0 -0
  724. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_issue_store_seam.py +0 -0
  725. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_issues_sync_status.py +0 -0
  726. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_liveness_auditor.py +0 -0
  727. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_liveness_notify.py +0 -0
  728. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_lock_contention_ratchet.py +0 -0
  729. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_machine_fault.py +0 -0
  730. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_machine_metrics.py +0 -0
  731. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_machine_onboard.py +0 -0
  732. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_machine_pause.py +0 -0
  733. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_machine_stats.py +0 -0
  734. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_merge_queue.py +0 -0
  735. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_merge_verify.py +0 -0
  736. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_milestone_chat.py +0 -0
  737. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_milestone_dispatch.py +0 -0
  738. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_milestone_gate.py +0 -0
  739. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_milestone_order.py +0 -0
  740. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_milestone_seam.py +0 -0
  741. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_mock_author.py +0 -0
  742. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_model_tiering.py +0 -0
  743. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_models.py +0 -0
  744. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_models_config_labels.py +0 -0
  745. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_needs_attention.py +0 -0
  746. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_network.py +0 -0
  747. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_new_issue_chat.py +0 -0
  748. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_next_release_tag.py +0 -0
  749. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_node_shim.py +0 -0
  750. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notifier_baseline.py +0 -0
  751. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notifier_cli.py +0 -0
  752. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notifier_collect.py +0 -0
  753. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notifier_config.py +0 -0
  754. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notifier_drive_seam.py +0 -0
  755. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notifier_isolation.py +0 -0
  756. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notifier_predicate.py +0 -0
  757. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notifier_quiet_hours.py +0 -0
  758. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notifier_service.py +0 -0
  759. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notify.py +0 -0
  760. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_notify_drain.py +0 -0
  761. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_openapi.py +0 -0
  762. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_operational_defaults.py +0 -0
  763. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_overlap_fence.py +0 -0
  764. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_overlap_predict.py +0 -0
  765. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_packaged_deploy_units.py +0 -0
  766. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_parentage.py +0 -0
  767. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_paste_landed.py +0 -0
  768. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  769. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_pipeline.py +0 -0
  770. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_plan_followup_approve_plan_command.py +0 -0
  771. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_plan_followup_pr_command.py +0 -0
  772. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_plan_followup_review_command.py +0 -0
  773. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_plan_only.py +0 -0
  774. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_plan_parser.py +0 -0
  775. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_platform_paths.py +0 -0
  776. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_portal_bridge.py +0 -0
  777. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_portal_config.py +0 -0
  778. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_portal_store.py +0 -0
  779. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_portal_sync.py +0 -0
  780. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_pr_body_lint.py +0 -0
  781. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_prereqs.py +0 -0
  782. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_production_db_guard.py +0 -0
  783. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_progress.py +0 -0
  784. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_provider_seam.py +0 -0
  785. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_providers.py +0 -0
  786. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_providers_config_labels.py +0 -0
  787. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_providers_pty.py +0 -0
  788. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_provision_core.py +0 -0
  789. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_provision_machine.py +0 -0
  790. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_py_rust_mirror_inventory.py +0 -0
  791. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_quiet_hours.py +0 -0
  792. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_quiet_hours_store_2146.py +0 -0
  793. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reap_merged_sessions.py +0 -0
  794. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reap_stale_interactive_tick.py +0 -0
  795. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reconcile.py +0 -0
  796. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reconcile_branch.py +0 -0
  797. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reconcile_completions.py +0 -0
  798. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  799. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reconcile_merges.py +0 -0
  800. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reconcile_no_agent_record.py +0 -0
  801. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reconcile_tick.py +0 -0
  802. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reconcile_usage_limit_done.py +0 -0
  803. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_refine_chat.py +0 -0
  804. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_cordon_2101.py +0 -0
  805. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  806. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_cordon_deadlock_2240.py +0 -0
  807. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  808. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_cordon_stuck_2490.py +0 -0
  809. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_propagate.py +0 -0
  810. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_propagate_threshold.py +0 -0
  811. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_roll_between_legs_2854.py +0 -0
  812. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_roll_window_handoff.py +0 -0
  813. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_unified_1242.py +0 -0
  814. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_verify.py +0 -0
  815. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_release_window.py +0 -0
  816. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_remote_auto_prune.py +0 -0
  817. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_remote_interactive_reaper.py +0 -0
  818. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_repo_add.py +0 -0
  819. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_repo_dormancy.py +0 -0
  820. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_repo_edit_2220.py +0 -0
  821. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_repo_graph_fleet_2237.py +0 -0
  822. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_repo_onboard_2220.py +0 -0
  823. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_report_result_push.py +0 -0
  824. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_reports.py +0 -0
  825. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_restart_cmd.py +0 -0
  826. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_retry.py +0 -0
  827. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_retry_advisory_1606.py +0 -0
  828. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_retry_escalation_classify_3360.py +0 -0
  829. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_retry_type_1636.py +0 -0
  830. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_revalidate.py +0 -0
  831. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_review.py +0 -0
  832. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_review_end_review_without_verdict.py +0 -0
  833. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_review_parse_failure_diagnostic.py +0 -0
  834. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_review_reaffirm.py +0 -0
  835. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_review_state.py +0 -0
  836. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_review_verdict_backstop.py +0 -0
  837. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_review_verdict_override_audit.py +0 -0
  838. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_review_verdict_relay.py +0 -0
  839. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_review_zero_commits.py +0 -0
  840. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_scoped_review_wiring.py +0 -0
  841. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_scorecard.py +0 -0
  842. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_self_health.py +0 -0
  843. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_serve.py +0 -0
  844. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_serve_app.py +0 -0
  845. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_serve_app_board_trim.py +0 -0
  846. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_serve_rest_routes.py +0 -0
  847. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_session.py +0 -0
  848. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_slice_issue_attribution.py +0 -0
  849. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_smoke.py +0 -0
  850. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  851. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_smoke_live_checkout_restore.py +0 -0
  852. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_smoke_workflow.py +0 -0
  853. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_spend_ceiling.py +0 -0
  854. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_spend_ceiling_coordinator.py +0 -0
  855. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_split.py +0 -0
  856. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_split_work.py +0 -0
  857. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_sql_dialect.py +0 -0
  858. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_sqlite_connect_ratchet.py +0 -0
  859. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_stage_projection.py +0 -0
  860. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_stale_busy_reviewer_697.py +0 -0
  861. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_stalled_pipeline.py +0 -0
  862. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_state.py +0 -0
  863. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_state_review_findings_daemon.py +0 -0
  864. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_status_fleet_footer.py +0 -0
  865. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_stop_1567.py +0 -0
  866. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_store_contract.py +0 -0
  867. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_store_migrate.py +0 -0
  868. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_stuck.py +0 -0
  869. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  870. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_terminal_command.py +0 -0
  871. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_test_author.py +0 -0
  872. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_test_chat.py +0 -0
  873. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_test_orchestrator.py +0 -0
  874. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_test_report.py +0 -0
  875. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_test_verdict_parsing.py +0 -0
  876. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_test_verdict_transcript_floor.py +0 -0
  877. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_text_io_encoding_audit.py +0 -0
  878. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_thin_client_board_audit.py +0 -0
  879. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_thin_client_config_load_1080.py +0 -0
  880. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_thin_client_daemon_routing_906.py +0 -0
  881. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_throwaway_vm.py +0 -0
  882. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_tmux_host.py +0 -0
  883. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_tmux_session.py +0 -0
  884. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_transcript_floor.py +0 -0
  885. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_uat_checks.py +0 -0
  886. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_usage.py +0 -0
  887. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_usage_limits.py +0 -0
  888. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_usage_rollup.py +0 -0
  889. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_venv_live_install_2121.py +0 -0
  890. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_version_single_source.py +0 -0
  891. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_watch.py +0 -0
  892. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  893. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_worker_env_venv_isolation.py +0 -0
  894. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_worker_events.py +0 -0
  895. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_worker_image_pin_sync.py +0 -0
  896. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_worker_safety.py +0 -0
  897. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_worker_test_scoping.py +0 -0
  898. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_worktree.py +0 -0
  899. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  900. {code_coordinator-0.5.501 → code_coordinator-0.5.502}/tests/test_write_parity.py +0 -0
  901. {code_coordinator-0.5.501 → 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.501
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.501
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.501",
2
+ "tag": "0.5.502",
3
3
  "distance": 0,
4
- "node": "gf1c4fc8c6aabba829d2631892fc576fd10bbc58a",
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
@@ -32,6 +32,9 @@ from coord.agent import (
32
32
  AgentServer,
33
33
  AssignmentSpec,
34
34
  _COMPLETED_HISTORY_CAP,
35
+ _DEFAULT_RUNTIME_CEILING_S,
36
+ _PHANTOM_AGE_MARGIN_S,
37
+ _PHANTOM_ASSIGNMENT_MAX_AGE_S,
35
38
  _WIP_RESCUE_TYPES,
36
39
  _ZERO_COMMIT_TYPES,
37
40
  _base_checkout_write_guard_tools,
@@ -5536,6 +5539,240 @@ class TestCompletedHistoryCap:
5536
5539
  )
5537
5540
 
5538
5541
 
5542
+ # ── #3363: a PENDING/RUNNING assignment that never reaches a terminal
5543
+ # status must not be trusted as "busy" forever — `active_assignment_count`
5544
+ # is the one shared predicate every restart path in `coord/agent_app.py`
5545
+ # now calls, and it ages out (and finalizes) any such phantom entry ─────────
5546
+
5547
+ class TestActiveAssignmentCount:
5548
+ def _make_spec(self, repo_path: Path) -> AssignmentSpec:
5549
+ return AssignmentSpec(
5550
+ repo_name="api",
5551
+ repo_path=str(repo_path),
5552
+ issue_number=1,
5553
+ issue_title="t",
5554
+ briefing="b",
5555
+ branch="main",
5556
+ )
5557
+
5558
+ def test_genuinely_running_assignment_counts_as_active(self, tmp_path: Path) -> None:
5559
+ repo = _init_repo(tmp_path / "repo")
5560
+ server = _server(tmp_path, repo_path=repo)
5561
+ spec = self._make_spec(repo)
5562
+ now = 10_000.0
5563
+ server._assignments["fresh"] = AgentAssignment(
5564
+ id="fresh", spec=spec, status=RUNNING, started_at=now - 60.0,
5565
+ )
5566
+ assert server.active_assignment_count(now=now) == 1
5567
+ assert server._assignments["fresh"].status == RUNNING, (
5568
+ "a genuinely fresh RUNNING assignment must not be touched"
5569
+ )
5570
+
5571
+ def test_genuinely_pending_assignment_counts_as_active(self, tmp_path: Path) -> None:
5572
+ repo = _init_repo(tmp_path / "repo")
5573
+ server = _server(tmp_path, repo_path=repo)
5574
+ spec = self._make_spec(repo)
5575
+ now = 10_000.0
5576
+ server._assignments["fresh"] = AgentAssignment(
5577
+ id="fresh", spec=spec, status=PENDING, created_at=now - 5.0,
5578
+ )
5579
+ assert server.active_assignment_count(now=now) == 1
5580
+
5581
+ def test_phantom_running_assignment_ages_out_and_is_finalized(
5582
+ self, tmp_path: Path
5583
+ ) -> None:
5584
+ """#3363: macmini's actual shape — a RUNNING record that outlived
5585
+ even the runtime-ceiling watchdog by a wide margin, with no
5586
+ terminal status ever written back. Must stop counting as busy AND
5587
+ get flipped to a terminal status so it stops looking active on
5588
+ every other surface (`/status`, `coord usage`) too — not merely
5589
+ excluded from this one count."""
5590
+ repo = _init_repo(tmp_path / "repo")
5591
+ server = _server(tmp_path, repo_path=repo)
5592
+ spec = self._make_spec(repo)
5593
+ now = 1_000_000.0
5594
+ stale_started_at = now - _PHANTOM_ASSIGNMENT_MAX_AGE_S - 1.0
5595
+ server._assignments["phantom"] = AgentAssignment(
5596
+ id="phantom", spec=spec, status=RUNNING, started_at=stale_started_at,
5597
+ )
5598
+ assert server.active_assignment_count(now=now) == 0
5599
+
5600
+ finalized = server._assignments["phantom"]
5601
+ assert finalized.status == FAILED
5602
+ assert finalized.finished_at == now
5603
+ assert "phantom assignment" in (finalized.error or "")
5604
+ assert "#3363" in (finalized.error or "")
5605
+
5606
+ # And the finalization must actually be durable, not just in-memory
5607
+ # bookkeeping this one call happened to mutate.
5608
+ persisted = json.loads(server.state_path.read_text())
5609
+ persisted_entry = next(
5610
+ a for a in persisted["assignments"] if a["id"] == "phantom"
5611
+ )
5612
+ assert persisted_entry["status"] == FAILED
5613
+
5614
+ def test_phantom_pending_assignment_ages_out(self, tmp_path: Path) -> None:
5615
+ repo = _init_repo(tmp_path / "repo")
5616
+ server = _server(tmp_path, repo_path=repo)
5617
+ spec = self._make_spec(repo)
5618
+ now = 1_000_000.0
5619
+ stale_created_at = now - _PHANTOM_ASSIGNMENT_MAX_AGE_S - 1.0
5620
+ server._assignments["phantom-pending"] = AgentAssignment(
5621
+ id="phantom-pending", spec=spec, status=PENDING,
5622
+ created_at=stale_created_at,
5623
+ )
5624
+ assert server.active_assignment_count(now=now) == 0
5625
+ assert server._assignments["phantom-pending"].status == FAILED
5626
+
5627
+ def test_mixed_real_and_phantom_only_counts_the_real_one(
5628
+ self, tmp_path: Path
5629
+ ) -> None:
5630
+ """The exact macmini shape: `coord usage`/the board show zero real
5631
+ work, but a phantom sat in the map — count must reflect ONLY
5632
+ genuine activity, never the phantom, while still finalizing it."""
5633
+ repo = _init_repo(tmp_path / "repo")
5634
+ server = _server(tmp_path, repo_path=repo)
5635
+ spec = self._make_spec(repo)
5636
+ now = 1_000_000.0
5637
+ server._assignments["real"] = AgentAssignment(
5638
+ id="real", spec=spec, status=RUNNING, started_at=now - 30.0,
5639
+ )
5640
+ server._assignments["phantom"] = AgentAssignment(
5641
+ id="phantom", spec=spec, status=RUNNING,
5642
+ started_at=now - _PHANTOM_ASSIGNMENT_MAX_AGE_S - 1.0,
5643
+ )
5644
+ assert server.active_assignment_count(now=now) == 1
5645
+ assert server._assignments["real"].status == RUNNING
5646
+ assert server._assignments["phantom"].status == FAILED
5647
+
5648
+ def test_assignment_right_at_the_ceiling_still_counts(self, tmp_path: Path) -> None:
5649
+ """Boundary: exactly at the max age is still trusted — only
5650
+ strictly older is a phantom. Guards against an off-by-one flipping
5651
+ a worker that is running right up against its own runtime ceiling."""
5652
+ repo = _init_repo(tmp_path / "repo")
5653
+ server = _server(tmp_path, repo_path=repo)
5654
+ spec = self._make_spec(repo)
5655
+ now = 1_000_000.0
5656
+ server._assignments["boundary"] = AgentAssignment(
5657
+ id="boundary", spec=spec, status=RUNNING,
5658
+ started_at=now - _PHANTOM_ASSIGNMENT_MAX_AGE_S,
5659
+ )
5660
+ assert server.active_assignment_count(now=now) == 1
5661
+
5662
+ def test_stale_but_confirmed_alive_process_is_never_finalized(
5663
+ self, tmp_path: Path
5664
+ ) -> None:
5665
+ """#3363 review: a stale timestamp is not proof of death. A record
5666
+ whose `self._processes` entry is still alive (`proc.poll() is
5667
+ None`) must stay active and untouched no matter how far past the
5668
+ age ceiling it looks — finalizing it here would orphan the real
5669
+ subprocess with no WIP push (see `cancel()`'s push_mode handling),
5670
+ since a FAILED record no longer shows up in `/restart`'s
5671
+ `pending_ids` scan that would otherwise gracefully cancel it."""
5672
+ repo = _init_repo(tmp_path / "repo")
5673
+ server = _server(tmp_path, repo_path=repo)
5674
+ spec = self._make_spec(repo)
5675
+ now = 1_000_000.0
5676
+ server._assignments["stuck-but-alive"] = AgentAssignment(
5677
+ id="stuck-but-alive", spec=spec, status=RUNNING,
5678
+ started_at=now - _PHANTOM_ASSIGNMENT_MAX_AGE_S - 3600.0,
5679
+ )
5680
+ server._processes["stuck-but-alive"] = _FakeProc(alive=True)
5681
+
5682
+ assert server.active_assignment_count(now=now) == 1
5683
+ assert server._assignments["stuck-but-alive"].status == RUNNING, (
5684
+ "a confirmed-alive process must never be force-finalized"
5685
+ )
5686
+
5687
+ def test_stale_and_confirmed_exited_process_is_finalized(
5688
+ self, tmp_path: Path
5689
+ ) -> None:
5690
+ """The mirror case: a `self._processes` entry that HAS exited
5691
+ (`proc.poll()` returns a real code) is confirmed dead, so a stale
5692
+ record for it is still a genuine phantom and gets finalized exactly
5693
+ like the no-process-at-all case."""
5694
+ repo = _init_repo(tmp_path / "repo")
5695
+ server = _server(tmp_path, repo_path=repo)
5696
+ spec = self._make_spec(repo)
5697
+ now = 1_000_000.0
5698
+ server._assignments["dead-proc"] = AgentAssignment(
5699
+ id="dead-proc", spec=spec, status=RUNNING,
5700
+ started_at=now - _PHANTOM_ASSIGNMENT_MAX_AGE_S - 3600.0,
5701
+ )
5702
+ server._processes["dead-proc"] = _FakeProc(alive=False)
5703
+
5704
+ assert server.active_assignment_count(now=now) == 0
5705
+ assert server._assignments["dead-proc"].status == FAILED
5706
+
5707
+ def test_ceiling_scales_with_agent_configured_runtime_ceiling_s(
5708
+ self, tmp_path: Path
5709
+ ) -> None:
5710
+ """#3363 review: an operator-raised fleet-wide
5711
+ `runtime_ceiling_s` must raise the phantom-age ceiling to match,
5712
+ not get silently overridden by the hardcoded
5713
+ `_DEFAULT_RUNTIME_CEILING_S`. A record aged past the OLD
5714
+ (default-derived) ceiling but within the new, higher one must
5715
+ still count as active."""
5716
+ repo = _init_repo(tmp_path / "repo")
5717
+ raised_ceiling = _DEFAULT_RUNTIME_CEILING_S * 3
5718
+ server = _server(tmp_path, repo_path=repo, runtime_ceiling_s=raised_ceiling)
5719
+ spec = self._make_spec(repo)
5720
+ now = 1_000_000.0
5721
+ # Older than the old hardcoded 7h ceiling, but well inside the
5722
+ # raised one — with no live process, so the only thing that could
5723
+ # keep it active is the ceiling resolution itself.
5724
+ server._assignments["long-runner"] = AgentAssignment(
5725
+ id="long-runner", spec=spec, status=RUNNING,
5726
+ started_at=now - _PHANTOM_ASSIGNMENT_MAX_AGE_S - 3600.0,
5727
+ )
5728
+ assert server.active_assignment_count(now=now) == 1
5729
+ assert server._assignments["long-runner"].status == RUNNING
5730
+
5731
+ # But it's still finite: well past the RAISED ceiling, it's a
5732
+ # phantom again.
5733
+ now2 = now + raised_ceiling + _PHANTOM_AGE_MARGIN_S + 3600.0
5734
+ assert server.active_assignment_count(now=now2) == 0
5735
+ assert server._assignments["long-runner"].status == FAILED
5736
+
5737
+ def test_ceiling_scales_with_per_assignment_spec_override(
5738
+ self, tmp_path: Path
5739
+ ) -> None:
5740
+ """Same as above, but the override comes from
5741
+ `AssignmentSpec.runtime_ceiling_s` (a per-leg override) rather than
5742
+ the agent's own default — mirroring `_reap`'s own resolution order,
5743
+ where a positive per-leg value wins."""
5744
+ repo = _init_repo(tmp_path / "repo")
5745
+ server = _server(tmp_path, repo_path=repo)
5746
+ raised_ceiling = _DEFAULT_RUNTIME_CEILING_S * 3
5747
+ spec = AssignmentSpec(
5748
+ repo_name="api",
5749
+ repo_path=str(repo),
5750
+ issue_number=1,
5751
+ issue_title="t",
5752
+ briefing="b",
5753
+ branch="main",
5754
+ runtime_ceiling_s=raised_ceiling,
5755
+ )
5756
+ now = 1_000_000.0
5757
+ server._assignments["long-runner"] = AgentAssignment(
5758
+ id="long-runner", spec=spec, status=RUNNING,
5759
+ started_at=now - _PHANTOM_ASSIGNMENT_MAX_AGE_S - 3600.0,
5760
+ )
5761
+ assert server.active_assignment_count(now=now) == 1
5762
+ assert server._assignments["long-runner"].status == RUNNING
5763
+
5764
+
5765
+ class _FakeProc:
5766
+ """Minimal stand-in for `subprocess.Popen` exercising only `.poll()`,
5767
+ for `_active_assignment_ids`'s liveness check (#3363 review)."""
5768
+
5769
+ def __init__(self, *, alive: bool) -> None:
5770
+ self._alive = alive
5771
+
5772
+ def poll(self) -> int | None:
5773
+ return None if self._alive else 0
5774
+
5775
+
5539
5776
  # ── #1421: _persist() must not race on a shared tmp file, and a corrupt
5540
5777
  # agent_state.json must be surfaced rather than silently discarded ───────────
5541
5778