code-coordinator 0.5.158__tar.gz → 0.5.163__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 (879) hide show
  1. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/_board_mapping.py +6 -0
  7. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/api/generated.ts +1 -0
  8. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/db.py +8 -0
  9. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/drive.py +65 -7
  10. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/models.py +32 -0
  11. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/state.py +77 -8
  12. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/manifest.yml +163 -0
  13. code_coordinator-0.5.163/tests/acceptance/ms-65/tabs_discoverability_2287.rs +1040 -0
  14. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_drive.py +56 -22
  15. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_state.py +157 -0
  16. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/data.rs +6 -1
  17. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/dialogs.rs +138 -0
  18. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/doc_tabs.rs +299 -0
  19. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/events.rs +145 -11
  20. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/fixtures.rs +6 -0
  21. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/milestone_dag.rs +1 -0
  22. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/mod.rs +236 -10
  23. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/pipeline.rs +11 -0
  24. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/plans.rs +12 -1
  25. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/render.rs +32 -0
  26. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/tests.rs +381 -0
  27. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/types.rs +37 -0
  28. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/tests/acceptance.rs +1 -0
  29. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/tests/fixtures/board_sample.json +3 -0
  30. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.claude/commands/board.md +0 -0
  31. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.claude/commands/complete-session.md +0 -0
  32. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.claude/commands/coordinator.md +0 -0
  33. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.githooks/_lib.sh +0 -0
  34. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.githooks/post-checkout +0 -0
  35. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.githooks/post-commit +0 -0
  36. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.githooks/post-merge +0 -0
  37. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  38. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.github/coord-ci-acceptance.yml +0 -0
  39. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.github/workflows/acceptance-web.yml +0 -0
  40. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.github/workflows/auto-release.yml +0 -0
  41. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.github/workflows/cargo-test.yml +0 -0
  42. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.github/workflows/publish.yml +0 -0
  43. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.github/workflows/release-tui.yml +0 -0
  44. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.github/workflows/test.yml +0 -0
  45. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/.gitignore +0 -0
  46. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/CLAUDE.md +0 -0
  47. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/GOAL.md +0 -0
  48. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/LICENSE +0 -0
  49. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/MANIFEST.in +0 -0
  50. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/README.md +0 -0
  51. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/code_coordinator.egg-info/dependency_links.txt +0 -0
  52. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/code_coordinator.egg-info/entry_points.txt +0 -0
  53. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/code_coordinator.egg-info/requires.txt +0 -0
  54. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/code_coordinator.egg-info/top_level.txt +0 -0
  55. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/__init__.py +0 -0
  56. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/acceptance.py +0 -0
  57. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/acceptance_drivers.py +0 -0
  58. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/agent.py +0 -0
  59. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/agent_app.py +0 -0
  60. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/agent_update.py +0 -0
  61. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/agents/opencode/.gitignore +0 -0
  62. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/agents/opencode/agents/work.md +0 -0
  63. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/agents/opencode/routing.jsonc +0 -0
  64. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/audit.py +0 -0
  65. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/auto_loop.py +0 -0
  66. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/block_log.py +0 -0
  67. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/board_bool_guard.py +0 -0
  68. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/board_service.py +0 -0
  69. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/board_wire.py +0 -0
  70. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/brain.py +0 -0
  71. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/branch_model.py +0 -0
  72. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/bug_intake.py +0 -0
  73. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/cargo_cache.py +0 -0
  74. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/ci_github.py +0 -0
  75. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/ci_store.py +0 -0
  76. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/claim.py +0 -0
  77. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/cli.py +0 -0
  78. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/client.py +0 -0
  79. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/__init__.py +0 -0
  80. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/_common.py +0 -0
  81. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/acceptance.py +0 -0
  82. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/agent_ops.py +0 -0
  83. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/audit.py +0 -0
  84. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/chat.py +0 -0
  85. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/dispatch.py +0 -0
  86. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/dispatch_workers.py +0 -0
  87. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/drive.py +0 -0
  88. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/drive_queue.py +0 -0
  89. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/gate_a.py +0 -0
  90. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/gates.py +0 -0
  91. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/issues.py +0 -0
  92. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/lifecycle.py +0 -0
  93. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/merge.py +0 -0
  94. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/milestone.py +0 -0
  95. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/plan_followup.py +0 -0
  96. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/plans.py +0 -0
  97. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/portal.py +0 -0
  98. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/release.py +0 -0
  99. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/repo.py +0 -0
  100. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/report.py +0 -0
  101. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/review.py +0 -0
  102. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/scorecard.py +0 -0
  103. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/sessions.py +0 -0
  104. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/setup.py +0 -0
  105. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/status.py +0 -0
  106. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/terminal.py +0 -0
  107. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/test_gate.py +0 -0
  108. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/commands/tui.py +0 -0
  109. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/comments.py +0 -0
  110. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/config.py +0 -0
  111. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/config_reload.py +0 -0
  112. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/conflict_fix.py +0 -0
  113. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dao.py +0 -0
  114. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/__init__.py +0 -0
  115. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/fixture.py +0 -0
  116. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/index.html +0 -0
  117. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/server.py +0 -0
  118. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/terminal.py +0 -0
  119. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/.gitignore +0 -0
  120. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/components.json +0 -0
  121. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  122. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  123. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  124. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  125. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  126. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  127. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  128. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  129. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  130. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/index.html +0 -0
  131. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  132. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/sw.js +0 -0
  133. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  134. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  135. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  136. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  137. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  138. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  139. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  140. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  141. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  142. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  143. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/eslint.config.js +0 -0
  144. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/index.html +0 -0
  145. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  146. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/package-lock.json +0 -0
  147. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/package.json +0 -0
  148. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  149. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/playwright.config.ts +0 -0
  150. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/postcss.config.js +0 -0
  151. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  152. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  153. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  154. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/App.tsx +0 -0
  155. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/api/client.ts +0 -0
  156. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  157. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  158. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  159. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  160. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  161. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  162. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  163. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  164. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  165. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  166. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  167. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  168. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  169. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  170. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  171. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  172. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  173. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  174. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  175. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  176. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  177. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  178. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  179. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  180. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  181. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  182. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  183. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  184. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  185. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  186. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  187. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  188. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  189. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  190. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/index.css +0 -0
  191. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  192. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  193. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/main.tsx +0 -0
  194. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  195. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  196. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  197. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  198. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  199. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  200. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  201. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  202. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  203. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  204. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  205. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  206. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  207. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  208. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  209. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  210. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  211. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  212. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  213. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  214. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  215. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  216. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  217. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/tailwind.config.js +0 -0
  218. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/tsconfig.json +0 -0
  219. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  220. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dashboard/webapp/vite.config.ts +0 -0
  221. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dead_end.py +0 -0
  222. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/README.md +0 -0
  223. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-agent.service +0 -0
  224. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-db-backup.service +0 -0
  225. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-db-backup.sh +0 -0
  226. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-db-backup.timer +0 -0
  227. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-drive-queue.service +0 -0
  228. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-drive-queue.timer +0 -0
  229. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-notify.service +0 -0
  230. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-notify.timer +0 -0
  231. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-release-propagate.service +0 -0
  232. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-release-propagate.timer +0 -0
  233. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-release-window.service +0 -0
  234. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-release-window.timer +0 -0
  235. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-serve.service +0 -0
  236. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-web-dist-build.service +0 -0
  237. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-web-dist-build.timer +0 -0
  238. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy/coord-web.service +0 -0
  239. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy_manifest.py +0 -0
  240. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deploy_units.py +0 -0
  241. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/deps.py +0 -0
  242. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/diagnose.py +0 -0
  243. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dispatch.py +0 -0
  244. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/dist_name.py +0 -0
  245. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/drive_queue.py +0 -0
  246. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/drive_state.py +0 -0
  247. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/events.py +0 -0
  248. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/failure_class.py +0 -0
  249. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/filelock.py +0 -0
  250. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/fleet_config_health.py +0 -0
  251. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/freshness.py +0 -0
  252. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/gate_a.py +0 -0
  253. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/gate_b.py +0 -0
  254. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/gate_snapshot.py +0 -0
  255. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/gates.py +0 -0
  256. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/github_ops.py +0 -0
  257. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/goal.py +0 -0
  258. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/graph_health.py +0 -0
  259. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/__init__.py +0 -0
  260. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/aggregate.py +0 -0
  261. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/__init__.py +0 -0
  262. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/agent_install.py +0 -0
  263. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/cargo_targets.py +0 -0
  264. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/claude_binary.py +0 -0
  265. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/deploy_lane_facts.py +0 -0
  266. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/disk.py +0 -0
  267. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/fleet_board.py +0 -0
  268. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  269. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/fleet_phantom.py +0 -0
  270. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/fleet_unit_drift.py +0 -0
  271. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/graph.py +0 -0
  272. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/graphify_cli.py +0 -0
  273. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/index_lock.py +0 -0
  274. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/plan_usage.py +0 -0
  275. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/repo_state.py +0 -0
  276. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/spawned_coord.py +0 -0
  277. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/timer_active.py +0 -0
  278. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/toolchain.py +0 -0
  279. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/unit_drift.py +0 -0
  280. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/unit_enablement.py +0 -0
  281. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/checks/worktrees.py +0 -0
  282. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/cli.py +0 -0
  283. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/context.py +0 -0
  284. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/fleet_snapshot.py +0 -0
  285. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/models.py +0 -0
  286. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/pypi.py +0 -0
  287. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/registry.py +0 -0
  288. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/render.py +0 -0
  289. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/health/units.py +0 -0
  290. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/hooks.py +0 -0
  291. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/housekeeping.py +0 -0
  292. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/interactive.py +0 -0
  293. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/issue_store.py +0 -0
  294. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/liveness_auditor.py +0 -0
  295. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/machine_pause.py +0 -0
  296. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/merge_queue.py +0 -0
  297. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/milestone_chat.py +0 -0
  298. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/milestone_dispatch.py +0 -0
  299. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/milestone_gate.py +0 -0
  300. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/milestone_order.py +0 -0
  301. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/mock_author.py +0 -0
  302. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/network.py +0 -0
  303. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/new_issue_chat.py +0 -0
  304. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/__init__.py +0 -0
  305. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/baseline.py +0 -0
  306. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/cli.py +0 -0
  307. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/collect.py +0 -0
  308. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/digest.py +0 -0
  309. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/models.py +0 -0
  310. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/predicate.py +0 -0
  311. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/service.py +0 -0
  312. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/store.py +0 -0
  313. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notifier/transport.py +0 -0
  314. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/notify.py +0 -0
  315. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/openapi.py +0 -0
  316. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/overlap_fence.py +0 -0
  317. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/overlap_predict.py +0 -0
  318. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/parentage.py +0 -0
  319. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/parentage_github.py +0 -0
  320. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/pipeline.py +0 -0
  321. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/plan_parser.py +0 -0
  322. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/plans.py +0 -0
  323. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/platform_paths.py +0 -0
  324. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/portal_bridge.py +0 -0
  325. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/portal_store.py +0 -0
  326. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/portal_sync.py +0 -0
  327. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/pr_body_lint.py +0 -0
  328. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/prereqs.py +0 -0
  329. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/progress.py +0 -0
  330. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/providers/__init__.py +0 -0
  331. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/providers/base.py +0 -0
  332. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/providers/claude.py +0 -0
  333. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/providers/claude_pty.py +0 -0
  334. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/providers/opencode.py +0 -0
  335. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/queue_diagnose.py +0 -0
  336. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/reconcile.py +0 -0
  337. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/reconcile_tick.py +0 -0
  338. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/refine_chat.py +0 -0
  339. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/release_cordon.py +0 -0
  340. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/release_propagate.py +0 -0
  341. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/release_verify.py +0 -0
  342. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/release_window.py +0 -0
  343. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/repo_edit.py +0 -0
  344. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/repo_onboard.py +0 -0
  345. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/reports.py +0 -0
  346. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/revalidate.py +0 -0
  347. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/review.py +0 -0
  348. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/scorecard.py +0 -0
  349. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/serve_app.py +0 -0
  350. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  351. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  352. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  353. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  354. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  355. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/skills/portal-followup/SKILL.md +0 -0
  356. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  357. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  358. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/skills/update-issue/SKILL.md +0 -0
  359. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/smoke.py +0 -0
  360. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/spend_ceiling.py +0 -0
  361. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/split_work.py +0 -0
  362. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/stage_projection.py +0 -0
  363. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/test_author.py +0 -0
  364. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/test_chat.py +0 -0
  365. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/test_orchestrator.py +0 -0
  366. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/test_report.py +0 -0
  367. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/tui_release.py +0 -0
  368. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/usage.py +0 -0
  369. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/usage_limits.py +0 -0
  370. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/usage_rollup.py +0 -0
  371. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coord/worker_events.py +0 -0
  372. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/coordinator.example.yml +0 -0
  373. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-agent.service +0 -0
  374. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-db-backup.service +0 -0
  375. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-db-backup.sh +0 -0
  376. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-db-backup.timer +0 -0
  377. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-drive-queue.service +0 -0
  378. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-drive-queue.timer +0 -0
  379. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-notify.service +0 -0
  380. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-notify.timer +0 -0
  381. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-release-propagate.service +0 -0
  382. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-release-propagate.timer +0 -0
  383. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-release-window.service +0 -0
  384. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-release-window.timer +0 -0
  385. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-serve.service +0 -0
  386. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-web-dist-build.service +0 -0
  387. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-web-dist-build.sh +0 -0
  388. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-web-dist-build.timer +0 -0
  389. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-web-rollback.sh +0 -0
  390. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/coord-web.service +0 -0
  391. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/deploy/node-shim.sh +0 -0
  392. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/ADR_COORD_WEB_DIST.md +0 -0
  393. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/AGENT_OPERATIONS.md +0 -0
  394. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/ARCHITECTURE.md +0 -0
  395. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/ARCH_SECURITY_GATES.md +0 -0
  396. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/COCKPIT.md +0 -0
  397. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/CONTROL_CENTER.md +0 -0
  398. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/COST_DISCIPLINE.md +0 -0
  399. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/CROSS_PLATFORM.md +0 -0
  400. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/CUSTOMER_PORTAL.md +0 -0
  401. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/DRIVE_QUEUE.md +0 -0
  402. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/EPHEMERAL_WORKERS.md +0 -0
  403. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/FORGE_MIGRATION.md +0 -0
  404. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/GRAPHIFY_SETUP.md +0 -0
  405. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/ISSUE_GUIDANCE.md +0 -0
  406. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/MAC_MINI.md +0 -0
  407. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  408. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/NOTIFIER.md +0 -0
  409. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/OPENCODE_VERIFICATION.md +0 -0
  410. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/OPERATING_GOTCHAS.md +0 -0
  411. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/ORACLE_LOOP.md +0 -0
  412. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/PHONE_WEBAPP.md +0 -0
  413. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/PIPELINE_V2.md +0 -0
  414. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/PLATFORM_EVOLUTION.md +0 -0
  415. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/SECOND_BACKEND.md +0 -0
  416. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/STORE_SERVICE.md +0 -0
  417. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  418. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/WEB_CONTROL_CENTER.md +0 -0
  419. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/WSL_WINDOWS_WORKER.md +0 -0
  420. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/mocks/web/README.md +0 -0
  421. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/mocks/web/_tokens.css +0 -0
  422. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/mocks/web/issue-detail.html +0 -0
  423. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/mocks/web/pipeline-narrow.html +0 -0
  424. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/docs/mocks/web/pipeline-wide.html +0 -0
  425. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/graphify-out/.gitignore +0 -0
  426. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/install-agent.sh +0 -0
  427. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/pyproject.toml +0 -0
  428. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/audit_review_verdict_overrides.py +0 -0
  429. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  430. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/build-worker-image.sh +0 -0
  431. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/coordinator-machine.py +0 -0
  432. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/epic-down.sh +0 -0
  433. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/epic-up.sh +0 -0
  434. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/preflight.sh +0 -0
  435. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/provision-worker.sh +0 -0
  436. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  437. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  438. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/azure-workers/verify-github-token.sh +0 -0
  439. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/codegen.py +0 -0
  440. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/coord-test-runner.sh +0 -0
  441. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/drive-batch.sh +0 -0
  442. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/gen_board_fixture.py +0 -0
  443. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/next_release_tag.py +0 -0
  444. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/run_tests_in_populated_home.sh +0 -0
  445. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/run_tests_without_gh.sh +0 -0
  446. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/smoke_437_interactive.py +0 -0
  447. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/verify_878_review_capture.py +0 -0
  448. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/verify_release_published.py +0 -0
  449. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/scripts/verify_release_wheel.py +0 -0
  450. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/setup.cfg +0 -0
  451. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/SMOKE_SET.md +0 -0
  452. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/__init__.py +0 -0
  453. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  454. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-33/contract.md +0 -0
  455. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-33/manifest.yml +0 -0
  456. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  457. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  458. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  459. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  460. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-37/conftest.py +0 -0
  461. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-37/contract.md +0 -0
  462. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-37/manifest.yml +0 -0
  463. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  464. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  465. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/contract.md +0 -0
  466. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/manifest.yml +0 -0
  467. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  468. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  469. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  470. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  471. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  472. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  473. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  474. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  475. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  476. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  477. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-51/contract.md +0 -0
  478. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  479. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  480. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-51/manifest.yml +0 -0
  481. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  482. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-51/tsconfig.json +0 -0
  483. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  484. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  485. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/contract.md +0 -0
  486. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  487. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  488. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  489. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  490. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  491. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  492. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  493. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  494. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  495. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  496. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  497. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/conftest.py +0 -0
  498. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/board-pipeline-basic.json +0 -0
  499. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  500. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  501. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  502. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  503. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/playwright/all_pass.json +0 -0
  504. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  505. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/playwright/mixed_fail.json +0 -0
  506. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  507. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  508. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/playwright/skip.json +0 -0
  509. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/playwright/truncated.json +0 -0
  510. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  511. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  512. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  513. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  514. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  515. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  516. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  517. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  518. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_acceptance.py +0 -0
  519. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_acceptance_drivers.py +0 -0
  520. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent.py +0 -0
  521. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_api_error.py +0 -0
  522. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_app.py +0 -0
  523. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_branch_base.py +0 -0
  524. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_branch_capture.py +0 -0
  525. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_config_free_1712.py +0 -0
  526. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_deploy_units_endpoint.py +0 -0
  527. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_dirty_worktree.py +0 -0
  528. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  529. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_graph_self_heal.py +0 -0
  530. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_health_h3.py +0 -0
  531. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_idle_restart.py +0 -0
  532. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_push_failure.py +0 -0
  533. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_reap.py +0 -0
  534. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_repos_and_pull.py +0 -0
  535. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_restart_services_endpoint.py +0 -0
  536. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_skills_self_heal.py +0 -0
  537. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_startup_diagnostics.py +0 -0
  538. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_update.py +0 -0
  539. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_update_bluegreen.py +0 -0
  540. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_usage_limit.py +0 -0
  541. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_agent_zero_commit.py +0 -0
  542. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_ambient_home_isolation.py +0 -0
  543. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_approve_reject_plan.py +0 -0
  544. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_approve_usage_gate.py +0 -0
  545. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_assignment_already_recorded_daemon.py +0 -0
  546. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_audit_log.py +0 -0
  547. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_audit_outcome.py +0 -0
  548. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_audit_query.py +0 -0
  549. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_auto_loop.py +0 -0
  550. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_auto_release_publish_2035.py +0 -0
  551. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_base_checkout_restore.py +0 -0
  552. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_block_log.py +0 -0
  553. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_board_cap_762.py +0 -0
  554. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_board_fixture.py +0 -0
  555. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_board_read_path.py +0 -0
  556. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_board_service.py +0 -0
  557. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_board_state.py +0 -0
  558. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_board_wire.py +0 -0
  559. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_brain.py +0 -0
  560. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_branch_model.py +0 -0
  561. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_bug_intake.py +0 -0
  562. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_build_worker_image_env_update.py +0 -0
  563. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cargo_cache.py +0 -0
  564. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_ci_acceptance_gate_1950.py +0 -0
  565. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_ci_parity_2091.py +0 -0
  566. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_ci_store.py +0 -0
  567. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_claim.py +0 -0
  568. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_acceptance.py +0 -0
  569. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_assign.py +0 -0
  570. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  571. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_assign_interactive_remote.py +0 -0
  572. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_assign_provider.py +0 -0
  573. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  574. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_audit.py +0 -0
  575. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_chat_continue.py +0 -0
  576. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_decide.py +0 -0
  577. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_diagnose_config_provenance.py +0 -0
  578. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_diagnose_graph.py +0 -0
  579. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_doctor.py +0 -0
  580. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_doctor_config_free_1801.py +0 -0
  581. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  582. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_drive.py +0 -0
  583. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_drive_queue.py +0 -0
  584. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_escalate.py +0 -0
  585. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_fix_headless_review.py +0 -0
  586. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_gate_a.py +0 -0
  587. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_install_drift.py +0 -0
  588. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_install_skills.py +0 -0
  589. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_issue_create_label.py +0 -0
  590. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_issue_reopen.py +0 -0
  591. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_merge.py +0 -0
  592. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_milestone_assign.py +0 -0
  593. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_milestone_capture.py +0 -0
  594. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_milestone_chat_add_child.py +0 -0
  595. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_milestone_dispatch.py +0 -0
  596. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_milestone_gate_b.py +0 -0
  597. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_milestone_gate_c.py +0 -0
  598. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_milestone_order.py +0 -0
  599. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  600. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_milestone_ship.py +0 -0
  601. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_network.py +0 -0
  602. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_new_issue_chat.py +0 -0
  603. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_plans.py +0 -0
  604. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_portal.py +0 -0
  605. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_pull_artifact.py +0 -0
  606. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_queue.py +0 -0
  607. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_reattach_sessions.py +0 -0
  608. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_refine_board.py +0 -0
  609. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_release_preflight.py +0 -0
  610. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_release_propagate.py +0 -0
  611. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_release_window.py +0 -0
  612. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_repo_2220.py +0 -0
  613. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_scorecard.py +0 -0
  614. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_set_review_findings.py +0 -0
  615. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_status_advisory_terminal.py +0 -0
  616. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_status_merge_queue.py +0 -0
  617. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_status_provider.py +0 -0
  618. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_status_review_finalizing.py +0 -0
  619. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_status_test_failed_tag.py +0 -0
  620. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_status_usage_limit.py +0 -0
  621. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_sync_comments_873.py +0 -0
  622. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_test_plan.py +0 -0
  623. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_track.py +0 -0
  624. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_tui_update.py +0 -0
  625. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cli_wait.py +0 -0
  626. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_client_base_install.py +0 -0
  627. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_comments.py +0 -0
  628. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_completion_summary.py +0 -0
  629. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_config.py +0 -0
  630. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_config_acceptance.py +0 -0
  631. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_config_audit.py +0 -0
  632. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_config_pricing.py +0 -0
  633. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  634. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_config_usage_gate.py +0 -0
  635. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_conflict_fix.py +0 -0
  636. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_conflict_fix_semantic.py +0 -0
  637. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_coord_test.py +0 -0
  638. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_coord_test_runner_baseline.py +0 -0
  639. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_coord_test_runner_populated_home.py +0 -0
  640. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_coord_test_runner_routing.py +0 -0
  641. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_coord_test_runner_toolchain.py +0 -0
  642. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_coord_web_sse_restart_live.py +0 -0
  643. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_coordinator_machine.py +0 -0
  644. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_cross_platform_imports.py +0 -0
  645. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_dashboard.py +0 -0
  646. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_dashboard_fixture.py +0 -0
  647. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_dashboard_terminal.py +0 -0
  648. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_dashboard_terminal_live.py +0 -0
  649. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_db.py +0 -0
  650. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_dead_end.py +0 -0
  651. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_deploy_coord_db_backup.py +0 -0
  652. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_deploy_coord_web_dist.py +0 -0
  653. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_deploy_coord_web_rollback.py +0 -0
  654. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_deploy_drive_queue_unit.py +0 -0
  655. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_deploy_manifest.py +0 -0
  656. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_deploy_units_lane.py +0 -0
  657. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_deploy_web_unit.py +0 -0
  658. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_deps.py +0 -0
  659. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_diagnose.py +0 -0
  660. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_dispatch.py +0 -0
  661. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_dispatch_target_validation.py +0 -0
  662. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_dist_name.py +0 -0
  663. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_done_housekeeping.py +0 -0
  664. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_drive_queue.py +0 -0
  665. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_drive_state.py +0 -0
  666. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_drive_tmux.py +0 -0
  667. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_epic_up_capability_detection.py +0 -0
  668. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  669. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_epic_up_image_provenance.py +0 -0
  670. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_errors.py +0 -0
  671. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_events.py +0 -0
  672. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_failure_class.py +0 -0
  673. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_filelock.py +0 -0
  674. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  675. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_fix_of_force_override.py +0 -0
  676. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_fleet_config_health.py +0 -0
  677. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_fleet_health_probes.py +0 -0
  678. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_fleet_health_snapshot.py +0 -0
  679. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_freshness.py +0 -0
  680. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_gate_a.py +0 -0
  681. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_gate_b.py +0 -0
  682. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_gate_snapshot_staleness.py +0 -0
  683. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_gates.py +0 -0
  684. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  685. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_generated_types_fixture.py +0 -0
  686. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_github_ops.py +0 -0
  687. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_goal.py +0 -0
  688. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_graph_health.py +0 -0
  689. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_graph_selfheal_absent_2237.py +0 -0
  690. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_handoff.py +0 -0
  691. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_checks.py +0 -0
  692. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_cli.py +0 -0
  693. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_cli_graph.py +0 -0
  694. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_config.py +0 -0
  695. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_context.py +0 -0
  696. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_deploy_lane_facts.py +0 -0
  697. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_incident_regression.py +0 -0
  698. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_pypi.py +0 -0
  699. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_registry.py +0 -0
  700. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_timer_active.py +0 -0
  701. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_toolchain.py +0 -0
  702. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_unit_drift.py +0 -0
  703. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_health_unit_enablement.py +0 -0
  704. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_hooks.py +0 -0
  705. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_human_attended_437.py +0 -0
  706. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_init.py +0 -0
  707. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_integration.py +0 -0
  708. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_interactive_briefing_echo.py +0 -0
  709. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_interactive_prefill_state.py +0 -0
  710. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_interactive_session_relaunch.py +0 -0
  711. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_interactive_test_verdict_backstop.py +0 -0
  712. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_interactive_token_attribution.py +0 -0
  713. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_interactive_worktree.py +0 -0
  714. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_issue_store_seam.py +0 -0
  715. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_liveness_auditor.py +0 -0
  716. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_liveness_notify.py +0 -0
  717. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_machine_pause.py +0 -0
  718. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_merge_queue.py +0 -0
  719. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_merge_verify.py +0 -0
  720. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_milestone_chat.py +0 -0
  721. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_milestone_dispatch.py +0 -0
  722. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_milestone_gate.py +0 -0
  723. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_milestone_order.py +0 -0
  724. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_milestone_seam.py +0 -0
  725. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_mock_author.py +0 -0
  726. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_model_tiering.py +0 -0
  727. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_models.py +0 -0
  728. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_models_config_labels.py +0 -0
  729. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_needs_attention.py +0 -0
  730. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_network.py +0 -0
  731. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_new_issue_chat.py +0 -0
  732. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_next_release_tag.py +0 -0
  733. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_no_direct_gh_calls.py +0 -0
  734. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_node_shim.py +0 -0
  735. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notifier_baseline.py +0 -0
  736. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notifier_cli.py +0 -0
  737. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notifier_collect.py +0 -0
  738. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notifier_config.py +0 -0
  739. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notifier_drive_seam.py +0 -0
  740. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notifier_isolation.py +0 -0
  741. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notifier_predicate.py +0 -0
  742. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notifier_quiet_hours.py +0 -0
  743. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notifier_service.py +0 -0
  744. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notify.py +0 -0
  745. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_notify_drain.py +0 -0
  746. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_openapi.py +0 -0
  747. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_operational_defaults.py +0 -0
  748. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_overlap_fence.py +0 -0
  749. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_overlap_predict.py +0 -0
  750. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_packaged_deploy_units.py +0 -0
  751. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_parentage.py +0 -0
  752. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_paste_landed.py +0 -0
  753. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_pipeline.py +0 -0
  754. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_plan_followup_approve_plan_command.py +0 -0
  755. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_plan_followup_pr_command.py +0 -0
  756. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_plan_followup_review_command.py +0 -0
  757. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_plan_only.py +0 -0
  758. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_plan_parser.py +0 -0
  759. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_platform_paths.py +0 -0
  760. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_portal_bridge.py +0 -0
  761. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_portal_config.py +0 -0
  762. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_portal_sync.py +0 -0
  763. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_pr_body_lint.py +0 -0
  764. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_prereqs.py +0 -0
  765. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_production_db_guard.py +0 -0
  766. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_progress.py +0 -0
  767. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_provider_seam.py +0 -0
  768. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_providers.py +0 -0
  769. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_providers_config_labels.py +0 -0
  770. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_providers_pty.py +0 -0
  771. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_quiet_hours.py +0 -0
  772. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_quiet_hours_store_2146.py +0 -0
  773. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reap_merged_sessions.py +0 -0
  774. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reap_stale_interactive_tick.py +0 -0
  775. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reconcile.py +0 -0
  776. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reconcile_branch.py +0 -0
  777. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reconcile_completions.py +0 -0
  778. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reconcile_merges.py +0 -0
  779. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reconcile_no_agent_record.py +0 -0
  780. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reconcile_tick.py +0 -0
  781. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reconcile_usage_limit_done.py +0 -0
  782. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_refine_chat.py +0 -0
  783. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_release_cordon_2101.py +0 -0
  784. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  785. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_release_cordon_deadlock_2240.py +0 -0
  786. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_release_propagate.py +0 -0
  787. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_release_unified_1242.py +0 -0
  788. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_release_verify.py +0 -0
  789. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_release_window.py +0 -0
  790. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_remote_auto_prune.py +0 -0
  791. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_remote_interactive_reaper.py +0 -0
  792. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_repo_edit_2220.py +0 -0
  793. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_repo_graph_fleet_2237.py +0 -0
  794. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_repo_onboard_2220.py +0 -0
  795. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_report_result_push.py +0 -0
  796. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_reports.py +0 -0
  797. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_retry.py +0 -0
  798. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_retry_advisory_1606.py +0 -0
  799. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_retry_type_1636.py +0 -0
  800. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_revalidate.py +0 -0
  801. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_review.py +0 -0
  802. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_review_end_review_without_verdict.py +0 -0
  803. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_review_parse_failure_diagnostic.py +0 -0
  804. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_review_reaffirm.py +0 -0
  805. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_review_state.py +0 -0
  806. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_review_verdict_backstop.py +0 -0
  807. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_review_verdict_override_audit.py +0 -0
  808. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_review_verdict_relay.py +0 -0
  809. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_review_zero_commits.py +0 -0
  810. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_scoped_review_wiring.py +0 -0
  811. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_scorecard.py +0 -0
  812. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_serve.py +0 -0
  813. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_serve_app_board_trim.py +0 -0
  814. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_session.py +0 -0
  815. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_slice_issue_attribution.py +0 -0
  816. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_smoke.py +0 -0
  817. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_smoke_live_checkout_restore.py +0 -0
  818. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_smoke_workflow.py +0 -0
  819. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_spend_ceiling.py +0 -0
  820. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_spend_ceiling_coordinator.py +0 -0
  821. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_split.py +0 -0
  822. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_split_work.py +0 -0
  823. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_stage_projection.py +0 -0
  824. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_stalled_pipeline.py +0 -0
  825. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_state_review_findings_daemon.py +0 -0
  826. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_status_fleet_footer.py +0 -0
  827. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_stop_1567.py +0 -0
  828. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_stuck.py +0 -0
  829. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_terminal_command.py +0 -0
  830. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_test_author.py +0 -0
  831. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_test_chat.py +0 -0
  832. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_test_orchestrator.py +0 -0
  833. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_test_report.py +0 -0
  834. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_test_verdict_parsing.py +0 -0
  835. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_test_verdict_transcript_floor.py +0 -0
  836. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_thin_client_board_audit.py +0 -0
  837. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_thin_client_config_load_1080.py +0 -0
  838. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_thin_client_daemon_routing_906.py +0 -0
  839. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_tmux_host.py +0 -0
  840. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_tmux_session.py +0 -0
  841. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_transcript_floor.py +0 -0
  842. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_usage.py +0 -0
  843. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_usage_limits.py +0 -0
  844. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_usage_rollup.py +0 -0
  845. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_venv_live_install_2121.py +0 -0
  846. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_version_single_source.py +0 -0
  847. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_watch.py +0 -0
  848. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  849. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_worker_events.py +0 -0
  850. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_worker_image_pin_sync.py +0 -0
  851. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_worker_safety.py +0 -0
  852. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_worker_test_scoping.py +0 -0
  853. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_worktree.py +0 -0
  854. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  855. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/Cargo.lock +0 -0
  856. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/Cargo.toml +0 -0
  857. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/cargo-config-local-quadraui.toml.example +0 -0
  858. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/audit.rs +0 -0
  859. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/chat.rs +0 -0
  860. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/drive.rs +0 -0
  861. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/drive_queue.rs +0 -0
  862. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/escalation.rs +0 -0
  863. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/fleet_health.rs +0 -0
  864. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/fleet_sessions.rs +0 -0
  865. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/fleet_terminals.rs +0 -0
  866. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/format.rs +0 -0
  867. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/msv.rs +0 -0
  868. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/reports.rs +0 -0
  869. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/sessions.rs +0 -0
  870. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/settings_ui.rs +0 -0
  871. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/sidebar.rs +0 -0
  872. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/terminal.rs +0 -0
  873. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/app/workspace.rs +0 -0
  874. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/bin/gtk.rs +0 -0
  875. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/commands.rs +0 -0
  876. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/lib.rs +0 -0
  877. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/main.rs +0 -0
  878. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/src/settings.rs +0 -0
  879. {code_coordinator-0.5.158 → code_coordinator-0.5.163}/tui/tests/cli.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.158
