code-coordinator 0.5.52__tar.gz → 0.5.55__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 (810) hide show
  1. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/workflows/test.yml +49 -0
  2. {code_coordinator-0.5.52/code_coordinator.egg-info → code_coordinator-0.5.55}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.52 → code_coordinator-0.5.55/code_coordinator.egg-info}/PKG-INFO +1 -1
  4. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/SOURCES.txt +4 -0
  5. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/scm_file_list.json +4 -0
  6. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/scm_version.json +2 -2
  7. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/cli.py +3 -1
  8. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/client.py +59 -0
  9. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/agent_ops.py +250 -1
  10. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/status.py +11 -1
  11. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/test_gate.py +33 -1
  12. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/config.py +51 -22
  13. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/machine_pause.py +304 -19
  14. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notify.py +90 -11
  15. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/progress.py +117 -0
  16. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/revalidate.py +103 -2
  17. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/serve_app.py +80 -3
  18. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/smoke.py +23 -4
  19. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/OPERATING_GOTCHAS.md +85 -0
  20. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/coord-test-runner.sh +232 -2
  21. code_coordinator-0.5.55/scripts/run_tests_in_populated_home.sh +150 -0
  22. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_acceptance_drivers.py +34 -2
  23. code_coordinator-0.5.55/tests/test_ambient_home_isolation.py +392 -0
  24. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coord_test.py +77 -0
  25. code_coordinator-0.5.55/tests/test_coord_test_runner_baseline.py +364 -0
  26. code_coordinator-0.5.55/tests/test_cross_platform_imports.py +267 -0
  27. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_coord_db_backup.py +42 -1
  28. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notify.py +112 -0
  29. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_progress.py +73 -0
  30. code_coordinator-0.5.55/tests/test_quiet_hours_store_2146.py +660 -0
  31. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_revalidate.py +200 -0
  32. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_smoke.py +20 -0
  33. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/data.rs +67 -4
  34. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/dialogs.rs +262 -3
  35. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/events.rs +31 -0
  36. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/fixtures.rs +2 -0
  37. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/mod.rs +58 -1
  38. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/pipeline.rs +7 -0
  39. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/sidebar.rs +23 -0
  40. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/tests.rs +476 -0
  41. code_coordinator-0.5.52/tests/test_cross_platform_imports.py +0 -136
  42. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.claude/commands/board.md +0 -0
  43. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.claude/commands/complete-session.md +0 -0
  44. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.claude/commands/coordinator.md +0 -0
  45. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.githooks/_lib.sh +0 -0
  46. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.githooks/post-checkout +0 -0
  47. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.githooks/post-commit +0 -0
  48. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.githooks/post-merge +0 -0
  49. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  50. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/workflows/auto-release.yml +0 -0
  51. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/workflows/cargo-test.yml +0 -0
  52. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/workflows/publish.yml +0 -0
  53. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/workflows/release-tui.yml +0 -0
  54. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.gitignore +0 -0
  55. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/CLAUDE.md +0 -0
  56. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/GOAL.md +0 -0
  57. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/LICENSE +0 -0
  58. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/MANIFEST.in +0 -0
  59. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/README.md +0 -0
  60. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/dependency_links.txt +0 -0
  61. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/entry_points.txt +0 -0
  62. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/requires.txt +0 -0
  63. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/top_level.txt +0 -0
  64. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/__init__.py +0 -0
  65. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/_board_mapping.py +0 -0
  66. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/acceptance.py +0 -0
  67. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/acceptance_drivers.py +0 -0
  68. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agent.py +0 -0
  69. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agent_app.py +0 -0
  70. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agent_update.py +0 -0
  71. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agents/opencode/.gitignore +0 -0
  72. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agents/opencode/agents/work.md +0 -0
  73. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agents/opencode/routing.jsonc +0 -0
  74. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/audit.py +0 -0
  75. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/auto_loop.py +0 -0
  76. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/board_bool_guard.py +0 -0
  77. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/board_service.py +0 -0
  78. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/board_wire.py +0 -0
  79. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/brain.py +0 -0
  80. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/branch_model.py +0 -0
  81. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/bug_intake.py +0 -0
  82. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/cargo_cache.py +0 -0
  83. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/ci_github.py +0 -0
  84. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/ci_store.py +0 -0
  85. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/claim.py +0 -0
  86. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/__init__.py +0 -0
  87. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/_common.py +0 -0
  88. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/acceptance.py +0 -0
  89. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/audit.py +0 -0
  90. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/chat.py +0 -0
  91. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/dispatch.py +0 -0
  92. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/dispatch_workers.py +0 -0
  93. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/drive.py +0 -0
  94. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/drive_queue.py +0 -0
  95. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/gate_a.py +0 -0
  96. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/gates.py +0 -0
  97. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/issues.py +0 -0
  98. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/lifecycle.py +0 -0
  99. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/merge.py +0 -0
  100. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/milestone.py +0 -0
  101. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/plan_followup.py +0 -0
  102. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/plans.py +0 -0
  103. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/release.py +0 -0
  104. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/report.py +0 -0
  105. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/review.py +0 -0
  106. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/scorecard.py +0 -0
  107. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/sessions.py +0 -0
  108. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/setup.py +0 -0
  109. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/terminal.py +0 -0
  110. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/tui.py +0 -0
  111. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/comments.py +0 -0
  112. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/conflict_fix.py +0 -0
  113. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dao.py +0 -0
  114. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/__init__.py +0 -0
  115. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/fixture.py +0 -0
  116. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/index.html +0 -0
  117. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/server.py +0 -0
  118. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/terminal.py +0 -0
  119. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/.gitignore +0 -0
  120. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/components.json +0 -0
  121. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  122. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  123. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  124. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  125. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  126. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  127. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  128. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  129. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  130. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/index.html +0 -0
  131. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  132. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/sw.js +0 -0
  133. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  134. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  135. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  136. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  137. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  138. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  139. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  140. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  141. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  142. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  143. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/eslint.config.js +0 -0
  144. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/index.html +0 -0
  145. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  146. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/package-lock.json +0 -0
  147. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/package.json +0 -0
  148. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  149. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/playwright.config.ts +0 -0
  150. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/postcss.config.js +0 -0
  151. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  152. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  153. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  154. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/App.tsx +0 -0
  155. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/api/client.ts +0 -0
  156. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  157. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  158. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  159. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  160. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  161. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  162. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  163. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  164. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  165. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  166. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  167. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  168. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  169. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  170. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  171. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  172. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  173. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  174. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  175. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  176. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  177. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  178. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  179. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  180. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  181. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  182. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  183. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  184. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  185. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  186. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  187. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  188. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  189. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  190. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  191. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/index.css +0 -0
  192. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  193. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  194. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/main.tsx +0 -0
  195. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  196. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  197. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  198. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  199. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  200. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  201. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  202. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  203. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  204. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  205. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  206. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  207. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  208. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  209. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  210. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  211. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  212. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  213. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  214. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  215. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  216. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  217. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  218. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/tailwind.config.js +0 -0
  219. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/tsconfig.json +0 -0
  220. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  221. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/vite.config.ts +0 -0
  222. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/db.py +0 -0
  223. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dead_end.py +0 -0
  224. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/README.md +0 -0
  225. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-agent.service +0 -0
  226. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-db-backup.service +0 -0
  227. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-db-backup.sh +0 -0
  228. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-db-backup.timer +0 -0
  229. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-drive-queue.service +0 -0
  230. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-drive-queue.timer +0 -0
  231. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-notify.service +0 -0
  232. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-notify.timer +0 -0
  233. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-release-propagate.service +0 -0
  234. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-release-propagate.timer +0 -0
  235. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-release-window.service +0 -0
  236. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-release-window.timer +0 -0
  237. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-serve.service +0 -0
  238. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-web-dist-build.service +0 -0
  239. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-web-dist-build.timer +0 -0
  240. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-web.service +0 -0
  241. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy_manifest.py +0 -0
  242. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy_units.py +0 -0
  243. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deps.py +0 -0
  244. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/diagnose.py +0 -0
  245. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dispatch.py +0 -0
  246. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dist_name.py +0 -0
  247. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/drive.py +0 -0
  248. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/drive_queue.py +0 -0
  249. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/drive_state.py +0 -0
  250. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/events.py +0 -0
  251. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/failure_class.py +0 -0
  252. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/filelock.py +0 -0
  253. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/fleet_config_health.py +0 -0
  254. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/freshness.py +0 -0
  255. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/gate_a.py +0 -0
  256. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/gate_b.py +0 -0
  257. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/gate_snapshot.py +0 -0
  258. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/gates.py +0 -0
  259. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/github_ops.py +0 -0
  260. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/goal.py +0 -0
  261. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/graph_health.py +0 -0
  262. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/__init__.py +0 -0
  263. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/aggregate.py +0 -0
  264. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/__init__.py +0 -0
  265. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/agent_install.py +0 -0
  266. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/cargo_targets.py +0 -0
  267. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/claude_binary.py +0 -0
  268. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/deploy_lane_facts.py +0 -0
  269. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/disk.py +0 -0
  270. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/fleet_board.py +0 -0
  271. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  272. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/fleet_phantom.py +0 -0
  273. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/fleet_unit_drift.py +0 -0
  274. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/graph.py +0 -0
  275. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/plan_usage.py +0 -0
  276. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/repo_state.py +0 -0
  277. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/spawned_coord.py +0 -0
  278. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/timer_active.py +0 -0
  279. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/toolchain.py +0 -0
  280. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/unit_drift.py +0 -0
  281. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/unit_enablement.py +0 -0
  282. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/worktrees.py +0 -0
  283. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/cli.py +0 -0
  284. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/context.py +0 -0
  285. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/fleet_snapshot.py +0 -0
  286. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/models.py +0 -0
  287. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/pypi.py +0 -0
  288. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/registry.py +0 -0
  289. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/render.py +0 -0
  290. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/units.py +0 -0
  291. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/hooks.py +0 -0
  292. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/housekeeping.py +0 -0
  293. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/interactive.py +0 -0
  294. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/issue_store.py +0 -0
  295. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/liveness_auditor.py +0 -0
  296. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/merge_queue.py +0 -0
  297. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/milestone_chat.py +0 -0
  298. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/milestone_dispatch.py +0 -0
  299. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/milestone_gate.py +0 -0
  300. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/milestone_order.py +0 -0
  301. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/mock_author.py +0 -0
  302. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/models.py +0 -0
  303. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/network.py +0 -0
  304. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/new_issue_chat.py +0 -0
  305. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/__init__.py +0 -0
  306. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/baseline.py +0 -0
  307. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/cli.py +0 -0
  308. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/collect.py +0 -0
  309. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/digest.py +0 -0
  310. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/models.py +0 -0
  311. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/predicate.py +0 -0
  312. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/service.py +0 -0
  313. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/store.py +0 -0
  314. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/transport.py +0 -0
  315. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/openapi.py +0 -0
  316. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/overlap_fence.py +0 -0
  317. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/parentage.py +0 -0
  318. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/parentage_github.py +0 -0
  319. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/pipeline.py +0 -0
  320. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/plan_parser.py +0 -0
  321. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/plans.py +0 -0
  322. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/platform_paths.py +0 -0
  323. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/pr_body_lint.py +0 -0
  324. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/prereqs.py +0 -0
  325. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/__init__.py +0 -0
  326. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/base.py +0 -0
  327. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/claude.py +0 -0
  328. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/claude_pty.py +0 -0
  329. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/opencode.py +0 -0
  330. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/reconcile.py +0 -0
  331. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/refine_chat.py +0 -0
  332. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/release_cordon.py +0 -0
  333. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/release_propagate.py +0 -0
  334. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/release_verify.py +0 -0
  335. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/release_window.py +0 -0
  336. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/reports.py +0 -0
  337. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/review.py +0 -0
  338. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/scorecard.py +0 -0
  339. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/skills/update-issue/SKILL.md +0 -0
  340. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/spend_ceiling.py +0 -0
  341. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/split_work.py +0 -0
  342. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/stage_projection.py +0 -0
  343. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/state.py +0 -0
  344. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/test_author.py +0 -0
  345. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/test_chat.py +0 -0
  346. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/test_orchestrator.py +0 -0
  347. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/test_report.py +0 -0
  348. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/tui_release.py +0 -0
  349. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/usage.py +0 -0
  350. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/usage_limits.py +0 -0
  351. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/usage_rollup.py +0 -0
  352. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/worker_events.py +0 -0
  353. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coordinator.example.yml +0 -0
  354. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-agent.service +0 -0
  355. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-db-backup.service +0 -0
  356. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-db-backup.sh +0 -0
  357. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-db-backup.timer +0 -0
  358. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-drive-queue.service +0 -0
  359. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-drive-queue.timer +0 -0
  360. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-notify.service +0 -0
  361. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-notify.timer +0 -0
  362. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-release-propagate.service +0 -0
  363. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-release-propagate.timer +0 -0
  364. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-release-window.service +0 -0
  365. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-release-window.timer +0 -0
  366. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-serve.service +0 -0
  367. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web-dist-build.service +0 -0
  368. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web-dist-build.sh +0 -0
  369. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web-dist-build.timer +0 -0
  370. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web-rollback.sh +0 -0
  371. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web.service +0 -0
  372. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/node-shim.sh +0 -0
  373. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/AGENT_OPERATIONS.md +0 -0
  374. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/ARCHITECTURE.md +0 -0
  375. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/ARCH_SECURITY_GATES.md +0 -0
  376. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/COCKPIT.md +0 -0
  377. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/CONTROL_CENTER.md +0 -0
  378. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/CROSS_PLATFORM.md +0 -0
  379. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/CUSTOMER_PORTAL.md +0 -0
  380. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/DRIVE_QUEUE.md +0 -0
  381. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/EPHEMERAL_WORKERS.md +0 -0
  382. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/FORGE_MIGRATION.md +0 -0
  383. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/GRAPHIFY_SETUP.md +0 -0
  384. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/ISSUE_GUIDANCE.md +0 -0
  385. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/MAC_MINI.md +0 -0
  386. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  387. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/NOTIFIER.md +0 -0
  388. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/OPENCODE_VERIFICATION.md +0 -0
  389. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/ORACLE_LOOP.md +0 -0
  390. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/PHONE_WEBAPP.md +0 -0
  391. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/PIPELINE_V2.md +0 -0
  392. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/PLATFORM_EVOLUTION.md +0 -0
  393. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/SECOND_BACKEND.md +0 -0
  394. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/STORE_SERVICE.md +0 -0
  395. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  396. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/WEB_CONTROL_CENTER.md +0 -0
  397. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/README.md +0 -0
  398. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/_tokens.css +0 -0
  399. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/issue-detail.html +0 -0
  400. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/pipeline-narrow.html +0 -0
  401. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/pipeline-wide.html +0 -0
  402. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/graphify-out/.gitignore +0 -0
  403. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/install-agent.sh +0 -0
  404. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/pyproject.toml +0 -0
  405. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/audit_review_verdict_overrides.py +0 -0
  406. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  407. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/build-worker-image.sh +0 -0
  408. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/coordinator-machine.py +0 -0
  409. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/epic-down.sh +0 -0
  410. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/epic-up.sh +0 -0
  411. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/preflight.sh +0 -0
  412. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/provision-worker.sh +0 -0
  413. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  414. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  415. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/verify-github-token.sh +0 -0
  416. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/codegen.py +0 -0
  417. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/drive-batch.sh +0 -0
  418. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/gen_board_fixture.py +0 -0
  419. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/next_release_tag.py +0 -0
  420. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/run_tests_without_gh.sh +0 -0
  421. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/smoke_437_interactive.py +0 -0
  422. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/verify_878_review_capture.py +0 -0
  423. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/verify_release_published.py +0 -0
  424. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/verify_release_wheel.py +0 -0
  425. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/setup.cfg +0 -0
  426. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/SMOKE_SET.md +0 -0
  427. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/__init__.py +0 -0
  428. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  429. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/contract.md +0 -0
  430. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/manifest.yml +0 -0
  431. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  432. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  433. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  434. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  435. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/conftest.py +0 -0
  436. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/contract.md +0 -0
  437. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/manifest.yml +0 -0
  438. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  439. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  440. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/contract.md +0 -0
  441. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/manifest.yml +0 -0
  442. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  443. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  444. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  445. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  446. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  447. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  448. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  449. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  450. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  451. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  452. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/contract.md +0 -0
  453. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  454. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  455. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/manifest.yml +0 -0
  456. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  457. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/tsconfig.json +0 -0
  458. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  459. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/conftest.py +0 -0
  460. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/board-pipeline-basic.json +0 -0
  461. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  462. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  463. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  464. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/all_pass.json +0 -0
  465. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  466. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/mixed_fail.json +0 -0
  467. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  468. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  469. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/skip.json +0 -0
  470. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/truncated.json +0 -0
  471. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  472. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  473. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  474. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  475. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  476. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  477. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  478. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  479. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_acceptance.py +0 -0
  480. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent.py +0 -0
  481. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_api_error.py +0 -0
  482. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_app.py +0 -0
  483. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_branch_base.py +0 -0
  484. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_branch_capture.py +0 -0
  485. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_config_free_1712.py +0 -0
  486. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_deploy_units_endpoint.py +0 -0
  487. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_dirty_worktree.py +0 -0
  488. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_graph_self_heal.py +0 -0
  489. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_health_h3.py +0 -0
  490. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_idle_restart.py +0 -0
  491. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_push_failure.py +0 -0
  492. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_reap.py +0 -0
  493. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_repos_and_pull.py +0 -0
  494. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_restart_services_endpoint.py +0 -0
  495. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_startup_diagnostics.py +0 -0
  496. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_update.py +0 -0
  497. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_update_bluegreen.py +0 -0
  498. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_usage_limit.py +0 -0
  499. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_zero_commit.py +0 -0
  500. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_approve_reject_plan.py +0 -0
  501. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_approve_usage_gate.py +0 -0
  502. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_assignment_already_recorded_daemon.py +0 -0
  503. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_audit_log.py +0 -0
  504. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_audit_outcome.py +0 -0
  505. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_audit_query.py +0 -0
  506. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_auto_loop.py +0 -0
  507. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_auto_release_publish_2035.py +0 -0
  508. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_base_checkout_restore.py +0 -0
  509. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_cap_762.py +0 -0
  510. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_fixture.py +0 -0
  511. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_read_path.py +0 -0
  512. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_service.py +0 -0
  513. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_state.py +0 -0
  514. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_wire.py +0 -0
  515. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_brain.py +0 -0
  516. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_branch_model.py +0 -0
  517. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_bug_intake.py +0 -0
  518. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_build_worker_image_env_update.py +0 -0
  519. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cargo_cache.py +0 -0
  520. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_ci_acceptance_gate_1950.py +0 -0
  521. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_ci_store.py +0 -0
  522. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_claim.py +0 -0
  523. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_acceptance.py +0 -0
  524. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_assign.py +0 -0
  525. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  526. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_assign_interactive_remote.py +0 -0
  527. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_assign_provider.py +0 -0
  528. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_audit.py +0 -0
  529. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_chat_continue.py +0 -0
  530. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_diagnose_config_provenance.py +0 -0
  531. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_diagnose_graph.py +0 -0
  532. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_doctor.py +0 -0
  533. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_doctor_config_free_1801.py +0 -0
  534. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  535. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_drive.py +0 -0
  536. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_drive_queue.py +0 -0
  537. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_escalate.py +0 -0
  538. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_fix_headless_review.py +0 -0
  539. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_gate_a.py +0 -0
  540. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_install_drift.py +0 -0
  541. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_install_skills.py +0 -0
  542. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_issue_create_label.py +0 -0
  543. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_issue_reopen.py +0 -0
  544. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_merge.py +0 -0
  545. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_assign.py +0 -0
  546. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_capture.py +0 -0
  547. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_chat_add_child.py +0 -0
  548. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_dispatch.py +0 -0
  549. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_gate_b.py +0 -0
  550. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_gate_c.py +0 -0
  551. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_order.py +0 -0
  552. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  553. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_ship.py +0 -0
  554. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_network.py +0 -0
  555. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_new_issue_chat.py +0 -0
  556. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_plans.py +0 -0
  557. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_pull_artifact.py +0 -0
  558. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_queue.py +0 -0
  559. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_reattach_sessions.py +0 -0
  560. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_refine_board.py +0 -0
  561. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_release_preflight.py +0 -0
  562. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_release_propagate.py +0 -0
  563. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_release_window.py +0 -0
  564. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_scorecard.py +0 -0
  565. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_set_review_findings.py +0 -0
  566. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_advisory_terminal.py +0 -0
  567. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_merge_queue.py +0 -0
  568. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_provider.py +0 -0
  569. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_review_finalizing.py +0 -0
  570. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_test_failed_tag.py +0 -0
  571. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_usage_limit.py +0 -0
  572. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_sync_comments_873.py +0 -0
  573. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_test_plan.py +0 -0
  574. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_track.py +0 -0
  575. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_tui_update.py +0 -0
  576. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_wait.py +0 -0
  577. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_client_base_install.py +0 -0
  578. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_comments.py +0 -0
  579. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_completion_summary.py +0 -0
  580. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config.py +0 -0
  581. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config_acceptance.py +0 -0
  582. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config_audit.py +0 -0
  583. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config_pricing.py +0 -0
  584. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config_usage_gate.py +0 -0
  585. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_conflict_fix.py +0 -0
  586. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_conflict_fix_semantic.py +0 -0
  587. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coord_test_runner_routing.py +0 -0
  588. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coord_test_runner_toolchain.py +0 -0
  589. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coord_web_sse_restart_live.py +0 -0
  590. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coordinator_machine.py +0 -0
  591. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dashboard.py +0 -0
  592. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dashboard_fixture.py +0 -0
  593. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dashboard_terminal.py +0 -0
  594. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dashboard_terminal_live.py +0 -0
  595. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_db.py +0 -0
  596. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dead_end.py +0 -0
  597. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_coord_web_dist.py +0 -0
  598. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_coord_web_rollback.py +0 -0
  599. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_drive_queue_unit.py +0 -0
  600. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_manifest.py +0 -0
  601. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_units_lane.py +0 -0
  602. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_web_unit.py +0 -0
  603. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deps.py +0 -0
  604. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_diagnose.py +0 -0
  605. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dispatch.py +0 -0
  606. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dispatch_target_validation.py +0 -0
  607. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dist_name.py +0 -0
  608. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_done_housekeeping.py +0 -0
  609. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_drive.py +0 -0
  610. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_drive_queue.py +0 -0
  611. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_drive_state.py +0 -0
  612. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_drive_tmux.py +0 -0
  613. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_epic_up_capability_detection.py +0 -0
  614. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  615. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_epic_up_image_provenance.py +0 -0
  616. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_errors.py +0 -0
  617. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_events.py +0 -0
  618. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_failure_class.py +0 -0
  619. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_filelock.py +0 -0
  620. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  621. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_fix_of_force_override.py +0 -0
  622. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_fleet_config_health.py +0 -0
  623. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_fleet_health_probes.py +0 -0
  624. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_fleet_health_snapshot.py +0 -0
  625. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_freshness.py +0 -0
  626. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_gate_a.py +0 -0
  627. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_gate_b.py +0 -0
  628. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_gate_snapshot_staleness.py +0 -0
  629. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_gates.py +0 -0
  630. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_generated_types_fixture.py +0 -0
  631. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_github_ops.py +0 -0
  632. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_goal.py +0 -0
  633. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_graph_health.py +0 -0
  634. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_handoff.py +0 -0
  635. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_checks.py +0 -0
  636. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_cli.py +0 -0
  637. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_cli_graph.py +0 -0
  638. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_config.py +0 -0
  639. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_context.py +0 -0
  640. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_deploy_lane_facts.py +0 -0
  641. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_incident_regression.py +0 -0
  642. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_pypi.py +0 -0
  643. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_registry.py +0 -0
  644. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_timer_active.py +0 -0
  645. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_toolchain.py +0 -0
  646. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_unit_drift.py +0 -0
  647. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_unit_enablement.py +0 -0
  648. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_hooks.py +0 -0
  649. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_human_attended_437.py +0 -0
  650. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_init.py +0 -0
  651. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_integration.py +0 -0
  652. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_briefing_echo.py +0 -0
  653. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_prefill_state.py +0 -0
  654. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_session_relaunch.py +0 -0
  655. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_test_verdict_backstop.py +0 -0
  656. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_token_attribution.py +0 -0
  657. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_worktree.py +0 -0
  658. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_issue_store_seam.py +0 -0
  659. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_liveness_auditor.py +0 -0
  660. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_liveness_notify.py +0 -0
  661. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_machine_pause.py +0 -0
  662. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_merge_queue.py +0 -0
  663. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_merge_verify.py +0 -0
  664. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_chat.py +0 -0
  665. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_dispatch.py +0 -0
  666. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_gate.py +0 -0
  667. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_order.py +0 -0
  668. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_seam.py +0 -0
  669. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_mock_author.py +0 -0
  670. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_model_tiering.py +0 -0
  671. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_models.py +0 -0
  672. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_models_config_labels.py +0 -0
  673. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_needs_attention.py +0 -0
  674. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_network.py +0 -0
  675. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_new_issue_chat.py +0 -0
  676. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_next_release_tag.py +0 -0
  677. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_no_direct_gh_calls.py +0 -0
  678. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_node_shim.py +0 -0
  679. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_baseline.py +0 -0
  680. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_cli.py +0 -0
  681. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_collect.py +0 -0
  682. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_config.py +0 -0
  683. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_drive_seam.py +0 -0
  684. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_isolation.py +0 -0
  685. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_predicate.py +0 -0
  686. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_quiet_hours.py +0 -0
  687. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_service.py +0 -0
  688. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notify_drain.py +0 -0
  689. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_openapi.py +0 -0
  690. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_operational_defaults.py +0 -0
  691. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_overlap_fence.py +0 -0
  692. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_packaged_deploy_units.py +0 -0
  693. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_parentage.py +0 -0
  694. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_paste_landed.py +0 -0
  695. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_pipeline.py +0 -0
  696. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_followup_approve_plan_command.py +0 -0
  697. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_followup_pr_command.py +0 -0
  698. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_followup_review_command.py +0 -0
  699. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_only.py +0 -0
  700. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_parser.py +0 -0
  701. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_platform_paths.py +0 -0
  702. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_pr_body_lint.py +0 -0
  703. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_prereqs.py +0 -0
  704. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_production_db_guard.py +0 -0
  705. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_provider_seam.py +0 -0
  706. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_providers.py +0 -0
  707. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_providers_config_labels.py +0 -0
  708. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_providers_pty.py +0 -0
  709. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_quiet_hours.py +0 -0
  710. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reap_merged_sessions.py +0 -0
  711. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reap_stale_interactive_tick.py +0 -0
  712. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reconcile_branch.py +0 -0
  713. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reconcile_completions.py +0 -0
  714. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reconcile_merges.py +0 -0
  715. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reconcile_usage_limit_done.py +0 -0
  716. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_refine_chat.py +0 -0
  717. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_cordon_2101.py +0 -0
  718. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_propagate.py +0 -0
  719. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_unified_1242.py +0 -0
  720. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_verify.py +0 -0
  721. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_window.py +0 -0
  722. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_remote_auto_prune.py +0 -0
  723. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_remote_interactive_reaper.py +0 -0
  724. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_report_result_push.py +0 -0
  725. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reports.py +0 -0
  726. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_retry.py +0 -0
  727. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_retry_advisory_1606.py +0 -0
  728. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_retry_type_1636.py +0 -0
  729. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review.py +0 -0
  730. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_end_review_without_verdict.py +0 -0
  731. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_parse_failure_diagnostic.py +0 -0
  732. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_reaffirm.py +0 -0
  733. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_state.py +0 -0
  734. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_verdict_backstop.py +0 -0
  735. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_verdict_override_audit.py +0 -0
  736. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_verdict_relay.py +0 -0
  737. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_zero_commits.py +0 -0
  738. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_scoped_review_wiring.py +0 -0
  739. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_scorecard.py +0 -0
  740. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_serve.py +0 -0
  741. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_serve_app_board_trim.py +0 -0
  742. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_session.py +0 -0
  743. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_slice_issue_attribution.py +0 -0
  744. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_smoke_live_checkout_restore.py +0 -0
  745. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_smoke_workflow.py +0 -0
  746. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_spend_ceiling.py +0 -0
  747. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_spend_ceiling_coordinator.py +0 -0
  748. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_split.py +0 -0
  749. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_split_work.py +0 -0
  750. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_stage_projection.py +0 -0
  751. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_stalled_pipeline.py +0 -0
  752. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_state.py +0 -0
  753. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_state_review_findings_daemon.py +0 -0
  754. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_status_fleet_footer.py +0 -0
  755. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_stop_1567.py +0 -0
  756. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_stuck.py +0 -0
  757. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_terminal_command.py +0 -0
  758. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_author.py +0 -0
  759. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_chat.py +0 -0
  760. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_orchestrator.py +0 -0
  761. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_report.py +0 -0
  762. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_verdict_parsing.py +0 -0
  763. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_verdict_transcript_floor.py +0 -0
  764. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_thin_client_board_audit.py +0 -0
  765. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_thin_client_config_load_1080.py +0 -0
  766. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_thin_client_daemon_routing_906.py +0 -0
  767. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_tmux_host.py +0 -0
  768. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_tmux_session.py +0 -0
  769. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_transcript_floor.py +0 -0
  770. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_usage.py +0 -0
  771. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_usage_limits.py +0 -0
  772. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_usage_rollup.py +0 -0
  773. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_venv_live_install_2121.py +0 -0
  774. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_version_single_source.py +0 -0
  775. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_watch.py +0 -0
  776. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worker_events.py +0 -0
  777. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worker_image_pin_sync.py +0 -0
  778. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worker_safety.py +0 -0
  779. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worktree.py +0 -0
  780. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  781. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/Cargo.lock +0 -0
  782. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/Cargo.toml +0 -0
  783. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/cargo-config-local-quadraui.toml.example +0 -0
  784. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/audit.rs +0 -0
  785. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/chat.rs +0 -0
  786. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/drive.rs +0 -0
  787. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/drive_queue.rs +0 -0
  788. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/escalation.rs +0 -0
  789. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/fleet_health.rs +0 -0
  790. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/fleet_sessions.rs +0 -0
  791. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/fleet_terminals.rs +0 -0
  792. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/format.rs +0 -0
  793. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/milestone_dag.rs +0 -0
  794. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/msv.rs +0 -0
  795. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/plans.rs +0 -0
  796. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/render.rs +0 -0
  797. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/reports.rs +0 -0
  798. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/sessions.rs +0 -0
  799. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/settings_ui.rs +0 -0
  800. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/terminal.rs +0 -0
  801. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/types.rs +0 -0
  802. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/workspace.rs +0 -0
  803. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/bin/gtk.rs +0 -0
  804. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/commands.rs +0 -0
  805. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/lib.rs +0 -0
  806. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/main.rs +0 -0
  807. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/settings.rs +0 -0
  808. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/tests/acceptance.rs +0 -0
  809. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/tests/cli.rs +0 -0
  810. {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/tests/fixtures/board_sample.json +0 -0
@@ -115,6 +115,55 @@ jobs:
115
115
  - run: pip install -e ".[dev]"
116
116
  - run: scripts/run_tests_without_gh.sh python -m pytest tests/ -q
117
117
 
118
+ # #2170: run the full suite in the environment of a REAL FLEET MACHINE — a
119
+ # populated `~/.coord/` (thin-client shaped), no `sqlite3` on PATH, and a
120
+ # `$TMPDIR` under an ancestor pytest config.
121
+ #
122
+ # This job exists because the `test` matrix above is structurally incapable
123
+ # of catching the class it covers. Six tests failed on `origin/main` on every
124
+ # fleet machine while `ubuntu-latest` stayed green on 3.12 AND 3.13 — the
125
+ # INVERSE of the familiar "passes locally, fails only in CI ⇒ ambient $HOME"
126
+ # pattern. They passed in CI *precisely because* CI's `$HOME` is empty, and a
127
+ # matrix whose only environment is the empty one can never see that.
128
+ #
129
+ # What it cost while invisible: the Test stage on `precision` could not
130
+ # produce a green verdict for this repo on ANY branch. Every dispatch there
131
+ # returned `SMOKE: fail`, the branch was blamed for breakage it did not
132
+ # cause, and a human read the log and adjudicated — 11m36s and $0.61 for zero
133
+ # signal about the branch, repeatedly, for months (claude-coordinator#2158).
134
+ #
135
+ # SAME SHAPE AS `no-gh-on-path` ABOVE, AND FOR THE SAME REASON. That job
136
+ # (#1484) exists because a host-dependent `gh` made the suite's result depend
137
+ # on the machine rather than the code; this one exists because a
138
+ # host-dependent `$HOME`/`$PATH`/`$TMPDIR` did the same thing in the opposite
139
+ # direction. Both mask by NAME rather than by dropping PATH directories — see
140
+ # `scripts/run_tests_in_populated_home.sh`'s header for why
141
+ # `PATH=/usr/bin:/bin` is the wrong recipe here.
142
+ #
143
+ # `tests/test_ambient_home_isolation.py` pins the specific affected targets
144
+ # on every run everywhere (including this job, and including a fleet
145
+ # machine's own Test leg) — that is the always-on gate, and it is what fails
146
+ # first if one of the three regresses. THIS job is the whole-suite sweep: it
147
+ # is what finds the NEXT test of this class before a fleet machine does.
148
+ # Verified at authoring time: 9590 passed, 13 skipped under these three knobs.
149
+ populated-home:
150
+ runs-on: ubuntu-latest
151
+ steps:
152
+ - uses: actions/checkout@v4
153
+ - uses: actions/setup-python@v5
154
+ with:
155
+ python-version: "3.12"
156
+ - run: pip install -e ".[dev]"
157
+ - run: scripts/run_tests_in_populated_home.sh python -m pytest tests/ -q
158
+ - name: What a red result here means
159
+ if: failure()
160
+ run: |
161
+ echo "::error::The suite is red under a POPULATED \$HOME (thin-client ~/.coord/, no sqlite3 on PATH, \$TMPDIR under an ancestor pytest config) while the plain 'test' job may well be green."
162
+ echo "That difference IS the finding, not noise: a test that needs an empty \$HOME cannot pass on any fleet machine, so the Test stage there can never go green and every dispatch costs a human adjudication (#2170)."
163
+ echo "Fix the TEST's isolation -- redirect \$HOME/XDG at tmp_path, drop COORD_SERVICE_URL/COORD_TOKEN/COORD_CONFIG, skip-guard an unprovisioned system binary, pin a nested pytest's --rootdir."
164
+ echo "Do NOT fix it by making the product trust an ambient path: 'coord config --config' is deliberately NOT authoritative on a thin client (CLAUDE.md, docs/EPHEMERAL_WORKERS.md)."
165
+ echo "Reproduce locally: scripts/run_tests_in_populated_home.sh python -m pytest tests/ -q"
166
+
118
167
  # #906: run the test suite in thin-client mode with COORD_STRICT_LOCAL_BOARD=1
119
168
  # so any board touch reachable from a thin-client path raises RuntimeError
120
169
  # instead of silently no-oping against an empty local DB. This job catches
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.52
3
+ Version: 0.5.55
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.52
3
+ Version: 0.5.55
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
@@ -385,6 +385,7 @@ scripts/coord-test-runner.sh
385
385
  scripts/drive-batch.sh
386
386
  scripts/gen_board_fixture.py
387
387
  scripts/next_release_tag.py
388
+ scripts/run_tests_in_populated_home.sh
388
389
  scripts/run_tests_without_gh.sh
389
390
  scripts/smoke_437_interactive.py
390
391
  scripts/verify_878_review_capture.py
@@ -425,6 +426,7 @@ tests/test_agent_update.py
425
426
  tests/test_agent_update_bluegreen.py
426
427
  tests/test_agent_usage_limit.py
427
428
  tests/test_agent_zero_commit.py
429
+ tests/test_ambient_home_isolation.py
428
430
  tests/test_approve_reject_plan.py
429
431
  tests/test_approve_usage_gate.py
430
432
  tests/test_assignment_already_recorded_daemon.py
@@ -513,6 +515,7 @@ tests/test_config_usage_gate.py
513
515
  tests/test_conflict_fix.py
514
516
  tests/test_conflict_fix_semantic.py
515
517
  tests/test_coord_test.py
518
+ tests/test_coord_test_runner_baseline.py
516
519
  tests/test_coord_test_runner_routing.py
517
520
  tests/test_coord_test_runner_toolchain.py
518
521
  tests/test_coord_web_sse_restart_live.py
@@ -640,6 +643,7 @@ tests/test_providers.py
640
643
  tests/test_providers_config_labels.py
641
644
  tests/test_providers_pty.py
642
645
  tests/test_quiet_hours.py
646
+ tests/test_quiet_hours_store_2146.py
643
647
  tests/test_reap_merged_sessions.py
644
648
  tests/test_reap_stale_interactive_tick.py
645
649
  tests/test_reconcile_branch.py
@@ -375,6 +375,7 @@
375
375
  "scripts/drive-batch.sh",
376
376
  "scripts/gen_board_fixture.py",
377
377
  "scripts/next_release_tag.py",
378
+ "scripts/run_tests_in_populated_home.sh",
378
379
  "scripts/run_tests_without_gh.sh",
379
380
  "scripts/smoke_437_interactive.py",
380
381
  "scripts/verify_878_review_capture.py",
@@ -455,6 +456,7 @@
455
456
  "tests/test_agent_update_bluegreen.py",
456
457
  "tests/test_agent_usage_limit.py",
457
458
  "tests/test_agent_zero_commit.py",
459
+ "tests/test_ambient_home_isolation.py",
458
460
  "tests/test_approve_reject_plan.py",
459
461
  "tests/test_approve_usage_gate.py",
460
462
  "tests/test_assignment_already_recorded_daemon.py",
@@ -543,6 +545,7 @@
543
545
  "tests/test_conflict_fix.py",
544
546
  "tests/test_conflict_fix_semantic.py",
545
547
  "tests/test_coord_test.py",
548
+ "tests/test_coord_test_runner_baseline.py",
546
549
  "tests/test_coord_test_runner_routing.py",
547
550
  "tests/test_coord_test_runner_toolchain.py",
548
551
  "tests/test_coord_web_sse_restart_live.py",
@@ -670,6 +673,7 @@
670
673
  "tests/test_providers_config_labels.py",
671
674
  "tests/test_providers_pty.py",
672
675
  "tests/test_quiet_hours.py",
676
+ "tests/test_quiet_hours_store_2146.py",
673
677
  "tests/test_reap_merged_sessions.py",
674
678
  "tests/test_reap_stale_interactive_tick.py",
675
679
  "tests/test_reconcile_branch.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.52",
2
+ "tag": "0.5.55",
3
3
  "distance": 0,
4
- "node": "g330dc07157c3cfc0656c8d93b6c7d8a59ca29394",
4
+ "node": "g20ff70836aa359817f5f585fff5a5b9a075bb022",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-13"
@@ -55,7 +55,7 @@ from coord.commands.setup import (
55
55
  install_skills,
56
56
  version,
57
57
  )
58
- from coord.commands.agent_ops import agent, pause, unpause
58
+ from coord.commands.agent_ops import agent, pause, quiet_hours, unpause
59
59
  from coord.commands.gates import gates
60
60
  from coord.commands.status import diagnose, doctor, show_plan, status, usage
61
61
  from coord.commands.dispatch import (
@@ -376,6 +376,8 @@ main.add_command(bounce)
376
376
  main.add_command(sync)
377
377
  main.add_command(pause)
378
378
  main.add_command(unpause)
379
+ # #2146: set a machine's quiet-hours window without a coordinator session.
380
+ main.add_command(quiet_hours)
379
381
  main.add_command(refine_chat)
380
382
  main.add_command(test_chat)
381
383
  main.add_command(new_issue_chat)
@@ -283,6 +283,65 @@ def post_cordon(
283
283
  return post_record(svc, "/pause", payload, timeout=timeout)
284
284
 
285
285
 
286
+ def fetch_quiet_hours(
287
+ svc: ServiceConfig, *, timeout: float = _DEFAULT_TIMEOUT
288
+ ) -> dict[str, dict]:
289
+ """GET /pause → the daemon's effective quiet-hours windows (#2146).
290
+
291
+ ``{machine: {start, end, tz, source}}`` for every machine with a window,
292
+ whether it currently covers "now" or not — a thin client needs the whole
293
+ map to render `coord quiet-hours --list` and to pre-fill a dialog, not
294
+ just the subset that happens to be active this minute.
295
+
296
+ ``{}`` when the daemon predates #2146 (the key is simply absent), which
297
+ is the right read for a daemon that has no operator-set store. Raises
298
+ ``httpx.HTTPError`` on transport/HTTP failure —
299
+ `coord.machine_pause.effective_quiet_hours()` catches that and degrades
300
+ to "no windows known", the same fail-soft read posture as
301
+ `fetch_paused_machines`.
302
+ """
303
+ resp = httpx.get(f"{svc.url}/pause", headers=_headers(svc), timeout=timeout)
304
+ resp.raise_for_status()
305
+ data = resp.json()
306
+ rows = data.get("quiet_hours") if isinstance(data, dict) else None
307
+ if not isinstance(rows, dict):
308
+ return {}
309
+ return {str(k): dict(v) for k, v in rows.items() if isinstance(v, dict)}
310
+
311
+
312
+ def post_quiet_hours(
313
+ svc: ServiceConfig,
314
+ machine: str,
315
+ action: str,
316
+ *,
317
+ start: str | None = None,
318
+ end: str | None = None,
319
+ tz: str | None = None,
320
+ timeout: float = _WRITE_TIMEOUT,
321
+ ) -> dict:
322
+ """POST /pause {machine, action: set-quiet|clear-quiet, ...} (#2146).
323
+
324
+ Deliberately the SAME endpoint as pause/cordon: a quiet-hours window is
325
+ the same routing decision on a schedule, and one endpoint means one
326
+ place a thin client can be wrong about it.
327
+
328
+ Raises ``httpx.HTTPError`` on transport/HTTP failure — the whole point
329
+ of #2146 is that a thin client cannot edit `coordinator.yml` (its copy
330
+ is an overwritten cache), so a write that reported success and reached
331
+ nothing would rebuild the exact bug this closes. A daemon that predates
332
+ #2146 answers 400 ``unknown action``, which surfaces here as an
333
+ ``HTTPStatusError`` rather than a silent no-op: deploy the daemon first.
334
+ """
335
+ payload: dict = {"machine": machine, "action": action}
336
+ if start is not None:
337
+ payload["start"] = start
338
+ if end is not None:
339
+ payload["end"] = end
340
+ if tz is not None:
341
+ payload["tz"] = tz
342
+ return post_record(svc, "/pause", payload, timeout=timeout)
343
+
344
+
286
345
  def post_pause(
287
346
  svc: ServiceConfig, machine: str, action: str, *, timeout: float = _WRITE_TIMEOUT
288
347
  ) -> dict:
@@ -1386,4 +1386,253 @@ def unpause(config_path: Path, machine: str) -> None:
1386
1386
  f"({outcome.tz}) — resumes its normal quiet schedule next window"
1387
1387
  )
1388
1388
  else:
1389
- click.echo(f"not paused: {machine}")
1389
+ click.echo(f"not paused: {machine}")
1390
+
1391
+
1392
+ # ── #2146: `coord quiet-hours` ──────────────────────────────────────────────
1393
+
1394
+
1395
+ def _local_tz_name() -> str | None:
1396
+ """The CLIENT's IANA zone name, or None if it can't be determined.
1397
+
1398
+ #2146: `--tz` must default to the operator's own zone — they mean "22:00
1399
+ MY time", and the daemon runs UTC, so defaulting to the daemon's clock
1400
+ would fire hours off. `datetime.now().astimezone().tzinfo` gives an
1401
+ ABBREVIATION ("CDT"), not an IANA name `ZoneInfo` can resolve, so this
1402
+ walks the usual POSIX sources first and only falls back to that.
1403
+
1404
+ Returning None (rather than guessing "UTC") is deliberate: the caller
1405
+ turns it into "pass --tz explicitly", because a silently-UTC window is
1406
+ exactly the wrong-hour failure #1862 made `tz` mandatory to prevent.
1407
+ """
1408
+ from zoneinfo import ZoneInfo # noqa: PLC0415
1409
+
1410
+ def _ok(name: str | None) -> str | None:
1411
+ if not name or name in ("localtime", "UTC0"):
1412
+ return None
1413
+ try:
1414
+ ZoneInfo(name)
1415
+ except Exception: # noqa: BLE001 — not a resolvable zone, try the next source
1416
+ return None
1417
+ return name
1418
+
1419
+ candidates: list[str | None] = [os.environ.get("TZ")]
1420
+ try:
1421
+ candidates.append(Path("/etc/timezone").read_text(encoding="utf-8").strip())
1422
+ except OSError:
1423
+ pass
1424
+ try:
1425
+ parts = Path("/etc/localtime").resolve().parts
1426
+ if "zoneinfo" in parts:
1427
+ candidates.append("/".join(parts[parts.index("zoneinfo") + 1:]))
1428
+ except OSError:
1429
+ pass
1430
+ from datetime import datetime as _dt # noqa: PLC0415
1431
+
1432
+ candidates.append(_dt.now().astimezone().tzname())
1433
+ for candidate in candidates:
1434
+ resolved = _ok(candidate)
1435
+ if resolved is not None:
1436
+ return resolved
1437
+ return None
1438
+
1439
+
1440
+ def _parse_window_arg(window: str) -> tuple[str, str]:
1441
+ """``"22:00-08:00"`` → ``("22:00", "08:00")``. Shape only — the real
1442
+ validation (HH:MM, IANA tz, start != end) is `coord.config`'s, so the
1443
+ CLI can never accept a window `coordinator.yml` would reject."""
1444
+ parts = window.split("-")
1445
+ if len(parts) != 2 or not parts[0].strip() or not parts[1].strip():
1446
+ raise ValueError(
1447
+ f"window must look like '22:00-08:00', got {window!r}"
1448
+ )
1449
+ return parts[0].strip(), parts[1].strip()
1450
+
1451
+
1452
+ def _quiet_hours_rows(machines: Any) -> dict[str, dict]:
1453
+ from coord.machine_pause import effective_quiet_hours # noqa: PLC0415
1454
+
1455
+ return effective_quiet_hours(machines)
1456
+
1457
+
1458
+ def _describe_source(source: str) -> str:
1459
+ return "set here" if source == "store" else "coordinator.yml"
1460
+
1461
+
1462
+ @click.command(
1463
+ "quiet-hours",
1464
+ help=(
1465
+ "Show or set a machine's recurring no-new-dispatch window (#2146).\n\n"
1466
+ "\b\n"
1467
+ " coord quiet-hours MACHINE 22:00-08:00 [--tz America/Chicago]\n"
1468
+ " coord quiet-hours MACHINE --clear\n"
1469
+ " coord quiet-hours [MACHINE] --list\n"
1470
+ " coord quiet-hours MACHINE --print-yaml\n\n"
1471
+ "A window set here is stored on the DAEMON (alongside pauses and "
1472
+ "release cordons) and overrides that machine's coordinator.yml "
1473
+ "`quiet_hours:` block entirely — it does not rewrite the YAML. "
1474
+ "`--print-yaml` emits a paste-ready block for when a window should "
1475
+ "become permanent and version-controlled.\n\n"
1476
+ "--tz defaults to THIS machine's zone, never the daemon's UTC, and "
1477
+ "the resolved zone is echoed back so a wrong default is visible "
1478
+ "immediately."
1479
+ ),
1480
+ )
1481
+
1482
+
1483
+ @_CONFIG_OPTION
1484
+ @click.argument("machine", required=False)
1485
+ @click.argument("window", required=False)
1486
+ @click.option("--tz", "tz", default=None, help="IANA zone (default: this machine's).")
1487
+ @click.option("--clear", "clear_", is_flag=True, help="Remove an operator-set window.")
1488
+ @click.option("--list", "list_", is_flag=True, help="Show windows and where they came from.")
1489
+ @click.option(
1490
+ "--print-yaml",
1491
+ "print_yaml",
1492
+ is_flag=True,
1493
+ help="Emit a coordinator.yml `quiet_hours:` block for MACHINE.",
1494
+ )
1495
+ def quiet_hours(
1496
+ config_path: Path,
1497
+ machine: str | None,
1498
+ window: str | None,
1499
+ tz: str | None,
1500
+ clear_: bool,
1501
+ list_: bool,
1502
+ print_yaml: bool,
1503
+ ) -> None:
1504
+ from coord.machine_pause import clear_quiet_hours, set_quiet_hours # noqa: PLC0415
1505
+
1506
+ # Best-effort config, exactly like `unpause` above: an unloadable config
1507
+ # must not block the (fully functional) store path — it only means
1508
+ # coordinator.yml-sourced windows can't be listed alongside store ones.
1509
+ machines = None
1510
+ try:
1511
+ from coord.config import load as _load_yaml_config # noqa: PLC0415
1512
+
1513
+ machines = _load_yaml_config(config_path).machines
1514
+ except Exception: # noqa: BLE001
1515
+ pass
1516
+
1517
+ if list_ or (machine is None and not (clear_ or print_yaml or window)):
1518
+ rows = _quiet_hours_rows(machines)
1519
+ if machine is not None:
1520
+ rows = {k: v for k, v in rows.items() if k == machine}
1521
+ if not rows:
1522
+ click.echo(
1523
+ "no quiet hours set"
1524
+ + (f" for {machine}" if machine else "")
1525
+ + " (set one: coord quiet-hours MACHINE 22:00-08:00)"
1526
+ )
1527
+ return
1528
+ width = max(len(name) for name in rows)
1529
+ for name, row in sorted(rows.items()):
1530
+ click.echo(
1531
+ f"{name.ljust(width)} {row.get('start')}-{row.get('end')} "
1532
+ f"{row.get('tz')} [{_describe_source(str(row.get('source') or ''))}]"
1533
+ )
1534
+ return
1535
+
1536
+ if machine is None:
1537
+ click.echo("error: MACHINE is required", err=True)
1538
+ sys.exit(2)
1539
+
1540
+ if print_yaml:
1541
+ # The promotion path: a window that has proved itself belongs in
1542
+ # version control, where a daemon rebuild can't lose it.
1543
+ if window is not None:
1544
+ try:
1545
+ start, end = _parse_window_arg(window)
1546
+ except ValueError as e:
1547
+ click.echo(f"error: {e}", err=True)
1548
+ sys.exit(2)
1549
+ zone = tz or _local_tz_name()
1550
+ else:
1551
+ row = _quiet_hours_rows(machines).get(machine)
1552
+ if row is None:
1553
+ click.echo(
1554
+ f"error: no quiet hours known for {machine!r} — pass a window "
1555
+ "(e.g. `coord quiet-hours MACHINE 22:00-08:00 --print-yaml`)",
1556
+ err=True,
1557
+ )
1558
+ sys.exit(1)
1559
+ start, end, zone = row.get("start"), row.get("end"), tz or row.get("tz")
1560
+ if not zone:
1561
+ click.echo(
1562
+ "error: could not determine a time zone — pass --tz "
1563
+ "(e.g. --tz America/Chicago)",
1564
+ err=True,
1565
+ )
1566
+ sys.exit(2)
1567
+ click.echo(f" # machines[] entry for {machine!r} in coordinator.yml")
1568
+ click.echo(" quiet_hours:")
1569
+ click.echo(f' start: "{start}"')
1570
+ click.echo(f' end: "{end}"')
1571
+ click.echo(f' tz: "{zone}"')
1572
+ return
1573
+
1574
+ if clear_:
1575
+ # #2146 acceptance: "nothing set" is NOT success. A machine can still
1576
+ # have a coordinator.yml block this cannot touch, and reporting
1577
+ # "cleared" for a no-op is the failure class this feature exists to
1578
+ # avoid.
1579
+ try:
1580
+ changed = clear_quiet_hours(machine)
1581
+ except Exception as e: # noqa: BLE001
1582
+ click.echo(
1583
+ f"error: could not confirm clearing quiet hours for {machine!r} "
1584
+ f"with the daemon: {e}",
1585
+ err=True,
1586
+ )
1587
+ sys.exit(1)
1588
+ if not changed:
1589
+ click.echo(f"nothing set: {machine} has no operator-set quiet hours")
1590
+ return
1591
+ click.echo(f"cleared: {machine} quiet hours")
1592
+ row = _quiet_hours_rows(machines).get(machine)
1593
+ if row is not None:
1594
+ click.echo(
1595
+ f"note: {machine} still has a coordinator.yml window "
1596
+ f"{row.get('start')}-{row.get('end')} ({row.get('tz')})"
1597
+ )
1598
+ return
1599
+
1600
+ if window is None:
1601
+ click.echo(
1602
+ "error: pass a window (e.g. `coord quiet-hours MACHINE 22:00-08:00`), "
1603
+ "--clear, --list or --print-yaml",
1604
+ err=True,
1605
+ )
1606
+ sys.exit(2)
1607
+ try:
1608
+ start, end = _parse_window_arg(window)
1609
+ except ValueError as e:
1610
+ click.echo(f"error: {e}", err=True)
1611
+ sys.exit(2)
1612
+ zone = tz or _local_tz_name()
1613
+ if not zone:
1614
+ click.echo(
1615
+ "error: could not determine this machine's time zone — pass --tz "
1616
+ "(e.g. --tz America/Chicago). Quiet hours never default to the "
1617
+ "daemon's UTC clock: it would fire at the wrong local hour.",
1618
+ err=True,
1619
+ )
1620
+ sys.exit(2)
1621
+
1622
+ # #1563/#2146: fail loudly. A thin client's write that never reaches the
1623
+ # daemon must not print a confirmation.
1624
+ try:
1625
+ stored = set_quiet_hours(machine, start=start, end=end, tz=zone)
1626
+ except Exception as e: # noqa: BLE001
1627
+ click.echo(
1628
+ f"error: could not set quiet hours for {machine!r}: {e}",
1629
+ err=True,
1630
+ )
1631
+ sys.exit(1)
1632
+ # Echo the RESOLVED zone: a wrong `--tz` default is otherwise invisible
1633
+ # until the machine goes quiet at the wrong hour.
1634
+ click.echo(
1635
+ f"quiet hours set: {machine} {stored.get('start')}-{stored.get('end')} "
1636
+ f"({stored.get('tz')}) — overrides any coordinator.yml block for this "
1637
+ f"machine; `coord quiet-hours {machine} --print-yaml` to make it permanent"
1638
+ )
@@ -130,13 +130,21 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
130
130
  # render "PAUSED" for a machine nobody paused and no `coord unpause` will
131
131
  # free — work stopping with no stated reason, which is the exact failure
132
132
  # the cordon mechanism is supposed to stop repeating.
133
+ # #2146: an operator-SET quiet-hours window lives in the daemon's state
134
+ # file, not in coordinator.yml, so a thin client resolving it locally
135
+ # would see the machine in `paused` with no local explanation and print
136
+ # the flatly wrong "PAUSED". Fetch the effective window map (daemon-aware,
137
+ # fail-soft) and hand it to describe_pause_state, which also names where
138
+ # each window came from — "set here" vs "from coordinator.yml".
133
139
  from coord.machine_pause import ( # noqa: PLC0415
134
140
  cordons as fetch_cordons,
135
141
  describe_pause_state,
142
+ effective_quiet_hours,
136
143
  paused_set,
137
144
  )
138
145
  paused = paused_set(cfg.machines)
139
146
  cordons = fetch_cordons()
147
+ quiet_windows = effective_quiet_hours(cfg.machines)
140
148
 
141
149
  statuses = check_all(machines, timeout=timeout)
142
150
  agent_completed: dict[str, dict] = {}
@@ -196,7 +204,9 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
196
204
  # pause — an operator debugging a stalled queue at 1AM needs to
197
205
  # know whether the machine will wake itself up or is waiting on
198
206
  # `coord unpause`.
199
- pause_state = describe_pause_state(m, paused, cordons=cordons)
207
+ pause_state = describe_pause_state(
208
+ m, paused, cordons=cordons, quiet_hours=quiet_windows
209
+ )
200
210
  if pause_state is not None and pause_state.kind == "cordon":
201
211
  # #2101 trap E: name the version it is draining for, so a stopped
202
212
  # machine reads as "the fleet is upgrading itself" rather than as
@@ -649,8 +649,40 @@ def test(assignment_id: str, config_path: Path, verdict: str | None, reason: str
649
649
 
650
650
  if repo and repo.test_command:
651
651
  click.echo(f"Running tests: {repo.test_command}")
652
- result = subprocess.run(repo.test_command, shell=True, cwd=str(wt_path))
652
+ # #2170: capture (stdout+stderr merged, same as an unpiped terminal
653
+ # would show) so a failure can be checked for the runner's `RESULT:
654
+ # BASELINE-RED` marker below — a failure the runner itself has
655
+ # already confirmed also reproduces on the merge-base is a
656
+ # statement about THIS MACHINE, not this branch, and must not be
657
+ # nudged towards `coord test --fail`. Relayed to the terminal after
658
+ # the run finishes rather than streamed live — the trade-off that
659
+ # buys the marker check `subprocess.run` (not `Popen`) keeps this
660
+ # call mockable exactly like every other one in this function.
661
+ result = subprocess.run(
662
+ repo.test_command, shell=True, cwd=str(wt_path),
663
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True,
664
+ )
665
+ if result.stdout:
666
+ click.echo(result.stdout, nl=False)
653
667
  if result.returncode != 0:
668
+ from coord.revalidate import is_baseline_red_failure # noqa: PLC0415
669
+
670
+ if is_baseline_red_failure(result.returncode, result.stdout or ""):
671
+ click.echo(
672
+ f"\nTests failed (exit {result.returncode}) — but the "
673
+ "runner already confirmed every failure reproduces "
674
+ "identically on the merge-base (#2170): this machine's "
675
+ "BASELINE is red, not this branch.",
676
+ err=True,
677
+ )
678
+ click.echo(f" worktree kept for inspection: {wt_path}")
679
+ click.echo(
680
+ " run: coord test --skipped "
681
+ f"{assignment_id} --reason \"baseline-red (#2170): "
682
+ "pre-existing failures on this machine\" "
683
+ "# NOT --fail — the branch made nothing worse"
684
+ )
685
+ sys.exit(1)
654
686
  click.echo(f"Tests failed (exit {result.returncode})", err=True)
655
687
  click.echo(f" worktree kept for inspection: {wt_path}")
656
688
  sys.exit(1)
@@ -1951,6 +1951,50 @@ def _parse_hhmm(raw: Any, *, field_path: str) -> time:
1951
1951
  return time(int(m.group(1)), int(m.group(2)))
1952
1952
 
1953
1953
 
1954
+ def parse_quiet_hours_window(
1955
+ start: Any, end: Any, tz: Any, *, prefix: str = "quiet_hours"
1956
+ ) -> QuietHours:
1957
+ """Validate a raw ``start``/``end``/``tz`` triple into a `QuietHours`.
1958
+
1959
+ #2146: THE definition of "a valid quiet-hours window", shared by the
1960
+ YAML path (`_parse_quiet_hours_block` below, i.e.
1961
+ ``machines[i].quiet_hours`` and ``notifications.quiet_hours``) and by
1962
+ the operator-set store path (`coord.machine_pause.local_set_quiet_hours`,
1963
+ written by `coord quiet-hours` / the daemon's `/pause` endpoint).
1964
+
1965
+ The two sources must never diverge on what they accept: a window a
1966
+ `coord quiet-hours` call takes but `coordinator.yml` rejects (or vice
1967
+ versa) would make `--print-yaml`'s promotion path — the whole point of
1968
+ which is "make this temporary window permanent" — emit a block that
1969
+ fails to load. One validator, one answer.
1970
+
1971
+ Raises `ConfigError` (with *prefix* naming the offending field) on
1972
+ anything invalid; the daemon endpoint relays that message verbatim in
1973
+ its 400 so an operator sees the real reason, not "bad request".
1974
+ """
1975
+ parsed_start = _parse_hhmm(start, field_path=f"{prefix}.start")
1976
+ parsed_end = _parse_hhmm(end, field_path=f"{prefix}.end")
1977
+
1978
+ if not tz or not isinstance(tz, str):
1979
+ raise ConfigError(
1980
+ f"{prefix}.tz is required (IANA zone name, e.g. 'America/Chicago') — "
1981
+ "quiet hours never default to the daemon's own UTC clock, since that "
1982
+ "would silently fire at the wrong local hour"
1983
+ )
1984
+ try:
1985
+ ZoneInfo(tz)
1986
+ except (ZoneInfoNotFoundError, ValueError, OSError) as e:
1987
+ raise ConfigError(f"{prefix}.tz {tz!r} is not a known IANA zone name: {e}") from e
1988
+
1989
+ if parsed_start == parsed_end:
1990
+ raise ConfigError(
1991
+ f"{prefix}: start and end must differ ('always quiet' is ambiguous — "
1992
+ "use `coord pause` to take a machine out of rotation indefinitely instead)"
1993
+ )
1994
+
1995
+ return QuietHours(start=parsed_start, end=parsed_end, tz=tz)
1996
+
1997
+
1954
1998
  def _parse_quiet_hours_block(raw: Any, *, prefix: str) -> QuietHours | None:
1955
1999
  """Parse a ``{start, end, tz}`` quiet-hours mapping. ``None`` → ``None``.
1956
2000
 
@@ -1967,34 +2011,19 @@ def _parse_quiet_hours_block(raw: Any, *, prefix: str) -> QuietHours | None:
1967
2011
  operator wrote — a quiet-hours feature that activates early is worse
1968
2012
  than none, because it silently pulls the machine out of the fleet
1969
2013
  during the working day. Fail loudly here rather than default quietly.
2014
+
2015
+ #2146: the field-level rules themselves now live in
2016
+ `parse_quiet_hours_window` above, so the operator-set store validates
2017
+ identically to this YAML path.
1970
2018
  """
1971
2019
  if raw is None:
1972
2020
  return None
1973
2021
  if not isinstance(raw, dict):
1974
2022
  raise ConfigError(f"{prefix} must be a mapping")
1975
2023
 
1976
- start = _parse_hhmm(raw.get("start"), field_path=f"{prefix}.start")
1977
- end = _parse_hhmm(raw.get("end"), field_path=f"{prefix}.end")
1978
-
1979
- tz = raw.get("tz")
1980
- if not tz or not isinstance(tz, str):
1981
- raise ConfigError(
1982
- f"{prefix}.tz is required (IANA zone name, e.g. 'America/Chicago') — "
1983
- "quiet hours never default to the daemon's own UTC clock, since that "
1984
- "would silently fire at the wrong local hour"
1985
- )
1986
- try:
1987
- ZoneInfo(tz)
1988
- except (ZoneInfoNotFoundError, ValueError, OSError) as e:
1989
- raise ConfigError(f"{prefix}.tz {tz!r} is not a known IANA zone name: {e}") from e
1990
-
1991
- if start == end:
1992
- raise ConfigError(
1993
- f"{prefix}: start and end must differ ('always quiet' is ambiguous — "
1994
- "use `coord pause` to take a machine out of rotation indefinitely instead)"
1995
- )
1996
-
1997
- return QuietHours(start=start, end=end, tz=tz)
2024
+ return parse_quiet_hours_window(
2025
+ raw.get("start"), raw.get("end"), raw.get("tz"), prefix=prefix
2026
+ )
1998
2027
 
1999
2028
 
2000
2029
  def _parse_quiet_hours(raw: Any, *, machine_index: int, machine_name: str) -> QuietHours | None: