code-coordinator 0.5.331__tar.gz → 0.5.332__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 (825) hide show
  1. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. code_coordinator-0.5.332/code_coordinator.egg-info/scm_version.json +8 -0
  6. code_coordinator-0.5.332/coord/machine_metrics.py +217 -0
  7. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/serve_app.py +36 -1
  8. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/ADR_PY_RUST_MIRRORS.md +1 -0
  9. code_coordinator-0.5.332/tests/test_machine_metrics.py +229 -0
  10. code_coordinator-0.5.331/code_coordinator.egg-info/scm_version.json +0 -8
  11. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.claude/commands/board.md +0 -0
  12. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.claude/commands/complete-session.md +0 -0
  13. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.claude/commands/coordinator.md +0 -0
  14. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.githooks/_lib.sh +0 -0
  15. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.githooks/post-checkout +0 -0
  16. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.githooks/post-commit +0 -0
  17. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.githooks/post-merge +0 -0
  18. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.github/coord-ci-acceptance.yml +0 -0
  20. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.github/workflows/auto-release.yml +0 -0
  21. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.github/workflows/test.yml +0 -0
  23. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/.gitignore +0 -0
  24. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/CLAUDE.md +0 -0
  25. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/GOAL.md +0 -0
  26. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/LICENSE +0 -0
  27. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/MANIFEST.in +0 -0
  28. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/README.md +0 -0
  29. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/code_coordinator.egg-info/dependency_links.txt +0 -0
  30. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/code_coordinator.egg-info/entry_points.txt +0 -0
  31. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/code_coordinator.egg-info/requires.txt +0 -0
  32. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/code_coordinator.egg-info/top_level.txt +0 -0
  33. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/__init__.py +0 -0
  34. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/_board_mapping.py +0 -0
  35. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/acceptance.py +0 -0
  36. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/acceptance_drivers.py +0 -0
  37. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/agent.py +0 -0
  38. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/agent_app.py +0 -0
  39. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/agent_update.py +0 -0
  40. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/agents/opencode/.gitignore +0 -0
  41. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/agents/opencode/agents/work.md +0 -0
  42. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/agents/opencode/routing.jsonc +0 -0
  43. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/approved_work.py +0 -0
  44. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/audit.py +0 -0
  45. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/auto_loop.py +0 -0
  46. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/block_log.py +0 -0
  47. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/board_schema.py +0 -0
  48. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/board_service.py +0 -0
  49. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/board_wire.py +0 -0
  50. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/brain.py +0 -0
  51. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/branch_model.py +0 -0
  52. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/bug_intake.py +0 -0
  53. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/cargo_cache.py +0 -0
  54. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/ci_fix.py +0 -0
  55. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/ci_github.py +0 -0
  56. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/ci_gitlab.py +0 -0
  57. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/ci_store.py +0 -0
  58. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/claim.py +0 -0
  59. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/cli.py +0 -0
  60. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/client.py +0 -0
  61. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/__init__.py +0 -0
  62. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/_common.py +0 -0
  63. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/acceptance.py +0 -0
  64. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/agent_ops.py +0 -0
  65. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/audit.py +0 -0
  66. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/chat.py +0 -0
  67. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/dispatch.py +0 -0
  68. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/dispatch_workers.py +0 -0
  69. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/drive.py +0 -0
  70. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/drive_queue.py +0 -0
  71. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/gate_a.py +0 -0
  72. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/gates.py +0 -0
  73. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/issues.py +0 -0
  74. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/lifecycle.py +0 -0
  75. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/machine.py +0 -0
  76. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/merge.py +0 -0
  77. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/milestone.py +0 -0
  78. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/plan_followup.py +0 -0
  79. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/plans.py +0 -0
  80. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/portal.py +0 -0
  81. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/pr.py +0 -0
  82. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/release.py +0 -0
  83. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/repo.py +0 -0
  84. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/report.py +0 -0
  85. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/review.py +0 -0
  86. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/scorecard.py +0 -0
  87. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/sessions.py +0 -0
  88. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/setup.py +0 -0
  89. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/status.py +0 -0
  90. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/store_migrate.py +0 -0
  91. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/terminal.py +0 -0
  92. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/test_gate.py +0 -0
  93. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/commands/tui.py +0 -0
  94. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/comments.py +0 -0
  95. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/config.py +0 -0
  96. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/config_reload.py +0 -0
  97. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/confirm_test.py +0 -0
  98. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/conflict_fix.py +0 -0
  99. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/dao.py +0 -0
  100. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/dashboard/__init__.py +0 -0
  101. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/dashboard/fixture.py +0 -0
  102. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/dashboard/index.html +0 -0
  103. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/dashboard/server.py +0 -0
  104. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/dashboard/terminal.py +0 -0
  105. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/db.py +0 -0
  106. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/dead_end.py +0 -0
  107. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/decomposition_chat.py +0 -0
  108. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/README.md +0 -0
  109. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-agent.service +0 -0
  110. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-db-backup.service +0 -0
  111. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-db-backup.sh +0 -0
  112. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-db-backup.timer +0 -0
  113. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-drive-queue.service +0 -0
  114. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-drive-queue.timer +0 -0
  115. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-failure-notify.service +0 -0
  116. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-fleet-watchdog.service +0 -0
  117. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  118. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-notify.service +0 -0
  119. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-notify.timer +0 -0
  120. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-release-propagate.service +0 -0
  121. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-release-propagate.timer +0 -0
  122. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-release-window.service +0 -0
  123. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-release-window.timer +0 -0
  124. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-serve.service +0 -0
  125. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-web-dist-build.service +0 -0
  126. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-web-dist-build.timer +0 -0
  127. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy/coord-web.service +0 -0
  128. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy_manifest.py +0 -0
  129. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deploy_units.py +0 -0
  130. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deprecation_telemetry.py +0 -0
  131. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/deps.py +0 -0
  132. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/diagnose.py +0 -0
  133. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/dispatch.py +0 -0
  134. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/dist_name.py +0 -0
  135. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/drive.py +0 -0
  136. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/drive_queue.py +0 -0
  137. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/drive_state.py +0 -0
  138. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/events.py +0 -0
  139. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/failure_class.py +0 -0
  140. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/filelock.py +0 -0
  141. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/fleet_config_health.py +0 -0
  142. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/forge_availability.py +0 -0
  143. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/freshness.py +0 -0
  144. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/gate_a.py +0 -0
  145. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/gate_b.py +0 -0
  146. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/gate_snapshot.py +0 -0
  147. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/gates.py +0 -0
  148. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/github_ops.py +0 -0
  149. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/github_throttle.py +0 -0
  150. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/goal.py +0 -0
  151. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/graph_health.py +0 -0
  152. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/__init__.py +0 -0
  153. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/aggregate.py +0 -0
  154. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/__init__.py +0 -0
  155. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/_ci_pin.py +0 -0
  156. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/agent_install.py +0 -0
  157. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/cargo_targets.py +0 -0
  158. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/claude_binary.py +0 -0
  159. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  160. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/coord_web_ci_pin.py +0 -0
  161. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/deploy_lane_facts.py +0 -0
  162. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/disk.py +0 -0
  163. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/fleet_board.py +0 -0
  164. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  165. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/fleet_phantom.py +0 -0
  166. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/fleet_unit_drift.py +0 -0
  167. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/graph.py +0 -0
  168. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/graphify_cli.py +0 -0
  169. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/index_lock.py +0 -0
  170. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/issues_sync_staleness.py +0 -0
  171. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/plan_usage.py +0 -0
  172. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/release_cordon.py +0 -0
  173. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/repo_state.py +0 -0
  174. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/spawned_coord.py +0 -0
  175. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/stalled_pipeline.py +0 -0
  176. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/timer_active.py +0 -0
  177. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/toolchain.py +0 -0
  178. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/unit_drift.py +0 -0
  179. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/unit_enablement.py +0 -0
  180. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/wedged_drive_queue.py +0 -0
  181. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/checks/worktrees.py +0 -0
  182. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/cli.py +0 -0
  183. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/context.py +0 -0
  184. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/fleet_snapshot.py +0 -0
  185. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/models.py +0 -0
  186. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/pypi.py +0 -0
  187. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/registry.py +0 -0
  188. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/render.py +0 -0
  189. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/health/units.py +0 -0
  190. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/hooks.py +0 -0
  191. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/housekeeping.py +0 -0
  192. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/interactive.py +0 -0
  193. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/issue_store.py +0 -0
  194. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/issues_sync_status.py +0 -0
  195. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/liveness_auditor.py +0 -0
  196. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/machine_onboard.py +0 -0
  197. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/machine_pause.py +0 -0
  198. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/merge_queue.py +0 -0
  199. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/milestone_chat.py +0 -0
  200. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/milestone_dispatch.py +0 -0
  201. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/milestone_gate.py +0 -0
  202. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/milestone_order.py +0 -0
  203. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/mock_author.py +0 -0
  204. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/models.py +0 -0
  205. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/network.py +0 -0
  206. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/new_issue_chat.py +0 -0
  207. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/__init__.py +0 -0
  208. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/baseline.py +0 -0
  209. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/cli.py +0 -0
  210. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/collect.py +0 -0
  211. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/digest.py +0 -0
  212. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/models.py +0 -0
  213. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/predicate.py +0 -0
  214. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/service.py +0 -0
  215. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/store.py +0 -0
  216. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notifier/transport.py +0 -0
  217. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/notify.py +0 -0
  218. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/openapi.py +0 -0
  219. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/overlap_fence.py +0 -0
  220. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/overlap_predict.py +0 -0
  221. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/parentage.py +0 -0
  222. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/parentage_github.py +0 -0
  223. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/pipeline.py +0 -0
  224. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/plan_parser.py +0 -0
  225. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/plans.py +0 -0
  226. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/platform_paths.py +0 -0
  227. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/portal_bridge.py +0 -0
  228. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/portal_store.py +0 -0
  229. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/portal_sync.py +0 -0
  230. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/pr_body_lint.py +0 -0
  231. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/prereqs.py +0 -0
  232. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/progress.py +0 -0
  233. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/providers/__init__.py +0 -0
  234. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/providers/base.py +0 -0
  235. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/providers/claude.py +0 -0
  236. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/providers/claude_pty.py +0 -0
  237. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/providers/opencode.py +0 -0
  238. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/queue_diagnose.py +0 -0
  239. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/reconcile.py +0 -0
  240. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/reconcile_tick.py +0 -0
  241. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/refine_chat.py +0 -0
  242. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/release_cordon.py +0 -0
  243. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/release_propagate.py +0 -0
  244. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/release_verify.py +0 -0
  245. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/release_window.py +0 -0
  246. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/repo_dormancy.py +0 -0
  247. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/repo_edit.py +0 -0
  248. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/repo_onboard.py +0 -0
  249. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/reports.py +0 -0
  250. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/rest_schema.py +0 -0
  251. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/revalidate.py +0 -0
  252. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/review.py +0 -0
  253. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/scorecard.py +0 -0
  254. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/self_health.py +0 -0
  255. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  256. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  257. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  258. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  259. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/portal-followup/SKILL.md +0 -0
  261. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/release-now/SKILL.md +0 -0
  262. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  263. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  264. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/skills/update-issue/SKILL.md +0 -0
  265. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/smoke.py +0 -0
  266. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/spend_ceiling.py +0 -0
  267. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/split_work.py +0 -0
  268. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/sql.py +0 -0
  269. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/stage_projection.py +0 -0
  270. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/state.py +0 -0
  271. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/store_migrate.py +0 -0
  272. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/test_author.py +0 -0
  273. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/test_chat.py +0 -0
  274. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/test_orchestrator.py +0 -0
  275. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/test_report.py +0 -0
  276. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/tui_release.py +0 -0
  277. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/usage.py +0 -0
  278. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/usage_limits.py +0 -0
  279. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/usage_rollup.py +0 -0
  280. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coord/worker_events.py +0 -0
  281. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/coordinator.example.yml +0 -0
  282. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-agent.service +0 -0
  283. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-db-backup.service +0 -0
  284. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-db-backup.sh +0 -0
  285. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-db-backup.timer +0 -0
  286. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-drive-queue.service +0 -0
  287. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-drive-queue.timer +0 -0
  288. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-failure-notify.service +0 -0
  289. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-failure-notify.sh +0 -0
  290. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-fleet-watchdog.service +0 -0
  291. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-fleet-watchdog.timer +0 -0
  292. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-notify.service +0 -0
  293. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-notify.timer +0 -0
  294. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-release-propagate.service +0 -0
  295. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-release-propagate.timer +0 -0
  296. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-release-window.service +0 -0
  297. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-release-window.timer +0 -0
  298. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-serve.service +0 -0
  299. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-web-dist-build.service +0 -0
  300. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-web-dist-build.sh +0 -0
  301. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-web-dist-build.timer +0 -0
  302. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-web-rollback.sh +0 -0
  303. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/coord-web.service +0 -0
  304. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/deploy/node-shim.sh +0 -0
  305. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/ADR_COORD_TUI_CI.md +0 -0
  306. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  307. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/ADR_COORD_WEB_CI.md +0 -0
  308. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/ADR_COORD_WEB_DIST.md +0 -0
  309. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/AGENT_OPERATIONS.md +0 -0
  310. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/ARCHITECTURE.md +0 -0
  311. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/ARCH_SECURITY_GATES.md +0 -0
  312. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/COCKPIT.md +0 -0
  313. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/CONTROL_CENTER.md +0 -0
  314. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/COST_DISCIPLINE.md +0 -0
  315. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/CROSS_PLATFORM.md +0 -0
  316. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/CUSTOMER_FACING_APPS.md +0 -0
  317. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/CUSTOMER_PORTAL.md +0 -0
  318. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/DRIVE_QUEUE.md +0 -0
  319. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/EPHEMERAL_WORKERS.md +0 -0
  320. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/FORGE_MIGRATION.md +0 -0
  321. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/GRAPHIFY_SETUP.md +0 -0
  322. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/ISSUE_GUIDANCE.md +0 -0
  323. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/MAC_MINI.md +0 -0
  324. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  325. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/NOTIFIER.md +0 -0
  326. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/OPENCODE_VERIFICATION.md +0 -0
  327. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/OPERATING_GOTCHAS.md +0 -0
  328. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/OPERATOR_GUIDES.md +0 -0
  329. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/ORACLE_LOOP.md +0 -0
  330. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/PHONE_WEBAPP.md +0 -0
  331. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/PIPELINE_V2.md +0 -0
  332. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/PLATFORM_EVOLUTION.md +0 -0
  333. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/SECOND_BACKEND.md +0 -0
  334. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/STORE_SERVICE.md +0 -0
  335. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  336. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/WEB_CONTROL_CENTER.md +0 -0
  337. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/WSL_WINDOWS_WORKER.md +0 -0
  338. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/mocks/web/README.md +0 -0
  339. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/mocks/web/_tokens.css +0 -0
  340. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/mocks/web/issue-detail.html +0 -0
  341. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/mocks/web/pipeline-narrow.html +0 -0
  342. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/docs/mocks/web/pipeline-wide.html +0 -0
  343. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/graphify-out/.gitignore +0 -0
  344. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/install-agent.sh +0 -0
  345. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/pyproject.toml +0 -0
  346. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/audit_review_verdict_overrides.py +0 -0
  347. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  348. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/build-worker-image.sh +0 -0
  349. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/coordinator-machine.py +0 -0
  350. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/epic-down.sh +0 -0
  351. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/epic-up.sh +0 -0
  352. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/preflight.sh +0 -0
  353. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/provision-worker.sh +0 -0
  354. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  355. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  356. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/azure-workers/verify-github-token.sh +0 -0
  357. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/check_gh_argv_containment.py +0 -0
  358. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/codegen.py +0 -0
  359. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/coord-test-runner.sh +0 -0
  360. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  361. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  362. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  363. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  364. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/coord-venv-rollback.sh +0 -0
  365. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/drive-batch.sh +0 -0
  366. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/extract-coord-tui.sh +0 -0
  367. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/fleet_watchdog.py +0 -0
  368. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/gen_board_fixture.py +0 -0
  369. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/gen_mock_index.py +0 -0
  370. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/next_release_tag.py +0 -0
  371. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/run_tests_in_populated_home.sh +0 -0
  372. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/run_tests_without_gh.sh +0 -0
  373. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/smoke_437_interactive.py +0 -0
  374. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/verify_878_review_capture.py +0 -0
  375. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/verify_release_published.py +0 -0
  376. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/scripts/verify_release_wheel.py +0 -0
  377. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/setup.cfg +0 -0
  378. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/SMOKE_SET.md +0 -0
  379. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/__init__.py +0 -0
  380. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-37/conftest.py +0 -0
  381. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-37/contract.md +0 -0
  382. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-37/manifest.yml +0 -0
  383. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  384. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  385. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-51/contract.md +0 -0
  386. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  387. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  388. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-51/manifest.yml +0 -0
  389. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  390. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-51/tsconfig.json +0 -0
  391. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  392. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/backends.py +0 -0
  393. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/conftest.py +0 -0
  394. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/board-pipeline-basic.json +0 -0
  395. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  396. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  397. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  398. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  399. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/playwright/all_pass.json +0 -0
  400. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  401. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/playwright/mixed_fail.json +0 -0
  402. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  403. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  404. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/playwright/skip.json +0 -0
  405. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/playwright/truncated.json +0 -0
  406. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  407. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  408. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  409. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  410. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  411. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  412. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  413. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  414. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_acceptance.py +0 -0
  415. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_acceptance_drivers.py +0 -0
  416. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent.py +0 -0
  417. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_api_error.py +0 -0
  418. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_app.py +0 -0
  419. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_branch_base.py +0 -0
  420. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_branch_capture.py +0 -0
  421. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_config_free_1712.py +0 -0
  422. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_deploy_units_endpoint.py +0 -0
  423. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_dirty_worktree.py +0 -0
  424. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  425. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_graph_self_heal.py +0 -0
  426. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_health_h3.py +0 -0
  427. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_idle_restart.py +0 -0
  428. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_push_failure.py +0 -0
  429. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_reap.py +0 -0
  430. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_repos_and_pull.py +0 -0
  431. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_restart_services_endpoint.py +0 -0
  432. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_skills_self_heal.py +0 -0
  433. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_startup_diagnostics.py +0 -0
  434. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_update.py +0 -0
  435. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_update_bluegreen.py +0 -0
  436. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_usage_limit.py +0 -0
  437. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_agent_zero_commit.py +0 -0
  438. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_ambient_home_isolation.py +0 -0
  439. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_approve_dependency_busy_2804.py +0 -0
  440. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_approve_reject_plan.py +0 -0
  441. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_approve_usage_gate.py +0 -0
  442. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_approved_work_2532.py +0 -0
  443. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_approved_work_2996.py +0 -0
  444. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_assignment_already_recorded_daemon.py +0 -0
  445. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_audit_log.py +0 -0
  446. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_audit_outcome.py +0 -0
  447. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_audit_query.py +0 -0
  448. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_auto_loop.py +0 -0
  449. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_auto_release_publish_2035.py +0 -0
  450. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_backend_selection.py +0 -0
  451. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_base_checkout_restore.py +0 -0
  452. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_block_log.py +0 -0
  453. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_board_cap_762.py +0 -0
  454. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_board_fixture.py +0 -0
  455. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_board_read_path.py +0 -0
  456. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_board_schema.py +0 -0
  457. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_board_service.py +0 -0
  458. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_board_state.py +0 -0
  459. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_board_wire.py +0 -0
  460. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_brain.py +0 -0
  461. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_branch_model.py +0 -0
  462. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_bug_intake.py +0 -0
  463. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_build_worker_image_env_update.py +0 -0
  464. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cargo_cache.py +0 -0
  465. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_check_gh_argv_containment.py +0 -0
  466. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_ci_acceptance_gate_1950.py +0 -0
  467. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_ci_fix.py +0 -0
  468. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_ci_gitlab.py +0 -0
  469. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_ci_parity_2091.py +0 -0
  470. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_ci_store.py +0 -0
  471. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_claim.py +0 -0
  472. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_claude_md_budget.py +0 -0
  473. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_acceptance.py +0 -0
  474. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_assign.py +0 -0
  475. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  476. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_assign_interactive_remote.py +0 -0
  477. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_assign_provider.py +0 -0
  478. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  479. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_audit.py +0 -0
  480. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_chat_continue.py +0 -0
  481. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_decide.py +0 -0
  482. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_diagnose_capability_rules.py +0 -0
  483. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_diagnose_config_provenance.py +0 -0
  484. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_diagnose_forge_availability.py +0 -0
  485. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_diagnose_graph.py +0 -0
  486. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_diagnose_self.py +0 -0
  487. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_diagnose_test_coverage.py +0 -0
  488. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_doctor.py +0 -0
  489. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_doctor_config_free_1801.py +0 -0
  490. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  491. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_drive.py +0 -0
  492. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_drive_queue.py +0 -0
  493. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_escalate.py +0 -0
  494. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_fix_headless_review.py +0 -0
  495. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_gate_a.py +0 -0
  496. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_install_drift.py +0 -0
  497. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_install_skills.py +0 -0
  498. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_issue_comment.py +0 -0
  499. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_issue_create_label.py +0 -0
  500. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_issue_reopen.py +0 -0
  501. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_issue_view_list.py +0 -0
  502. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_merge.py +0 -0
  503. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_milestone_assign.py +0 -0
  504. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_milestone_capture.py +0 -0
  505. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_milestone_chat_add_child.py +0 -0
  506. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_milestone_dispatch.py +0 -0
  507. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_milestone_gate_b.py +0 -0
  508. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_milestone_gate_c.py +0 -0
  509. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_milestone_order.py +0 -0
  510. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  511. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_milestone_ship.py +0 -0
  512. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_network.py +0 -0
  513. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_new_issue_chat.py +0 -0
  514. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_plans.py +0 -0
  515. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_portal.py +0 -0
  516. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_pr.py +0 -0
  517. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_pull_artifact.py +0 -0
  518. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_queue.py +0 -0
  519. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_reattach_sessions.py +0 -0
  520. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_refine_board.py +0 -0
  521. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_release_preflight.py +0 -0
  522. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_release_propagate.py +0 -0
  523. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_release_window.py +0 -0
  524. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_repo_2220.py +0 -0
  525. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  526. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_scorecard.py +0 -0
  527. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_set_review_findings.py +0 -0
  528. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_status_advisory_terminal.py +0 -0
  529. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_status_contested_tag.py +0 -0
  530. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_status_merge_queue.py +0 -0
  531. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_status_provider.py +0 -0
  532. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_status_review_finalizing.py +0 -0
  533. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_status_test_failed_tag.py +0 -0
  534. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_status_usage_limit.py +0 -0
  535. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_sync_comments_873.py +0 -0
  536. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_test_plan.py +0 -0
  537. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_track.py +0 -0
  538. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_tui_update.py +0 -0
  539. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cli_wait.py +0 -0
  540. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_client_base_install.py +0 -0
  541. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_client_resource_migration_1946.py +0 -0
  542. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_commands_common.py +0 -0
  543. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_comments.py +0 -0
  544. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_completion_summary.py +0 -0
  545. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_config.py +0 -0
  546. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_config_acceptance.py +0 -0
  547. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_config_audit.py +0 -0
  548. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_config_pricing.py +0 -0
  549. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  550. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_config_usage_gate.py +0 -0
  551. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_confirm_test.py +0 -0
  552. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_conflict_fix.py +0 -0
  553. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_conflict_fix_semantic.py +0 -0
  554. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  555. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coord_test.py +0 -0
  556. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  557. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coord_test_runner_baseline.py +0 -0
  558. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coord_test_runner_populated_home.py +0 -0
  559. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coord_test_runner_routing.py +0 -0
  560. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coord_test_runner_toolchain.py +0 -0
  561. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coord_uat.py +0 -0
  562. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coord_web_sse_restart_live.py +0 -0
  563. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_coordinator_machine.py +0 -0
  564. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_cross_platform_imports.py +0 -0
  565. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dao.py +0 -0
  566. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dashboard.py +0 -0
  567. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dashboard_api.py +0 -0
  568. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dashboard_fixture.py +0 -0
  569. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dashboard_terminal.py +0 -0
  570. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dashboard_terminal_live.py +0 -0
  571. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_db.py +0 -0
  572. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dead_end.py +0 -0
  573. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_decomposition_chat.py +0 -0
  574. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deploy_coord_db_backup.py +0 -0
  575. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deploy_coord_web_dist.py +0 -0
  576. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deploy_coord_web_rollback.py +0 -0
  577. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deploy_drive_queue_unit.py +0 -0
  578. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deploy_failure_notify_unit.py +0 -0
  579. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deploy_manifest.py +0 -0
  580. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deploy_notify_unit.py +0 -0
  581. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deploy_units_lane.py +0 -0
  582. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deploy_web_unit.py +0 -0
  583. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deprecation_telemetry.py +0 -0
  584. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_deps.py +0 -0
  585. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_diagnose.py +0 -0
  586. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dispatch.py +0 -0
  587. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dispatch_target_validation.py +0 -0
  588. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_dist_name.py +0 -0
  589. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_done_housekeeping.py +0 -0
  590. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_drive.py +0 -0
  591. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_drive_queue.py +0 -0
  592. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_drive_queue_blocked_rendering.py +0 -0
  593. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_drive_queue_launch_argv.py +0 -0
  594. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  595. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_drive_queue_roll_pending.py +0 -0
  596. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  597. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_drive_state.py +0 -0
  598. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_drive_tmux.py +0 -0
  599. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_epic_up_capability_detection.py +0 -0
  600. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  601. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_epic_up_image_provenance.py +0 -0
  602. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_errors.py +0 -0
  603. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_events.py +0 -0
  604. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_failure_class.py +0 -0
  605. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_filelock.py +0 -0
  606. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  607. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_fix_of_force_override.py +0 -0
  608. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_fleet_config_health.py +0 -0
  609. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_fleet_health_probes.py +0 -0
  610. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_fleet_health_snapshot.py +0 -0
  611. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_fleet_watchdog.py +0 -0
  612. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_forge_availability.py +0 -0
  613. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_freshness.py +0 -0
  614. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_gate_a.py +0 -0
  615. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_gate_b.py +0 -0
  616. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_gate_snapshot_staleness.py +0 -0
  617. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_gates.py +0 -0
  618. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  619. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_gen_mock_index.py +0 -0
  620. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_generated_rust_fixture.py +0 -0
  621. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_generated_rust_requests.py +0 -0
  622. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_generated_types_fixture.py +0 -0
  623. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_github_ops.py +0 -0
  624. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_github_throttle.py +0 -0
  625. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_goal.py +0 -0
  626. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_graph_health.py +0 -0
  627. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_graph_selfheal_absent_2237.py +0 -0
  628. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_handoff.py +0 -0
  629. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_checks.py +0 -0
  630. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_cli.py +0 -0
  631. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_cli_graph.py +0 -0
  632. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_config.py +0 -0
  633. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_context.py +0 -0
  634. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_coord_tui_ci_pin.py +0 -0
  635. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_coord_web_ci_pin.py +0 -0
  636. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_deploy_lane_facts.py +0 -0
  637. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_fix.py +0 -0
  638. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_incident_regression.py +0 -0
  639. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_issues_sync_staleness.py +0 -0
  640. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_pypi.py +0 -0
  641. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_registry.py +0 -0
  642. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_release_cordon_probe.py +0 -0
  643. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_timer_active.py +0 -0
  644. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_toolchain.py +0 -0
  645. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_unit_drift.py +0 -0
  646. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_unit_enablement.py +0 -0
  647. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_health_wedged_drive_queue.py +0 -0
  648. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_hooks.py +0 -0
  649. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_human_attended_437.py +0 -0
  650. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_init.py +0 -0
  651. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_install_agent_venv_2911.py +0 -0
  652. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_integration.py +0 -0
  653. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_interactive_briefing_echo.py +0 -0
  654. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_interactive_pane_log_2541.py +0 -0
  655. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_interactive_prefill_state.py +0 -0
  656. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_interactive_session_relaunch.py +0 -0
  657. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_interactive_test_verdict_backstop.py +0 -0
  658. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_interactive_token_attribution.py +0 -0
  659. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_interactive_worktree.py +0 -0
  660. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_issue_store_seam.py +0 -0
  661. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_issues_sync_status.py +0 -0
  662. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_liveness_auditor.py +0 -0
  663. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_liveness_notify.py +0 -0
  664. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_lock_contention_ratchet.py +0 -0
  665. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_machine_onboard.py +0 -0
  666. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_machine_pause.py +0 -0
  667. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_merge_queue.py +0 -0
  668. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_merge_verify.py +0 -0
  669. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_milestone_chat.py +0 -0
  670. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_milestone_dispatch.py +0 -0
  671. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_milestone_gate.py +0 -0
  672. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_milestone_order.py +0 -0
  673. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_milestone_seam.py +0 -0
  674. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_mock_author.py +0 -0
  675. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_model_tiering.py +0 -0
  676. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_models.py +0 -0
  677. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_models_config_labels.py +0 -0
  678. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_needs_attention.py +0 -0
  679. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_network.py +0 -0
  680. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_new_issue_chat.py +0 -0
  681. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_next_release_tag.py +0 -0
  682. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_node_shim.py +0 -0
  683. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notifier_baseline.py +0 -0
  684. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notifier_cli.py +0 -0
  685. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notifier_collect.py +0 -0
  686. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notifier_config.py +0 -0
  687. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notifier_drive_seam.py +0 -0
  688. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notifier_isolation.py +0 -0
  689. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notifier_predicate.py +0 -0
  690. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notifier_quiet_hours.py +0 -0
  691. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notifier_service.py +0 -0
  692. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notify.py +0 -0
  693. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_notify_drain.py +0 -0
  694. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_openapi.py +0 -0
  695. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_operational_defaults.py +0 -0
  696. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_overlap_fence.py +0 -0
  697. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_overlap_predict.py +0 -0
  698. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_packaged_deploy_units.py +0 -0
  699. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_parentage.py +0 -0
  700. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_paste_landed.py +0 -0
  701. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  702. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_pipeline.py +0 -0
  703. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_plan_followup_approve_plan_command.py +0 -0
  704. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_plan_followup_pr_command.py +0 -0
  705. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_plan_followup_review_command.py +0 -0
  706. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_plan_only.py +0 -0
  707. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_plan_parser.py +0 -0
  708. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_platform_paths.py +0 -0
  709. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_portal_bridge.py +0 -0
  710. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_portal_config.py +0 -0
  711. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_portal_store.py +0 -0
  712. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_portal_sync.py +0 -0
  713. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_pr_body_lint.py +0 -0
  714. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_prereqs.py +0 -0
  715. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_production_db_guard.py +0 -0
  716. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_progress.py +0 -0
  717. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_provider_seam.py +0 -0
  718. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_providers.py +0 -0
  719. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_providers_config_labels.py +0 -0
  720. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_providers_pty.py +0 -0
  721. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_py_rust_mirror_inventory.py +0 -0
  722. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_quiet_hours.py +0 -0
  723. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_quiet_hours_store_2146.py +0 -0
  724. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reap_merged_sessions.py +0 -0
  725. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reap_stale_interactive_tick.py +0 -0
  726. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reconcile.py +0 -0
  727. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reconcile_branch.py +0 -0
  728. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reconcile_completions.py +0 -0
  729. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  730. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reconcile_merges.py +0 -0
  731. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reconcile_no_agent_record.py +0 -0
  732. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reconcile_tick.py +0 -0
  733. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reconcile_usage_limit_done.py +0 -0
  734. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_refine_chat.py +0 -0
  735. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_cordon_2101.py +0 -0
  736. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  737. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_cordon_deadlock_2240.py +0 -0
  738. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_cordon_stuck_2490.py +0 -0
  739. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_propagate.py +0 -0
  740. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_propagate_threshold.py +0 -0
  741. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_roll_between_legs_2854.py +0 -0
  742. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_roll_window_handoff.py +0 -0
  743. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_unified_1242.py +0 -0
  744. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_verify.py +0 -0
  745. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_release_window.py +0 -0
  746. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_remote_auto_prune.py +0 -0
  747. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_remote_interactive_reaper.py +0 -0
  748. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_repo_add.py +0 -0
  749. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_repo_dormancy.py +0 -0
  750. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_repo_edit_2220.py +0 -0
  751. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_repo_graph_fleet_2237.py +0 -0
  752. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_repo_onboard_2220.py +0 -0
  753. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_report_result_push.py +0 -0
  754. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_reports.py +0 -0
  755. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_retry.py +0 -0
  756. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_retry_advisory_1606.py +0 -0
  757. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_retry_type_1636.py +0 -0
  758. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_revalidate.py +0 -0
  759. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_review.py +0 -0
  760. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_review_end_review_without_verdict.py +0 -0
  761. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_review_parse_failure_diagnostic.py +0 -0
  762. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_review_reaffirm.py +0 -0
  763. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_review_state.py +0 -0
  764. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_review_verdict_backstop.py +0 -0
  765. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_review_verdict_override_audit.py +0 -0
  766. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_review_verdict_relay.py +0 -0
  767. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_review_zero_commits.py +0 -0
  768. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_scoped_review_wiring.py +0 -0
  769. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_scorecard.py +0 -0
  770. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_self_health.py +0 -0
  771. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_serve.py +0 -0
  772. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_serve_app_board_trim.py +0 -0
  773. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_serve_rest_routes.py +0 -0
  774. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_session.py +0 -0
  775. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_slice_issue_attribution.py +0 -0
  776. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_smoke.py +0 -0
  777. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_smoke_live_checkout_restore.py +0 -0
  778. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_smoke_workflow.py +0 -0
  779. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_spend_ceiling.py +0 -0
  780. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_spend_ceiling_coordinator.py +0 -0
  781. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_split.py +0 -0
  782. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_split_work.py +0 -0
  783. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_sql_dialect.py +0 -0
  784. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_sqlite_connect_ratchet.py +0 -0
  785. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_stage_projection.py +0 -0
  786. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_stale_busy_reviewer_697.py +0 -0
  787. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_stalled_pipeline.py +0 -0
  788. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_state.py +0 -0
  789. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_state_review_findings_daemon.py +0 -0
  790. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_status_fleet_footer.py +0 -0
  791. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_stop_1567.py +0 -0
  792. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_store_contract.py +0 -0
  793. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_store_migrate.py +0 -0
  794. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_stuck.py +0 -0
  795. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  796. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_terminal_command.py +0 -0
  797. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_test_author.py +0 -0
  798. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_test_chat.py +0 -0
  799. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_test_orchestrator.py +0 -0
  800. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_test_report.py +0 -0
  801. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_test_verdict_parsing.py +0 -0
  802. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_test_verdict_transcript_floor.py +0 -0
  803. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_text_io_encoding_audit.py +0 -0
  804. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_thin_client_board_audit.py +0 -0
  805. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_thin_client_config_load_1080.py +0 -0
  806. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_thin_client_daemon_routing_906.py +0 -0
  807. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_tmux_host.py +0 -0
  808. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_tmux_session.py +0 -0
  809. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_transcript_floor.py +0 -0
  810. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_usage.py +0 -0
  811. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_usage_limits.py +0 -0
  812. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_usage_rollup.py +0 -0
  813. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_venv_live_install_2121.py +0 -0
  814. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_version_single_source.py +0 -0
  815. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_watch.py +0 -0
  816. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  817. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_worker_env_venv_isolation.py +0 -0
  818. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_worker_events.py +0 -0
  819. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_worker_image_pin_sync.py +0 -0
  820. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_worker_safety.py +0 -0
  821. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_worker_test_scoping.py +0 -0
  822. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_worktree.py +0 -0
  823. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  824. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/tests/test_write_parity.py +0 -0
  825. {code_coordinator-0.5.331 → code_coordinator-0.5.332}/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.331