3
+ Version: 0.5.163
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.158
3
+ Version: 0.5.163
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
@@ -806,6 +806,7 @@ tests/acceptance/ms-65/contract.md
806
806
  tests/acceptance/ms-65/detail_substate_2285.rs
807
807
  tests/acceptance/ms-65/manifest.yml
808
808
  tests/acceptance/ms-65/pipeline_tabs_2284.rs
809
+ tests/acceptance/ms-65/tabs_discoverability_2287.rs
809
810
  tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen
810
811
  tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen
811
812
  tests/acceptance/ms-65/mocks/board-preview-tab.screen
@@ -454,6 +454,7 @@
454
454
  "tests/acceptance/ms-65/mocks/board-tabs-overflow.screen",
455
455
  "tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen",
456
456
  "tests/acceptance/ms-65/pipeline_tabs_2284.rs",
457
+ "tests/acceptance/ms-65/tabs_discoverability_2287.rs",
457
458
  "tests/acceptance/ms-example/mocks/home-active.html",
458
459
  "tests/conftest.py",
459
460
  "tests/fixtures/board-pipeline-basic.json",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.158",
2
+ "tag": "0.5.163",
3
3
  "distance": 0,
4
- "node": "g4e440181f25b4e02cfc8fc64b76c584c7e63a197",
4
+ "node": "g6fa07c5850b078c8d3d43576ceee2b342698e255",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-19"
@@ -161,6 +161,12 @@ def row_to_assignment(row: object) -> Assignment:
161
161
  # #2316: raw terminal stop_reason; None for rows predating this
