code-coordinator 0.5.173__tar.gz → 0.5.175__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 (883) hide show
  1. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/ci_github.py +50 -17
  7. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/ci_store.py +27 -0
  8. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/merge.py +55 -1
  9. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/gate_snapshot.py +40 -0
  10. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/merge_queue.py +48 -0
  11. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/manifest.yml +155 -0
  12. code_coordinator-0.5.175/tests/acceptance/ms-65/tabs_persistence_2286.rs +1105 -0
  13. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_board_read_path.py +81 -0
  14. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_ci_store.py +69 -0
  15. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_merge.py +93 -0
  16. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_merge_queue.py +78 -0
  17. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/tests/acceptance.rs +1 -0
  18. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.claude/commands/board.md +0 -0
  19. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.claude/commands/complete-session.md +0 -0
  20. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.claude/commands/coordinator.md +0 -0
  21. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.githooks/_lib.sh +0 -0
  22. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.githooks/post-checkout +0 -0
  23. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.githooks/post-commit +0 -0
  24. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.githooks/post-merge +0 -0
  25. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  26. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.github/coord-ci-acceptance.yml +0 -0
  27. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.github/workflows/acceptance-web.yml +0 -0
  28. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.github/workflows/auto-release.yml +0 -0
  29. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.github/workflows/cargo-test.yml +0 -0
  30. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.github/workflows/publish.yml +0 -0
  31. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.github/workflows/release-tui.yml +0 -0
  32. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.github/workflows/test.yml +0 -0
  33. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/.gitignore +0 -0
  34. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/CLAUDE.md +0 -0
  35. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/GOAL.md +0 -0
  36. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/LICENSE +0 -0
  37. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/MANIFEST.in +0 -0
  38. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/README.md +0 -0
  39. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/code_coordinator.egg-info/dependency_links.txt +0 -0
  40. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/code_coordinator.egg-info/entry_points.txt +0 -0
  41. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/code_coordinator.egg-info/requires.txt +0 -0
  42. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/agent.py +0 -0
  48. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/agent_app.py +0 -0
  49. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/agent_update.py +0 -0
  50. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/agents/opencode/.gitignore +0 -0
  51. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/agents/opencode/agents/work.md +0 -0
  52. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/agents/opencode/routing.jsonc +0 -0
  53. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/audit.py +0 -0
  54. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/auto_loop.py +0 -0
  55. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/block_log.py +0 -0
  56. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/board_bool_guard.py +0 -0
  57. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/board_service.py +0 -0
  58. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/board_wire.py +0 -0
  59. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/brain.py +0 -0
  60. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/branch_model.py +0 -0
  61. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/bug_intake.py +0 -0
  62. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/cargo_cache.py +0 -0
  63. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/client.py +0 -0
  66. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/chat.py +0 -0
  72. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/dispatch.py +0 -0
  73. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/dispatch_workers.py +0 -0
  74. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/portal.py +0 -0
  84. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/release.py +0 -0
  85. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/repo.py +0 -0
  86. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/report.py +0 -0
  87. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/review.py +0 -0
  88. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/scorecard.py +0 -0
  89. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/sessions.py +0 -0
  90. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/setup.py +0 -0
  91. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/status.py +0 -0
  92. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/terminal.py +0 -0
  93. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/test_gate.py +0 -0
  94. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/commands/tui.py +0 -0
  95. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/comments.py +0 -0
  96. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/config.py +0 -0
  97. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/config_reload.py +0 -0
  98. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/conflict_fix.py +0 -0
  99. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dao.py +0 -0
  100. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/__init__.py +0 -0
  101. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/fixture.py +0 -0
  102. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/index.html +0 -0
  103. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/server.py +0 -0
  104. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/terminal.py +0 -0
  105. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/.gitignore +0 -0
  106. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/components.json +0 -0
  107. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  108. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  109. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  110. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  111. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  112. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  113. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  114. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  115. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  116. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/index.html +0 -0
  117. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  118. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/sw.js +0 -0
  119. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  120. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  121. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  122. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  123. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  124. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  125. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  126. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  127. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  128. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  129. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/eslint.config.js +0 -0
  130. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/index.html +0 -0
  131. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  132. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/package-lock.json +0 -0
  133. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/package.json +0 -0
  134. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  135. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/playwright.config.ts +0 -0
  136. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/postcss.config.js +0 -0
  137. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  138. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  139. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  140. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/App.tsx +0 -0
  141. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/api/client.ts +0 -0
  142. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  143. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  144. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  145. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  146. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  147. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  148. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  149. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  150. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  151. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  152. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  153. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  154. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  155. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  156. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  157. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  158. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  159. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  160. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  161. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  162. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  163. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  164. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  165. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  166. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  167. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  168. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  169. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  170. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  171. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  172. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  173. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  174. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  175. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  176. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  177. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/index.css +0 -0
  178. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  179. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  180. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/main.tsx +0 -0
  181. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  182. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  183. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  184. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  185. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  186. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  187. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  188. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  189. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  190. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  191. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  192. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  193. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  194. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  195. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  196. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  197. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  198. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  199. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  200. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  201. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  202. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  203. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  204. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/tailwind.config.js +0 -0
  205. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/tsconfig.json +0 -0
  206. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  207. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dashboard/webapp/vite.config.ts +0 -0
  208. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/db.py +0 -0
  209. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dead_end.py +0 -0
  210. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/README.md +0 -0
  211. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-agent.service +0 -0
  212. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-db-backup.service +0 -0
  213. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-db-backup.sh +0 -0
  214. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-db-backup.timer +0 -0
  215. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-drive-queue.service +0 -0
  216. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-drive-queue.timer +0 -0
  217. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-notify.service +0 -0
  218. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-notify.timer +0 -0
  219. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-release-propagate.service +0 -0
  220. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-release-propagate.timer +0 -0
  221. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-release-window.service +0 -0
  222. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-release-window.timer +0 -0
  223. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-serve.service +0 -0
  224. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-web-dist-build.service +0 -0
  225. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-web-dist-build.timer +0 -0
  226. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy/coord-web.service +0 -0
  227. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy_manifest.py +0 -0
  228. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deploy_units.py +0 -0
  229. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/deps.py +0 -0
  230. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/diagnose.py +0 -0
  231. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dispatch.py +0 -0
  232. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/dist_name.py +0 -0
  233. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/drive.py +0 -0
  234. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/drive_queue.py +0 -0
  235. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/drive_state.py +0 -0
  236. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/events.py +0 -0
  237. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/failure_class.py +0 -0
  238. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/filelock.py +0 -0
  239. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/fleet_config_health.py +0 -0
  240. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/freshness.py +0 -0
  241. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/gate_a.py +0 -0
  242. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/gate_b.py +0 -0
  243. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/gates.py +0 -0
  244. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/github_ops.py +0 -0
  245. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/goal.py +0 -0
  246. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/graph_health.py +0 -0
  247. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/__init__.py +0 -0
  248. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/aggregate.py +0 -0
  249. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/__init__.py +0 -0
  250. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/agent_install.py +0 -0
  251. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/cargo_targets.py +0 -0
  252. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/claude_binary.py +0 -0
  253. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/deploy_lane_facts.py +0 -0
  254. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/disk.py +0 -0
  255. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/fleet_board.py +0 -0
  256. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  257. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/fleet_phantom.py +0 -0
  258. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/fleet_unit_drift.py +0 -0
  259. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/graph.py +0 -0
  260. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/graphify_cli.py +0 -0
  261. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/index_lock.py +0 -0
  262. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/plan_usage.py +0 -0
  263. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/repo_state.py +0 -0
  264. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/spawned_coord.py +0 -0
  265. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/timer_active.py +0 -0
  266. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/toolchain.py +0 -0
  267. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/unit_drift.py +0 -0
  268. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/unit_enablement.py +0 -0
  269. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/checks/worktrees.py +0 -0
  270. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/cli.py +0 -0
  271. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/context.py +0 -0
  272. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/fleet_snapshot.py +0 -0
  273. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/models.py +0 -0
  274. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/pypi.py +0 -0
  275. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/registry.py +0 -0
  276. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/render.py +0 -0
  277. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/health/units.py +0 -0
  278. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/hooks.py +0 -0
  279. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/housekeeping.py +0 -0
  280. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/interactive.py +0 -0
  281. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/issue_store.py +0 -0
  282. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/liveness_auditor.py +0 -0
  283. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/machine_pause.py +0 -0
  284. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/milestone_chat.py +0 -0
  285. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/milestone_dispatch.py +0 -0
  286. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/milestone_gate.py +0 -0
  287. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/milestone_order.py +0 -0
  288. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/mock_author.py +0 -0
  289. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/models.py +0 -0
  290. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/network.py +0 -0
  291. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/new_issue_chat.py +0 -0
  292. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/__init__.py +0 -0
  293. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/baseline.py +0 -0
  294. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/cli.py +0 -0
  295. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/collect.py +0 -0
  296. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/digest.py +0 -0
  297. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/models.py +0 -0
  298. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/predicate.py +0 -0
  299. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/service.py +0 -0
  300. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/store.py +0 -0
  301. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notifier/transport.py +0 -0
  302. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/notify.py +0 -0
  303. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/openapi.py +0 -0
  304. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/overlap_fence.py +0 -0
  305. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/overlap_predict.py +0 -0
  306. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/parentage.py +0 -0
  307. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/parentage_github.py +0 -0
  308. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/pipeline.py +0 -0
  309. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/plan_parser.py +0 -0
  310. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/plans.py +0 -0
  311. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/platform_paths.py +0 -0
  312. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/portal_bridge.py +0 -0
  313. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/portal_store.py +0 -0
  314. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/portal_sync.py +0 -0
  315. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/pr_body_lint.py +0 -0
  316. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/prereqs.py +0 -0
  317. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/progress.py +0 -0
  318. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/providers/__init__.py +0 -0
  319. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/providers/base.py +0 -0
  320. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/providers/claude.py +0 -0
  321. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/providers/claude_pty.py +0 -0
  322. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/providers/opencode.py +0 -0
  323. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/queue_diagnose.py +0 -0
  324. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/reconcile.py +0 -0
  325. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/reconcile_tick.py +0 -0
  326. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/refine_chat.py +0 -0
  327. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/release_cordon.py +0 -0
  328. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/release_propagate.py +0 -0
  329. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/release_verify.py +0 -0
  330. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/release_window.py +0 -0
  331. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/repo_edit.py +0 -0
  332. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/repo_onboard.py +0 -0
  333. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/reports.py +0 -0
  334. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/revalidate.py +0 -0
  335. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/review.py +0 -0
  336. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/scorecard.py +0 -0
  337. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/self_health.py +0 -0
  338. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/serve_app.py +0 -0
  339. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  340. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  341. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  342. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  343. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  344. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/skills/portal-followup/SKILL.md +0 -0
  345. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  346. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  347. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/skills/update-issue/SKILL.md +0 -0
  348. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/smoke.py +0 -0
  349. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/spend_ceiling.py +0 -0
  350. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/split_work.py +0 -0
  351. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/stage_projection.py +0 -0
  352. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/state.py +0 -0
  353. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/test_author.py +0 -0
  354. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/test_chat.py +0 -0
  355. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/test_orchestrator.py +0 -0
  356. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/test_report.py +0 -0
  357. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/tui_release.py +0 -0
  358. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/usage.py +0 -0
  359. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/usage_limits.py +0 -0
  360. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/usage_rollup.py +0 -0
  361. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coord/worker_events.py +0 -0
  362. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/coordinator.example.yml +0 -0
  363. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-agent.service +0 -0
  364. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-db-backup.service +0 -0
  365. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-db-backup.sh +0 -0
  366. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-db-backup.timer +0 -0
  367. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-drive-queue.service +0 -0
  368. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-drive-queue.timer +0 -0
  369. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-notify.service +0 -0
  370. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-notify.timer +0 -0
  371. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-release-propagate.service +0 -0
  372. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-release-propagate.timer +0 -0
  373. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-release-window.service +0 -0
  374. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-release-window.timer +0 -0
  375. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-serve.service +0 -0
  376. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-web-dist-build.service +0 -0
  377. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-web-dist-build.sh +0 -0
  378. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-web-dist-build.timer +0 -0
  379. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-web-rollback.sh +0 -0
  380. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/coord-web.service +0 -0
  381. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/deploy/node-shim.sh +0 -0
  382. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/ADR_COORD_WEB_DIST.md +0 -0
  383. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/AGENT_OPERATIONS.md +0 -0
  384. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/ARCHITECTURE.md +0 -0
  385. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/ARCH_SECURITY_GATES.md +0 -0
  386. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/COCKPIT.md +0 -0
  387. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/CONTROL_CENTER.md +0 -0
  388. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/COST_DISCIPLINE.md +0 -0
  389. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/CROSS_PLATFORM.md +0 -0
  390. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/CUSTOMER_PORTAL.md +0 -0
  391. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/DRIVE_QUEUE.md +0 -0
  392. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/EPHEMERAL_WORKERS.md +0 -0
  393. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/FORGE_MIGRATION.md +0 -0
  394. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/GRAPHIFY_SETUP.md +0 -0
  395. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/ISSUE_GUIDANCE.md +0 -0
  396. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/MAC_MINI.md +0 -0
  397. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  398. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/NOTIFIER.md +0 -0
  399. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/OPENCODE_VERIFICATION.md +0 -0
  400. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/OPERATING_GOTCHAS.md +0 -0
  401. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/ORACLE_LOOP.md +0 -0
  402. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/PHONE_WEBAPP.md +0 -0
  403. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/PIPELINE_V2.md +0 -0
  404. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/PLATFORM_EVOLUTION.md +0 -0
  405. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/SECOND_BACKEND.md +0 -0
  406. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/STORE_SERVICE.md +0 -0
  407. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  408. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/WEB_CONTROL_CENTER.md +0 -0
  409. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/WSL_WINDOWS_WORKER.md +0 -0
  410. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/mocks/web/README.md +0 -0
  411. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/mocks/web/_tokens.css +0 -0
  412. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/mocks/web/issue-detail.html +0 -0
  413. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/mocks/web/pipeline-narrow.html +0 -0
  414. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/docs/mocks/web/pipeline-wide.html +0 -0
  415. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/graphify-out/.gitignore +0 -0
  416. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/install-agent.sh +0 -0
  417. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/pyproject.toml +0 -0
  418. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/audit_review_verdict_overrides.py +0 -0
  419. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  420. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/build-worker-image.sh +0 -0
  421. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/coordinator-machine.py +0 -0
  422. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/epic-down.sh +0 -0
  423. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/epic-up.sh +0 -0
  424. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/preflight.sh +0 -0
  425. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/provision-worker.sh +0 -0
  426. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  427. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  428. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/azure-workers/verify-github-token.sh +0 -0
  429. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/codegen.py +0 -0
  430. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/coord-test-runner.sh +0 -0
  431. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/drive-batch.sh +0 -0
  432. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/gen_board_fixture.py +0 -0
  433. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/next_release_tag.py +0 -0
  434. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/run_tests_in_populated_home.sh +0 -0
  435. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/run_tests_without_gh.sh +0 -0
  436. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/smoke_437_interactive.py +0 -0
  437. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/verify_878_review_capture.py +0 -0
  438. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/verify_release_published.py +0 -0
  439. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/scripts/verify_release_wheel.py +0 -0
  440. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/setup.cfg +0 -0
  441. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/SMOKE_SET.md +0 -0
  442. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/__init__.py +0 -0
  443. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  444. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-33/contract.md +0 -0
  445. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-33/manifest.yml +0 -0
  446. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  447. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  448. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  449. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  450. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-37/conftest.py +0 -0
  451. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-37/contract.md +0 -0
  452. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-37/manifest.yml +0 -0
  453. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  454. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  455. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/contract.md +0 -0
  456. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/manifest.yml +0 -0
  457. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  458. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  459. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  460. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  461. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  462. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  463. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  464. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  465. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  466. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  467. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-51/contract.md +0 -0
  468. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  469. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  470. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-51/manifest.yml +0 -0
  471. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  472. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-51/tsconfig.json +0 -0
  473. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  474. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  475. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/contract.md +0 -0
  476. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  477. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  478. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  479. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  480. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  481. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  482. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  483. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  484. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  485. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  486. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  487. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  488. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/conftest.py +0 -0
  489. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/board-pipeline-basic.json +0 -0
  490. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  491. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  492. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  493. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  494. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/playwright/all_pass.json +0 -0
  495. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  496. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/playwright/mixed_fail.json +0 -0
  497. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  498. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  499. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/playwright/skip.json +0 -0
  500. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/playwright/truncated.json +0 -0
  501. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  502. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  503. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  504. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  505. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  506. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  507. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  508. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  509. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_acceptance.py +0 -0
  510. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_acceptance_drivers.py +0 -0
  511. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent.py +0 -0
  512. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_api_error.py +0 -0
  513. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_app.py +0 -0
  514. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_branch_base.py +0 -0
  515. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_branch_capture.py +0 -0
  516. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_config_free_1712.py +0 -0
  517. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_deploy_units_endpoint.py +0 -0
  518. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_dirty_worktree.py +0 -0
  519. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  520. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_graph_self_heal.py +0 -0
  521. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_health_h3.py +0 -0
  522. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_idle_restart.py +0 -0
  523. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_push_failure.py +0 -0
  524. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_reap.py +0 -0
  525. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_repos_and_pull.py +0 -0
  526. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_restart_services_endpoint.py +0 -0
  527. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_skills_self_heal.py +0 -0
  528. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_startup_diagnostics.py +0 -0
  529. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_update.py +0 -0
  530. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_update_bluegreen.py +0 -0
  531. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_usage_limit.py +0 -0
  532. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_agent_zero_commit.py +0 -0
  533. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_ambient_home_isolation.py +0 -0
  534. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_approve_reject_plan.py +0 -0
  535. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_approve_usage_gate.py +0 -0
  536. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_assignment_already_recorded_daemon.py +0 -0
  537. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_audit_log.py +0 -0
  538. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_audit_outcome.py +0 -0
  539. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_audit_query.py +0 -0
  540. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_auto_loop.py +0 -0
  541. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_auto_release_publish_2035.py +0 -0
  542. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_base_checkout_restore.py +0 -0
  543. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_block_log.py +0 -0
  544. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_board_cap_762.py +0 -0
  545. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_board_fixture.py +0 -0
  546. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_board_service.py +0 -0
  547. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_board_state.py +0 -0
  548. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_board_wire.py +0 -0
  549. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_brain.py +0 -0
  550. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_branch_model.py +0 -0
  551. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_bug_intake.py +0 -0
  552. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_build_worker_image_env_update.py +0 -0
  553. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cargo_cache.py +0 -0
  554. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_ci_acceptance_gate_1950.py +0 -0
  555. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_ci_parity_2091.py +0 -0
  556. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_claim.py +0 -0
  557. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_acceptance.py +0 -0
  558. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_assign.py +0 -0
  559. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  560. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_assign_interactive_remote.py +0 -0
  561. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_assign_provider.py +0 -0
  562. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  563. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_audit.py +0 -0
  564. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_chat_continue.py +0 -0
  565. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_decide.py +0 -0
  566. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_diagnose_config_provenance.py +0 -0
  567. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_diagnose_graph.py +0 -0
  568. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_diagnose_self.py +0 -0
  569. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_doctor.py +0 -0
  570. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_doctor_config_free_1801.py +0 -0
  571. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  572. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_drive.py +0 -0
  573. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_drive_queue.py +0 -0
  574. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_escalate.py +0 -0
  575. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_fix_headless_review.py +0 -0
  576. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_gate_a.py +0 -0
  577. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_install_drift.py +0 -0
  578. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_install_skills.py +0 -0
  579. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_issue_create_label.py +0 -0
  580. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_issue_reopen.py +0 -0
  581. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_milestone_assign.py +0 -0
  582. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_milestone_capture.py +0 -0
  583. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_milestone_chat_add_child.py +0 -0
  584. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_milestone_dispatch.py +0 -0
  585. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_milestone_gate_b.py +0 -0
  586. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_milestone_gate_c.py +0 -0
  587. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_milestone_order.py +0 -0
  588. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  589. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_milestone_ship.py +0 -0
  590. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_network.py +0 -0
  591. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_new_issue_chat.py +0 -0
  592. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_plans.py +0 -0
  593. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_portal.py +0 -0
  594. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_pull_artifact.py +0 -0
  595. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_queue.py +0 -0
  596. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_reattach_sessions.py +0 -0
  597. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_refine_board.py +0 -0
  598. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_release_preflight.py +0 -0
  599. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_release_propagate.py +0 -0
  600. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_release_window.py +0 -0
  601. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_repo_2220.py +0 -0
  602. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_scorecard.py +0 -0
  603. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_set_review_findings.py +0 -0
  604. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_status_advisory_terminal.py +0 -0
  605. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_status_merge_queue.py +0 -0
  606. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_status_provider.py +0 -0
  607. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_status_review_finalizing.py +0 -0
  608. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_status_test_failed_tag.py +0 -0
  609. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_status_usage_limit.py +0 -0
  610. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_sync_comments_873.py +0 -0
  611. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_test_plan.py +0 -0
  612. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_track.py +0 -0
  613. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_tui_update.py +0 -0
  614. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cli_wait.py +0 -0
  615. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_client_base_install.py +0 -0
  616. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_comments.py +0 -0
  617. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_completion_summary.py +0 -0
  618. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_config.py +0 -0
  619. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_config_acceptance.py +0 -0
  620. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_config_audit.py +0 -0
  621. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_config_pricing.py +0 -0
  622. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  623. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_config_usage_gate.py +0 -0
  624. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_conflict_fix.py +0 -0
  625. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_conflict_fix_semantic.py +0 -0
  626. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_coord_test.py +0 -0
  627. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_coord_test_runner_baseline.py +0 -0
  628. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_coord_test_runner_populated_home.py +0 -0
  629. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_coord_test_runner_routing.py +0 -0
  630. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_coord_test_runner_toolchain.py +0 -0
  631. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_coord_web_sse_restart_live.py +0 -0
  632. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_coordinator_machine.py +0 -0
  633. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_cross_platform_imports.py +0 -0
  634. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_dashboard.py +0 -0
  635. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_dashboard_fixture.py +0 -0
  636. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_dashboard_terminal.py +0 -0
  637. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_dashboard_terminal_live.py +0 -0
  638. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_db.py +0 -0
  639. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_dead_end.py +0 -0
  640. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_deploy_coord_db_backup.py +0 -0
  641. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_deploy_coord_web_dist.py +0 -0
  642. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_deploy_coord_web_rollback.py +0 -0
  643. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_deploy_drive_queue_unit.py +0 -0
  644. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_deploy_manifest.py +0 -0
  645. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_deploy_units_lane.py +0 -0
  646. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_deploy_web_unit.py +0 -0
  647. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_deps.py +0 -0
  648. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_diagnose.py +0 -0
  649. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_dispatch.py +0 -0
  650. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_dispatch_target_validation.py +0 -0
  651. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_dist_name.py +0 -0
  652. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_done_housekeeping.py +0 -0
  653. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_drive.py +0 -0
  654. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_drive_queue.py +0 -0
  655. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_drive_state.py +0 -0
  656. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_drive_tmux.py +0 -0
  657. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_epic_up_capability_detection.py +0 -0
  658. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  659. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_epic_up_image_provenance.py +0 -0
  660. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_errors.py +0 -0
  661. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_events.py +0 -0
  662. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_failure_class.py +0 -0
  663. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_filelock.py +0 -0
  664. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  665. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_fix_of_force_override.py +0 -0
  666. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_fleet_config_health.py +0 -0
  667. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_fleet_health_probes.py +0 -0
  668. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_fleet_health_snapshot.py +0 -0
  669. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_freshness.py +0 -0
  670. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_gate_a.py +0 -0
  671. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_gate_b.py +0 -0
  672. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_gate_snapshot_staleness.py +0 -0
  673. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_gates.py +0 -0
  674. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  675. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_generated_types_fixture.py +0 -0
  676. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_github_ops.py +0 -0
  677. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_goal.py +0 -0
  678. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_graph_health.py +0 -0
  679. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_graph_selfheal_absent_2237.py +0 -0
  680. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_handoff.py +0 -0
  681. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_checks.py +0 -0
  682. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_cli.py +0 -0
  683. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_cli_graph.py +0 -0
  684. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_config.py +0 -0
  685. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_context.py +0 -0
  686. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_deploy_lane_facts.py +0 -0
  687. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_incident_regression.py +0 -0
  688. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_pypi.py +0 -0
  689. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_registry.py +0 -0
  690. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_timer_active.py +0 -0
  691. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_toolchain.py +0 -0
  692. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_unit_drift.py +0 -0
  693. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_health_unit_enablement.py +0 -0
  694. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_hooks.py +0 -0
  695. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_human_attended_437.py +0 -0
  696. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_init.py +0 -0
  697. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_integration.py +0 -0
  698. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_interactive_briefing_echo.py +0 -0
  699. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_interactive_prefill_state.py +0 -0
  700. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_interactive_session_relaunch.py +0 -0
  701. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_interactive_test_verdict_backstop.py +0 -0
  702. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_interactive_token_attribution.py +0 -0
  703. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_interactive_worktree.py +0 -0
  704. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_issue_store_seam.py +0 -0
  705. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_liveness_auditor.py +0 -0
  706. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_liveness_notify.py +0 -0
  707. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_machine_pause.py +0 -0
  708. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_merge_verify.py +0 -0
  709. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_milestone_chat.py +0 -0
  710. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_milestone_dispatch.py +0 -0
  711. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_milestone_gate.py +0 -0
  712. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_milestone_order.py +0 -0
  713. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_milestone_seam.py +0 -0
  714. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_mock_author.py +0 -0
  715. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_model_tiering.py +0 -0
  716. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_models.py +0 -0
  717. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_models_config_labels.py +0 -0
  718. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_needs_attention.py +0 -0
  719. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_network.py +0 -0
  720. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_new_issue_chat.py +0 -0
  721. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_next_release_tag.py +0 -0
  722. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_no_direct_gh_calls.py +0 -0
  723. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_node_shim.py +0 -0
  724. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notifier_baseline.py +0 -0
  725. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notifier_cli.py +0 -0
  726. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notifier_collect.py +0 -0
  727. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notifier_config.py +0 -0
  728. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notifier_drive_seam.py +0 -0
  729. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notifier_isolation.py +0 -0
  730. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notifier_predicate.py +0 -0
  731. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notifier_quiet_hours.py +0 -0
  732. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notifier_service.py +0 -0
  733. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notify.py +0 -0
  734. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_notify_drain.py +0 -0
  735. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_openapi.py +0 -0
  736. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_operational_defaults.py +0 -0
  737. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_overlap_fence.py +0 -0
  738. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_overlap_predict.py +0 -0
  739. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_packaged_deploy_units.py +0 -0
  740. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_parentage.py +0 -0
  741. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_paste_landed.py +0 -0
  742. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_pipeline.py +0 -0
  743. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_plan_followup_approve_plan_command.py +0 -0
  744. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_plan_followup_pr_command.py +0 -0
  745. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_plan_followup_review_command.py +0 -0
  746. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_plan_only.py +0 -0
  747. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_plan_parser.py +0 -0
  748. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_platform_paths.py +0 -0
  749. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_portal_bridge.py +0 -0
  750. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_portal_config.py +0 -0
  751. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_portal_sync.py +0 -0
  752. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_pr_body_lint.py +0 -0
  753. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_prereqs.py +0 -0
  754. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_production_db_guard.py +0 -0
  755. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_progress.py +0 -0
  756. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_provider_seam.py +0 -0
  757. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_providers.py +0 -0
  758. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_providers_config_labels.py +0 -0
  759. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_providers_pty.py +0 -0
  760. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_quiet_hours.py +0 -0
  761. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_quiet_hours_store_2146.py +0 -0
  762. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reap_merged_sessions.py +0 -0
  763. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reap_stale_interactive_tick.py +0 -0
  764. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reconcile.py +0 -0
  765. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reconcile_branch.py +0 -0
  766. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reconcile_completions.py +0 -0
  767. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reconcile_merges.py +0 -0
  768. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reconcile_no_agent_record.py +0 -0
  769. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reconcile_tick.py +0 -0
  770. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reconcile_usage_limit_done.py +0 -0
  771. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_refine_chat.py +0 -0
  772. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_release_cordon_2101.py +0 -0
  773. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  774. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_release_cordon_deadlock_2240.py +0 -0
  775. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_release_propagate.py +0 -0
  776. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_release_unified_1242.py +0 -0
  777. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_release_verify.py +0 -0
  778. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_release_window.py +0 -0
  779. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_remote_auto_prune.py +0 -0
  780. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_remote_interactive_reaper.py +0 -0
  781. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_repo_edit_2220.py +0 -0
  782. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_repo_graph_fleet_2237.py +0 -0
  783. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_repo_onboard_2220.py +0 -0
  784. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_report_result_push.py +0 -0
  785. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_reports.py +0 -0
  786. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_retry.py +0 -0
  787. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_retry_advisory_1606.py +0 -0
  788. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_retry_type_1636.py +0 -0
  789. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_revalidate.py +0 -0
  790. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_review.py +0 -0
  791. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_review_end_review_without_verdict.py +0 -0
  792. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_review_parse_failure_diagnostic.py +0 -0
  793. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_review_reaffirm.py +0 -0
  794. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_review_state.py +0 -0
  795. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_review_verdict_backstop.py +0 -0
  796. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_review_verdict_override_audit.py +0 -0
  797. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_review_verdict_relay.py +0 -0
  798. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_review_zero_commits.py +0 -0
  799. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_scoped_review_wiring.py +0 -0
  800. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_scorecard.py +0 -0
  801. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_self_health.py +0 -0
  802. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_serve.py +0 -0
  803. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_serve_app_board_trim.py +0 -0
  804. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_session.py +0 -0
  805. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_slice_issue_attribution.py +0 -0
  806. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_smoke.py +0 -0
  807. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_smoke_live_checkout_restore.py +0 -0
  808. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_smoke_workflow.py +0 -0
  809. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_spend_ceiling.py +0 -0
  810. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_spend_ceiling_coordinator.py +0 -0
  811. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_split.py +0 -0
  812. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_split_work.py +0 -0
  813. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_stage_projection.py +0 -0
  814. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_stalled_pipeline.py +0 -0
  815. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_state.py +0 -0
  816. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_state_review_findings_daemon.py +0 -0
  817. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_status_fleet_footer.py +0 -0
  818. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_stop_1567.py +0 -0
  819. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_stuck.py +0 -0
  820. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_terminal_command.py +0 -0
  821. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_test_author.py +0 -0
  822. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_test_chat.py +0 -0
  823. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_test_orchestrator.py +0 -0
  824. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_test_report.py +0 -0
  825. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_test_verdict_parsing.py +0 -0
  826. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_test_verdict_transcript_floor.py +0 -0
  827. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_thin_client_board_audit.py +0 -0
  828. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_thin_client_config_load_1080.py +0 -0
  829. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_thin_client_daemon_routing_906.py +0 -0
  830. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_tmux_host.py +0 -0
  831. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_tmux_session.py +0 -0
  832. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_transcript_floor.py +0 -0
  833. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_usage.py +0 -0
  834. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_usage_limits.py +0 -0
  835. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_usage_rollup.py +0 -0
  836. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_venv_live_install_2121.py +0 -0
  837. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_version_single_source.py +0 -0
  838. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_watch.py +0 -0
  839. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  840. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_worker_events.py +0 -0
  841. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_worker_image_pin_sync.py +0 -0
  842. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_worker_safety.py +0 -0
  843. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_worker_test_scoping.py +0 -0
  844. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_worktree.py +0 -0
  845. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  846. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/Cargo.lock +0 -0
  847. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/Cargo.toml +0 -0
  848. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/cargo-config-local-quadraui.toml.example +0 -0
  849. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/audit.rs +0 -0
  850. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/chat.rs +0 -0
  851. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/data.rs +0 -0
  852. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/dialogs.rs +0 -0
  853. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/doc_tabs.rs +0 -0
  854. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/drive.rs +0 -0
  855. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/drive_queue.rs +0 -0
  856. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/escalation.rs +0 -0
  857. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/events.rs +0 -0
  858. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/fixtures.rs +0 -0
  859. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/fleet_health.rs +0 -0
  860. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/fleet_sessions.rs +0 -0
  861. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/fleet_terminals.rs +0 -0
  862. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/format.rs +0 -0
  863. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/milestone_dag.rs +0 -0
  864. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/mod.rs +0 -0
  865. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/msv.rs +0 -0
  866. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/pipeline.rs +0 -0
  867. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/plans.rs +0 -0
  868. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/render.rs +0 -0
  869. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/reports.rs +0 -0
  870. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/sessions.rs +0 -0
  871. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/settings_ui.rs +0 -0
  872. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/sidebar.rs +0 -0
  873. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/terminal.rs +0 -0
  874. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/tests.rs +0 -0
  875. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/types.rs +0 -0
  876. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/app/workspace.rs +0 -0
  877. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/bin/gtk.rs +0 -0
  878. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/commands.rs +0 -0
  879. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/lib.rs +0 -0
  880. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/main.rs +0 -0
  881. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/src/settings.rs +0 -0
  882. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/tests/cli.rs +0 -0
  883. {code_coordinator-0.5.173 → code_coordinator-0.5.175}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.173