3
+ Version: 0.5.332
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.331
3
+ Version: 0.5.332
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
@@ -91,6 +91,7 @@ coord/interactive.py
91
91
  coord/issue_store.py
92
92
  coord/issues_sync_status.py
93
93
  coord/liveness_auditor.py
94
+ coord/machine_metrics.py
94
95
  coord/machine_onboard.py
95
96
  coord/machine_pause.py
96
97
  coord/merge_queue.py
@@ -625,6 +626,7 @@ tests/test_issues_sync_status.py
625
626
  tests/test_liveness_auditor.py
626
627
  tests/test_liveness_notify.py
627
628
  tests/test_lock_contention_ratchet.py
629
+ tests/test_machine_metrics.py
628
630
  tests/test_machine_onboard.py
629
631
  tests/test_machine_pause.py
630
632
  tests/test_merge_queue.py
@@ -181,6 +181,7 @@
181
181
  "coord/issue_store.py",
182
182
  "coord/issues_sync_status.py",
183
183
  "coord/liveness_auditor.py",
184
+ "coord/machine_metrics.py",
184
185
  "coord/machine_onboard.py",
185
186
  "coord/machine_pause.py",
186
187
  "coord/merge_queue.py",
@@ -651,6 +652,7 @@
651
652
  "tests/test_liveness_auditor.py",