162
162
  # column or a worker whose log carried no such field.
163
163
  stop_reason=d.get("stop_reason"),
164
+ # #2417: the calling worker's own assignment id, when this row was
165
+ # dispatched from INSIDE another worker's turn (e.g. `coord
166
+ # acceptance author`/`coord fix` shelled out to from a `type="work"`
167
+ # session's own bash tool). None for a hand or coordinator/brain
168
+ # dispatch, and for rows predating this column.
169
+ dispatched_by_assignment_id=d.get("dispatched_by_assignment_id"),
164
170
  )
165
171
 
166
172
 
@@ -174,4 +174,5 @@ export interface Assignment {
174
174
  for_issue_number: number | null
175
175
  driven_by: string | null
176
176
  stop_reason: string | null
177
+ dispatched_by_assignment_id: string | null
177
178
  }
@@ -926,6 +926,14 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
926
926
  # submission with no preview queued yet, same as `open_question`'s
927
927
  # own default.
928
928
  "ALTER TABLE portal_submissions ADD COLUMN preview_url TEXT NOT NULL DEFAULT ''",
929
+ # #2417: the CALLING assignment's id when this row was dispatched by
930
+ # a `coord` subcommand run from INSIDE another worker's own turn
931
+ # (e.g. `coord acceptance author`/`coord fix` shelled out to from a
932
+ # `type="work"` session's own bash tool) rather than typed by a
933
+ # human — see `coord.models.Assignment.dispatched_by_assignment_id`.
934
+ # NULL for a hand dispatch, a coordinator/brain-proposed dispatch,
935
+ # and every row predating this column.
936
+ "ALTER TABLE assignments ADD COLUMN dispatched_by_assignment_id TEXT",
929
937
  ]