3
+ Version: 0.5.175
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.173
3
+ Version: 0.5.175
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
@@ -810,6 +810,7 @@ tests/acceptance/ms-65/detail_substate_2285.rs
810
810
  tests/acceptance/ms-65/manifest.yml
811
811
  tests/acceptance/ms-65/pipeline_tabs_2284.rs
812
812
  tests/acceptance/ms-65/tabs_discoverability_2287.rs
813
+ tests/acceptance/ms-65/tabs_persistence_2286.rs
813
814
  tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen
814
815
  tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen
815
816
  tests/acceptance/ms-65/mocks/board-preview-tab.screen
@@ -456,6 +456,7 @@
456
456
  "tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen",
457
457
  "tests/acceptance/ms-65/pipeline_tabs_2284.rs",
458
458
  "tests/acceptance/ms-65/tabs_discoverability_2287.rs",
459
+ "tests/acceptance/ms-65/tabs_persistence_2286.rs",
459
460
  "tests/acceptance/ms-example/mocks/home-active.html",
460
461
  "tests/conftest.py",
461
462
  "tests/fixtures/board-pipeline-basic.json",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.173",
2
+ "tag": "0.5.175",
3
3
  "distance": 0,
4
- "node": "g3e3dcca5954ea1c1094878c1f81ed18e515e641f",
4
+ "node": "g517152e1c6b8bcb5f78fa7edd29915934fa18cc9",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-19"
@@ -146,6 +146,49 @@ class GitHubCi:
146
146
  return True