652
653
  "tests/test_liveness_notify.py",
653
654
  "tests/test_lock_contention_ratchet.py",
655
+ "tests/test_machine_metrics.py",
654
656
  "tests/test_machine_onboard.py",
655
657
  "tests/test_machine_pause.py",
656
658
  "tests/test_merge_queue.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.332",
3
+ "distance": 0,
4
+ "node": "g9eb084d2d068fc5fdf96e3a5de7f75bb41902679",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-01"
8
+ }
@@ -0,0 +1,217 @@
1
+ """Coordinator-side machine metrics sampler + bounded ring buffer (#3020).
2
+
3
+ Part of milestone #71 (Fleet metrics + machines API) — the backend half of
4
+ the coord-web Machines panel.
5
+
6
+ ``coord-tui`` renders CPU/mem sparklines by polling **each agent's own**
7
+ ``/metrics`` endpoint directly on port 7433 (``coord.agent_app.metrics``, a
8
+ ``psutil`` cpu/mem snapshot) and buffering samples in-process for as long as
9
+ the panel stays open (see ``coord-tui/src/app/data.rs``
10
+ ``spawn_machine_metrics``). A browser can't do that — ``coord web`` is a
11
+ single-origin HTTP client of the dashboard API, not something that can fan
12
+ out to N agent hosts — and nothing anywhere persists a series; the TUI's
13
+ ``VecDeque`` dies with the panel.
14
+
15
+ This module is the one missing thing: a coordinator-side sampler, owned by
16
+ the board daemon (``coord serve``) and driven off its existing periodic-loop
17
+ machinery (mirrors ``coord.health.fleet_snapshot.FleetHealthRefresher`` and
18
+ ``coord.gate_snapshot.GateSnapshotRefresher`` — see ``coord.serve_app``'s
19
+ ``_machine_metrics_loop``, isolated from ``_tick_loop`` for the identical
20
+ reason those two are: a fan-out HTTP GET per agent must never block, or be
21
+ blocked by, the reconcile/enqueue/drain steps).
22
+
23
+ **Bounded, not incidental (#3020).** Each machine gets its own
24
+ ``collections.deque(maxlen=...)`` ring buffer sized for a ~6h window at the
25
+ default ~15s cadence (:data:`DEFAULT_MAX_SAMPLES` = 1440) — old samples are
26
+ evicted automatically as new ones arrive; the process can never accumulate
27
+ unbounded history no matter how long the daemon stays up.
28
+
29
+ **``unknown``, never a silent gap (#1485).** A failed, timed-out, or 503
30
+ (psutil not installed) poll still appends a sample — with
31
+ ``status="unknown"`` — never nothing. A renderer building a sparkline from
32
+ this series must be able to tell "no data point" (a gap it filled in itself)
33
+ from "the daemon tried and the agent didn't answer" (an explicit unknown
34
+ sample); silently skipping the append would collapse that distinction back
35
+ into "looks the same as healthy", the exact failure mode
36
+ ``coord.health.fleet_snapshot`` already guards against for machine health.
37
+
38
+ **No persistence.** This is purely in-memory; history is lost on daemon
39
+ restart by design (a sqlite time-series was considered and deliberately
40
+ rejected for this milestone — see the issue).
41
+
42
+ **Out of scope here.** The read endpoint for this series (#A2) and putting
43
+ it on ``/board`` (explicitly rejected — every TUI client polls ``/board`` on
44
+ a short interval and ``FleetHealthSnapshot`` already carries a 256 KiB cap
45
+ for exactly this reason) are not this module's job.
46
+ """
47
+
48
+ from __future__ import annotations
49
+
50
+ import logging
51
+ import time
52
+ from collections import deque
53
+ from concurrent.futures import ThreadPoolExecutor
54
+ from dataclasses import dataclass
55
+
56
+ import httpx
57
+
58
+ from coord.network import AGENT_PORT, DEFAULT_TIMEOUT, classify_error
59
+
60
+ log = logging.getLogger("coord.serve")
61
+
62
+ # ~6h of history at the default ~15s cadence. Explicit and enforced (each
63
+ # per-machine buffer is a `deque(maxlen=...)`, not a list someone forgot to
64
+ # trim) rather than incidental.
65
+ DEFAULT_MAX_SAMPLES = 1440
66
+ DEFAULT_CADENCE_SECONDS = 15.0
67
+
68
+ STATUS_OK = "ok"
69
+ STATUS_UNKNOWN = "unknown"
70
+
71
+
72
+ @dataclass(frozen=True)
73
+ class MetricsSample:
74
+ """One machine, one point in time. ``status="unknown"`` carries no
75
+ cpu/mem values — never fabricated zeros — only a human-readable
76
+ ``reason`` for why the poll didn't produce a real reading.
77
+ """
78
+
79
+ timestamp: float
80
+ status: str # STATUS_OK | STATUS_UNKNOWN
81
+ cpu_percent: float | None = None
82
+ mem_percent: float | None = None
83
+ mem_used_mb: float | None = None
84
+ mem_total_mb: float | None = None
85
+ reason: str = ""
86
+
87
+ def to_dict(self) -> dict:
88
+ return {
89
+ "timestamp": self.timestamp,
90
+ "status": self.status,
91
+ "cpu_percent": self.cpu_percent,
92
+ "mem_percent": self.mem_percent,
93
+ "mem_used_mb": self.mem_used_mb,
94
+ "mem_total_mb": self.mem_total_mb,
95
+ "reason": self.reason,
96
+ }
97
+
98
+
99
+ def _unknown(reason: str, *, now: float | None = None) -> MetricsSample:
100
+ return MetricsSample(
101
+ timestamp=now if now is not None else time.time(),
102
+ status=STATUS_UNKNOWN,
103
+ reason=reason,
104
+ )
105
+
106
+
107
+ def fetch_metrics(machine, timeout: float = DEFAULT_TIMEOUT) -> MetricsSample: # noqa: ANN001 — coord.models.Machine
108
+ """GET one machine's agent ``/metrics`` and classify the result.
109
+
110
+ Mirrors ``coord.network.check_machine``'s error classification but
111
+ targets ``/metrics`` instead of ``/health``. Never raises: every failure
112
+ mode — connect/read timeout, DNS failure, connection refused, a non-200
113
+ status (including the documented 503 an agent returns when ``psutil``
114
+ isn't installed), and malformed/missing-field JSON — becomes an explicit
115
+ :data:`STATUS_UNKNOWN` sample rather than an exception or a dropped
116
+ point. The bounded ``timeout`` (default :data:`coord.network.
117
+ DEFAULT_TIMEOUT`, 3s) is what keeps one hanging agent from stalling this
118
+ call past that ceiling; :class:`MachineMetricsSampler.refresh` is what
119
+ keeps that bounded stall from serializing behind every other machine.
120
+ """
121
+ url = f"http://{machine.host}:{AGENT_PORT}/metrics"
122
+ try:
123
+ resp = httpx.get(url, timeout=timeout)
124
+ except Exception as e: # noqa: BLE001 — classify every network error, never raise
125
+ _, reason = classify_error(e)
126
+ return _unknown(reason)
127
+
128
+ if resp.status_code == 503:
129
+ # #207's documented shape: psutil not installed on that agent.
130
+ return _unknown("psutil not installed on agent")
131
+ if resp.status_code != 200:
132
+ return _unknown(f"HTTP {resp.status_code}")
133
+
134
+ try:
135
+ data = resp.json()
136
+ except ValueError:
137
+ return _unknown("invalid JSON from /metrics")
138
+
139
+ try:
140
+ return MetricsSample(
141
+ timestamp=time.time(),
142
+ status=STATUS_OK,
143
+ cpu_percent=float(data["cpu_percent"]),
144
+ mem_percent=float(data["mem_percent"]),
145
+ mem_used_mb=float(data["mem_used_mb"]),
146
+ mem_total_mb=float(data["mem_total_mb"]),
147
+ )
148
+ except (KeyError, TypeError, ValueError):
149
+ return _unknown("malformed /metrics payload")
150
+
151
+
152
+ class MachineMetricsSampler:
153
+ """Owns the bounded per-machine ring buffers; refreshed by the daemon tick.
154
+
155
+ ``series()``/``all_series()`` are the read path — bare in-memory reads,
156
+ no I/O, safe to call from a request handler. ``refresh(config)`` is the
157
+ only method that talks to agents and must only ever run from the
158
+ daemon's tick machinery (or a test driving it explicitly), exactly the
159
+ same split as ``coord.health.fleet_snapshot.FleetHealthRefresher``.
160
+ """
161
+
162
+ def __init__(
163
+ self,
164
+ *,
165
+ max_samples: int = DEFAULT_MAX_SAMPLES,
166
+ timeout: float = DEFAULT_TIMEOUT,
167
+ ) -> None:
168
+ if max_samples <= 0:
169
+ raise ValueError("max_samples must be positive")
170
+ self._max_samples = max_samples
171
+ self._timeout = timeout
172
+ self._buffers: dict[str, deque] = {}
173
+
174
+ def series(self, machine_name: str) -> list[dict]:
175
+ """This machine's samples, oldest first. ``[]`` if never polled."""
176
+ buf = self._buffers.get(machine_name)
177
+ return [s.to_dict() for s in buf] if buf else []
178
+
179
+ def all_series(self) -> dict[str, list[dict]]:
180
+ """Every known machine's series, oldest-first, keyed by name."""
181
+ return {name: [s.to_dict() for s in buf] for name, buf in self._buffers.items()}
182
+
183
+ def refresh(self, config) -> None: # noqa: ANN001 — coord.config.Config
184
+ """Poll every machine in ``config.machines`` once and append a sample
185
+ each — :data:`STATUS_OK` or :data:`STATUS_UNKNOWN`, never neither.
186
+
187
+ Polls concurrently (mirrors ``coord.network.check_all``): each call
188
+ is individually bounded by ``timeout``, and running them in a thread
189
+ pool rather than sequentially means one slow/hanging agent's bounded
190
+ stall does not serialize in front of the rest of the fleet's polls —
191
+ the whole ``refresh()`` call takes roughly one ``timeout``, not
192
+ ``len(machines) * timeout``, no matter which machine is the slow
193
+ one. Called off the event loop (``run_in_threadpool`` from
194
+ ``coord.serve_app``'s own loop, isolated from ``_tick_loop``) so
195
+ even that bound never touches board-read latency.
196
+ """
197
+ machines = list(getattr(config, "machines", ()) or ())
198
+ if not machines:
199
+ return
200
+
201
+ workers = min(8, len(machines))
202
+ with ThreadPoolExecutor(max_workers=workers) as pool:
203
+ samples = list(pool.map(self._poll_one, machines))
204
+
205
+ for machine, sample in zip(machines, samples):
206
+ buf = self._buffers.get(machine.name)
207
+ if buf is None:
208
+ buf = deque(maxlen=self._max_samples)
209
+ self._buffers[machine.name] = buf
210
+ buf.append(sample)
211
+
212
+ def _poll_one(self, machine) -> MetricsSample: # noqa: ANN001
213
+ try:
214
+ return fetch_metrics(machine, timeout=self._timeout)
215
+ except Exception as exc: # noqa: BLE001 — one bad machine must never abort the refresh
216
+ log.warning("machine-metrics poll: %s raised %s", machine.name, exc)
217
+ return _unknown(f"poll raised: {exc}")
@@ -5340,6 +5340,15 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
5340
5340
 