930
938
  for sql in migrations:
931
939
  try:
@@ -396,6 +396,22 @@ class DriveCounters:
396
396
  # overwhelming majority of drives — non-oracle ones — never allocate it,
397
397
  # and `--dry-run`'s counter snapshot stays unchanged for them.
398
398
  acceptance: "DriveCounters | None" = None
399
+ # #2416: bounded retry for an ADVISORY work row whose branch carries zero
400
+ # commits — `_decide_advisory`'s dead-end signature. Before this, that
401
+ # branch went straight to `_die()` on every observation, so the only
402
+ # thing that could ever supersede the terminal row was a human running
403
+ # `coord retry <aid>` by hand (`coord diagnose --stage work --reset` is
404
+ # NOT the escape hatch here — it never sets `needs_reset` for this
405
+ # shape). `drive-queue`'s own automatic retry does not take that path
406
+ # either: it just relaunches a brand new `coord drive` process, which
407
+ # re-observes the SAME terminal row and dies again in seconds, burning a
408
+ # queue attempt+backoff cycle for nothing (coord-portal#119, drive-queue
409
+ # entry 432). Bounded the same way `work_retries` is (`opts.
410
+ # max_work_retries`) so a genuinely unactionable row (the issue's real
411
+ # resolution is a sibling task, not another attempt) still reaches a
412
+ # terminal `_die()` — never an unbounded loop — once the budget is
413
+ # spent.
414
+ advisory_retries: int = 0
399
415
 
