code-coordinator 0.5.74__tar.gz → 0.5.76__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.
- code_coordinator-0.5.76/CLAUDE.md +253 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/PKG-INFO +1 -1
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/code_coordinator.egg-info/scm_file_list.json +2 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/merge.py +39 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/release.py +89 -1
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/interactive.py +72 -1
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/merge_queue.py +77 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/release_propagate.py +4 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/AGENT_OPERATIONS.md +48 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/ARCHITECTURE.md +156 -0
- code_coordinator-0.5.76/docs/COST_DISCIPLINE.md +67 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_merge.py +163 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_release_propagate.py +168 -1
- code_coordinator-0.5.76/tests/test_gather_fleet_tmux_sessions.py +134 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_merge_queue.py +65 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_thin_client_board_audit.py +7 -0
- code_coordinator-0.5.74/CLAUDE.md +0 -220
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/.gitignore +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/GOAL.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/LICENSE +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/MANIFEST.in +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/README.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/__init__.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/agent.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/audit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/board_service.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/brain.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/claim.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/cli.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/client.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/comments.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/config.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dao.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/db.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/deps.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/drive.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/events.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/filelock.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/freshness.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/gates.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/goal.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/context.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/models.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/render.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/health/units.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/hooks.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/models.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/network.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/notify.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/openapi.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/parentage.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/plans.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/progress.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/release_window.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/reports.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/review.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/smoke.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/split_work.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/state.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/test_author.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/test_report.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/usage.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/install-agent.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/pyproject.toml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/setup.cfg +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/__init__.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/conftest.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_config.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_db.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_events.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_init.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_models.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_network.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_review.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_session.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_split.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_state.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.74 → code_coordinator-0.5.76}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# claude-coordinator
|
|
2
|
+
|
|
3
|
+
CLI tool + per-machine agent server that coordinates Claude Code workers across multiple machines and repos over Tailscale.
|
|
4
|
+
|
|
5
|
+
> **Scope of this file (#2195).** This is the **worker- and reviewer-facing** rulebook: it is
|
|
6
|
+
> loaded into every worker leg, every review leg, and every coordinator session, so it holds
|
|
7
|
+
> only what someone *editing this repo* must act on. Operator runbooks live in
|
|
8
|
+
> [`docs/`](docs/) — see [Operational guides](#operational-guides--operator-facing) at the
|
|
9
|
+
> bottom. Settled design rationale lives in
|
|
10
|
+
> [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#design-decisions--the-settled-rationale).
|
|
11
|
+
> Keep it that way: if a new rule does not change what a worker does, it belongs in `docs/`.
|
|
12
|
+
|
|
13
|
+
## Current Goal — read first
|
|
14
|
+
|
|
15
|
+
**[`GOAL.md`](GOAL.md) holds the current north-star objective** — the living, cross-repo / cross-machine goal that should bias all planning, triage, and dispatch. It is meta-level (above any single issue, repo, or session) and changes as priorities evolve: read it first, plan against it, and keep it current. `coordinator.yml` is the source of truth for *topology*; `GOAL.md` is the source of truth for *intent*.
|
|
16
|
+
|
|
17
|
+
## Codebase navigation — query the graph first
|
|
18
|
+
|
|
19
|
+
This repo ships a **graphify** knowledge graph in `graphify-out/` (`graph.json`,
|
|
20
|
+
`GRAPH_REPORT.md`), kept current on a best-effort basis by `post-commit` /
|
|
21
|
+
`post-checkout` git hooks. For any architecture / "where is this handled" / "what
|
|
22
|
+
calls this" / file-relationship question, **query the graph first** (the `graphify`
|
|
23
|
+
skill, or the graphify CLI) before reaching for grep/Read. Grep/Read are for
|
|
24
|
+
exact-string or line-level confirmation — not the first move.
|
|
25
|
+
|
|
26
|
+
**In a worktree the graph is the base checkout's, not yours.** `graphify-out/` is
|
|
27
|
+
gitignored (only its `.gitignore` is tracked), so `git worktree add` yields an empty
|
|
28
|
+
one — and `graphify query` resolves `graphify-out/graph.json` strictly relative to
|
|
29
|
+
cwd, with no upward walk and no `--graph` override. `.githooks/post-checkout`
|
|
30
|
+
therefore symlinks the *contents* of a worktree's `graphify-out/` (`graph.json`,
|
|
31
|
+
`manifest.json`, `cache/`, ...) at the base checkout's graph — the directory
|
|
32
|
+
itself, and its tracked `.gitignore`, are left alone so the worktree stays
|
|
33
|
+
`git status`-clean.
|
|
34
|
+
Consequences worth knowing while working in one: the graph reflects the **base
|
|
35
|
+
checkout's HEAD, not your edits** — trust it for *"where is X handled"*, never for
|
|
36
|
+
*"did my change land"* — and rebuilds are deliberately disabled inside worktrees
|
|
37
|
+
(a rebuild there would overwrite the shared graph from a feature branch). The
|
|
38
|
+
bootstrap only runs where `core.hooksPath` is set: `git config core.hooksPath
|
|
39
|
+
.githooks`, once per machine.
|
|
40
|
+
|
|
41
|
+
**The graph drifts, and the hooks cannot prevent it.** They `exit 0` during
|
|
42
|
+
rebase/merge/cherry-pick (so the merge agent's proactive rebase never rebuilds),
|
|
43
|
+
nothing fires at all for `git reset --hard`, every failure path is a silent
|
|
44
|
+
`exit 0` behind a detached 600s-timeout background process, concurrent triggers
|
|
45
|
+
coalesce, and their `[ ! -f graphify-out/graph.json ]` guard is a permanent
|
|
46
|
+
off-switch once the graph is purged. Treat the hooks as an optimization and check
|
|
47
|
+
freshness instead — `GRAPH_REPORT.md` records its source commit, and
|
|
48
|
+
**`coord diagnose --graph`** compares that to HEAD for every local checkout (and
|
|
49
|
+
flags an unset `core.hooksPath`). If it reports STALE, `graphify update .` in that
|
|
50
|
+
checkout.
|
|
51
|
+
|
|
52
|
+
Setting this up on a new machine: [`docs/GRAPHIFY_SETUP.md`](docs/GRAPHIFY_SETUP.md).
|
|
53
|
+
|
|
54
|
+
## Architecture
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
coordinator.yml — Single config file: repos, machines, dependencies
|
|
58
|
+
coord CLI — User-facing commands (plan, approve, assign, status, etc.)
|
|
59
|
+
coord agent (per-machine) — HTTP server (port 7433) that runs claude -p
|
|
60
|
+
coord serve — Board daemon (port 7435): canonical board state for thin clients
|
|
61
|
+
coord web — Lightweight dashboard (port 7434)
|
|
62
|
+
claude -p — The actual worker (runs locally on each machine)
|
|
63
|
+
GitHub issues — Work source + message bus (via issue comments)
|
|
64
|
+
Tailscale — Networking between machines
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Full walkthrough — the agent HTTP API, where each subcommand actually runs, the auto-loop end
|
|
68
|
+
to end: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
|
|
69
|
+
|
|
70
|
+
## Project Structure
|
|
71
|
+
|
|
72
|
+
Query the **graphify graph** (`graphify-out/`) for the full module map + relationships — it's authoritative and auto-updated. Key entry points: `coord/cli.py` (Click CLI + all subcommands), `coord/agent.py` (`AgentServer`: `claude -p` subprocess mgmt) + `coord/agent_app.py` / `coord/serve_app.py` (agent + board-daemon HTTP apps), `coord/brain.py` (planning), `coord/dispatch.py` (routing: POST to agents, briefings), `coord/review.py` (adversarial review), `coord/merge_queue.py` (merge sequencing) + `coord/reconcile.py` (board↔agent), `coord/state.py` (board persistence in `~/.coord/`), `coord/models.py` (dataclasses), `coord/config.py` (`coordinator.yml` parsing), `coord/dashboard/` (web dashboard + `webapp/` phone PWA). Tests: `tests/test_<module>.py` (pytest; fixtures in `conftest.py`).
|
|
73
|
+
|
|
74
|
+
## Commands
|
|
75
|
+
|
|
76
|
+
`coord <cmd> --help` documents every command + flags. The core loop:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
coord plan # Brain proposes assignments for idle machines
|
|
80
|
+
coord approve 1,3 # Dispatch approved proposals (comma-separated IDs)
|
|
81
|
+
coord assign <machine> <repo> <issue> [--briefing TEXT | --briefing-file F] [--dry-run] # Direct dispatch
|
|
82
|
+
coord status [--freshness] # Machines, assignments, connectivity (+ repo freshness vs GitHub HEADs)
|
|
83
|
+
coord log <id> [-f] [--machine NAME] # claude -p output (remote logs need --machine)
|
|
84
|
+
coord notify # Poll agents, post completion/failure comments to GitHub
|
|
85
|
+
coord test --passed|--fail|--skipped <id> # Record the Test-gate verdict (bare `coord test <id>` builds+tests locally)
|
|
86
|
+
coord merge [--dry-run] [--repo NAME] [--method rebase|squash|merge] [--order IDs] [--force-merge]
|
|
87
|
+
coord reconcile-merges # Backfill missing branches + record out-of-band merges (#609/#611)
|
|
88
|
+
coord retry|stop|resume <id> # Recovery; `coord done` ends the session
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Setup / diagnostics (discoverable via `--help`): `coord init`, `coord config`, `coord agent`, `coord serve`, `coord web`, `coord diagnose`, `coord sessions [--remote]`, `coord split`, `coord notifier`, `coord repo add` / `coord repo doctor`.
|
|
92
|
+
|
|
93
|
+
## Development
|
|
94
|
+
|
|
95
|
+
Always work in a virtualenv. Agent workers are spawned with the agent's own
|
|
96
|
+
venv stripped from `PATH` (#402), so a bare `pip install` resolves to system
|
|
97
|
+
Python (PEP 668) — and must **never** target the agent's runtime venv. Create
|
|
98
|
+
your own venv in the checkout (`.venv/` is gitignored):
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
python3 -m venv .venv && . .venv/bin/activate
|
|
102
|
+
pip install -e ".[dev]"
|
|
103
|
+
pytest
|
|
104
|
+
coord plan --dry-run
|
|
105
|
+
coord approve --dry-run 1,2
|
|
106
|
+
coord assign --dry-run precision claude-coordinator 42
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Workers: scope your test run to your diff, never `pytest` bare (#2169).**
|
|
110
|
+
The full suite exceeds Claude Code's 600s Bash ceiling on this repo and
|
|
111
|
+
duplicates the Test stage + CI, which both run it against your pushed SHA
|
|
112
|
+
regardless. Run just the file(s) that mirror what you changed — `pytest
|
|
113
|
+
tests/test_<module>.py` for a `coord/<module>.py` change, `cargo test` from
|
|
114
|
+
`tui/` scoped with a test-name filter for a `tui/**` change. To see what
|
|
115
|
+
the Test stage itself would run for your diff (and confirm you're not
|
|
116
|
+
missing a suite), `scripts/coord-test-runner.sh <worktree> --print-routing`
|
|
117
|
+
computes the routing without actually building or testing anything.
|
|
118
|
+
|
|
119
|
+
## Working on `tui/` — the `quadraui` pin
|
|
120
|
+
|
|
121
|
+
**`coord-tui` pins `quadraui` to a git rev in `tui/Cargo.toml`**
|
|
122
|
+
(`quadraui = { git = "https://github.com/JDonaghy/quadraui", rev = "<sha>" }`, #1973). This
|
|
123
|
+
replaced the old relative-path dependency (`../../quadraui/quadraui`), which built against
|
|
124
|
+
whatever branch happened to be checked out in `~/src/quadraui` — a quadraui merge could break
|
|
125
|
+
coord-tui's build/merge with **zero coord-tui commits and no warning** (it already happened
|
|
126
|
+
once). `cargo build`/`cargo test` from `tui/` now fetch quadraui straight from GitHub at the
|
|
127
|
+
pinned rev and never touch `~/src/quadraui`, so the local checkout's branch is irrelevant.
|
|
128
|
+
|
|
129
|
+
- **Bumping the pin** (deliberate, reviewable, its own coord-tui commit): pick the target
|
|
130
|
+
quadraui rev — normally the tip of `origin/develop` (quadraui's default/integration branch,
|
|
131
|
+
per quadraui's CLAUDE.md) — edit the `rev = "..."` in `tui/Cargo.toml`, then run
|
|
132
|
+
`cargo build && cargo test` from `tui/` and confirm EXIT=0 before committing.
|
|
133
|
+
`cargo update -p quadraui` alone will **not** move a `rev`-pinned git dependency; the
|
|
134
|
+
`Cargo.toml` edit is the actual bump.
|
|
135
|
+
- **Co-developing against an unmerged quadraui branch/PR:** if a `tui/` task consumes a
|
|
136
|
+
not-yet-merged quadraui feature, the briefing **must** name the quadraui PR/branch. The
|
|
137
|
+
worker builds against a local `~/src/quadraui` checkout **without editing
|
|
138
|
+
`tui/Cargo.toml`**, via cargo's local-paths override:
|
|
139
|
+
`cp tui/cargo-config-local-quadraui.toml.example tui/.cargo/config.toml` (git-ignored — see
|
|
140
|
+
the example file's header) after checking out the target branch in `~/src/quadraui`. Delete
|
|
141
|
+
`tui/.cargo/config.toml` (or don't create it) to build against the pinned rev again — this
|
|
142
|
+
is the default and what CI/other workers use. **Verify build EXIT=0 from `tui/` both with
|
|
143
|
+
the override active (proves the feature works) and, before finishing, confirm the committed
|
|
144
|
+
`tui/Cargo.toml` still points at the pinned rev** (the override file itself is never
|
|
145
|
+
committed).
|
|
146
|
+
|
|
147
|
+
## Key Design Decisions
|
|
148
|
+
|
|
149
|
+
One line each — the reasoning behind them is in
|
|
150
|
+
[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#design-decisions--the-settled-rationale).
|
|
151
|
+
|
|
152
|
+
- **No API key needed.** Everything uses `claude -p`, which runs on a Max/Pro subscription via OAuth.
|
|
153
|
+
- **Agent servers are dumb dispatchers.** They spawn `claude -p` and track the subprocess; all intelligence is in the coordinator brain.
|
|
154
|
+
- **GitHub issue comments are the message bus.** Briefings, completion notices and failure reports are comments, carrying `<!-- coord:... -->` markers for machine parsing.
|
|
155
|
+
- **`coordinator.yml` is the single source of truth** for repo topology, machine capabilities, dependencies, concurrency limits, review settings, smoke-test rules, and the pipeline gate order (`pipeline.default_gates`). It lives in `~/.coord/`, **not** the repo checkout.
|
|
156
|
+
- **User approves everything.** `coord plan` proposes, the user reviews, `coord approve` dispatches. No autonomous dispatch.
|
|
157
|
+
- **Claim detection prevents duplicate work.** Before dispatching, the coordinator checks the board for active assignments and the remote for `issue-{N}-*` branches.
|
|
158
|
+
- **Conflict rules are inferred, not configured.** The brain reads issue bodies and infers which files will be touched.
|
|
159
|
+
- **Adversarial reviews are rule-enforcing, not rubber-stamping.** On worker completion a fresh `claude -p` session on a *different* machine reviews the PR diff against this file and the review checklist, with zero shared context with the worker — that's the whole point.
|
|
160
|
+
- **The pipeline order is `Work → Test → Review → Merge`.** Test precedes Review; the headless auto-loop holds review dispatch until there is a `passed`/`skipped` test verdict.
|
|
161
|
+
- **Merge is gated on CI checks (#240).** `coord merge` refuses when a check failed or is still running — and a PR with *zero* reported checks is not automatically clear either (#1904).
|
|
162
|
+
- **Mechanical merge conflicts auto-rebase (#241).** A `type="conflict-fix"` worker rebases and resolves additive merges; semantic conflicts are left for a human.
|
|
163
|
+
- **Smoke tests validate on capable hardware.** `smoke_tests.capability_rules` map changed files to required machine capabilities (e.g. GTK changes → a machine with GTK).
|
|
164
|
+
- **Progress streaming from workers.** Workers emit `STATUS:` and `STUCK:` lines; the coordinator parses these for real-time progress in `coord status` and the dashboard.
|
|
165
|
+
- **The notifier tells you when NOBODY IS COMING — and nothing else (#1632).** Advisory, isolated, off by default; it is not an error channel and not a progress feed.
|
|
166
|
+
|
|
167
|
+
## Review Prompt Assembly
|
|
168
|
+
|
|
169
|
+
The reviewer gets a prompt built from:
|
|
170
|
+
1. **Repo's CLAUDE.md** — the project rules (source of truth, not duplicated)
|
|
171
|
+
2. **Generic checklist** — "did you add tests?", "did you stay in file scope?", "any security issues?"
|
|
172
|
+
3. **Repo overrides** — project-specific patterns from `coordinator.yml` `reviews.repo_overrides`
|
|
173
|
+
4. **The diff** — `gh pr diff` of the worker's branch vs base
|
|
174
|
+
5. **The issue** — title and body for intent verification
|
|
175
|
+
|
|
176
|
+
The reviewer reads the rules and enforces them against the diff. It does not have the worker's session context — genuinely independent.
|
|
177
|
+
|
|
178
|
+
## Rules for workers
|
|
179
|
+
|
|
180
|
+
- **Only the coordinator writes docs.** Workers must **not** update README, CHANGELOG, or shared documentation files — parallel doc edits cause merge conflicts. If a briefing lists docs in `files_forbidden`, respect it. An issue whose *entire* deliverable is a doc edit is coordinator work and should never have been dispatched; say so and stop rather than editing the doc.
|
|
181
|
+
- **Never edit `tests/acceptance/**`.** Those suites are sealed and delivered read-only / run-only. Write your own unit and internal tests instead.
|
|
182
|
+
- **Stay in file scope.** If you must touch a file outside your briefing, note it in your final message.
|
|
183
|
+
- **Commit and push before your final message** — even if the build is broken or you ran out of time. Uncommitted work is destroyed when the session ends.
|
|
184
|
+
- **`gh` is on the deny-list.** The coordinator owns all GitHub interaction; use plain `git`.
|
|
185
|
+
|
|
186
|
+
The operator-side counterparts to these rules (dispatch economics, what to send to a worker
|
|
187
|
+
versus keep in the coordinator session) are in
|
|
188
|
+
[`docs/COST_DISCIPLINE.md`](docs/COST_DISCIPLINE.md).
|
|
189
|
+
|
|
190
|
+
## Testing — black-box coverage is the acceptance bar
|
|
191
|
+
|
|
192
|
+
**Every PR that changes user-visible behavior must ship a black-box test** that drives the *running app* and asserts on its rendered output — not just unit tests on internal functions. The adversarial reviewer reads this file and **rejects behavior-changing PRs that lack one** (pure refactors / internal-only changes are exempt — say so in the PR if that applies). Build the **harness once per repo**; add **tests incrementally, one (or a few) per behavior-changing issue** — do *not* big-bang a full suite. Coverage then grows with churn and ratchets up (PRs add coverage, never remove it). Keep a thin **core smoke set** over the few most-trafficked screens so critical flows stay guarded even by unrelated changes.
|
|
193
|
+
|
|
194
|
+
> **The acceptance suite is becoming an independent, sealed *oracle* (2026-07-04, [`docs/ORACLE_LOOP.md`](docs/ORACLE_LOOP.md)).** In an oracle-loop milestone the worker **no longer authors** the acceptance tests — an independent `test-author` agent writes them from a mock-first Gate-A contract, and they are delivered to the worker **read-only / run-only** (`coord acceptance run --issue N`). The worker iterates against them **in its own warm session** until green (the tight loop), then the coordinator re-runs the sealed suite **externally** against the pushed SHA as the trust gate. The runner sits above **pluggable framework drivers**, declared per repo in `acceptance.drivers` and routed to a capability-matched machine. **Implemented today: `tui-tuidriver`** (quadraui `TuiDriver`, the coord-tui case below), **`cli-pytest`**, and **`web-playwright`** (#1539) — see `SUPPORTED_KINDS` in `coord/acceptance_drivers.py`, which is the source of truth. **Native is NOT implemented**: a kind may be *declared* in `coordinator.yml` ahead of its adapter, but `run_driver()` rejects it with a "not yet implemented" `DriverError` rather than silently no-opping. What still gates the webapp is **not** the driver but its inputs — the deterministic fixture server (#1538) and a machine whose `browser` capability actually probes as met (#1678); both milestone #51 / epic #1537 ([`docs/WEB_CONTROL_CENTER.md`](docs/WEB_CONTROL_CENTER.md)). Workers still write their **own unit/internal tests**; they must **never** edit `tests/acceptance/**`.
|
|
195
|
+
|
|
196
|
+
**How it runs:** black-box tests are part of the repo's normal test command, so the **Test stage** executes them on a capability-matched machine — `smoke_tests.capability_rules` route platform-specific suites to capable hardware (a GTK box; a machine with a browser). Favor the automated pre-review gate; the point is to trust the suite so manual/interactive smoke (incl. driving from a phone) is rarely needed.
|
|
197
|
+
|
|
198
|
+
### coord-tui — quadraui `TuiDriver` (harness shipped: #690 / #691)
|
|
199
|
+
- Drives the whole app through the real `event → handle → render` path against ratatui's headless `TestBackend` and asserts on the screen grid. `cargo test`-native, deterministic, no TTY.
|
|
200
|
+
- `CoordApp` implements quadraui's `ShellApp`, so use `quadraui::tui::testing::driver_with_shell(app, CoordApp::shell_config(), w, h)`. API: `find("text")` → coords, `click(x, y)`, `press`, `type_char`, `screen()`, `screen_contains(needle)`. **Locate targets with `find` — never hardcode coordinates.**
|
|
201
|
+
- **Reuse the existing fixtures** — `make_test_app(data: BoardData) -> CoordApp` (and `make_app_with_assignments`, `make_app_with_one_completed_issue`, …) in `tui/src/app.rs` build a full app from in-memory `BoardData`, no live daemon. Put the tests **in-crate** (`#[cfg(test)]`), **not** in `tui/tests/` — the fixtures are `#[cfg(test)]`/private and an integration-test crate can't see them.
|
|
202
|
+
- Limit: `TuiDriver` renders to `TestBackend`, so it does **not** parse real ANSI — terminal-protocol bugs (raw-mode, SGR mouse, the embedded `claude` PTY pane) are out of reach and still need a live smoke. A native pty + vt100 tier is tracked in quadraui#302 (unbuilt).
|
|
203
|
+
|
|
204
|
+
### coord web (Phone Control Center) — shipped v1 (#700–#703); browser E2E forthcoming
|
|
205
|
+
- The phone web app lives in `coord/dashboard/webapp/` (React / Vite / TS PWA, served by `coord/dashboard/server.py`). **v1 milestone (#700–#703) is shipped.** See [`docs/PHONE_WEBAPP.md`](docs/PHONE_WEBAPP.md) for the full runbook (build → serve → phone access over Tailscale).
|
|
206
|
+
- **Build the React bundle before first use** — `dist/` is gitignored. From `coord/dashboard/webapp/`: `npm install && npm run build`. Re-run after pulling changes to `src/`. The server falls back to the legacy `index.html` when `dist/` is absent so existing behaviour is unchanged without a build.
|
|
207
|
+
- **Run on the always-on host:** `coord web` binds `0.0.0.0:7434`. Reach it from a phone via the Tailscale MagicDNS name: `http://dellserver:7434` (replace with your host's name). Install as a PWA via "Add to Home Screen" in Safari / Chrome.
|
|
208
|
+
- **Vitest unit tests** ship in `coord/dashboard/webapp/src/components/__tests__/` — run with `npm test` inside `coord/dashboard/webapp/`.
|
|
209
|
+
- **Playwright E2E tests** are the acceptance bar: start the dashboard server against a seeded board (the web parallel of `make_test_app(BoardData)`), drive a real headless browser, assert on the rendered DOM. Browsers headless-test more cleanly than terminals, so the webapp should lean almost entirely on this automated gate rather than interactive smoke.
|
|
210
|
+
- **Shipped:** `playwright.config.ts` + specs in `coord/dashboard/webapp/e2e/` (`npm run test:e2e`), and `smoke_tests.capability_rules` already routes `coord/dashboard/webapp/**` → the `browser` capability, so the **Test stage** lands on a browser-capable machine.
|
|
211
|
+
- **Shipped:** the `web-playwright` acceptance driver (#1539) — it is in `SUPPORTED_KINDS`, so `coord acceptance run/record` can drive the webapp.
|
|
212
|
+
- **Not shipped:** the seeded-board fixture server (#1538) — today's specs run against whatever the live fleet is doing, so they are a smoke net, **not** a deterministic oracle. Milestone #51 / epic #1537.
|
|
213
|
+
- **`browser` is advertised by one machine (elitebook)** until #1541 adds it to dellserver — so all web testing currently funnels through the dev box. **And as of 2026-08-01 that machine's `browser` probe reads UNMET (#1678)**, so `dispatch_smoke` refuses to route any `coord/dashboard/webapp/**` change and the Test stage silently retries forever — check `coord doctor` before assuming a webapp change can be tested at all.
|
|
214
|
+
|
|
215
|
+
## Conventions
|
|
216
|
+
|
|
217
|
+
- Python 3.12+, type hints everywhere
|
|
218
|
+
- Click for CLI
|
|
219
|
+
- httpx for HTTP client, Starlette + uvicorn for HTTP server
|
|
220
|
+
- PyYAML for config
|
|
221
|
+
- No Anthropic SDK — all Claude interaction is via `claude -p` subprocess
|
|
222
|
+
- Tests use pytest with fixtures in conftest.py
|
|
223
|
+
- State files go in `~/.coord/` — including `coordinator.yml` (canonical: `~/.coord/coordinator.yml`; override with `$COORD_CONFIG` or `--config`; `./coordinator.yml` is a dev fallback)
|
|
224
|
+
- Agent server port: 7433, dashboard port: 7434, board daemon port: 7435
|
|
225
|
+
- GitHub issue comments carry `<!-- coord:event=... assignment=... -->` markers for machine parsing
|
|
226
|
+
|
|
227
|
+
## Operational guides — operator-facing
|
|
228
|
+
|
|
229
|
+
**Not needed to work on this repo.** These are runbooks for driving the fleet; a worker or
|
|
230
|
+
reviewer can stop reading here.
|
|
231
|
+
|
|
232
|
+
**Read before operating the fleet:**
|
|
233
|
+
|
|
234
|
+
- [`docs/OPERATING_GOTCHAS.md`](docs/OPERATING_GOTCHAS.md) — **READ BEFORE OPERATING.** Traps that each cost a real dispatch, real money, or real lost work, and are invisible from the code. The headline: **a merged fix is not a live fix.**
|
|
235
|
+
- [`docs/AGENT_OPERATIONS.md`](docs/AGENT_OPERATIONS.md) — releases, propagation, the deploy lanes, agent installs, and the **`~/.coord-venv` must-be-PyPI invariant**. **Read end-to-end before touching any agent install** — don't re-derive it.
|
|
236
|
+
- [`docs/DRIVE_QUEUE.md`](docs/DRIVE_QUEUE.md) — the durable, board-backed driver (`coord drive-queue`, #1750). **Read the top section before queuing more than ~2 issues on one repo.**
|
|
237
|
+
|
|
238
|
+
**Reference:**
|
|
239
|
+
|
|
240
|
+
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — how it all fits together, plus the settled design rationale. Two diagnostic entry points: [why a merge/review isn't happening](docs/ARCHITECTURE.md#when-a-merge-isnt-happening) (**check here first when "Go does nothing"**) and [why an issue is in the Pipeline you never dispatched](docs/ARCHITECTURE.md#when-an-issue-is-sitting-in-the-pipeline-you-never-dispatched).
|
|
241
|
+
- [`docs/COST_DISCIPLINE.md`](docs/COST_DISCIPLINE.md) — dispatch economics; what to send to a worker versus keep in the coordinator session.
|
|
242
|
+
- [`docs/NOTIFIER.md`](docs/NOTIFIER.md) — the "nobody is coming" push channel (`coord notifier`).
|
|
243
|
+
- [`docs/ORACLE_LOOP.md`](docs/ORACLE_LOOP.md) — sealed acceptance suites, Gate-A contracts, the test-author agent.
|
|
244
|
+
- [`docs/PHONE_WEBAPP.md`](docs/PHONE_WEBAPP.md) — Phone Control Center v1 runbook and the `/api/pipeline` surface.
|
|
245
|
+
- [`docs/GRAPHIFY_SETUP.md`](docs/GRAPHIFY_SETUP.md) — installing the knowledge graph on a new machine (four layers, all of which fail *silently*).
|
|
246
|
+
- [`docs/EPHEMERAL_WORKERS.md`](docs/EPHEMERAL_WORKERS.md) — on-demand Azure worker VMs per epic. **The tailnet ACL is the security boundary** — `agent_app.py` has no authentication.
|
|
247
|
+
- [`docs/MAC_MINI.md`](docs/MAC_MINI.md) — adding a Mac mini; sizing, provisioning, and what non-macOS work routes there. The port itself is [`docs/CROSS_PLATFORM.md`](docs/CROSS_PLATFORM.md) (milestone #39).
|
|
248
|
+
- [`docs/FORGE_MIGRATION.md`](docs/FORGE_MIGRATION.md) — surviving a forge outage (cheap) versus leaving a forge (expensive); milestone #58 / epic #1902.
|
|
249
|
+
|
|
250
|
+
**Two deploy facts that bite most often:**
|
|
251
|
+
|
|
252
|
+
- **`coord-tui` ships as a locally-built binary, not via PyPI.** After a `tui/` PR merges, rebuild and reinstall locally: `cd tui && cargo build && cp target/debug/coord-tui ~/.local/bin/coord-tui`. Workers should not bump versions for tui-only changes.
|
|
253
|
+
- **Turn off Claude Code's Agent View when driving the fleet** — set `"disableAgentView": true` in `~/.claude/settings.json` (the Claude-Code *client* config, not `~/.coord/`; restart to apply), or its cross-session roster pops up mid-type when another session changes stage. Full note in [`docs/AGENT_OPERATIONS.md`](docs/AGENT_OPERATIONS.md#operator-claude-code-settings-driving-the-fleet).
|
|
@@ -359,6 +359,7 @@ docs/ARCHITECTURE.md
|
|
|
359
359
|
docs/ARCH_SECURITY_GATES.md
|
|
360
360
|
docs/COCKPIT.md
|
|
361
361
|
docs/CONTROL_CENTER.md
|
|
362
|
+
docs/COST_DISCIPLINE.md
|
|
362
363
|
docs/CROSS_PLATFORM.md
|
|
363
364
|
docs/CUSTOMER_PORTAL.md
|
|
364
365
|
docs/DRIVE_QUEUE.md
|
|
@@ -571,6 +572,7 @@ tests/test_gate_a.py
|
|
|
571
572
|
tests/test_gate_b.py
|
|
572
573
|
tests/test_gate_snapshot_staleness.py
|
|
573
574
|
tests/test_gates.py
|
|
575
|
+
tests/test_gather_fleet_tmux_sessions.py
|
|
574
576
|
tests/test_generated_types_fixture.py
|
|
575
577
|
tests/test_github_ops.py
|
|
576
578
|
tests/test_goal.py
|
{code_coordinator-0.5.74 → code_coordinator-0.5.76}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -337,6 +337,7 @@
|
|
|
337
337
|
"docs/ARCH_SECURITY_GATES.md",
|
|
338
338
|
"docs/COCKPIT.md",
|
|
339
339
|
"docs/CONTROL_CENTER.md",
|
|
340
|
+
"docs/COST_DISCIPLINE.md",
|
|
340
341
|
"docs/CROSS_PLATFORM.md",
|
|
341
342
|
"docs/CUSTOMER_PORTAL.md",
|
|
342
343
|
"docs/DRIVE_QUEUE.md",
|
|
@@ -601,6 +602,7 @@
|
|
|
601
602
|
"tests/test_gate_b.py",
|
|
602
603
|
"tests/test_gate_snapshot_staleness.py",
|
|
603
604
|
"tests/test_gates.py",
|
|
605
|
+
"tests/test_gather_fleet_tmux_sessions.py",
|
|
604
606
|
"tests/test_generated_types_fixture.py",
|
|
605
607
|
"tests/test_github_ops.py",
|
|
606
608
|
"tests/test_goal.py",
|
|
@@ -218,6 +218,37 @@ def _apply_ci_revalidation(
|
|
|
218
218
|
return deferred
|
|
219
219
|
|
|
220
220
|
|
|
221
|
+
def _reload_board_after_wait(board, *, dry_run: bool):
|
|
222
|
+
"""#2143: force a fresh board read after ``_apply_ci_revalidation``'s
|
|
223
|
+
``wait_for_ci_settle`` poll — which, like ``_apply_revalidation``'s
|
|
224
|
+
composite/solo suite runs, can hold the caller for minutes.
|
|
225
|
+
|
|
226
|
+
``_apply_revalidation`` already refreshes the board it hands back, but
|
|
227
|
+
only when *it* recorded a new verdict; it has no way to know a CI-settle
|
|
228
|
+
wait ran afterwards. Real state can change on GitHub during that wait —
|
|
229
|
+
most dangerously a review approval landing, or a concurrent merge driver
|
|
230
|
+
(the drive-queue timer, another operator) merging the exact branch this
|
|
231
|
+
run is about to act on — and `merge_queue.process()` must not evaluate
|
|
232
|
+
review/smoke gates against a *board* snapshot that predates any of it
|
|
233
|
+
(the 2026-08-12 incident: a review approved 89s into the wait was still
|
|
234
|
+
reported as unapproved because the pre-wait board was never re-read).
|
|
235
|
+
|
|
236
|
+
Unconditional (not "only when something looks stale"): the risk here is
|
|
237
|
+
a stale *read*, and there's no cheap way to tell "nothing changed" from
|
|
238
|
+
"something changed but we didn't notice" without just re-reading. One
|
|
239
|
+
extra ``load_board()`` is a rounding error next to the suite run(s) or
|
|
240
|
+
the CI-settle poll that just happened. Under ``--dry-run`` nothing was
|
|
241
|
+
triggered (no wait actually ran), so the board is left untouched.
|
|
242
|
+
"""
|
|
243
|
+
if dry_run:
|
|
244
|
+
return board
|
|
245
|
+
from coord.models import Board as _Board # noqa: PLC0415
|
|
246
|
+
from coord.state import load_board as _load_board # noqa: PLC0415
|
|
247
|
+
|
|
248
|
+
refreshed = _load_board()
|
|
249
|
+
return refreshed if refreshed is not None else _Board(active=[], completed=[])
|
|
250
|
+
|
|
251
|
+
|
|
221
252
|
def _dispatch_conflict_fixes(events, config, *, dry_run: bool) -> None:
|
|
222
253
|
"""#241: classify any conflict events and dispatch a conflict-fix worker
|
|
223
254
|
for the eligible ones. Mutates each conflict event's ``ev.entry.state``
|
|
@@ -1564,6 +1595,10 @@ def merge(
|
|
|
1564
1595
|
only_items, board_only, cfg_only, ci_store_only, gh_ops,
|
|
1565
1596
|
dry_run=dry_run,
|
|
1566
1597
|
)
|
|
1598
|
+
# #2143: the CI-settle wait just above can run for minutes —
|
|
1599
|
+
# re-read the board so the gates `process()` runs below see
|
|
1600
|
+
# whatever landed on GitHub during it, not the pre-wait snapshot.
|
|
1601
|
+
board_only = _reload_board_after_wait(board_only, dry_run=dry_run)
|
|
1567
1602
|
# #1925: an entry deferred by the CI-settle wait above must not go
|
|
1568
1603
|
# through process() this pass — that would immediately re-derive the
|
|
1569
1604
|
# exact self-triggered "unknown" reading the wait was just trying to
|
|
@@ -1870,6 +1905,10 @@ def merge(
|
|
|
1870
1905
|
deferred_ci = _apply_ci_revalidation(
|
|
1871
1906
|
pending, board, cfg, ci_store, gh_ops, dry_run=dry_run,
|
|
1872
1907
|
)
|
|
1908
|
+
# #2143: the CI-settle wait just above can run for minutes —
|
|
1909
|
+
# re-read the board so the gates `process()` runs below see
|
|
1910
|
+
# whatever landed on GitHub during it, not the pre-wait snapshot.
|
|
1911
|
+
board = _reload_board_after_wait(board, dry_run=dry_run)
|
|
1873
1912
|
# #1925: entries the CI-settle wait above gave up on while still only
|
|
1874
1913
|
# seeing the registration-gap symptom must not go through process() this
|
|
1875
1914
|
# pass — see `_apply_ci_revalidation`'s docstring. They keep their
|
|
@@ -311,6 +311,66 @@ def _fetch_board() -> tuple[dict, str | None]:
|
|
|
311
311
|
return {}, f"{type(exc).__name__}: {exc}"
|
|
312
312
|
|
|
313
313
|
|
|
314
|
+
def _interactive_session_busy(config) -> list:
|
|
315
|
+
"""Live interactive tmux sessions as host-pinned `Busy` signals (#2228).
|
|
316
|
+
|
|
317
|
+
`release_propagate.assess_quiescence`'s ``extra_busy`` seam was built
|
|
318
|
+
for exactly this — its own docstring names "an interactive tmux
|
|
319
|
+
session" as the seam's purpose — but until now nothing ever fed it one.
|
|
320
|
+
An interactive session is invisible to the board *by construction*
|
|
321
|
+
(``coord assign --interactive`` launches into tmux; the tmux session
|
|
322
|
+
never POSTs ``/assign``), so without this a host running one reads as
|
|
323
|
+
idle and rolls out from under a human, restarting `coord-serve` on the
|
|
324
|
+
daemon host mid-session.
|
|
325
|
+
|
|
326
|
+
Reuses the same discovery `coord sessions --remote` renders
|
|
327
|
+
(:func:`coord.interactive.gather_fleet_tmux_sessions`) rather than
|
|
328
|
+
inventing a second way to look.
|
|
329
|
+
|
|
330
|
+
Fails OPEN, not closed: a probe error is logged and DROPPED, never
|
|
331
|
+
turned into a host-less `Busy` — an unattributable signal blocks EVERY
|
|
332
|
+
host by design (`Quiescence.fleet_wide_busy`), and an unreadable
|
|
333
|
+
session list must not silently escalate into that.
|
|
334
|
+
"""
|
|
335
|
+
from coord import release_propagate as rp # noqa: PLC0415
|
|
336
|
+
from coord.interactive import gather_fleet_tmux_sessions # noqa: PLC0415
|
|
337
|
+
|
|
338
|
+
try:
|
|
339
|
+
sessions, errors = gather_fleet_tmux_sessions(config)
|
|
340
|
+
except Exception as exc: # noqa: BLE001 — fail open, see docstring
|
|
341
|
+
click.echo(
|
|
342
|
+
f"warning: could not probe interactive sessions ({exc}) — "
|
|
343
|
+
"quiescence is blind to them this run",
|
|
344
|
+
err=True,
|
|
345
|
+
)
|
|
346
|
+
return []
|
|
347
|
+
|
|
348
|
+
for machine in errors:
|
|
349
|
+
click.echo(
|
|
350
|
+
f"warning: could not probe {machine} for live interactive "
|
|
351
|
+
"sessions — quiescence is blind to that host this run",
|
|
352
|
+
err=True,
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
busy = []
|
|
356
|
+
for s in sessions:
|
|
357
|
+
if s.get("pane_dead") == "1":
|
|
358
|
+
continue # claude exited; tmux is up but nobody is driving it
|
|
359
|
+
machine = s.get("machine")
|
|
360
|
+
if not machine:
|
|
361
|
+
continue # no coordinator.yml host to pin it to (#2228: never invent one)
|
|
362
|
+
busy.append(
|
|
363
|
+
rp.Busy(
|
|
364
|
+
kind="interactive session",
|
|
365
|
+
subject=f"{machine}:{s['session_name']}",
|
|
366
|
+
detail="`coord assign --interactive` never POSTs /assign, "
|
|
367
|
+
"so the board cannot see this",
|
|
368
|
+
host=machine,
|
|
369
|
+
)
|
|
370
|
+
)
|
|
371
|
+
return busy
|
|
372
|
+
|
|
373
|
+
|
|
314
374
|
def _daemon_machine_name(
|
|
315
375
|
config, override: str | None, machine_health: dict | None = None
|
|
316
376
|
) -> str | None:
|
|
@@ -550,6 +610,11 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
550
610
|
extra_busy.append(
|
|
551
611
|
rp.Busy(kind="board unreadable", subject="/board", detail=board_error)
|
|
552
612
|
)
|
|
613
|
+
# #2228: the board can't see an interactive session (no /assign POST) —
|
|
614
|
+
# feed assess_quiescence's extra_busy seam from the same fleet-wide tmux
|
|
615
|
+
# probe `coord sessions --remote` uses, so a live session defers a roll
|
|
616
|
+
# exactly like a live headless assignment does.
|
|
617
|
+
extra_busy.extend(_interactive_session_busy(config))
|
|
553
618
|
quiescence = rp.assess_quiescence(
|
|
554
619
|
queue_entries=board.get("drive_queue") or [],
|
|
555
620
|
assignments=board.get("assignments") or [],
|
|
@@ -1933,8 +1998,10 @@ def _drain(
|
|
|
1933
1998
|
config_path: Path,
|
|
1934
1999
|
deadline: float,
|
|
1935
2000
|
poll_interval: float,
|
|
2001
|
+
config=None,
|
|
1936
2002
|
reconcile=None,
|
|
1937
2003
|
board_fetch=None,
|
|
2004
|
+
extra_busy_fetch=None,
|
|
1938
2005
|
now=None,
|
|
1939
2006
|
sleep=None,
|
|
1940
2007
|
):
|
|
@@ -1945,7 +2012,21 @@ def _drain(
|
|
|
1945
2012
|
may lead a roll — rather than a second definition of "busy" (#2096's
|
|
1946
2013
|
"two surfaces, one function" rule). ``now``/``sleep`` are injectable so
|
|
1947
2014
|
this loop is unit-testable without a real clock; ``reconcile``/
|
|
1948
|
-
``board_fetch`` default to the real subprocess/
|
|
2015
|
+
``board_fetch``/``extra_busy_fetch`` default to the real subprocess/
|
|
2016
|
+
board/tmux-probe calls.
|
|
2017
|
+
|
|
2018
|
+
#2228: ``extra_busy_fetch`` re-probes live interactive sessions on
|
|
2019
|
+
every poll (not just once) — a session that ends mid-drain should let
|
|
2020
|
+
the daemon host clear within THIS wait, not only on the next `coord
|
|
2021
|
+
release propagate` tick. Deliberately keyed off the explicit *config*
|
|
2022
|
+
param, never an implicit ``_load_config(config_path)`` fallback: this
|
|
2023
|
+
function is called with ``config_path=None`` from unit tests that
|
|
2024
|
+
inject their own clock/board — silently resolving a real
|
|
2025
|
+
``coordinator.yml`` (and then SSH-probing whatever machines it names)
|
|
2026
|
+
the moment ``config`` is omitted would make this loop non-hermetic by
|
|
2027
|
+
default. No *config* simply means "no interactive-session signal this
|
|
2028
|
+
call" — the caller opts in by passing one, as the real
|
|
2029
|
+
``coord release nightly-window`` call site does.
|
|
1949
2030
|
"""
|
|
1950
2031
|
import time as _time # noqa: PLC0415
|
|
1951
2032
|
|
|
@@ -1956,6 +2037,11 @@ def _drain(
|
|
|
1956
2037
|
sleep_fn = sleep or _time.sleep
|
|
1957
2038
|
reconcile_fn = reconcile or (lambda: _run_reconcile_tick(config_path))
|
|
1958
2039
|
fetch_fn = board_fetch or _fetch_board
|
|
2040
|
+
if extra_busy_fetch is None:
|
|
2041
|
+
if config is not None:
|
|
2042
|
+
extra_busy_fetch = lambda: _interactive_session_busy(config) # noqa: E731
|
|
2043
|
+
else:
|
|
2044
|
+
extra_busy_fetch = lambda: [] # noqa: E731
|
|
1959
2045
|
|
|
1960
2046
|
start = now_fn()
|
|
1961
2047
|
while True:
|
|
@@ -1966,6 +2052,7 @@ def _drain(
|
|
|
1966
2052
|
extra_busy.append(
|
|
1967
2053
|
rp.Busy(kind="board unreadable", subject="/board", detail=board_error)
|
|
1968
2054
|
)
|
|
2055
|
+
extra_busy.extend(extra_busy_fetch())
|
|
1969
2056
|
quiescence = rp.assess_quiescence(
|
|
1970
2057
|
queue_entries=board.get("drive_queue") or [],
|
|
1971
2058
|
assignments=board.get("assignments") or [],
|
|
@@ -2327,6 +2414,7 @@ def release_nightly_window( # noqa: PLR0912, PLR0915 — a pipeline; see module
|
|
|
2327
2414
|
outcome = _drain(
|
|
2328
2415
|
daemon_host=daemon_name, config_path=config_path,
|
|
2329
2416
|
deadline=drain_deadline, poll_interval=poll_interval,
|
|
2417
|
+
config=config,
|
|
2330
2418
|
)
|
|
2331
2419
|
record.drained = outcome.drained
|
|
2332
2420
|
record.drain_seconds = outcome.elapsed_seconds
|
|
@@ -90,7 +90,7 @@ from typing import TYPE_CHECKING, Sequence
|
|
|
90
90
|
if TYPE_CHECKING:
|
|
91
91
|
from coord.agent import MergeVerify
|
|
92
92
|
from coord.config import Config
|
|
93
|
-
from coord.models import Board
|
|
93
|
+
from coord.models import Board, Machine
|
|
94
94
|
|
|
95
95
|
from coord.providers.claude_pty import (
|
|
96
96
|
BRACKETED_PASTE_ENABLE,
|
|
@@ -118,6 +118,7 @@ __all__ = [
|
|
|
118
118
|
"tmux_session_alive",
|
|
119
119
|
"tmux_pane_dead",
|
|
120
120
|
"list_coord_tmux_sessions",
|
|
121
|
+
"gather_fleet_tmux_sessions",
|
|
121
122
|
"TMUX_ATTACH_WARNING",
|
|
122
123
|
"PTY_RELAY_NO_DETACH_WARNING",
|
|
123
124
|
]
|
|
@@ -469,6 +470,76 @@ def list_coord_tmux_sessions(
|
|
|
469
470
|
return []
|
|
470
471
|
|
|
471
472
|
|
|
473
|
+
def gather_fleet_tmux_sessions(
|
|
474
|
+
config: "Config",
|
|
475
|
+
*,
|
|
476
|
+
max_workers: int = 8,
|
|
477
|
+
) -> tuple[list[dict], list[str]]:
|
|
478
|
+
"""Enumerate live ``coord-*`` tmux sessions across every machine in *config*.
|
|
479
|
+
|
|
480
|
+
Mirrors the local+remote discovery ``coord sessions --remote`` renders
|
|
481
|
+
(#2228): local sessions via a plain :func:`list_coord_tmux_sessions`
|
|
482
|
+
call, remote sessions via one SSH probe per non-local configured
|
|
483
|
+
machine, run in parallel — bounded by :func:`list_coord_tmux_sessions`'s
|
|
484
|
+
own 5s per-host subprocess timeout so one unreachable host cannot stall
|
|
485
|
+
the caller.
|
|
486
|
+
|
|
487
|
+
Returns ``(sessions, probe_errors)``:
|
|
488
|
+
|
|
489
|
+
* ``sessions`` — one dict per tmux session found (dead or alive; the
|
|
490
|
+
caller filters), each carrying ``session_name``/``pane_dead``/
|
|
491
|
+
``attached`` (see :func:`list_coord_tmux_sessions`) plus ``machine``
|
|
492
|
+
— the ``coordinator.yml`` machine name the session was found on. A
|
|
493
|
+
local session whose host has no ``coordinator.yml`` entry gets
|
|
494
|
+
``machine=None``: there is no name to pin it to, and no configured
|
|
495
|
+
host it could block either.
|
|
496
|
+
* ``probe_errors`` — machine names whose remote probe *raised* (as
|
|
497
|
+
opposed to returning "no sessions", which is what an unreachable
|
|
498
|
+
host or a dead tmux server already look like —
|
|
499
|
+
:func:`list_coord_tmux_sessions` collapses both into ``[]`` with no
|
|
500
|
+
way to tell them apart). Callers must treat this the same as an
|
|
501
|
+
empty result for that host — never as a reason to defer everything
|
|
502
|
+
— but should still log it: an unreadable session list failing open
|
|
503
|
+
and failing *silently* are two different things (#2228).
|
|
504
|
+
"""
|
|
505
|
+
import concurrent.futures as _cf # noqa: PLC0415
|
|
506
|
+
|
|
507
|
+
local_hn = _get_local_short_hostname()
|
|
508
|
+
|
|
509
|
+
def _is_local(machine: "Machine") -> bool:
|
|
510
|
+
return (
|
|
511
|
+
machine.name.lower() == local_hn
|
|
512
|
+
or machine.host.split(".")[0].lower() == local_hn
|
|
513
|
+
)
|
|
514
|
+
|
|
515
|
+
local_machine = next((m.name for m in config.machines if _is_local(m)), None)
|
|
516
|
+
|
|
517
|
+
sessions: list[dict] = [
|
|
518
|
+
{**s, "machine": local_machine} for s in list_coord_tmux_sessions()
|
|
519
|
+
]
|
|
520
|
+
|
|
521
|
+
remotes = [m for m in config.machines if not _is_local(m)]
|
|
522
|
+
errors: list[str] = []
|
|
523
|
+
if remotes:
|
|
524
|
+
def _probe(machine: "Machine") -> tuple[str, list[dict], BaseException | None]:
|
|
525
|
+
try:
|
|
526
|
+
found = list_coord_tmux_sessions(
|
|
527
|
+
host=TmuxHost(ssh_target=machine.host, batch=True)
|
|
528
|
+
)
|
|
529
|
+
return machine.name, found, None
|
|
530
|
+
except Exception as exc: # noqa: BLE001 — reported via probe_errors
|
|
531
|
+
return machine.name, [], exc
|
|
532
|
+
|
|
533
|
+
with _cf.ThreadPoolExecutor(max_workers=min(max_workers, len(remotes))) as ex:
|
|
534
|
+
for mname, found, err in ex.map(_probe, remotes):
|
|
535
|
+
if err is not None:
|
|
536
|
+
errors.append(mname)
|
|
537
|
+
continue
|
|
538
|
+
sessions.extend({**s, "machine": mname} for s in found)
|
|
539
|
+
|
|
540
|
+
return sessions, errors
|
|
541
|
+
|
|
542
|
+
|
|
472
543
|
def _inject_briefing_into_tmux_session(
|
|
473
544
|
session_name: str,
|
|
474
545
|
briefing: str,
|