5341
5341
  _fleet_health_refresher = FleetHealthRefresher()
5342
5342
 
5343
+ # #3020: same shape again — polling every agent's own /metrics is real
5344
+ # per-machine I/O, so it runs on the tick loop's cadence
5345
+ # (`_machine_metrics_loop` below), never inline off a request handler.
5346
+ # Series live only in this sampler's bounded in-memory ring buffers; no
5347
+ # read endpoint exists yet (that's #A2) and nothing here touches /board.
5348
+ from coord.machine_metrics import MachineMetricsSampler # noqa: PLC0415
5349
+
5350
+ _machine_metrics_sampler = MachineMetricsSampler()
5351
+
5343
5352
  # Short-TTL cache for the computed /board projection so burst polls from the
5344
5353
  # TUI don't each pay the full board_projection + merge-plan + stage-projection
5345
5354
  # recomputation (~465-issue load measured in the issue). Keyed to nothing
@@ -9452,6 +9461,26 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
9452
9461
  except Exception: # noqa: BLE001 — keep serving the old snapshot
9453
9462
  log.warning("fleet-health refresh failed", exc_info=True)
9454
9463
 
9464
+ # #3020: CPU/mem sampler for the coord-web Machines panel — default
9465
+ # 15s (env COORD_METRICS_POLL_INTERVAL; 0 disables). Own loop, not a
9466
+ # `_tick_loop` step, for the identical reason as `_health_refresh_loop`
9467
+ # just above: it fans out one HTTP GET per agent and must never be
9468
+ # held up behind, or hold up, the reconcile/enqueue/drain steps.
9469
+ try:
9470
+ metrics_poll_interval = float(
9471
+ os.environ.get("COORD_METRICS_POLL_INTERVAL", "15")
9472
+ )
9473
+ except ValueError:
9474
+ metrics_poll_interval = 15.0
9475
+
9476
+ async def _machine_metrics_loop() -> None:
9477
+ while True:
9478
+ await asyncio.sleep(metrics_poll_interval)
9479
+ try:
9480
+ await run_in_threadpool(_machine_metrics_sampler.refresh, config)
9481
+ except Exception: # noqa: BLE001 — a tick must never crash the daemon
9482
+ log.warning("machine-metrics refresh failed", exc_info=True)
9483
+
9455
9484
  # #2570: the #2536 phantom-row auto-heal, run a SECOND time from