400
416
  def slice_budget(self) -> "DriveCounters":
401
417
  """This run's slice-landing budget, created on first use (#2079)."""
@@ -1603,8 +1619,15 @@ def decide(
1603
1619
  if state.work_status == "done":
1604
1620
  pass
1605
1621
  elif state.work_status == "advisory":
1606
- advisory = _decide_advisory(state, opts, machine, verifier)
1607
- if advisory.is_exit:
1622
+ advisory = _decide_advisory(state, opts, counters, machine, verifier)
1623
+ # #2416: `_decide_advisory` now returns a RUN action (a bounded
1624
+ # `coord retry` dispatch) for the zero-commit case, not only an EXIT
1625
+ # — `is_exit` alone would let a RUN action fall through to the
1626
+ # Test/Review/Merge logic below as though the row were validated
1627
+ # work. Only its "proceeding under --accept-advisory" branch returns
1628
+ # WAIT (with warnings to fold in); every other branch (EXIT or RUN)
1629
+ # is this poll's whole answer.
1630
+ if advisory.kind != WAIT:
1608
1631
  return advisory
1609
1632
  warnings = advisory.warnings
1610
1633
  elif state.work_status == "refused_policy":
@@ -1825,6 +1848,7 @@ def _dispatch_work_stage(
1825
1848
  def _decide_advisory(
1826
1849
  state: IssueState,
1827
1850
  opts: DriveOptions,
1851
+ counters: DriveCounters,
1828
1852
  machine: str,
1829
1853
  verifier: MergeVerifier,
1830
1854
  ) -> Action:
@@ -1835,13 +1859,47 @@ def _decide_advisory(
1835
1859
  ``tui/target/debug/coord-tui``, which a Python diff never produces, so
1836
1860
  #1323's stash-miss check downgrades a perfectly good DONE. Ask git which
1837
1861
  case this actually is rather than trusting the status.
1862
+
1863
+ #2416: a GENUINE zero-commit advisory (no branch, or a branch verified to
1864
+ carry no commits) used to be an immediate, unconditional `_die()` — the
1865
+ ONE thing that can actually change this row, `coord retry <aid>`'s
1866
+ zero-commit-advisory path (#1606: `ahead == 0` → reassign a fresh
1867
+ worker), was never invoked automatically. That made every automatic
1868
+ retry — `drive-queue`'s own included — a no-op: a brand new `coord
1869
+ drive` process just re-observes the identical terminal row and dies
1870
+ again in seconds, spending a queue attempt+backoff cycle for nothing.
1871
+ Mirrors the `work_status == "failed"` branch above: a bounded number of
1872
+ `coord retry` dispatches (`opts.max_work_retries`, via `counters.
1873
+ advisory_retries`) before finally giving up, so a row whose correct
1874
+ resolution really is "dispatch something else" still reaches a terminal
1875
+ `_die()` naming `coord retry` for a human — never an unbounded loop.
1838
1876
  """
1839
1877
  if not state.work_branch or not verifier.branch_has_commits(state):
1840
- return _die(
1841
- f"work {state.work_aid} exited ADVISORY with no commits on its branch —\n"
1842
- " nothing was pushed, so there is nothing to test, review, or merge.\n"
1843
- f" inspect: coord log {state.work_aid} --machine "
1844
- f"{state.work_machine or machine}"
1878
+ budget = opts.max_work_retries
1879
+ if counters.advisory_retries >= budget:
1880
+ return _die(
1881
+ f"work {state.work_aid} exited ADVISORY with no commits on its "
1882
+ f"branch {counters.advisory_retries} time(s) in a row (budget "
1883
+ f"{budget}, #2416) — nothing was pushed, so there is nothing to "
1884
+ "test, review, or merge, and retrying has not produced a "
1885
+ "different outcome.\n"
1886
+ f" inspect: coord log {state.work_aid} --machine "
1887
+ f"{state.work_machine or machine}\n"
1888
+ f" this needs an operator decision: `coord retry "
1889
+ f"{state.work_aid}` by hand once the underlying blocker is "
1890
+ "understood, or dispatch an independent follow-up issue if "
1891
+ "another attempt at this one is not the right fix."
1892
+ )
1893
+ counters.advisory_retries += 1
1894
+ return Action(
1895
+ kind=RUN,
1896
+ label=(
1897
+ f"WORK: {state.work_aid} exited ADVISORY with no commits → "
1898
+ f"coord retry {state.work_aid} (attempt "
1899
+ f"{counters.advisory_retries}/{budget}, #2416)"
1900
+ ),
1901
+ command=("retry", state.work_aid),
1902
+ error_message=f"coord retry failed for {state.work_aid}",
1845
1903
  )
1846
1904
  if not opts.accept_advisory:
1847
1905
  return _die(
@@ -723,6 +723,29 @@ class Assignment:
723
723
  # `advisory` — the same bucket as a worker that looked and correctly
724
724
  # found nothing to do — so nobody re-drove it.
725
725
  stop_reason: str | None = None
726
+ # #2417: the CALLING assignment's id when this row was dispatched by a
727
+ # `coord` subcommand run from INSIDE another worker's own turn (e.g. a
728
+ # `type="work"` session shelling out to `coord acceptance author repo ms
729
+ # --issue N` or `coord fix <other-id>`), as opposed to a human typing the
730
+ # same command in their own shell. Populated centrally in
731
+ # `coord.state.record_dispatched`/`record_dispatched_assignment` from the
732
+ # `COORD_ASSIGNMENT_ID` env var (see `coord.agent._build_worker_env`'s
733
+ # #2217 note — every headless worker's subprocess environment carries its
734
+ # own assignment id, so a `coord` CLI the worker shells out to inherits
735
+ # it automatically; a human's own shell never has it set). `None` for a
736
+ # hand dispatch, a coordinator/brain-proposed dispatch, and rows
737
+ # predating this column.
738
+ #
739
+ # This is the missing link #2417 reported: before this field, the only
740
+ # way to discover that a work row had dispatched an independent sibling
741
+ # assignment (and whether that sibling then succeeded) was grepping the
742
+ # worker's raw `claude -p` transcript for the printed "Dispatched ... to
743
+ # ..." line and manually cross-referencing a second `coord log` by hand.
744
+ # With this field, the ORIGIN row can be found by any consumer (the
745
+ # board, `coord audit`, the TUI) via a reverse lookup: "which assignment
746
+ # has `dispatched_by_assignment_id == this row's id`?" — see
747
+ # `coord.state.find_dispatched_children`.
748
+ dispatched_by_assignment_id: str | None = None
726
749
 
727
750
 
728
751
  def effective_issue_number(assignment: "Assignment | dict") -> int:
@@ -859,6 +882,15 @@ class Proposal:
859
882
  # through) carries durable provenance. `None` for every other caller
860
883
  # (brain-proposed, milestone dispatch, ...).
861
884
  driven_by: str | None = None
885
+ # #2417: mirrors `Assignment.dispatched_by_assignment_id` — see that
886
+ # field's docstring. Set here (rather than left for the caller to
887
+ # populate) by `coord.state.record_dispatched` reading
888
+ # `COORD_ASSIGNMENT_ID` from the environment at record time, so every
889
+ # `Proposal`-based dispatch path (`coord fix`/`coord pr`/`coord review`
890
+ # follow-ups via `_dispatch_followup`, `coord assign`,
891
+ # `coord/dispatch_workers.py`, ...) gets this for free without each call
892
+ # site threading it through by hand.
893
+ dispatched_by_assignment_id: str | None = None
862
894
 
863
895
 
864
896
  @dataclass
@@ -17,7 +17,7 @@ import os
17
17
  import sqlite3
18
18
  import time
19
19
  import warnings
20
- from dataclasses import asdict
20
+ from dataclasses import asdict, replace
21
21
  from datetime import datetime, timezone
22
22
  from pathlib import Path
23
23
  from typing import TYPE_CHECKING
@@ -561,6 +561,10 @@ def _dispatched_dict_from_payload(a: dict) -> dict:
561
561
  "provider_name": a.get("provider_name"),
562
562
  # #1499: durable drive provenance; None for a hand `coord assign`.
563
563
  "driven_by": a.get("driven_by"),
564
+ # #2417: the calling worker's own assignment id, when this row was
565
+ # dispatched from INSIDE another worker's turn. None for a hand or
566
+ # coordinator/brain dispatch.
567
+ "dispatched_by_assignment_id": a.get("dispatched_by_assignment_id"),
564
568
  }
565
569
 
566
570
 
@@ -605,6 +609,10 @@ def _row_to_dispatched_dict(row: object) -> dict:
605
609
  "provider_name": d.get("provider_name"),
606
610
  # #1499: durable drive provenance; None for a hand `coord assign`.
607
611
  "driven_by": d.get("driven_by"),
612
+ # #2417: the calling worker's own assignment id, when this row was
613
+ # dispatched from INSIDE another worker's turn. None for a hand or
614
+ # coordinator/brain dispatch.
615
+ "dispatched_by_assignment_id": d.get("dispatched_by_assignment_id"),
608
616
  }