147
147
 
148
148
  def list_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
149
+ """Checks the merge gate evaluates — narrowed to what GitHub's own
150
+ branch protection actually REQUIRES, when that's determinable
151
+ (#2388/#2446).
152
+
153
+ A repo can report far more `gh pr checks` entries than GitHub's
154
+ required-status-check list (this repo: 9 reported, 5 required), and
155
+ every merge-gate predicate downstream of this method
156
+ (`failed_checks`, `in_flight_checks`, `checks_are_stale`) otherwise
157
+ waits on advisory jobs GitHub itself doesn't — a hung/flaky ADVISORY
158
+ check (e.g. `Acceptance (web)`, or an unconditional Playwright/
159
+ Chromium install with no timeout) then blocks `coord merge`
160
+ indefinitely even though the PR is already `MERGEABLE`. Never
161
+ filters (returns everything :meth:`list_all_checks_for_pr` does)
162
+ when the required list can't be determined — #1525's bias: unknown
163
+ reads as "wait on everything reported", not as a free pass to stop
164
+ waiting on something that might matter.
165
+
166
+ #2446: this is deliberately the ONLY narrowed view — see
167
+ :meth:`list_all_checks_for_pr` for the full, unfiltered set that
168
+ feeds `coord merge --plan`'s CI summary, so a regressed advisory
169
+ check stays visible to an operator even though it can no longer gate
170
+ a merge attempt.
171
+ """
172
+ checks = self._all_checks(repo, number)
173
+ required = self._required_contexts(repo)
174
+ if required:
175
+ return [c for c in checks if c.name in required]
176
+ return checks
177
+
178
+ def list_all_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
179
+ """Every check `gh pr checks` reports, required or advisory (#2446).
180
+
181
+ Purely a visibility view — `coord merge --plan`/the TUI's CI badges
182
+ read this so a regressed ADVISORY check (one GitHub's branch
183
+ protection doesn't require, and :meth:`list_checks_for_pr` therefore
184
+ no longer waits on) is still something an operator can see, per
185
+ #2446's suggested fix: "still visible ... but should never gate a
186
+ merge attempt." Shares :meth:`list_checks_for_pr`'s cached fetch —
187
+ one `gh pr checks` subprocess call backs both views, never two.
188
+ """
189
+ return self._all_checks(repo, number)
190
+
191
+ def _all_checks(self, repo: str, number: int) -> list[CheckRun]:
149
192
  key = (repo, number)