9456
9485
  # inside this long-lived process rather than relying solely on
9457
9486
  # `coord-notify.timer`'s oneshot `~/.coord-venv/bin/coord notify`
@@ -10218,12 +10247,18 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
10218
10247
  else None,
10219
10248
  "auto-revalidate",
10220
10249
  )
10250
+ machine_metrics_task = _watch(
10251
+ asyncio.create_task(_machine_metrics_loop())
10252
+ if interval > 0 and metrics_poll_interval > 0
10253
+ else None,
10254
+ "machine-metrics",
10255
+ )
10221
10256
  try:
10222
10257
  yield
10223
10258
  finally:
10224
10259
  for t in (
10225
10260
  task, gate_task, health_task, phantom_heal_task,
10226
- auto_revalidate_task,
10261
+ auto_revalidate_task, machine_metrics_task,
10227
10262
  ):
10228
10263
  if t is not None:
10229
10264
  t.cancel()
@@ -97,6 +97,7 @@ they drift, the symbol names do not — grep the symbol if the line has moved.
97
97
  | `coord/commands/terminal.py:5` | `src/app/terminal.rs` | The embedded-terminal session contract. |
98
98
  | `coord/commands/_common.py:308` | `src/app/pipeline.rs` | Which acceptance subcommand the TUI's Pipeline dispatch fires. |