609
617
 
610
618
 
@@ -799,6 +807,21 @@ def _thin_client_local_board_guard(fn_name: str) -> None:
799
807
  _log.warning(msg)
800
808
 
801
809
 
810
+ def _dispatched_by_from_env() -> str | None:
811
+ """The calling worker's own assignment id, if this process is running
812
+ INSIDE a headless worker's turn (#2417).
813
+
814
+ `COORD_ASSIGNMENT_ID` is set on a worker subprocess's own environment by
815
+ `coord.agent._build_worker_env` (#2217) — so a `coord` CLI invocation
816
+ the worker shells out to (e.g. `coord acceptance author` dispatching an
817
+ independent test-author sibling, `coord fix <other-id>` escalating an
818
+ unrelated assignment) inherits it automatically. A human typing the same
819
+ command in their own shell never has it set, so this correctly returns
820
+ `None` for a hand/coordinator dispatch.
821
+ """
822
+ return os.environ.get("COORD_ASSIGNMENT_ID") or None
823
+
824
+
802
825
  def record_dispatched(
803
826
  *,
804
827
  assignment_id: str,
@@ -807,6 +830,15 @@ def record_dispatched(
807
830
  provider_name: str | None = None,
808
831
  ) -> None:
809
832
  """Record a newly dispatched assignment — routes to the daemon when set."""
833
+ # #2417: stamp the calling worker's own assignment id (if any) BEFORE
834
+ # this crosses the HTTP boundary to a possibly-remote daemon — the env
835
+ # var only exists on the machine/process that is actually dispatching,
836
+ # never on the daemon host. Caller-supplied values (none of today's
837
+ # callers set one explicitly) are left alone.
838
+ if proposal.dispatched_by_assignment_id is None:
839
+ proposal = replace(
840
+ proposal, dispatched_by_assignment_id=_dispatched_by_from_env()
841
+ )
810
842
  svc = _board_service()
811
843
  resp = _route_write(
812
844
  svc,
@@ -874,8 +906,8 @@ def _record_dispatched_local(
874
906
  assignment_id, machine_name, repo_name, repo_github,
875
907
  issue_number, issue_title, status, type, briefing,
876
908
  files_allowed, model, dispatched_at, required_gates,
877
- provider_name, branch, driven_by
878
- ) VALUES (?, ?, ?, ?, ?, ?, 'running', ?, ?, ?, ?, ?, ?, ?, ?, ?)
909
+ provider_name, branch, driven_by, dispatched_by_assignment_id
910
+ ) VALUES (?, ?, ?, ?, ?, ?, 'running', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
879
911
  ON CONFLICT(assignment_id) DO NOTHING""",
880
912
  (
881
913
  assignment_id,
@@ -893,6 +925,7 @@ def _record_dispatched_local(
893
925
  provider_name,
894
926
  branch,
895
927
  proposal.driven_by,
928
+ proposal.dispatched_by_assignment_id,
896
929
  ),
897
930
  )
898
931
  conn.commit()
@@ -915,7 +948,16 @@ def _record_dispatched_local(
915
948
  # the audit log alone, after the driver process has exited.
916
949
  actor="drive" if proposal.driven_by else "coordinator",
917
950
  summary=f"Dispatched {proposal.type} to {proposal.machine_name}: "
918
- f"{proposal.repo_name}#{proposal.issue_number}",
951
+ f"{proposal.repo_name}#{proposal.issue_number}"
952
+ # #2417: make the sibling-dispatch link visible in the default
953
+ # (non-`--json`) `coord audit` table, not just in `details` —
954
+ # this is what let coord-portal#119's dispatch of a test-author
955
+ # sibling go unnoticed without grepping the raw worker transcript.
956
+ + (
957
+ f" (dispatched by assignment {proposal.dispatched_by_assignment_id})"
958
+ if proposal.dispatched_by_assignment_id
959
+ else ""
960
+ ),
919
961
  repo=proposal.repo_name,
920
962
  issue=proposal.issue_number,
921
963
  assignment_id=assignment_id,
@@ -924,6 +966,11 @@ def _record_dispatched_local(
924
966
  "type": proposal.type,
925
967
  "branch": branch,
926
968
  "driven_by": proposal.driven_by,
969
+ # #2417: surfaces "this was dispatched BY a worker's own
970
+ # turn" directly in `coord audit`, without cross-referencing
971
+ # the raw `claude -p` transcript for the printed "Dispatched
972
+ # ... to ..." line.
973
+ "dispatched_by_assignment_id": proposal.dispatched_by_assignment_id,
927
974
  },
928
975
  )
929
976
 
@@ -934,6 +981,12 @@ def record_dispatched_assignment(
934
981
  repo_github: str,
935
982
  ) -> None:
936
983
  """Record a dispatched assignment — routes to the daemon when set."""
984
+ # #2417: see record_dispatched's matching comment — must be stamped here,
985
+ # on the dispatching process's own env, before the daemon HTTP hop.
986
+ if assignment.dispatched_by_assignment_id is None:
987
+ assignment = replace(
988
+ assignment, dispatched_by_assignment_id=_dispatched_by_from_env()
989
+ )
937
990
  svc = _board_service()
938
991
  resp = _route_write(
939
992
  svc, "/dispatched", {"assignment": asdict(assignment), "repo_github": repo_github}
@@ -971,7 +1024,8 @@ def _record_dispatched_assignment_local(
971
1024
  issue_number, issue_title, status, type, briefing,
972
1025
  files_allowed, model, dispatched_at, review_of_assignment_id,
973
1026
  review_target, required_gates, review_iteration,
974
- provider_name, branch, for_issue_number, driven_by
1027
+ provider_name, branch, for_issue_number, driven_by,
1028
+ dispatched_by_assignment_id
975
1029
  ) VALUES (?, ?, ?, ?, ?, ?, 'running', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
976
1030
  -- #1553: a follow-up dispatched off another assignment (review,
977
1031
  -- smoke, [fix-N], retry, pr-helper) inherits that parent's
@@ -989,7 +1043,7 @@ def _record_dispatched_assignment_local(
989
1043
  SELECT p.for_issue_number FROM assignments p
990
1044
  WHERE p.assignment_id = ?
991
1045
  )),
992
- ?)
1046
+ ?, ?)
993
1047
  ON CONFLICT(assignment_id) DO UPDATE SET
994
1048
  status = 'running',
995
1049
  machine_name = excluded.machine_name,
@@ -1013,7 +1067,13 @@ def _record_dispatched_assignment_local(
1013
1067
  for_issue_number = COALESCE(excluded.for_issue_number, for_issue_number),
1014
1068
  -- #1499: COALESCE so a re-dispatch/reload doesn't clear the
1015
1069
  -- drive provenance already recorded for this assignment.
1016
- driven_by = COALESCE(excluded.driven_by, driven_by)""",
1070
+ driven_by = COALESCE(excluded.driven_by, driven_by),
1071
+ -- #2417: COALESCE so a re-dispatch/reload doesn't clear the
1072
+ -- calling-worker provenance already recorded for this
1073
+ -- assignment.
1074
+ dispatched_by_assignment_id = COALESCE(
1075
+ excluded.dispatched_by_assignment_id, dispatched_by_assignment_id
1076
+ )""",
1017
1077
  (
1018
1078
  assignment.assignment_id or "",
1019
1079
  assignment.machine_name,
@@ -1039,6 +1099,7 @@ def _record_dispatched_assignment_local(
1039
1099
  # positional).
1040
1100
  assignment.review_of_assignment_id,
1041
1101
  assignment.driven_by,
1102
+ assignment.dispatched_by_assignment_id,
1042
1103
  ),
1043
1104
  )
1044
1105
  conn.commit()
@@ -1051,7 +1112,13 @@ def _record_dispatched_assignment_local(
1051
1112
  # to a human `coord assign` (the exact gap #1499 reported).
1052
1113
  actor="drive" if assignment.driven_by else "coordinator",
1053
1114
  summary=f"Dispatched {assignment.type} to {assignment.machine_name}: "
1054
- f"{assignment.repo_name}#{assignment.issue_number}",
1115
+ f"{assignment.repo_name}#{assignment.issue_number}"
1116
+ # #2417: see the matching Proposal-path comment above.
1117
+ + (
1118
+ f" (dispatched by assignment {assignment.dispatched_by_assignment_id})"
1119
+ if assignment.dispatched_by_assignment_id
1120
+ else ""
1121
+ ),
1055
1122
  repo=assignment.repo_name,
1056
1123
  issue=assignment.issue_number,
1057
1124
  assignment_id=assignment.assignment_id,
@@ -1062,6 +1129,8 @@ def _record_dispatched_assignment_local(
1062
1129
  "review_target": assignment.review_target,
1063
1130
  "review_iteration": assignment.review_iteration,
1064
1131
  "driven_by": assignment.driven_by,
1132
+ # #2417: see record_dispatched's matching comment.
1133
+ "dispatched_by_assignment_id": assignment.dispatched_by_assignment_id,
1065
1134
  },
1066
1135
  )
1067
1136
 
@@ -143,6 +143,50 @@ tests:
143
143
  # THIS IS A GREEN RATCHET — see the `expected_red` block below.
144
144
  detail_substate_2285::a_single_open_tab_keeps_todays_sub_tab_and_scroll_behaviour: 2285
145
145
 
146
+ # ── #2287 (T-5) — discoverability: status bar / `?` help / right-click ────
147
+ # Slice: tabs_discoverability_2287.rs · mocks: board-tab-context-menu.screen,
148
+ # board-tabs-help-overlay.screen (plus board-preview-tab.screen and
149
+ # board-baseline-no-tabs.screen — §8a's own hint-present / hint-absent
150
+ # reference pair)
151
+ #
152
+ # §8a — with >=1 tab open the status bar advertises the tab gestures
153
+ tabs_discoverability_2287::status_bar_shows_the_tab_hints_while_a_tab_is_open: 2287
154
+ # §8a — …as the contract's pinned, verbatim substring (two spaces between
155
+ # segments). Split from the clause above so a spacing/ordering deviation
156
+ # reds exactly one id.
157
+ tabs_discoverability_2287::status_bar_tab_hint_is_the_contracts_verbatim_string: 2287
158
+ # §8a + #2287 AC — the dynamic half: the hint goes away again when the last
159
+ # tab closes (a latched hint passes the static control but fails this)
160
+ tabs_discoverability_2287::status_bar_tab_hints_disappear_when_the_last_tab_closes: 2287
161
+ # §8a — CONTROL: zero tabs => no tab hint, and the Board's own pre-ms-65
162
+ # hints survive. THIS IS THE GREEN CONTROL — see `expected_red` below.
163
+ tabs_discoverability_2287::zero_tabs_status_bar_keeps_the_boards_own_hints_and_shows_no_tab_hints: 2287
164
+ # §8b — `?` opens an overlay titled "Board — Help"
165
+ tabs_discoverability_2287::help_overlay_opens_on_question_mark_with_the_board_title: 2287
166
+ # §8b — …listing the four pinned key-binding phrases ("open preview tab",
167
+ # "pin tab", "close active tab", "cycle tabs")
168
+ tabs_discoverability_2287::help_overlay_lists_the_document_tab_key_bindings: 2287
169
+ # §8b — …and the two mouse gestures the status bar cannot advertise,
170
+ # under the "Document tabs" heading
171
+ tabs_discoverability_2287::help_overlay_lists_the_mouse_tab_gestures_under_a_document_tabs_heading: 2287
172
+ # §8b — ` Esc=close ` while open, and `Esc` closes it
173
+ tabs_discoverability_2287::help_overlay_advertises_and_honours_escape_to_close: 2287
174
+ # §8c — right-clicking a tab opens the four-item menu (Close checked as a
175
+ # standalone item, not as a prefix of its two longer siblings)
176
+ tabs_discoverability_2287::right_clicking_a_tab_opens_a_menu_with_close_close_others_close_all_and_pin_tab: 2287
177
+ # §8c — "Close others" leaves exactly the right-clicked (middle) tab
178
+ tabs_discoverability_2287::close_others_leaves_exactly_the_right_clicked_tab: 2287
179
+ # §8c — "Close all" leaves none and restores the zero-tab state
180
+ tabs_discoverability_2287::close_all_leaves_no_tabs_and_restores_the_zero_tab_state: 2287
181
+ # §8c — "Close" closes the right-clicked tab and no other (see finding 16)
182
+ tabs_discoverability_2287::close_menu_item_closes_the_right_clicked_tab_and_no_other: 2287
183
+ # §8c + #2287 AC — "Pin tab" promotes a preview tab (drops `∘ `) without
184
+ # changing count or order
185
+ tabs_discoverability_2287::pin_tab_promotes_a_preview_tab_without_changing_count_or_order: 2287
186
+ # §8c — "hidden or inert" on an already-pinned tab, asserted through the
187
+ # outcome both readings share (see finding 17)
188
+ tabs_discoverability_2287::pin_tab_is_hidden_or_inert_on_an_already_pinned_tab: 2287
189
+
146
190
  # ── expected_red (#2164) ───────────────────────────────────────────────────
147
191
  # Hand-derived from a REAL run of the sealed suite against origin/main at the
148
192
  # time of authoring (`cd tui && cargo test --test acceptance --features
@@ -249,6 +293,40 @@ expected_red:
249
293
  - detail_substate_2285::closing_a_tab_discards_its_sub_state_and_reopening_starts_from_the_defaults
250
294
  - detail_substate_2285::terminal_sub_tab_selection_follows_its_own_tab
251
295
 
296
+ # #2287 — OBSERVED, not intended. Taken from two consecutive real runs of
297
+ # the sealed suite (`cd tui && RUSTC_BOOTSTRAP=1 cargo test --test acceptance
298
+ # --features test-support -- -Z unstable-options --format json`, the driver
299
+ # command in coordinator.yml) at authoring time: of this slice's 14 ids, the
300
+ # same 13 FAILED and the same 1 passed on both runs. Every one of the 13 died
301
+ # on a §8 clause, never on a §2/§4 precondition — verified by reading the
302
+ # panic line of each failure (the §8c ones all land in `assert_menu_item` /
303
+ # `click_menu_item`, i.e. "no such menu"; the §8a/§8b ones on the missing
304
+ # hint string and the missing overlay). The 1 that passed is deliberately
305
+ # ABSENT below:
306
+ #
307
+ # * `zero_tabs_status_bar_keeps_the_boards_own_hints_and_shows_no_tab_hints`
308
+ # — the CONTROL. Green today (nothing renders "click=preview", and the
309
+ # Board status bar already reads `… n=notify m=merge R=retry P=purge
310
+ # q=quit`) and it must STAY green after #2287 lands: an implementation
311
+ # that appends the tab hints unconditionally, or that replaces the
312
+ # Board's own hint set with them outright, passes every §8a test above
313
+ # and breaks exactly this one. Listing it would make its inevitable pass
314
+ # a HARD FAILURE.
315
+ 2287:
316
+ - tabs_discoverability_2287::status_bar_shows_the_tab_hints_while_a_tab_is_open
317
+ - tabs_discoverability_2287::status_bar_tab_hint_is_the_contracts_verbatim_string
318
+ - tabs_discoverability_2287::status_bar_tab_hints_disappear_when_the_last_tab_closes
319
+ - tabs_discoverability_2287::help_overlay_opens_on_question_mark_with_the_board_title
320
+ - tabs_discoverability_2287::help_overlay_lists_the_document_tab_key_bindings
321
+ - tabs_discoverability_2287::help_overlay_lists_the_mouse_tab_gestures_under_a_document_tabs_heading
322
+ - tabs_discoverability_2287::help_overlay_advertises_and_honours_escape_to_close
323
+ - tabs_discoverability_2287::right_clicking_a_tab_opens_a_menu_with_close_close_others_close_all_and_pin_tab
324
+ - tabs_discoverability_2287::close_others_leaves_exactly_the_right_clicked_tab
325
+ - tabs_discoverability_2287::close_all_leaves_no_tabs_and_restores_the_zero_tab_state
326
+ - tabs_discoverability_2287::close_menu_item_closes_the_right_clicked_tab_and_no_other
327
+ - tabs_discoverability_2287::pin_tab_promotes_a_preview_tab_without_changing_count_or_order
328
+ - tabs_discoverability_2287::pin_tab_is_hidden_or_inert_on_an_already_pinned_tab
329
+
252
330
  # ═══════════════════════════════════════════════════════════════════════════
253
331
  # FOR THE COORDINATOR — three findings from authoring this slice. None of them
254
332
  # is a worker's to fix, and none was resolved by editing the contract (a
@@ -506,3 +584,88 @@ expected_red:
506
584
  # And this slice deliberately does NOT assert the sub-tab-switch scroll reset
507
585
  # the app performs today (`detail_scroll = 0` on a sub-tab click): no clause
508
586
  # pins it either way, so pinning it could force a wrong implementation.
587
+
588
+ # ═══════════════════════════════════════════════════════════════════════════
589
+ # FOR THE COORDINATOR — findings from authoring the #2287 slice (contract §8).
590
+ # Independent of the #2282 / #2283 / #2284 / #2285 notes above; again, none is
591
+ # a worker's to fix by editing this suite, and none was resolved by editing
592
+ # the contract (a test-author may not amend one).
593
+ # ═══════════════════════════════════════════════════════════════════════════
594
+ #
595
+ # 14. §8b's `?` overlay has TWO sections and the second one is #2288's, not
596
+ # #2287's. §8b pins "Document tabs" AND "Split (§9's four keys)", and
597
+ # `mocks/board-tabs-help-overlay.screen` renders the four split rows
598
+ # (`Ctrl-W v split right`, `Ctrl-W s split down`, `Ctrl-W w next pane`,
599
+ # `Ctrl-W x close pane`). This slice asserts the Document-tabs section
600
+ # only. #2287's own acceptance criteria say just "`?` lists the tab key
601
+ # bindings"; the split keys belong to §9 (#2288), which the milestone's
602
+ # work order puts AFTER this issue, and §9 note 2 says `Ctrl-W s` is a
603
+ # reserved placeholder that does nothing in ms-65. Asserting those rows
604
+ # here would gate #2287's acceptance run on a later issue's surface — and,
605
+ # for `Ctrl-W s`, on a binding the contract says must NOT work yet. If the
606
+ # Split section is meant to be gated by acceptance, it wants an id in
607
+ # #2288's slice (the overlay is #2287's to build; the rows it lists for
608
+ # split are #2288's to justify). Flagged as a `TODO(test-author)` in the
609
+ # slice too.
610
+ #
611
+ # 15. §8a's hint is pinned "whenever the active panel owns a tab set", but the
612
+ # Pipeline half is not asserted. Pipeline owns its own set (§3), so the
613
+ # hint presumably applies there too, but the contract names no
614
+ # Pipeline hint-present mock and finding 7 above (the #2284 author's) is a
615
+ # live blocker: entering the Pipeline panel from this external test crate
616
+ # can wholesale-replace the seeded fixture, because `start_data_load()`'s
617
+ # deterministic short-circuit is gated `#[cfg(test)]` only. Rather than
618
+ # add a fourteenth id with a known race, this slice asserts §8a on the
619
+ # Board only — where both of §8a's own reference mocks live. If finding
620
+ # 7's one-line cfg widening lands, a Pipeline hint id is cheap to add.
621
+ #
622
+ # 16. §8c does not say what the menu's **"Close"** item does. The section
623
+ # spells out the effect of "Close others", "Close all" and "Pin tab" and
624
+ # is silent on the first item. `close_menu_item_closes_the_right_clicked_
625
+ # tab_and_no_other` takes the only reading the label admits, and the one
626
+ # §4 already pins for the `×` route: the RIGHT-CLICKED tab closes, the
627
+ # others survive. The fixture deliberately right-clicks a tab that is NOT
628
+ # the active one (#102 while #103 is active) so the two readings are
629
+ # distinguishable — if "Close" was meant to close the *active* tab, that
630
+ # needs a contract amendment, not a silent implementation choice.
631
+ # Flagged as a `TODO(test-author)` in the slice.
632
+ #
633
+ # 17. §8c's "hidden **or** inert" is permissive, so neither the presence nor
634
+ # the absence of "Pin tab" on an already-pinned tab is assertable on its
635
+ # own. `pin_tab_is_hidden_or_inert_on_an_already_pinned_tab` asserts the
636
+ # outcome BOTH readings share instead — the tab set is unchanged (count,
637
+ # order, and still no `∘ ` marker anywhere) — taking the item's branch
638
+ # when it renders and dismissing the menu when it does not. It is not
639
+ # vacuous: it first requires the menu to open on a pinned tab at all
640
+ # (§8c gates only the one item, not the menu), which is why it was RED at
641
+ # authoring time.
642
+ #
643
+ # 18. §8b's overlay is driven with ZERO tabs open, though
644
+ # `mocks/board-tabs-help-overlay.screen` depicts it over a 3-tab board.
645
+ # §8b's testable clause carries no tab precondition ("`driver.press('?')`
646
+ # while the Board panel is active"), and #2287's own rationale — the
647
+ # gestures are "undiscoverable by anyone who did not read the issue" — is
648
+ # at its strongest before the operator has opened anything. If the tab
649
+ # section of the overlay is meant to be conditional on an open tab set,
650
+ # that is a contract amendment; as written, four ids here would be red
651
+ # against such an implementation.
652
+ #
653
+ # Also worth knowing, not a contract problem: (a) the shipped Board status bar
654
+ # is a full row of segments — `coord-tui Board [Sidebar] ↻ 0s QUEUE: empty
655
+ # FLEET: OK (coord health n=notify m=merge R=retry P=purge q=quit` — and
656
+ # is already truncated at 120 columns, whereas §8a's own reference mock renders
657
+ # only ` click=preview dbl-click=pin ctrl-w=close ctrl-tab=next q=quit`.
658
+ # The control asserts the four Board hint segments (`n=notify`, `R=retry`,
659
+ # `P=purge`, `q=quit`) survive in the ZERO-tab state only, which is the only
660
+ # state §8a calls "unchanged"; it deliberately pins nothing about what the row
661
+ # looks like once the tab hints are in it, since the mock implies the left-hand
662
+ # segments give way. (b) `"Close"` is a prefix of both `"Close others"` and
663
+ # `"Close all"`, so a bare `screen_contains("Close")` would pass on a menu
664
+ # missing the item entirely; the slice's `menu_item_row()` rejects a match
665
+ # whose label is immediately followed by another item's continuation. It does
666
+ # NOT require the row to end after the label — §8c pins no accelerator column
667
+ # for this menu, but ms-38's menus do render one (`Refresh … r`), so an item
668
+ # carrying an accelerator must still count. (c) §8c pins no gesture for
669
+ # activating an open menu item; a left click on the item's own label is the
670
+ # only activation path any context menu in this app already documents, so that
671
+ # is what the slice sends.