150
193
  now = time.time()
151
194
  cached = self._cache.get(key)
@@ -367,7 +410,13 @@ class GitHubCi:
367
410
  return [_unreadable_check(repo, number, str(e))]
368
411
  if not isinstance(raw, list):
369
412
  return [_unreadable_check(repo, number, "gh pr checks returned non-list JSON")]
370
- checks = [
413
+ # #2446: `_all_checks` (this method's only caller) is the single
414
+ # unfiltered fetch shared by both `list_checks_for_pr` (narrowed to
415
+ # required contexts) and `list_all_checks_for_pr` (everything) — the
416
+ # required-contexts narrowing used to happen here, which meant an
417
+ # advisory check's regression was invisible everywhere, not just to
418
+ # the merge gate. See both methods' docstrings.
419
+ return [
371
420
  CheckRun(
372
421
  name=str(entry.get("name", "")),
373
422
  status=_status_from_bucket(str(entry.get("bucket", ""))),
@@ -380,22 +429,6 @@ class GitHubCi:
380
429
  for entry in raw
381
430
  if isinstance(entry, dict)
382
431
  ]
383
- # #2388: narrow to what branch protection actually REQUIRES, when
384
- # that's determinable — a repo can report far more `gh pr checks`
385
- # entries than GitHub's own required list (this repo: 9 reported, 5
386
- # required), and every merge-gate predicate downstream of this
387
- # method (`failed_checks`, `in_flight_checks`, `checks_are_stale`)
388
- # otherwise waits on advisory jobs GitHub itself doesn't. A hung
389
- # advisory job (e.g. an unconditional Playwright/Chromium install
390
- # with no timeout) would then block `coord merge` indefinitely even
391
- # though the PR is already `MERGEABLE`. `_required_contexts` returns
392
- # `None` (never filters) when it can't determine the required list
393
- # — #1525's bias: unknown reads as "wait on everything reported",
394
- # not as a free pass to stop waiting on something that might matter.
395
- required = self._required_contexts(repo)
396
- if required:
397
- checks = [c for c in checks if c.name in required]
398
- return checks
399
432
 
400
433
  def _required_contexts(self, repo: str) -> frozenset[str] | None:
401
434
  now = time.time()
@@ -125,6 +125,28 @@ class CiStore(Protocol):
125
125
 
126
126
  def list_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]: ...
127
127
 
128
+ def list_all_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
129
+ """Every check reported for *repo*/*number*, required or advisory
130
+ (#2446) — the unfiltered counterpart to :meth:`list_checks_for_pr`,
131
+ which narrows to what branch protection actually requires so the
132
+ merge gate never blocks on a merely-advisory check (see that
133
+ method's docstring on :class:`coord.ci_github.GitHubCi`).
134
+
135
+ Purely a visibility view: `coord merge --plan`'s CI summary reads
136
+ this so a regressed advisory check is still visible to an operator
137
+ even though it can no longer gate a merge attempt — matching what
138
+ GitHub's own merge button already allows.
139
+
140
+ Optional/duck-typed like :meth:`rerun_failed_for_pr` — call sites
141
+ use ``getattr(ci_store, "list_all_checks_for_pr", None)`` and fall
142
+ back to :meth:`list_checks_for_pr` for a stand-in (a test stub, or
143
+ :class:`coord.gate_snapshot.GateSnapshot` when its own snapshot
144
+ wasn't refreshed with the unfiltered view) that predates this
145
+ capability — read as "no separate advisory view available", not an
146
+ error.
147
+ """
148
+ ...
149
+
128
150
  @property
129
151
  def is_available(self) -> bool: ...
130
152
 
@@ -232,6 +254,11 @@ class NoOpCi:
232
254
  def list_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
233
255
  return []
234
256
 
257
+ def list_all_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
258
+ """No-op: CI gating is disabled entirely, so there is nothing to
259
+ show either the gate or an operator (#2446)."""
260
+ return []
261
+
235
262
  @property
236
263
  def is_available(self) -> bool:
237
264
  return False
@@ -944,6 +944,60 @@ def _reconcile_via_daemon(svc, params: dict) -> None:
944
944
  sys.exit(int(code))
945
945
 
946
946
 
947
+ def _ci_field(summary, name: str, default=0):
948
+ """Read *name* off a CI rollup, tolerating both shapes ``p.ci_summary``/
949
+ ``p.ci_summary_all`` can arrive in (#2446).
950
+
951
+ ``coord.merge_queue.plan()`` (the local, in-process path) hands back
952
+ real :class:`~coord.ci_store.CiCheckSummary` instances. ``coord merge
953
+ --plan`` against a daemon instead reconstructs ``PlannedMerge`` from the
954
+ ``/board`` JSON payload (``_show_plan_from_daemon`` below) — the server
955
+ side flattens each rollup with ``dataclasses.asdict`` and nothing
956
+ re-hydrates it, so on that path both fields arrive as plain ``dict``s
957
+ instead. ``summary`` is ``None`` on either path when there's nothing to
958
+ report (no PR yet, no ``ci_store``, …).
959
+ """
960
+ if summary is None:
961
+ return default
962
+ if isinstance(summary, dict):
963
+ return summary.get(name, default)
964
+ return getattr(summary, name, default)
965
+
966
+
967
+ def _advisory_ci_note(p) -> str:
968
+ """#2446: describe any check failing/still-running in the unfiltered
969
+ (required + advisory) CI rollup that the required-only rollup
970
+ (``p.ci_summary`` — the same view the merge gate itself evaluates)
971
+ doesn't already account for.
972
+
973
+ A regression here is on a check GitHub's own branch protection doesn't
974
+ require — `coord merge`'s gate correctly no longer blocks on it (see
975
+ ``coord.ci_github.GitHubCi.list_checks_for_pr``'s docstring), but an
976
+ operator staring at a READY row while a real job is red/hung nearby
977
+ still deserves to see it. Returns ``""`` when there's nothing extra to
978
+ report (no ``ci_summary_all``, or it agrees with ``ci_summary``).
979
+ """
980
+ if p.ci_summary_all is None:
981
+ return ""
982
+ req_failed = _ci_field(p.ci_summary, "failed")
983
+ req_running = _ci_field(p.ci_summary, "running")
984
+ req_failed_names = set(_ci_field(p.ci_summary, "failed_names", []) or [])
985
+ extra_failed = _ci_field(p.ci_summary_all, "failed") - req_failed
986
+ extra_running = _ci_field(p.ci_summary_all, "running") - req_running
987
+ if extra_failed <= 0 and extra_running <= 0:
988
+ return ""
989
+ all_failed_names = _ci_field(p.ci_summary_all, "failed_names", []) or []
990
+ advisory_failed_names = [n for n in all_failed_names if n not in req_failed_names]
991
+ bits = []
992
+ if advisory_failed_names:
993
+ bits.append("failing: " + ", ".join(advisory_failed_names))
994
+ elif extra_failed > 0:
995
+ bits.append(f"{extra_failed} failing")
996
+ if extra_running > 0:
997
+ bits.append(f"{extra_running} running")
998
+ return " [advisory CI, not blocking — " + "; ".join(bits) + "]"
999
+
1000
+
947
1001
  def _print_merge_plan_entries(planned: list) -> None:
948
1002
  """Print a list of PlannedMerge entries grouped by repo → target_branch."""
949
1003
  if not planned:
@@ -963,7 +1017,7 @@ def _print_merge_plan_entries(planned: list) -> None:
963
1017
  _status_str = f"{_p.status} {_p.reason}"
964
1018
  click.echo(
965
1019
  f" {_p.rank}. #{_p.issue_number} {_size_str} "
966
- f"{_status_str} {_p.issue_title}"
1020
+ f"{_status_str} {_p.issue_title}{_advisory_ci_note(_p)}"
967
1021
  )
968
1022
 
969
1023
 
@@ -136,6 +136,16 @@ class GateSnapshot:
136
136
  """
137
137
 
138
138
  checks: dict[tuple[str, int], list[CheckRun]] = field(default_factory=dict)
139
+ # #2446: the unfiltered counterpart to `checks` above — `checks` is
140
+ # already narrowed to branch-protection-required contexts (see
141
+ # `coord.ci_github.GitHubCi.list_checks_for_pr`'s docstring), so a
142
+ # regressed ADVISORY check (one GitHub's own merge button doesn't wait
143
+ # on either) would otherwise be invisible to `coord merge --plan`'s CI
144
+ # summary, not just to the merge gate. Populated from
145
+ # `list_all_checks_for_pr` when the inner `CiStore` offers it; falls
146
+ # back to the same (already-narrowed) data as `checks` for a backend
147
+ # that doesn't, same fail-open shape as `workflows_declared` below.
148
+ all_checks: dict[tuple[str, int], list[CheckRun]] = field(default_factory=dict)
139
149
  commit_messages: dict[tuple[str, int], list[str]] = field(default_factory=dict)
140
150
  epic_issues: dict[tuple[str, int], bool] = field(default_factory=dict)
141
151
  # #1640: (repo, branch) -> HEAD SHA, and (repo, base, head) -> patch-id,
@@ -180,6 +190,19 @@ class GateSnapshot:
180
190
  return [_stale_check(age)]
181
191
  return self.checks.get((repo, number), [])
182
192
 
193
+ def list_all_checks_for_pr(self, repo: str, number: int) -> list[CheckRun]:
194
+ """Unfiltered counterpart to :meth:`list_checks_for_pr` (#2446) —
195
+ same staleness handling, but keyed off ``all_checks`` so an
196
+ advisory check's regression stays visible to `coord merge --plan`
197
+ even though `list_checks_for_pr` (the gate's own view) no longer
198
+ waits on it.
199
+ """
200
+ if self.ci_available:
201
+ age = None if self.refreshed_at is None else time.time() - self.refreshed_at
202
+ if age is None or age > STALE_AFTER_SECONDS:
203
+ return [_stale_check(age)]
204
+ return self.all_checks.get((repo, number), [])
205
+
183
206
  def expects_checks(self, repo: str, number: int) -> bool:
184
207
  # #1904: unlike `list_checks_for_pr`'s "unknown reads as failing"
185
208
  # (#1525) posture, a repo this snapshot hasn't cached an answer for
@@ -286,6 +309,7 @@ class GateSnapshotRefresher:
286
309
  entries = [e for e in pending if e.pr_number]
287
310
 
288
311
  checks: dict[tuple[str, int], list[CheckRun]] = {}
312
+ all_checks: dict[tuple[str, int], list[CheckRun]] = {}
289
313
  messages: dict[tuple[str, int], list[str]] = {}
290
314
  epics: dict[tuple[str, int], bool] = {}
291
315
  branch_shas: dict[tuple[str, str], str | None] = {}
@@ -342,6 +366,21 @@ class GateSnapshotRefresher:
342
366
  checks[key] = inner.list_checks_for_pr(*key)
343
367
  except Exception: # noqa: BLE001 — fail-open for this entry
344
368
  checks[key] = []
369
+ # #2446: the unfiltered view backing `coord merge --plan`'s
370
+ # CI summary — see `GateSnapshot.all_checks`'s field
371
+ # comment. `list_all_checks_for_pr` is optional/duck-typed
372
+ # (a `CiStore` stand-in that predates #2446 doesn't offer
373
+ # it); falling back to the already-fetched `checks[key]`
374
+ # degrades to "advisory checks aren't shown separately",
375
+ # never to an extra `gh` call or a missing key.
376
+ list_all = getattr(inner, "list_all_checks_for_pr", None)
377
+ if list_all is not None:
378
+ try:
379
+ all_checks[key] = list_all(*key)
380
+ except Exception: # noqa: BLE001 — fail-open for this entry
381
+ all_checks[key] = checks[key]
382
+ else:
383
+ all_checks[key] = checks[key]
345
384
  # #1904: repo-wide, so dedupe across every pending entry in
346
385
  # the same repo — one `gh api .../actions/workflows` call
347
386
  # per repo per tick, not one per PR. A failure here reads
@@ -372,6 +411,7 @@ class GateSnapshotRefresher:
372
411
 
373
412
  snap = GateSnapshot(
374
413
  checks=checks,
414
+ all_checks=all_checks,
375
415
  commit_messages=messages,
376
416
  epic_issues=epics,
377
417
  branch_shas=branch_shas,
@@ -3984,6 +3984,20 @@ class PlannedMerge:
3984
3984
  # when no PR is open yet, or `ci_store` has no checks for this PR.
3985
3985
  pr_number: int | None = None
3986
3986
  ci_summary: "CiCheckSummary | None" = None
3987
+ # #2446: the unfiltered (required + advisory) counterpart to
3988
+ # `ci_summary` above, which is narrowed to what GitHub's branch
3989
+ # protection actually requires — the same scope the merge gate itself
3990
+ # evaluates (see `_entry_gate_status`/`coord.ci_github.GitHubCi.
3991
+ # list_checks_for_pr`'s docstrings). A merely-advisory check regressing
3992
+ # (a flaky/hung job the branch's own protection rules don't wait on
3993
+ # either) must never gate a merge attempt, but it's still worth an
3994
+ # operator seeing — this is what `coord merge --plan` renders that from.
3995
+ # `None` under the same conditions as `ci_summary` (no PR yet, or no
3996
+ # `ci_store`); a `CiStore` that predates `list_all_checks_for_pr` yields
3997
+ # the same value as `ci_summary` rather than `None`, so a plan built
3998
+ # against an older store still shows *something* instead of silently
3999
+ # losing the badge.
4000
+ ci_summary_all: "CiCheckSummary | None" = None
3987
4001
  # #2397: mirrors `config.merge.auto_drain` (default False) at plan-build
3988
4002
  # time — read-only exposure, no gate-logic change. The TUI's per-issue
3989
4003
  # Merge stage box needs this to tell "nothing retries until a human runs
@@ -4101,6 +4115,7 @@ def plan(
4101
4115
  reason: str | None = None
4102
4116
 
4103
4117
  ci_summary = None
4118
+ ci_summary_all = None
4104
4119
  if entry.state == PENDING:
4105
4120
  base_status, reason = _entry_gate_status(
4106
4121
  entry, board, config, ci_store, gh_ops
@@ -4126,11 +4141,43 @@ def plan(
4126
4141
  # only ever populates checks for entries that are PENDING at
4127
4142
  # refresh time, so a MERGING/MERGED row never had real
4128
4143
  # snapshot data to render in the first place.
4144
+ #
4145
+ # #2446: `ci_summary` MUST stay derived from the same
4146
+ # (already required-narrowed) `list_checks_for_pr` view
4147
+ # `_entry_gate_status` just consulted above — do not widen it
4148
+ # to the unfiltered check list. `coord.drive_queue
4149
+ # ._ci_rollup_all_clear` reads this exact field as positive
4150
+ # evidence that a frozen "CI running:" raw-row string has
4151
+ # gone stale, and that evidence is only valid when it is
4152
+ # counting the SAME checks the live gate decision is based
4153
+ # on (see that function's docstring); widening it here would
4154
+ # make a still-pending ADVISORY check block the #2158
4155
+ # park-recovery self-heal even though the gate itself (and
4156
+ # GitHub's own merge button) is already clear. Advisory
4157
+ # visibility is a genuinely separate concern — see
4158
+ # `ci_summary_all` below.
4129
4159
  if ci_store is not None and ci_store.is_available and entry.pr_number:
4130
4160
  checks = ci_store.list_checks_for_pr(entry.repo_github, entry.pr_number)
4131
4161
  if checks:
4132
4162
  ci_summary = summarize_counts(checks)
4133
4163
 
4164
+ # #2446: the unfiltered (required + advisory) rollup —
4165
+ # pure visibility, never consulted by any gate decision
4166
+ # or self-heal evidence. Lets `coord merge --plan`/the
4167
+ # TUI still show a regressed advisory check (e.g.
4168
+ # `Acceptance (web)`) even though it can no longer block
4169
+ # `_entry_gate_status` above or the #2158 recovery read
4170
+ # above. Falls back to `ci_summary` for a `CiStore`
4171
+ # stand-in that predates `list_all_checks_for_pr`.
4172
+ list_all = getattr(ci_store, "list_all_checks_for_pr", None)
4173
+ all_checks = (
4174
+ list_all(entry.repo_github, entry.pr_number)
4175
+ if list_all is not None
4176
+ else checks
4177
+ )
4178
+ if all_checks:
4179
+ ci_summary_all = summarize_counts(all_checks)
4180
+
4134
4181
  result.append(PlannedMerge(
4135
4182
  assignment_id=entry.assignment_id,
4136
4183
  repo_name=entry.repo_name,
@@ -4145,6 +4192,7 @@ def plan(
4145
4192
  reason=reason,
4146
4193
  pr_number=entry.pr_number,
4147
4194
  ci_summary=ci_summary,
4195
+ ci_summary_all=ci_summary_all,
4148
4196
  enqueued_at=entry.enqueued_at,
4149
4197
  last_attempt=entry.last_attempt,
4150
4198
  milestone=milestones.get((entry.repo_name, entry.issue_number)),
@@ -186,6 +186,42 @@ tests:
186
186
  # §8c — "hidden or inert" on an already-pinned tab, asserted through the
187
187
  # outcome both readings share (see finding 17)
188
188
  tabs_discoverability_2287::pin_tab_is_hidden_or_inert_on_an_already_pinned_tab: 2287
189
+ # ── #2286 (T-5) — persistence, `~/.coord/tabs.json` (contract §6) ─────────
190
+ # Slice: tabs_persistence_2286.rs · mocks: none of its own (§6 is explicitly
191
+ # mock-less: "No visual mock (this is a file-format contract, not a
192
+ # screen)"); its rendered halves lean on `board-baseline-no-tabs.screen`
193
+ # (the zero-tab state a missing/malformed file must produce) and
194
+ # `board-pinned-3-tabs.screen` (three restored tabs, §2c bracket included).
195
+ #
196
+ # §6 bullet 1 (save side) — 3 Board tabs are written as an ORDERED `tabs`
197
+ # list with `active` set and `preview` null
198
+ tabs_persistence_2286::three_board_tabs_are_saved_to_tabs_json_in_strip_order_with_the_active_tab: 2286
199
+ # §6 (`preview` is "the key of the one preview tab […] must also appear in
200
+ # `tabs`") — the file-level half of "restored as a preview, not promoted"
201
+ tabs_persistence_2286::a_preview_tab_is_saved_as_the_scopes_preview_slot: 2286
202
+ # §6 bullet 1 + #2286 AC 1 (Board half) — three Board tabs restored after a
203
+ # restart, persisted active tab preserved
204
+ tabs_persistence_2286::board_tabs_are_restored_from_tabs_json_after_a_restart: 2286
205
+ # §6 + #2286 AC 2 — a restored preview tab keeps §1's `∘ ` marker, i.e. is
206
+ # not promoted to pinned on load
207
+ tabs_persistence_2286::a_restored_preview_tab_is_still_a_preview_tab: 2286
208
+ # §6 bullet 1 + #2286 AC 1 (Pipeline half) — the same file restores two
209
+ # Pipeline tabs to the PIPELINE panel with its own active tab (see
210
+ # coordinator finding 15 for the live blocker on entering that panel)
211
+ tabs_persistence_2286::pipeline_tabs_are_restored_to_the_pipeline_panel_with_its_own_active_tab: 2286
212
+ # §6 bullet 2 + #2286 AC 3 — a document whose issue is gone from the board is
213
+ # dropped on load, never rendered, never round-tripped into a re-saved file
214
+ tabs_persistence_2286::a_document_whose_issue_is_absent_from_the_board_is_pruned_on_load: 2286
215
+ # §6 bullet 3 (first branch) — the active document being pruned activates a
216
+ # surviving neighbour (WHICH one is not pinned — see finding 16)
217
+ tabs_persistence_2286::pruning_the_active_document_activates_a_surviving_neighbour: 2286
218
+ # §6 bullet 3 (second branch) — nothing survives the prune → no tabs at all.
219
+ # THIS IS A GREEN RATCHET — see the `expected_red` block below.
220
+ tabs_persistence_2286::a_scope_whose_documents_are_all_pruned_starts_with_no_tabs: 2286
221
+ # §6 bullet 4 + #2286 AC 4 — missing / empty / malformed file all start
222
+ # clean, never a panic, never a partial parse.
223
+ # THIS IS THE GREEN CONTROL — see the `expected_red` block below.
224
+ tabs_persistence_2286::a_missing_empty_or_malformed_tabs_json_starts_with_no_tabs: 2286
189
225
 
190
226
  # ── expected_red (#2164) ───────────────────────────────────────────────────
191
227
  # Hand-derived from a REAL run of the sealed suite against origin/main at the
@@ -326,6 +362,41 @@ expected_red:
326
362
  - tabs_discoverability_2287::close_menu_item_closes_the_right_clicked_tab_and_no_other
327
363
  - tabs_discoverability_2287::pin_tab_promotes_a_preview_tab_without_changing_count_or_order
328
364
  - tabs_discoverability_2287::pin_tab_is_hidden_or_inert_on_an_already_pinned_tab
365
+ # #2286 — OBSERVED, not intended. Taken from real runs of the sealed suite
366
+ # (`cd tui && RUSTC_BOOTSTRAP=1 cargo test --test acceptance --features
367
+ # test-support -- -Z unstable-options --format json`, the driver command in
368
+ # coordinator.yml) at authoring time: of this slice's 9 ids, the same 7
369
+ # FAILED and the same 2 passed on three consecutive full-suite runs and on
370
+ # three slice-filtered runs. Every one of the 7 died on a §6 clause — four on
371
+ # "nothing was restored" (no strip renders after seeding `tabs.json`), three
372
+ # on "no such file exists after opening tabs" — never on a harness
373
+ # precondition; verified by reading the panic line of every failure. The
374
+ # suite's other 6 failures (audit_1039, plans_detail_1122) are PRE-EXISTING:
375
+ # a `--skip tabs_persistence_2286` baseline run on the same commit reproduces
376
+ # exactly those 6, so this slice's sandboxed `HOME` (finding 14) is not
377
+ # destabilising them. The 2 that passed are deliberately ABSENT below:
378
+ #
379
+ # * `a_missing_empty_or_malformed_tabs_json_starts_with_no_tabs` — the
380
+ # CONTROL. Green today for the degenerate reason that nothing is ever
381
+ # loaded, and it must STAY green once loading lands: an implementation
382
+ # that `unwrap()`s the parse (panic) or best-effort restores the
383
+ # well-formed prefix of a truncated file breaks exactly this test, which
384
+ # is §6 bullet 4's whole point. Listing it would make its inevitable pass
385
+ # a HARD FAILURE.
386
+ # * `a_scope_whose_documents_are_all_pruned_starts_with_no_tabs` — a
387
+ # RATCHET, §6 bullet 3's second branch ("if none survive, start with no
388
+ # tabs"). Green today because nothing renders at all; it becomes a real
389
+ # constraint the moment restore lands, since an implementation that
390
+ # renders a dead tab, or keeps a pruned document active and paints its
391
+ # label, fails it.
392
+ 2286:
393
+ - tabs_persistence_2286::three_board_tabs_are_saved_to_tabs_json_in_strip_order_with_the_active_tab
394
+ - tabs_persistence_2286::a_preview_tab_is_saved_as_the_scopes_preview_slot
395
+ - tabs_persistence_2286::board_tabs_are_restored_from_tabs_json_after_a_restart
396
+ - tabs_persistence_2286::a_restored_preview_tab_is_still_a_preview_tab
397
+ - tabs_persistence_2286::pipeline_tabs_are_restored_to_the_pipeline_panel_with_its_own_active_tab
398
+ - tabs_persistence_2286::a_document_whose_issue_is_absent_from_the_board_is_pruned_on_load
399
+ - tabs_persistence_2286::pruning_the_active_document_activates_a_surviving_neighbour
329
400
 
330
401
  # ═══════════════════════════════════════════════════════════════════════════
331
402
  # FOR THE COORDINATOR — three findings from authoring this slice. None of them
@@ -669,3 +740,87 @@ expected_red:
669
740
  # activating an open menu item; a left click on the item's own label is the
670
741
  # only activation path any context menu in this app already documents, so that
671
742
  # is what the slice sends.
743
+ # FOR THE COORDINATOR — findings from authoring the #2286 slice (contract §6).
744
+ # Independent of the #2282 / #2283 / #2284 / #2285 notes above; again, none is
745
+ # a worker's to fix by editing this suite, and none was resolved by editing the
746
+ # contract (a test-author may not amend one).
747
+ # ═══════════════════════════════════════════════════════════════════════════
748
+ #
749
+ # 14. **A REAL CONSTRAINT ON #2286's IMPLEMENTATION, discovered while making §6
750
+ # observable: the restore must run on the FIXTURE construction path, and
751
+ # the coord-dir has no injectable seam.** Two facts force this:
752
+ #
753
+ # (a) The sealed suite's only way to build an app is #2281's
754
+ # `make_app_with_board_json` → `make_test_app`, which today sets
755
+ # `doc_tabs: DocTabs::default()` outright. `CoordApp::new()` is
756
+ # public but builds the real daemon-backed app with an EMPTY board,
757
+ # against which every persisted document would be pruned on load
758
+ # (§6: "drop any document whose issue is absent from the board") — so
759
+ # it structurally cannot witness a restore. If the load is wired only
760
+ # into real startup, the five restore/prune ids above stay red no
761
+ # matter how correct `doc_tabs.rs` is.
762
+ #
763
+ # (b) Every `~/.coord/…` path resolves through `std::env::var_os("HOME")`
764
+ # (`TuiSettings::path`, `Workspace::path`, `app::data::coord_dir`).
765
+ # There is no `COORD_HOME`-style override, so this slice sandboxes
766
+ # `HOME` to a temp dir (serialised behind a slice-global mutex,
767
+ # restored on drop including on panic) rather than clobbering the
768
+ # developer's real `~/.coord/tabs.json`. That window is
769
+ # process-global: while it is held, concurrently-running tests from
770
+ # OTHER slices see the sandboxed `HOME` too. Measured at authoring
771
+ # time it changes nothing — a `--skip tabs_persistence_2286` baseline
772
+ # reproduces exactly the same 6 pre-existing failures — but it is a
773
+ # latent cross-slice coupling, and it will get worse: once (a) lands,
774
+ # EVERY ms-65 slice's zero-tab control (`zero_doc_tabs_render_no_tab_strip`,
775
+ # `pipeline_with_zero_doc_tabs_renders_no_tab_strip`,
776
+ # `zero_tabs_render_no_close_or_overflow_glyphs`) will start reading
777
+ # the developer's REAL `~/.coord/tabs.json` and go red on any machine
778
+ # where a human has used the shipped feature.
779
+ #
780
+ # Both halves point at the same cheap fix, which is a coordinator call, not
781
+ # a worker's: give the coord-dir an injectable seam under
782
+ # `#[cfg(any(test, feature = "test-support"))]` (the exact widening this
783
+ # repo already applied to `resolve_board_service()` for #1039, and that
784
+ # finding 7 asks for on `start_data_load()`), and have the fixture path
785
+ # restore through it. Absent that, either the restore is untestable or the
786
+ # rest of ms-65's suite becomes machine-dependent.
787
+ #
788
+ # 15. Entering the Pipeline panel — finding 7's fixture-wipe blocker — did NOT
789
+ # bite this slice at authoring time, and the reason is worth recording:
790
+ # under the sandboxed `HOME` there is no `~/.coord/coord.db` to load, so
791
+ # `start_data_load` has nothing to overwrite the seeded board with.
792
+ # `pipeline_tabs_are_restored_to_the_pipeline_panel_with_its_own_active_tab`
793
+ # got cleanly past its `Overview` precondition and failed on its §6 clause
794
+ # on every run. That is a side effect of the sandbox, not a fix: finding 7
795
+ # stands for every other slice, and if #2286's worker moves the tab load
796
+ # off the `HOME` seam the protection disappears with it.
797
+ #
798
+ # 16. §6 bullet 3 says "a surviving neighbour in `tabs` (order preserved)
799
+ # becomes active" without pinning WHICH neighbour. §4 pins a left-neighbour
800
+ # rule, but that is #2283's `Ctrl-W` close gesture, and §6 does not extend
801
+ # it to this load-time prune. `pruning_the_active_document_activates_a_surviving_neighbour`
802
+ # therefore asserts only what is pinned — exactly one tab is bracketed
803
+ # (§2c) and it is one of the survivors — and deliberately does not pin left
804
+ # vs. right. Also a `TODO(test-author)` in the slice. If a specific rule was
805
+ # meant, it needs a contract amendment.
806
+ #
807
+ # 17. **Per-tab sub-state persistence is asserted by NOBODY.** §6's last bullet
808
+ # pins that the sub-tab selection is persisted ("as a string — yes") while
809
+ # scroll offsets may be dropped, but §6's pinned JSON shape carries no
810
+ # field for it: a document key is `{"repo": …, "issue": …}` and nothing
811
+ # more. There is therefore no pinned place to look for it in the file, and
812
+ # no pinned rule for what a restored tab's sub-tab is when the field is
813
+ # absent. Asserting it would have meant inventing a field name, so no test
814
+ # covers it. If it is meant to be gated by acceptance, §6's shape needs the
815
+ # field spelled out.
816
+ #
817
+ # Also worth knowing, not a contract problem: §6 pins that a restart restores,
818
+ # but not WHEN the file is written. `saved_tabs_json()` therefore reads
819
+ # `~/.coord/tabs.json` after the tab edits and, if it is not there yet, again
820
+ # after a `q` quit — so an implementation that flushes on tab mutation and one
821
+ # that flushes on exit both satisfy the two save-side tests; only a run that
822
+ # produces no file at all fails them. The file's field names (`tabs` /
823
+ # `active` / `preview`, and a key's `repo` / `issue`) ARE asserted as written,
824
+ # on §6 Note 5's own authority ("the shape above is what `coord acceptance
825
+ # author` will write fixtures against"; a deviation is "an amendment, not a
826
+ # silent implementation choice").