99
99
  | `coord/health/checks/deploy_lane_facts.py:115` | `src/app/data.rs` | Not a logic mirror: the *structural marker path* `resolve_coord_tui_checkout` uses to recognise a coord-tui checkout, and the pre-#2899 spelling it must NOT match. Listed because it is a hard-coded coord-tui path and would break on a layout change there. |
100
+ | `coord/machine_metrics.py:9` | `src/app/data.rs::spawn_machine_metrics` | The per-agent `GET :7433/metrics` polling contract (`coord.agent_app.metrics`: a `psutil` cpu/mem snapshot, `503` when psutil is absent). Two *independent* samplers now read that one endpoint — coord-tui's in-process `VecDeque`, live only while its panel is open, and the daemon-side ring buffer added by #3020. Not a logic mirror and not a divergence risk in itself: both sides consume the same wire, which is the endpoint's own contract, not a re-derived rule. Listed because it is a hard-coded reference to a coord-tui source symbol, and because a future change to the `/metrics` payload has to be made aware of *both* readers. |
100
101
 
101
102
  ## Consequences
102
103
 
@@ -0,0 +1,229 @@
1
+ """#3020: the coordinator-side machine-metrics sampler + bounded ring buffer.
2
+
3
+ Covers the three acceptance bullets from the issue:
4
+ 1. bound enforcement — the per-machine ring buffer never grows unbounded;
5
+ oldest samples are evicted as new ones arrive.
6
+ 2. `unknown`, never a silent gap — a failed / timed-out / 503 poll still
7
+ appends an explicit unknown sample (#1485: absence must never render as
8
+ healthy).
9
+ 3. a hanging agent cannot stall the sampler for other machines — polls run
10
+ concurrently, each individually bounded by its own timeout.
11
+
12
+ No live fleet contact: every test monkeypatches ``httpx.get`` (or the
13
+ sampler's own per-machine poll) rather than reaching a real agent.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import time
19
+
20
+ import httpx
21
+ import pytest
22
+
23
+ from coord import machine_metrics as mm
24
+ from coord.config import Config
25
+ from coord.machine_metrics import (
26
+ STATUS_OK,
27
+ STATUS_UNKNOWN,
28
+ MachineMetricsSampler,
29
+ MetricsSample,
30
+ fetch_metrics,
31
+ )
32
+ from coord.models import Machine
33
+
34
+
35
+ def _machine(name: str, host: str = "x.tailnet") -> Machine:
36
+ return Machine(name=name, host=host, capabilities=["python"], repos=["api"],
37
+ repo_paths={"api": f"/repos/{name}/api"})
38
+
39
+
40
+ class _FakeResponse:
41
+ def __init__(self, status_code: int, payload: dict | None = None, *, bad_json: bool = False):
42
+ self.status_code = status_code
43
+ self._payload = payload
44
+ self._bad_json = bad_json
45
+
46
+ def json(self):
47
+ if self._bad_json:
48
+ raise ValueError("not json")
49
+ return self._payload
50
+
51
+
52
+ # ── 1. bound enforcement ────────────────────────────────────────────────────
53
+
54
+
55
+ def test_ring_buffer_evicts_oldest_and_never_grows_unbounded(monkeypatch) -> None:
56
+ cfg = Config(repos=[], machines=[_machine("laptop")])
57
+ sampler = MachineMetricsSampler(max_samples=3)
58
+
59
+ seen_cpu: list[float] = []
60
+
61
+ def fake_poll_one(self, machine): # noqa: ANN001, ARG001
62
+ val = len(seen_cpu)
63
+ seen_cpu.append(val)
64
+ return MetricsSample(timestamp=time.time(), status=STATUS_OK, cpu_percent=float(val))
65
+
66
+ monkeypatch.setattr(MachineMetricsSampler, "_poll_one", fake_poll_one)
67
+
68
+ for _ in range(10):
69
+ sampler.refresh(cfg)
70
+
71
+ series = sampler.series("laptop")
72
+ # Bound is explicit and enforced — never more than max_samples, no matter
73
+ # how many refreshes ran.
74
+ assert len(series) == 3
75
+ # Oldest evicted: the buffer holds only the LAST 3 cpu values appended
76
+ # (7, 8, 9), not the first ones (0, 1, 2).
77
+ assert [s["cpu_percent"] for s in series] == [7.0, 8.0, 9.0]
78
+
79
+
80
+ def test_unknown_machine_series_is_empty_not_an_error() -> None:
81
+ sampler = MachineMetricsSampler()
82
+ assert sampler.series("never-polled") == []
83
+ assert sampler.all_series() == {}
84
+
85
+
86
+ # ── 2. `unknown`, never a silent gap (#1485) ────────────────────────────────
87
+
88
+
89
+ def test_fetch_metrics_ok_populates_all_fields(monkeypatch) -> None:
90
+ payload = {
91
+ "cpu_percent": 12.5,
92
+ "mem_percent": 40.0,
93
+ "mem_used_mb": 1024.0,
94
+ "mem_total_mb": 2048.0,
95
+ "timestamp": time.time(),
96
+ }
97
+ monkeypatch.setattr(httpx, "get", lambda url, timeout=3.0: _FakeResponse(200, payload))
98
+
99
+ sample = fetch_metrics(_machine("laptop"))
100
+ assert sample.status == STATUS_OK
101
+ assert sample.cpu_percent == 12.5
102
+ assert sample.mem_percent == 40.0
103
+ assert sample.mem_used_mb == 1024.0
104
+ assert sample.mem_total_mb == 2048.0
105
+
106
+
107
+ def test_fetch_metrics_503_psutil_missing_is_explicit_unknown(monkeypatch) -> None:
108
+ monkeypatch.setattr(httpx, "get", lambda url, timeout=3.0: _FakeResponse(503))
109
+
110
+ sample = fetch_metrics(_machine("laptop"))
111
+ assert sample.status == STATUS_UNKNOWN
112
+ assert "psutil" in sample.reason
113
+ assert sample.cpu_percent is None
114
+
115
+
116
+ def test_fetch_metrics_timeout_is_explicit_unknown(monkeypatch) -> None:
117
+ def raise_timeout(url, timeout=3.0):
118
+ raise httpx.ReadTimeout("timed out", request=None)
119
+
120
+ monkeypatch.setattr(httpx, "get", raise_timeout)
121
+
122
+ sample = fetch_metrics(_machine("laptop"))
123
+ assert sample.status == STATUS_UNKNOWN
124
+ assert sample.cpu_percent is None
125
+
126
+
127
+ def test_fetch_metrics_connection_error_is_explicit_unknown(monkeypatch) -> None:
128
+ def raise_connect_error(url, timeout=3.0):
129
+ raise httpx.ConnectError("connection refused")
130
+
131
+ monkeypatch.setattr(httpx, "get", raise_connect_error)
132
+
133
+ sample = fetch_metrics(_machine("laptop"))
134
+ assert sample.status == STATUS_UNKNOWN
135
+
136
+
137
+ def test_fetch_metrics_malformed_payload_is_explicit_unknown(monkeypatch) -> None:
138
+ monkeypatch.setattr(
139
+ httpx, "get", lambda url, timeout=3.0: _FakeResponse(200, {"cpu_percent": "not-a-number"})
140
+ )
141
+
142
+ sample = fetch_metrics(_machine("laptop"))
143
+ assert sample.status == STATUS_UNKNOWN
144
+
145
+
146
+ def test_fetch_metrics_bad_json_is_explicit_unknown(monkeypatch) -> None:
147
+ monkeypatch.setattr(httpx, "get", lambda url, timeout=3.0: _FakeResponse(200, bad_json=True))
148
+
149
+ sample = fetch_metrics(_machine("laptop"))
150
+ assert sample.status == STATUS_UNKNOWN
151
+
152
+
153
+ def test_refresh_appends_unknown_sample_for_failed_machine_never_a_gap(monkeypatch) -> None:
154
+ cfg = Config(repos=[], machines=[_machine("dead")])
155
+ sampler = MachineMetricsSampler()
156
+
157
+ monkeypatch.setattr(httpx, "get", lambda url, timeout=3.0: (_ for _ in ()).throw(
158
+ httpx.ConnectError("refused")
159
+ ))
160
+
161
+ sampler.refresh(cfg)
162
+
163
+ series = sampler.series("dead")
164
+ assert len(series) == 1
165
+ assert series[0]["status"] == STATUS_UNKNOWN
166
+
167
+
168
+ def test_poll_one_swallows_unexpected_exception_as_unknown(monkeypatch) -> None:
169
+ """Even a bug in fetch_metrics itself must not abort the whole refresh —
170
+ it degrades to an unknown sample for that one machine (mirrors
171
+ FleetHealthRefresher's "one bad machine must not abort the tick")."""
172
+ cfg = Config(repos=[], machines=[_machine("buggy"), _machine("fine")])
173
+ sampler = MachineMetricsSampler()
174
+
175
+ def fake_fetch(machine, timeout=3.0):
176
+ if machine.name == "buggy":
177
+ raise RuntimeError("boom")
178
+ return MetricsSample(timestamp=time.time(), status=STATUS_OK, cpu_percent=1.0)
179
+
180
+ monkeypatch.setattr(mm, "fetch_metrics", fake_fetch)
181
+
182
+ sampler.refresh(cfg)
183
+
184
+ assert sampler.series("buggy")[0]["status"] == STATUS_UNKNOWN
185
+ assert sampler.series("fine")[0]["status"] == STATUS_OK
186
+
187
+
188
+ # ── 3. a hanging agent cannot stall the sampler for other machines ─────────
189
+
190
+
191
+ def test_hanging_machine_does_not_serialize_behind_other_polls(monkeypatch) -> None:
192
+ cfg = Config(
193
+ repos=[],
194
+ machines=[_machine("slow-a"), _machine("slow-b"), _machine("fast")],
195
+ )
196
+ sampler = MachineMetricsSampler()
197
+ delay = 0.3
198
+
199
+ def fake_poll_one(self, machine): # noqa: ANN001, ARG001
200
+ if machine.name.startswith("slow"):
201
+ time.sleep(delay)
202
+ return MetricsSample(timestamp=time.time(), status=STATUS_OK, cpu_percent=1.0)
203
+
204
+ monkeypatch.setattr(MachineMetricsSampler, "_poll_one", fake_poll_one)
205
+
206
+ start = time.monotonic()
207
+ sampler.refresh(cfg)
208
+ elapsed = time.monotonic() - start
209
+
210
+ # Two "slow" machines each sleep `delay`. If polls ran sequentially the
211
+ # refresh would take >= 2 * delay; concurrently it takes ~1 * delay.
212
+ assert elapsed < delay * 1.8, (
213
+ f"refresh() took {elapsed:.2f}s — polls appear to be serializing "
214
+ f"instead of running concurrently"
215
+ )
216
+ for name in ("slow-a", "slow-b", "fast"):
217
+ assert sampler.series(name)[0]["status"] == STATUS_OK
218
+
219
+
220
+ def test_refresh_with_no_machines_is_a_noop() -> None:
221
+ cfg = Config(repos=[], machines=[])
222
+ sampler = MachineMetricsSampler()
223
+ sampler.refresh(cfg) # must not raise
224
+ assert sampler.all_series() == {}
225
+
226
+
227
+ def test_max_samples_must_be_positive() -> None:
228
+ with pytest.raises(ValueError):
229
+ MachineMetricsSampler(max_samples=0)
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.5.331",
3
- "distance": 0,
4
- "node": "g73f327b8112ca3cfc50ce512371659afb1a4c411",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-08-31"
8
- }