code-coordinator 0.5.118__tar.gz → 0.5.120__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.118 → code_coordinator-0.5.120}/PKG-INFO +1 -1
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/SOURCES.txt +10 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/scm_file_list.json +10 -0
- code_coordinator-0.5.120/code_coordinator.egg-info/scm_version.json +8 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agent.py +56 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/cli.py +56 -25
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/drive_queue.py +44 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/portal.py +78 -5
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/config.py +76 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/conflict_fix.py +7 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-drive-queue.service +29 -16
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/drive_queue.py +78 -0
- code_coordinator-0.5.120/coord/skills/portal-followup/SKILL.md +84 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-drive-queue.service +29 -16
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/DRIVE_QUEUE.md +42 -21
- code_coordinator-0.5.120/tests/acceptance/ms-65/contract.md +563 -0
- code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +40 -0
- code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +40 -0
- code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-preview-tab.screen +40 -0
- code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +40 -0
- code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +40 -0
- code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +40 -0
- code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +40 -0
- code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +40 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_portal.py +100 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_drive_queue.py +78 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_mock_author.py +10 -1
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_portal_config.py +20 -1
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worker_safety.py +149 -0
- code_coordinator-0.5.118/code_coordinator.egg-info/scm_version.json +0 -8
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.gitignore +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/CLAUDE.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/GOAL.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/LICENSE +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/MANIFEST.in +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/README.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/__init__.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/audit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/block_log.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/board_service.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/brain.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/claim.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/client.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/comments.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dao.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/db.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deps.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/drive.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/events.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/filelock.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/freshness.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/gates.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/goal.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/context.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/models.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/render.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/units.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/hooks.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/interactive.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/models.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/network.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notify.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/openapi.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/parentage.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/plans.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/progress.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/release_window.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/reports.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/review.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/smoke.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/split_work.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/state.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/test_author.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/test_report.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/usage.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/install-agent.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/pyproject.toml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/setup.cfg +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/__init__.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/conftest.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_db.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_events.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_init.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_models.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_network.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_session.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_split.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_state.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -342,6 +342,7 @@ coord/providers/base.py
|
|
|
342
342
|
coord/providers/claude.py
|
|
343
343
|
coord/providers/claude_pty.py
|
|
344
344
|
coord/providers/opencode.py
|
|
345
|
+
coord/skills/portal-followup/SKILL.md
|
|
345
346
|
coord/skills/update-issue/SKILL.md
|
|
346
347
|
deploy/coord-agent.service
|
|
347
348
|
deploy/coord-db-backup.service
|
|
@@ -783,6 +784,15 @@ tests/acceptance/ms-51/home-active.spec.ts
|
|
|
783
784
|
tests/acceptance/ms-51/manifest.yml
|
|
784
785
|
tests/acceptance/ms-51/tsconfig.json
|
|
785
786
|
tests/acceptance/ms-51/mocks/home-active.html
|
|
787
|
+
tests/acceptance/ms-65/contract.md
|
|
788
|
+
tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen
|
|
789
|
+
tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen
|
|
790
|
+
tests/acceptance/ms-65/mocks/board-preview-tab.screen
|
|
791
|
+
tests/acceptance/ms-65/mocks/board-split-side-by-side.screen
|
|
792
|
+
tests/acceptance/ms-65/mocks/board-tab-context-menu.screen
|
|
793
|
+
tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen
|
|
794
|
+
tests/acceptance/ms-65/mocks/board-tabs-overflow.screen
|
|
795
|
+
tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen
|
|
786
796
|
tests/acceptance/ms-example/mocks/home-active.html
|
|
787
797
|
tests/fixtures/board-pipeline-basic.json
|
|
788
798
|
tests/fixtures/board-pipeline-terminal-gates.json
|
{code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -305,6 +305,7 @@
|
|
|
305
305
|
"coord/review.py",
|
|
306
306
|
"coord/scorecard.py",
|
|
307
307
|
"coord/serve_app.py",
|
|
308
|
+
"coord/skills/portal-followup/SKILL.md",
|
|
308
309
|
"coord/skills/update-issue/SKILL.md",
|
|
309
310
|
"coord/smoke.py",
|
|
310
311
|
"coord/spend_ceiling.py",
|
|
@@ -428,6 +429,15 @@
|
|
|
428
429
|
"tests/acceptance/ms-51/manifest.yml",
|
|
429
430
|
"tests/acceptance/ms-51/mocks/home-active.html",
|
|
430
431
|
"tests/acceptance/ms-51/tsconfig.json",
|
|
432
|
+
"tests/acceptance/ms-65/contract.md",
|
|
433
|
+
"tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen",
|
|
434
|
+
"tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen",
|
|
435
|
+
"tests/acceptance/ms-65/mocks/board-preview-tab.screen",
|
|
436
|
+
"tests/acceptance/ms-65/mocks/board-split-side-by-side.screen",
|
|
437
|
+
"tests/acceptance/ms-65/mocks/board-tab-context-menu.screen",
|
|
438
|
+
"tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen",
|
|
439
|
+
"tests/acceptance/ms-65/mocks/board-tabs-overflow.screen",
|
|
440
|
+
"tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen",
|
|
431
441
|
"tests/acceptance/ms-example/mocks/home-active.html",
|
|
432
442
|
"tests/conftest.py",
|
|
433
443
|
"tests/fixtures/board-pipeline-basic.json",
|
|
@@ -3500,10 +3500,14 @@ MILESTONE_CHAT_DENY_COMMANDS: list[str] = [
|
|
|
3500
3500
|
"Bash(git push *)",
|
|
3501
3501
|
"Bash(git commit *)",
|
|
3502
3502
|
"Bash(git reset --hard *)",
|
|
3503
|
+
"Bash(git reset * --hard *)",
|
|
3503
3504
|
"Bash(git branch -D *)",
|
|
3505
|
+
"Bash(git branch * -D *)",
|
|
3504
3506
|
"Bash(git checkout -- .)",
|
|
3505
3507
|
"Bash(git clean -f *)",
|
|
3508
|
+
"Bash(git clean * -f *)",
|
|
3506
3509
|
"Bash(rm -rf *)",
|
|
3510
|
+
"Bash(rm -fr *)",
|
|
3507
3511
|
"Bash(coord approve *)",
|
|
3508
3512
|
"Bash(coord merge *)",
|
|
3509
3513
|
"Bash(coord assign *)",
|
|
@@ -3575,11 +3579,19 @@ manually verify in the rendered mock.
|
|
|
3575
3579
|
MOCK_AUTHOR_DENY_COMMANDS: list[str] = [
|
|
3576
3580
|
"Bash(gh *)",
|
|
3577
3581
|
"Bash(git push --force*)",
|
|
3582
|
+
# #2314: the entry above only matches `--force` IMMEDIATELY after
|
|
3583
|
+
# `push` — a `git push --quiet --force ...` with another flag pushed
|
|
3584
|
+
# in first would evade it.
|
|
3585
|
+
"Bash(git push * --force*)",
|
|
3578
3586
|
"Bash(git reset --hard *)",
|
|
3587
|
+
"Bash(git reset * --hard *)",
|
|
3579
3588
|
"Bash(git branch -D *)",
|
|
3589
|
+
"Bash(git branch * -D *)",
|
|
3580
3590
|
"Bash(git checkout -- .)",
|
|
3581
3591
|
"Bash(git clean -f *)",
|
|
3592
|
+
"Bash(git clean * -f *)",
|
|
3582
3593
|
"Bash(rm -rf *)",
|
|
3594
|
+
"Bash(rm -fr *)",
|
|
3583
3595
|
"Bash(coord approve *)",
|
|
3584
3596
|
"Bash(coord merge *)",
|
|
3585
3597
|
"Bash(coord assign *)",
|
|
@@ -3599,10 +3611,14 @@ NEW_ISSUE_CHAT_DENY_COMMANDS: list[str] = [
|
|
|
3599
3611
|
"Bash(git push *)",
|
|
3600
3612
|
"Bash(git commit *)",
|
|
3601
3613
|
"Bash(git reset --hard *)",
|
|
3614
|
+
"Bash(git reset * --hard *)",
|
|
3602
3615
|
"Bash(git branch -D *)",
|
|
3616
|
+
"Bash(git branch * -D *)",
|
|
3603
3617
|
"Bash(git checkout -- .)",
|
|
3604
3618
|
"Bash(git clean -f *)",
|
|
3619
|
+
"Bash(git clean * -f *)",
|
|
3605
3620
|
"Bash(rm -rf *)",
|
|
3621
|
+
"Bash(rm -fr *)",
|
|
3606
3622
|
]
|
|
3607
3623
|
|
|
3608
3624
|
|
|
@@ -3637,6 +3653,46 @@ def build_deny_prompt(deny_commands: list[str]) -> str:
|
|
|
3637
3653
|
)
|
|
3638
3654
|
|
|
3639
3655
|
|
|
3656
|
+
def bash_deny_pattern_matches(pattern: str, command: str) -> bool:
|
|
3657
|
+
"""Whether *command* (a raw shell command string) is caught by a single
|
|
3658
|
+
``Bash(...)`` deny *pattern*, using the same shell-glob semantics those
|
|
3659
|
+
patterns are written in throughout this module (``*`` matches any run of
|
|
3660
|
+
characters, including none, and including across what would look like an
|
|
3661
|
+
argv token boundary — this is a whole-string glob, not an argv-aware
|
|
3662
|
+
parse).
|
|
3663
|
+
|
|
3664
|
+
#2314: a worker evaded ``Bash(pip install -e *)`` simply by inserting
|
|
3665
|
+
another flag first (``pip install --user -e .``) — the pattern only
|
|
3666
|
+
matched ``-e`` IMMEDIATELY after ``install``. This function exists so
|
|
3667
|
+
that claim ("this deny list actually catches that evasion") is a
|
|
3668
|
+
testable fact rather than something read off the pattern text by eye —
|
|
3669
|
+
see the ``Bash(...)`` entries :data:`coord.config.DEFAULT_DENY_COMMANDS`
|
|
3670
|
+
pairs for exactly this reason, and ``tests/test_worker_safety.py`` for
|
|
3671
|
+
the regression tests built on top of this function.
|
|
3672
|
+
|
|
3673
|
+
Returns ``False`` for a *pattern* that isn't a ``Bash(...)`` rule at all
|
|
3674
|
+
(e.g. an ``Edit(...)``/``Write(...)`` path rule) — those constrain a
|
|
3675
|
+
different tool and never match a shell command string.
|
|
3676
|
+
"""
|
|
3677
|
+
if not (pattern.startswith("Bash(") and pattern.endswith(")")):
|
|
3678
|
+
return False
|
|
3679
|
+
inner = pattern[5:-1]
|
|
3680
|
+
return fnmatch.fnmatchcase(command.strip(), inner)
|
|
3681
|
+
|
|
3682
|
+
|
|
3683
|
+
def find_denying_bash_pattern(command: str, deny_commands: list[str]) -> str | None:
|
|
3684
|
+
"""The first pattern in *deny_commands* that blocks *command*, or ``None``.
|
|
3685
|
+
|
|
3686
|
+
Thin fold over :func:`bash_deny_pattern_matches` — a worker's own deny
|
|
3687
|
+
list is small (single digits to low tens of entries), so a linear scan
|
|
3688
|
+
needs no index.
|
|
3689
|
+
"""
|
|
3690
|
+
for pattern in deny_commands:
|
|
3691
|
+
if bash_deny_pattern_matches(pattern, command):
|
|
3692
|
+
return pattern
|
|
3693
|
+
return None
|
|
3694
|
+
|
|
3695
|
+
|
|
3640
3696
|
# #1315: sealed-oracle path prefix that only an independent authoring type
|
|
3641
3697
|
# (``"mock-author"``/a future ``"test-author"``) may ever write to
|
|
3642
3698
|
# (docs/ORACLE_LOOP.md sealing v1). ``coord.dispatch.dispatch`` already
|
|
@@ -300,49 +300,80 @@ def _warn_if_source_install_drift() -> None:
|
|
|
300
300
|
pass
|
|
301
301
|
|
|
302
302
|
|
|
303
|
-
def
|
|
304
|
-
"""#561/#601
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
303
|
+
def _editable_checkout_drift() -> tuple[Path, str] | None:
|
|
304
|
+
"""Pure query behind both #561/#601's CLI warning and #2314's
|
|
305
|
+
drive-queue tick refusal (:mod:`coord.drive_queue`): is THIS process an
|
|
306
|
+
EDITABLE checkout of coord, and if so, is it on a branch other than the
|
|
307
|
+
default one?
|
|
308
|
+
|
|
309
|
+
A Build/`coord test`/smoke that git-checkout'd the base — or an
|
|
310
|
+
interactive agent inspecting a branch in the live checkout — silently
|
|
311
|
+
puts the running coordinator on that branch's code until restored (#561
|
|
312
|
+
incident: disabled guards; #601 incident: old code + retired local DB).
|
|
313
|
+
|
|
314
|
+
Returns ``(repo_root, shown)`` when drifted — ``shown`` is the branch
|
|
315
|
+
name formatted the way both callers print it (quoted, or
|
|
316
|
+
``"(detached HEAD)"``) — or ``None`` when this is a non-editable/
|
|
317
|
+
site-packages install, isn't a git checkout at all, is cleanly on
|
|
318
|
+
``main``/``master``, or the check itself couldn't be completed (git not
|
|
319
|
+
on PATH, no ``.git``, a timeout). Every failure mode here is read-only
|
|
320
|
+
and best-effort, so it degrades to "no drift detected" rather than
|
|
321
|
+
raising — a flaky read must never itself block a tick or crash a
|
|
322
|
+
command.
|
|
312
323
|
"""
|
|
313
324
|
import subprocess # noqa: PLC0415
|
|
314
|
-
import sys as _sys # noqa: PLC0415
|
|
315
325
|
|
|
316
|
-
if "pytest" in _sys.modules:
|
|
317
|
-
return # don't add startup noise to the test suite
|
|
318
326
|
try:
|
|
319
327
|
import coord as _coord # noqa: PLC0415
|
|
320
328
|
|
|
321
329
|
coord_file = _coord.__file__ or ""
|
|
322
330
|
if "site-packages" in coord_file:
|
|
323
|
-
return # PyPI/snapshot install — moving a checkout can't affect it.
|
|
331
|
+
return None # PyPI/snapshot install — moving a checkout can't affect it.
|
|
324
332
|
repo_root = Path(coord_file).resolve().parents[1]
|
|
325
333
|
if not (repo_root / ".git").exists():
|
|
326
|
-
return
|
|
334
|
+
return None
|
|
327
335
|
head = subprocess.run(
|
|
328
336
|
["git", "rev-parse", "--abbrev-ref", "HEAD"],
|
|
329
337
|
cwd=str(repo_root), capture_output=True, text=True, timeout=3,
|
|
330
338
|
)
|
|
331
339
|
if head.returncode != 0:
|
|
332
|
-
return
|
|
340
|
+
return None
|
|
333
341
|
branch = head.stdout.strip()
|
|
334
342
|
if branch in ("main", "master"):
|
|
335
|
-
return
|
|
343
|
+
return None
|
|
336
344
|
shown = "(detached HEAD)" if branch == "HEAD" else f"'{branch}'"
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
345
|
+
return (repo_root, shown)
|
|
346
|
+
except Exception: # noqa: BLE001 — best-effort, never break the caller
|
|
347
|
+
return None
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def _warn_if_editable_checkout_moved() -> None:
|
|
351
|
+
"""#561/#601 backstop: when running from an EDITABLE checkout, warn loudly if
|
|
352
|
+
its branch was moved off the default.
|
|
353
|
+
|
|
354
|
+
This makes that state visible on every command instead of waiting for a
|
|
355
|
+
verdict or manual restore. #2314 escalated the SAME underlying reading
|
|
356
|
+
(:func:`_editable_checkout_drift`) from advisory-only here to a hard
|
|
357
|
+
refusal inside the drive-queue tick gate — see
|
|
358
|
+
``coord.drive_queue.plan_tick``'s ``editable_drift`` parameter — because
|
|
359
|
+
a warning nobody is watching an unattended tick's log for is not a gate.
|
|
360
|
+
This function stays as the interactive/human-facing half of that fix.
|
|
361
|
+
"""
|
|
362
|
+
import sys as _sys # noqa: PLC0415
|
|
363
|
+
|
|
364
|
+
if "pytest" in _sys.modules:
|
|
365
|
+
return # don't add startup noise to the test suite
|
|
366
|
+
drift = _editable_checkout_drift()
|
|
367
|
+
if drift is None:
|
|
368
|
+
return
|
|
369
|
+
repo_root, shown = drift
|
|
370
|
+
click.echo(
|
|
371
|
+
f"⚠ coord: editable checkout {repo_root} is on {shown}, not the "
|
|
372
|
+
"default branch — the running coordinator is on THAT code. A "
|
|
373
|
+
"Build/smoke/test may have checked it out. Restore with: "
|
|
374
|
+
f"git -C {repo_root} checkout main",
|
|
375
|
+
err=True,
|
|
376
|
+
)
|
|
346
377
|
|
|
347
378
|
|
|
348
379
|
@click.group(help="Multi-agent coordinator for Claude Code workers.")
|
|
@@ -1634,6 +1634,42 @@ def _fetch_cordons() -> dict[str, str]:
|
|
|
1634
1634
|
return {}
|
|
1635
1635
|
|
|
1636
1636
|
|
|
1637
|
+
def _fetch_editable_drift() -> tuple[str, str] | None:
|
|
1638
|
+
"""``(repo_root, shown)`` when THIS host's own `coord` is an editable
|
|
1639
|
+
checkout that has drifted off its default branch, else ``None`` (#2314).
|
|
1640
|
+
|
|
1641
|
+
Thin wrapper around ``coord.cli._editable_checkout_drift`` — the exact
|
|
1642
|
+
same read `coord.cli._warn_if_editable_checkout_moved` uses for its
|
|
1643
|
+
CLI-startup warning — reshaped to a plain ``(str, str)`` tuple so
|
|
1644
|
+
:func:`coord.drive_queue.plan_tick` (a pure function; see its module
|
|
1645
|
+
docstring) never has to import ``coord.cli`` or touch a ``Path``.
|
|
1646
|
+
Already fail-soft/best-effort at the source (see that function's
|
|
1647
|
+
docstring); this wrapper adds nothing on top beyond the reshape and the
|
|
1648
|
+
``str(repo_root)`` conversion.
|
|
1649
|
+
|
|
1650
|
+
Same ``"pytest" in sys.modules`` guard as
|
|
1651
|
+
``_warn_if_editable_checkout_moved`` — for the identical reason: this
|
|
1652
|
+
repo's OWN test suite runs from an editable checkout on a feature
|
|
1653
|
+
branch as a matter of course (that is what a worker's worktree is), so
|
|
1654
|
+
without the guard every CLI-level `drive-queue tick` test would trip
|
|
1655
|
+
this exact gate on itself. `coord.drive_queue.plan_tick`'s own tests
|
|
1656
|
+
(tests/test_drive_queue.py) exercise the real gate logic directly via
|
|
1657
|
+
its ``editable_drift`` parameter, unaffected by this guard.
|
|
1658
|
+
"""
|
|
1659
|
+
import sys as _sys # noqa: PLC0415
|
|
1660
|
+
|
|
1661
|
+
if "pytest" in _sys.modules:
|
|
1662
|
+
return None
|
|
1663
|
+
|
|
1664
|
+
from coord.cli import _editable_checkout_drift # noqa: PLC0415
|
|
1665
|
+
|
|
1666
|
+
drift = _editable_checkout_drift()
|
|
1667
|
+
if drift is None:
|
|
1668
|
+
return None
|
|
1669
|
+
repo_root, shown = drift
|
|
1670
|
+
return (str(repo_root), shown)
|
|
1671
|
+
|
|
1672
|
+
|
|
1637
1673
|
def _fetch_board_view() -> BoardView:
|
|
1638
1674
|
"""Board + live drive sessions, typed.
|
|
1639
1675
|
|
|
@@ -2316,6 +2352,13 @@ def drive_queue_tick(
|
|
|
2316
2352
|
# a rollable state.
|
|
2317
2353
|
cordons = _fetch_cordons()
|
|
2318
2354
|
|
|
2355
|
+
# #2314: is THIS host's own `coord` a drifted editable checkout?
|
|
2356
|
+
# Escalates `coord.cli._warn_if_editable_checkout_moved` from an
|
|
2357
|
+
# advisory-only startup warning (nothing unattended ever reads) to
|
|
2358
|
+
# an actual refusal — see `_editable_drift_alert` and `plan_tick`'s
|
|
2359
|
+
# `editable_drift` parameter for the gate itself.
|
|
2360
|
+
editable_drift = _fetch_editable_drift()
|
|
2361
|
+
|
|
2319
2362
|
# #1794: the clock is the shell's to read, never `coord.drive_queue`'s.
|
|
2320
2363
|
# It powers the startup grace window on both sides of the tick — a
|
|
2321
2364
|
# drive launched seconds ago is `starting`, not dead, and cannot be
|
|
@@ -2342,6 +2385,7 @@ def drive_queue_tick(
|
|
|
2342
2385
|
cordons=cordons,
|
|
2343
2386
|
live_ci_gate=live_ci_gate,
|
|
2344
2387
|
live_blocked_gate=live_blocked_gate,
|
|
2388
|
+
editable_drift=editable_drift,
|
|
2345
2389
|
)
|
|
2346
2390
|
|
|
2347
2391
|
if reconcile_only:
|
|
@@ -17,10 +17,16 @@ operator see and drive it without waiting for a tick:
|
|
|
17
17
|
* ``requeue`` revives a row the drain retired after burning its retry budget.
|
|
18
18
|
|
|
19
19
|
The state-touching commands (``sync``, ``outbox``, ``events``, ``enqueue-*``,
|
|
20
|
-
``requeue``)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
``requeue``) read and write the daemon's own ``~/.coord/coord.db`` and are
|
|
21
|
+
therefore **daemon-host commands**. Run from a thin client they used to silently
|
|
22
|
+
operate on that box's empty local DB, which is not where the bridge lives —
|
|
23
|
+
producing a normal-looking "nothing pending" instead of an error (#2336).
|
|
24
|
+
Every one of them now calls :func:`_refuse_if_thin_client` first, which
|
|
25
|
+
raises a loud, explicit error instead when ``board_service`` is configured
|
|
26
|
+
(i.e. this machine is a thin client per ``coord/client.py``'s bootstrap
|
|
27
|
+
contract) rather than silently reading the wrong box's empty tables. There is
|
|
28
|
+
no daemon-proxy for these yet (Option A in #2336 — a bigger lift, left for a
|
|
29
|
+
follow-up); this is the "fail loud instead of running wrong" half.
|
|
24
30
|
"""
|
|
25
31
|
|
|
26
32
|
from __future__ import annotations
|
|
@@ -30,6 +36,7 @@ import json
|
|
|
30
36
|
import click
|
|
31
37
|
|
|
32
38
|
from coord.commands._common import _CONFIG_OPTION, _load_config
|
|
39
|
+
from coord.config import has_unexpanded_env_var
|
|
33
40
|
from coord.portal_bridge import (
|
|
34
41
|
PortalBridgeError,
|
|
35
42
|
SUBMISSION_STATUSES,
|
|
@@ -37,6 +44,48 @@ from coord.portal_bridge import (
|
|
|
37
44
|
)
|
|
38
45
|
|
|
39
46
|
|
|
47
|
+
def _refuse_if_thin_client(cmd_name: str) -> None:
|
|
48
|
+
"""Refuse *cmd_name* when this machine isn't the daemon host (#2336).
|
|
49
|
+
|
|
50
|
+
``sync``/``outbox``/``events``/``enqueue-*``/``requeue`` read and write
|
|
51
|
+
the daemon's own ``~/.coord/coord.db`` directly — there is no daemon
|
|
52
|
+
proxy for portal state yet (unlike ``coord status``/``coord log``/etc,
|
|
53
|
+
which already route through ``board_service`` when it's configured; see
|
|
54
|
+
``coord/client.py``'s module docstring for the bootstrap contract). Run
|
|
55
|
+
on a machine that has ``board_service`` set in ``~/.coord/client.toml``
|
|
56
|
+
(a thin client, by definition — every other machine in the fleet that
|
|
57
|
+
isn't the daemon host), these commands would read/write that machine's
|
|
58
|
+
own empty local DB and report a normal-looking, silently wrong result
|
|
59
|
+
(2026-08-16 incident: a customer ``signoff.approved`` event sat
|
|
60
|
+
unnoticed on the daemon host for over an hour because every portal
|
|
61
|
+
command run from a thin client reported nothing pending).
|
|
62
|
+
|
|
63
|
+
Mirrors the guard already used for the same reason in
|
|
64
|
+
``coord.commands.drive_queue``'s ``diagnose`` command (#615/#906), which
|
|
65
|
+
refuses rather than "diagnose an empty queue" on a thin client. The
|
|
66
|
+
local-vs-daemon decision goes through ``coord.board_service`` — the #749
|
|
67
|
+
facade that exists precisely so call sites stop hand-rolling
|
|
68
|
+
``resolve_board_service()`` — rather than importing ``coord.client``
|
|
69
|
+
directly. ``resolve()`` and not ``is_remote()`` because the error names
|
|
70
|
+
the host the operator should ssh to, which needs the resolved URL.
|
|
71
|
+
"""
|
|
72
|
+
from coord.board_service import resolve # noqa: PLC0415
|
|
73
|
+
|
|
74
|
+
svc = resolve()
|
|
75
|
+
if svc is None:
|
|
76
|
+
return
|
|
77
|
+
from urllib.parse import urlparse # noqa: PLC0415
|
|
78
|
+
|
|
79
|
+
host = urlparse(svc.url).hostname or svc.url
|
|
80
|
+
raise click.ClickException(
|
|
81
|
+
f"coord portal {cmd_name} must run on the daemon host ({host}) — "
|
|
82
|
+
"this machine's ~/.coord/coord.db is not where the bridge lives "
|
|
83
|
+
"(board_service is configured in ~/.coord/client.toml, making this "
|
|
84
|
+
"a thin client). Run it over `ssh` on the daemon host instead. "
|
|
85
|
+
"See coord/skills/portal-followup/SKILL.md."
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
40
89
|
@click.group("portal")
|
|
41
90
|
def portal_group() -> None:
|
|
42
91
|
"""coord-portal sync bridge — status, manual push, heartbeat (#2179)."""
|
|
@@ -48,10 +97,20 @@ def portal_group() -> None:
|
|
|
48
97
|
def portal_status(config_path, as_json: bool) -> None:
|
|
49
98
|
"""Show whether the portal bridge is configured, without sending anything."""
|
|
50
99
|
cfg = _load_config(config_path).portal
|
|
100
|
+
# #2336: a non-empty-string check alone can't tell "resolved to a real
|
|
101
|
+
# secret" from "the ${VAR} placeholder was never expanded because the
|
|
102
|
+
# env var wasn't set in this shell" — both are non-empty strings. Reject
|
|
103
|
+
# either credential if it still carries an unexpanded placeholder.
|
|
104
|
+
credentials_set = bool(
|
|
105
|
+
cfg.bridge_client_id
|
|
106
|
+
and cfg.bridge_client_secret
|
|
107
|
+
and not has_unexpanded_env_var(cfg.bridge_client_id)
|
|
108
|
+
and not has_unexpanded_env_var(cfg.bridge_client_secret)
|
|
109
|
+
)
|
|
51
110
|
payload = {
|
|
52
111
|
"enabled": cfg.enabled,
|
|
53
112
|
"base_url": cfg.base_url,
|
|
54
|
-
"credentials_set":
|
|
113
|
+
"credentials_set": credentials_set,
|
|
55
114
|
"timeout_secs": cfg.timeout_secs,
|
|
56
115
|
"max_retries": cfg.max_retries,
|
|
57
116
|
}
|
|
@@ -151,6 +210,8 @@ def portal_sync_once(config_path, as_json: bool) -> None:
|
|
|
151
210
|
|
|
152
211
|
Daemon-host command: it reads and writes the daemon's ~/.coord/coord.db.
|
|
153
212
|
"""
|
|
213
|
+
_refuse_if_thin_client("sync")
|
|
214
|
+
|
|
154
215
|
from coord import portal_sync as _sync # noqa: PLC0415
|
|
155
216
|
|
|
156
217
|
config = _load_config(config_path)
|
|
@@ -198,6 +259,8 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
|
|
|
198
259
|
refusing to announce something to the customer before the thing it
|
|
199
260
|
announces has been confirmed applied.
|
|
200
261
|
"""
|
|
262
|
+
_refuse_if_thin_client("outbox")
|
|
263
|
+
|
|
201
264
|
from coord import portal_store # noqa: PLC0415
|
|
202
265
|
from coord.portal_sync import ordering_block_reason # noqa: PLC0415
|
|
203
266
|
|
|
@@ -277,6 +340,8 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
|
|
|
277
340
|
@click.option("--limit", type=int, default=20, show_default=True)
|
|
278
341
|
def portal_events(as_json: bool, limit: int) -> None:
|
|
279
342
|
"""List pulled, not-yet-consumed customer events (the inbound half)."""
|
|
343
|
+
_refuse_if_thin_client("events")
|
|
344
|
+
|
|
280
345
|
from coord import portal_store # noqa: PLC0415
|
|
281
346
|
|
|
282
347
|
events = portal_store.unhandled_events(limit=limit)
|
|
@@ -315,6 +380,8 @@ def portal_enqueue_status(submission_id: str, status: str) -> None:
|
|
|
315
380
|
that would summon the customer to an empty screen — `awaiting-signoff`
|
|
316
381
|
with no design round queued, `needs-input` with no question (#835).
|
|
317
382
|
"""
|
|
383
|
+
_refuse_if_thin_client("enqueue-status")
|
|
384
|
+
|
|
318
385
|
from coord.portal_sync import PortalSyncError, enqueue_status # noqa: PLC0415
|
|
319
386
|
|
|
320
387
|
try:
|
|
@@ -338,6 +405,8 @@ def portal_enqueue_design_round(submission_id: str, payload_json: str) -> None:
|
|
|
338
405
|
expected to carry whatever reference the customer's browser follows, plus
|
|
339
406
|
a `round` number if this is not the first.
|
|
340
407
|
"""
|
|
408
|
+
_refuse_if_thin_client("enqueue-design-round")
|
|
409
|
+
|
|
341
410
|
from coord.portal_sync import PortalSyncError, enqueue_design_round # noqa: PLC0415
|
|
342
411
|
|
|
343
412
|
try:
|
|
@@ -361,6 +430,8 @@ def portal_enqueue_design_round(submission_id: str, payload_json: str) -> None:
|
|
|
361
430
|
@click.argument("question")
|
|
362
431
|
def portal_enqueue_question(submission_id: str, question: str) -> None:
|
|
363
432
|
"""Queue an open question for SUBMISSION_ID (sent on the next sync)."""
|
|
433
|
+
_refuse_if_thin_client("enqueue-question")
|
|
434
|
+
|
|
364
435
|
from coord.portal_sync import PortalSyncError, enqueue_question # noqa: PLC0415
|
|
365
436
|
|
|
366
437
|
try:
|
|
@@ -389,6 +460,8 @@ def portal_requeue(submission_id: str, seq: int) -> None:
|
|
|
389
460
|
|
|
390
461
|
Find the seq with `coord portal outbox --all`.
|
|
391
462
|
"""
|
|
463
|
+
_refuse_if_thin_client("requeue")
|
|
464
|
+
|
|
392
465
|
from coord import portal_store # noqa: PLC0415
|
|
393
466
|
|
|
394
467
|
row = portal_store.requeue(submission_id, seq)
|
|
@@ -73,15 +73,66 @@ def is_canonical_config_path(path: Path) -> bool:
|
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
# Safety-by-default: repos without explicit worker_permissions get this deny-list.
|
|
76
|
+
#
|
|
77
|
+
# #2314: every ``Bash(<verb> <flag> *)`` entry only matches *flag* IMMEDIATELY
|
|
78
|
+
# after *verb* — a worker that inserted one more flag first (or swapped a
|
|
79
|
+
# combined short flag's letter order) sailed straight through undetected. The
|
|
80
|
+
# `git push`/`rm` entries below each pair the original adjacent form with a
|
|
81
|
+
# reordering-safe one (an interior ``*`` before the flag, or — for `rm` — the
|
|
82
|
+
# `-fr` letter-swap of `-rf`); this is the "audit other Bash(...) deny
|
|
83
|
+
# patterns for the same positional weakness" half of #2314, not exhaustive
|
|
84
|
+
# (it does not attempt to catch shell chaining/subshells, which is a
|
|
85
|
+
# different, much larger problem than argv flag position).
|
|
76
86
|
DEFAULT_DENY_COMMANDS: list[str] = [
|
|
77
87
|
"Bash(gh *)",
|
|
78
88
|
"Bash(git push --force *)",
|
|
79
89
|
"Bash(git push -f *)",
|
|
90
|
+
"Bash(git push * --force *)",
|
|
91
|
+
"Bash(git push * -f *)",
|
|
80
92
|
"Bash(git reset --hard *)",
|
|
93
|
+
"Bash(git reset * --hard *)",
|
|
81
94
|
"Bash(git branch -D *)",
|
|
95
|
+
"Bash(git branch * -D *)",
|
|
82
96
|
"Bash(git checkout -- .)",
|
|
83
97
|
"Bash(git clean -f *)",
|
|
98
|
+
"Bash(git clean * -f *)",
|
|
84
99
|
"Bash(rm -rf *)",
|
|
100
|
+
"Bash(rm -fr *)",
|
|
101
|
+
# #2314: a worker ran `pip install --break-system-packages -e .` — an
|
|
102
|
+
# editable install of coord's own source re-links (or, combined with
|
|
103
|
+
# `--user`/`--break-system-packages`, outright shadows) the interpreter
|
|
104
|
+
# `coord` itself is running under, out from under this and every other
|
|
105
|
+
# session on the box (see coord/cli.py's
|
|
106
|
+
# `_warn_if_source_install_drift`/`_editable_checkout_drift`). The old
|
|
107
|
+
# single `Bash(pip install -e *)` entry only matched `-e` IMMEDIATELY
|
|
108
|
+
# after `install`, so putting any other flag first evaded it entirely.
|
|
109
|
+
# Every entry below is duplicated with a leading `*` (covers `python -m
|
|
110
|
+
# pip install ...` / `python3 -m pip install ...`, which reach the exact
|
|
111
|
+
# same installer) and, for `-e`/`--editable` specifically, ALSO with an
|
|
112
|
+
# interior `*` before the flag (covers it appearing anywhere in argv,
|
|
113
|
+
# not just first) — the adjacent form alone still catches
|
|
114
|
+
# `pip install -e --break-system-packages .` (the flag being pushed
|
|
115
|
+
# AFTER `-e` doesn't break the immediate `install -e` adjacency), but
|
|
116
|
+
# not `pip install --break-system-packages -e .` (something pushed
|
|
117
|
+
# BEFORE it).
|
|
118
|
+
"Bash(pip install -e *)",
|
|
119
|
+
"Bash(*pip install -e *)",
|
|
120
|
+
"Bash(pip install * -e *)",
|
|
121
|
+
"Bash(*pip install * -e *)",
|
|
122
|
+
"Bash(pip install --editable *)",
|
|
123
|
+
"Bash(*pip install --editable *)",
|
|
124
|
+
"Bash(pip install * --editable *)",
|
|
125
|
+
"Bash(*pip install * --editable *)",
|
|
126
|
+
# `--break-system-packages` / `--user` are denied INDEPENDENTLY of
|
|
127
|
+
# `-e`/`--editable` — either flag alone, on a perfectly ordinary
|
|
128
|
+
# non-editable `pip install`, still lets a worker write into (or
|
|
129
|
+
# reconfigure) the interpreter coord itself runs under. No adjacency
|
|
130
|
+
# requirement at all: both are boolean flags a real `pip install`
|
|
131
|
+
# invocation can place anywhere after `install`.
|
|
132
|
+
"Bash(pip install *--break-system-packages*)",
|
|
133
|
+
"Bash(*pip install *--break-system-packages*)",
|
|
134
|
+
"Bash(pip install *--user*)",
|
|
135
|
+
"Bash(*pip install *--user*)",
|
|
85
136
|
]
|
|
86
137
|
|
|
87
138
|
|
|
@@ -3321,6 +3372,31 @@ def _expand_env_vars(value: str) -> str:
|
|
|
3321
3372
|
return _ENV_VAR_RE.sub(_replace, value)
|
|
3322
3373
|
|
|
3323
3374
|
|
|
3375
|
+
def has_unexpanded_env_var(value: str | None) -> bool:
|
|
3376
|
+
"""Whether *value* still contains an unexpanded ``${VAR}`` placeholder.
|
|
3377
|
+
|
|
3378
|
+
#2336: :func:`_expand_env_vars` leaves an unset variable's placeholder
|
|
3379
|
+
untouched — ``${MISSING}`` stays the literal string ``"${MISSING}"`` —
|
|
3380
|
+
so a plain ``bool(value)`` check on the *result* can't tell "this
|
|
3381
|
+
resolved to a real secret" from "the env var was never set in this
|
|
3382
|
+
process's environment": both are non-empty strings. This is the
|
|
3383
|
+
"actually resolved" check the config's own env-var expansion needs a
|
|
3384
|
+
caller to run afterward — e.g. ``coord portal status``'s
|
|
3385
|
+
``credentials_set`` used to report ``true`` for
|
|
3386
|
+
``portal.bridge_client_id: "${BRIDGE_CLIENT_ID}"`` even when
|
|
3387
|
+
``BRIDGE_CLIENT_ID`` was never exported into the shell the command ran
|
|
3388
|
+
in, which read as "credentials fine" while troubleshooting what was
|
|
3389
|
+
actually a missing-env-var problem.
|
|
3390
|
+
|
|
3391
|
+
``None`` is treated as not-a-placeholder (``False``) — an unset field is
|
|
3392
|
+
a separate "not configured" state, distinct from "configured but the
|
|
3393
|
+
env var didn't resolve".
|
|
3394
|
+
"""
|
|
3395
|
+
if value is None:
|
|
3396
|
+
return False
|
|
3397
|
+
return bool(_ENV_VAR_RE.search(value))
|
|
3398
|
+
|
|
3399
|
+
|
|
3324
3400
|
#: Matches exactly what opencode's own ``OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX``
|
|
3325
3401
|
#: parser (#2321) accepts as a *string form* of a number: one or more ASCII
|
|
3326
3402
|
#: digits, nothing else — no sign, no decimal point, no whitespace, no
|
|
@@ -70,6 +70,13 @@ CONFLICT_FIX_DENY_COMMANDS = [
|
|
|
70
70
|
"Bash(gh *)",
|
|
71
71
|
"Bash(git push --force *)",
|
|
72
72
|
"Bash(git push -f *)",
|
|
73
|
+
# #2314: the two entries above only match `--force`/`-f` IMMEDIATELY
|
|
74
|
+
# after `push` — a `--force-with-lease` push (the sanctioned, allowed
|
|
75
|
+
# form, see this module's own guidance above) must stay clear, but
|
|
76
|
+
# `git push --quiet --force ...` / `git push --quiet -f ...` (the flag
|
|
77
|
+
# pushed after some other one) must not evade the ban either.
|
|
78
|
+
"Bash(git push * --force *)",
|
|
79
|
+
"Bash(git push * -f *)",
|
|
73
80
|
]
|
|
74
81
|
|
|
75
82
|
|