code-coordinator 0.5.119__tar.gz → 0.5.121__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.119 → code_coordinator-0.5.121}/PKG-INFO +1 -1
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/acceptance.py +47 -1
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/acceptance.py +10 -1
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/portal.py +78 -5
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/config.py +25 -0
- code_coordinator-0.5.121/coord/skills/portal-followup/SKILL.md +84 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_acceptance.py +45 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_portal.py +100 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_portal_config.py +20 -1
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.gitignore +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/CLAUDE.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/GOAL.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/LICENSE +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/MANIFEST.in +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/README.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/__init__.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agent.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/audit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/block_log.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/board_service.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/brain.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/claim.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/cli.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/client.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/comments.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dao.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/db.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deps.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/drive.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/events.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/filelock.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/freshness.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/gates.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/goal.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/context.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/models.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/render.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/units.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/hooks.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/interactive.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/models.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/network.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notify.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/openapi.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/parentage.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/plans.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/progress.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/release_window.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/reports.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/review.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/smoke.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/split_work.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/state.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/test_author.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/test_report.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/usage.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/install-agent.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/pyproject.toml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/setup.cfg +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/__init__.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/conftest.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_db.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_events.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_init.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_models.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_network.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_session.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_split.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_state.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.119 → code_coordinator-0.5.121}/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
|
|
@@ -361,7 +361,34 @@ def load_manifest(acceptance_root: Path) -> dict[str, int]:
|
|
|
361
361
|
return mapping
|
|
362
362
|
|
|
363
363
|
|
|
364
|
-
def
|
|
364
|
+
def _driver_kind_for_manifest_dir(ms_dir: Path) -> str | None:
|
|
365
|
+
"""Best-effort LOCAL driver-kind lookup for one ``ms-NN``/``issue-NN``
|
|
366
|
+
acceptance directory, via its ``mocks/`` file extensions
|
|
367
|
+
(:data:`MOCK_EXT_TO_DRIVER_KIND`) — the filesystem counterpart of
|
|
368
|
+
:func:`resolve_for_path`'s GitHub-backed lookup, for callers that
|
|
369
|
+
already have a local checkout and don't want a network round trip.
|
|
370
|
+
|
|
371
|
+
Returns ``None`` (unknown) rather than guessing when ``mocks/`` is
|
|
372
|
+
absent, empty, or its files imply more than one kind — callers MUST
|
|
373
|
+
treat ``None`` as "don't exclude", never as "safe to skip": this feeds
|
|
374
|
+
a hard-failure check (:func:`load_expected_red`), and silently
|
|
375
|
+
dropping a manifest because its kind couldn't be determined would hide
|
|
376
|
+
the exact class of bug that check exists to catch.
|
|
377
|
+
"""
|
|
378
|
+
mocks_dir = ms_dir / "mocks"
|
|
379
|
+
if not mocks_dir.is_dir():
|
|
380
|
+
return None
|
|
381
|
+
kinds = {
|
|
382
|
+
MOCK_EXT_TO_DRIVER_KIND[p.suffix]
|
|
383
|
+
for p in mocks_dir.iterdir()
|
|
384
|
+
if p.suffix in MOCK_EXT_TO_DRIVER_KIND
|
|
385
|
+
}
|
|
386
|
+
return next(iter(kinds)) if len(kinds) == 1 else None
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def load_expected_red(
|
|
390
|
+
acceptance_root: Path, *, driver_kind: str | None = None
|
|
391
|
+
) -> dict[str, int]:
|
|
365
392
|
"""Merge every ``ms-NN/manifest.(yml|json)``'s ``expected_red:`` block
|
|
366
393
|
under *acceptance_root* into one ``{test_id: issue_number}`` mapping
|
|
367
394
|
(#2164) — the flat shape :func:`apply_expected_red` and the ``coord
|
|
@@ -369,9 +396,28 @@ def load_expected_red(acceptance_root: Path) -> dict[str, int]:
|
|
|
369
396
|
|
|
370
397
|
Mirrors :func:`load_manifest`'s merge/empty-dict/last-writer-wins
|
|
371
398
|
conventions exactly, just reading ``expected_red`` instead of ``tests``.
|
|
399
|
+
|
|
400
|
+
*driver_kind* (#2339): when given, a manifest whose own directory
|
|
401
|
+
resolves (via :func:`_driver_kind_for_manifest_dir`) to a DIFFERENT
|
|
402
|
+
driver kind is skipped entirely. A repo routes different milestones to
|
|
403
|
+
different drivers (``coord/**`` -> cli-pytest, ``tui/**`` ->
|
|
404
|
+
tui-tuidriver, ...), but a single ``coord acceptance run --for-path X
|
|
405
|
+
--all`` invocation only ever executes ONE of them — before this
|
|
406
|
+
parameter existed, the merged registry always spanned every driver, so
|
|
407
|
+
every milestone's ``expected_red`` ids that belonged to a DIFFERENT
|
|
408
|
+
driver than the one actually running were reported as
|
|
409
|
+
``missing_expected_red_ids`` (a hard, un-waivable CI failure) on every
|
|
410
|
+
single run, for every repo with more than one routed driver kind, the
|
|
411
|
+
moment two milestones used different drivers. A directory whose kind
|
|
412
|
+
can't be determined (see above) is always included, matching the
|
|
413
|
+
unfiltered (``driver_kind=None``) behaviour this defaults to.
|
|
372
414
|
"""
|
|
373
415
|
mapping: dict[str, int] = {}
|
|
374
416
|
for path in _manifest_paths(acceptance_root):
|
|
417
|
+
if driver_kind is not None:
|
|
418
|
+
resolved = _driver_kind_for_manifest_dir(path.parent)
|
|
419
|
+
if resolved is not None and resolved != driver_kind:
|
|
420
|
+
continue
|
|
375
421
|
try:
|
|
376
422
|
data = parse_manifest_text(path.read_text(), source=str(path))
|
|
377
423
|
except OSError as e:
|
|
@@ -301,7 +301,16 @@ def acceptance_run(
|
|
|
301
301
|
)
|
|
302
302
|
|
|
303
303
|
if ci_mode:
|
|
304
|
-
expected_red
|
|
304
|
+
# #2339: scope the expected_red registry to milestones this run's
|
|
305
|
+
# OWN driver could actually produce results for — a routed repo's
|
|
306
|
+
# `--all --ci` used to merge every milestone's expected_red
|
|
307
|
+
# regardless of which driver `--for-path` resolved, so every OTHER
|
|
308
|
+
# driver's ids always came back `missing_expected_red_ids` (a hard
|
|
309
|
+
# CI failure) the moment the repo had more than one driver kind in
|
|
310
|
+
# use. See coord.acceptance.load_expected_red's docstring.
|
|
311
|
+
expected_red = load_expected_red(
|
|
312
|
+
cwd / ACCEPTANCE_DIRNAME, driver_kind=driver_cfg.kind,
|
|
313
|
+
)
|
|
305
314
|
verdict = apply_expected_red(verdict, set(expected_red))
|
|
306
315
|
click.echo(json.dumps(verdict, indent=2))
|
|
307
316
|
hard_failure = expected_red_failure_summary(verdict)
|
|
@@ -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)
|
|
@@ -3372,6 +3372,31 @@ def _expand_env_vars(value: str) -> str:
|
|
|
3372
3372
|
return _ENV_VAR_RE.sub(_replace, value)
|
|
3373
3373
|
|
|
3374
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
|
+
|
|
3375
3400
|
#: Matches exactly what opencode's own ``OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX``
|
|
3376
3401
|
#: parser (#2321) accepts as a *string form* of a number: one or more ASCII
|
|
3377
3402
|
#: digits, nothing else — no sign, no decimal point, no whitespace, no
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# portal-followup skill
|
|
2
|
+
|
|
3
|
+
**Trigger:** Investigating a customer-portal signoff/event that "hasn't shown up"
|
|
4
|
+
— a submission stuck on an old status, a customer event (e.g.
|
|
5
|
+
`signoff.approved`) that doesn't seem to have registered, or any troubleshooting
|
|
6
|
+
of `coord portal` state.
|
|
7
|
+
|
|
8
|
+
**Purpose:** Get a straight answer out of `coord portal outbox`/`events`/`sync`
|
|
9
|
+
without re-discovering #2336 the hard way — a normal-looking "nothing pending"
|
|
10
|
+
from these commands used to be indistinguishable from "the bridge genuinely has
|
|
11
|
+
nothing pending," because they read/write **the local machine's**
|
|
12
|
+
`~/.coord/coord.db` directly, and only the daemon host's copy is real.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## The one thing to know
|
|
17
|
+
|
|
18
|
+
`coord portal status` / `heartbeat` / `push` touch only the config + the portal
|
|
19
|
+
API — safe to run from anywhere.
|
|
20
|
+
|
|
21
|
+
`coord portal sync` / `outbox` / `events` / `enqueue-*` / `requeue` touch the
|
|
22
|
+
daemon's own `~/.coord/coord.db`. **Run them on the daemon host directly**
|
|
23
|
+
(`ssh <daemon-host>` first — check `~/.coord/client.toml`'s `board_service` for
|
|
24
|
+
which host that is, or ask `coord status` on this machine, which already routes
|
|
25
|
+
through it).
|
|
26
|
+
|
|
27
|
+
Since #2336, running one of these from a thin client (any machine with
|
|
28
|
+
`board_service` configured) no longer silently reads that machine's empty local
|
|
29
|
+
DB — it refuses outright:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Error: coord portal outbox must run on the daemon host (dellserver) — this
|
|
33
|
+
machine's ~/.coord/coord.db is not where the bridge lives (board_service is
|
|
34
|
+
configured in ~/.coord/client.toml, making this a thin client). Run it over
|
|
35
|
+
`ssh` on the daemon host instead. See coord/skills/portal-followup/SKILL.md.
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If you see that error, you have your answer: SSH to the named host and re-run
|
|
39
|
+
the same command there.
|
|
40
|
+
|
|
41
|
+
## Steps
|
|
42
|
+
|
|
43
|
+
1. **Identify the daemon host.** `cat ~/.coord/client.toml` (if present) shows
|
|
44
|
+
`board_service = "http://<host>:<port>"` — that host is where the real
|
|
45
|
+
`coord.db` lives. If this machine has no `client.toml` at all, it may *be*
|
|
46
|
+
the daemon host already; try the command locally first.
|
|
47
|
+
|
|
48
|
+
2. **Run the portal command on that host** (over `ssh`, or directly if you're
|
|
49
|
+
already on it):
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
ssh <daemon-host> 'coord portal outbox --all'
|
|
53
|
+
ssh <daemon-host> 'coord portal events'
|
|
54
|
+
ssh <daemon-host> 'coord portal sync --json'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
3. **Cross-check credentials separately if a push/heartbeat looks like a 401.**
|
|
58
|
+
`coord portal status --json` reports `credentials_set: false` whenever
|
|
59
|
+
`BRIDGE_CLIENT_ID`/`BRIDGE_CLIENT_SECRET` are unset in *this shell's*
|
|
60
|
+
environment, even if `coordinator.yml` has non-empty `${VAR}` strings for
|
|
61
|
+
them (#2336) — a bare interactive `ssh <host> '...'` does not source
|
|
62
|
+
`~/.coord/coord-serve.env`, but the actual `coord-serve` systemd unit does
|
|
63
|
+
via `EnvironmentFile=`. A 401 from a manual `ssh` + `coord portal heartbeat`
|
|
64
|
+
check does not necessarily mean the credential itself is bad — check
|
|
65
|
+
`credentials_set` first before assuming the secret rotated.
|
|
66
|
+
|
|
67
|
+
4. **If a submission's outbox row is `HELD`,** that's the #835 ordering guard
|
|
68
|
+
working as intended (announcing a status like `awaiting-signoff` before its
|
|
69
|
+
design round applied would email the customer toward an empty screen), not
|
|
70
|
+
a bug — resolve the blocking condition rather than trying to force the push.
|
|
71
|
+
|
|
72
|
+
5. **If a row is terminal (retired) after burning its retry budget,** fix the
|
|
73
|
+
underlying cause first, then `coord portal requeue <submission_id> <seq>`
|
|
74
|
+
(find the seq with `coord portal outbox --all`) — also a daemon-host command.
|
|
75
|
+
|
|
76
|
+
## Rules
|
|
77
|
+
|
|
78
|
+
- Never try to work around the "must run on the daemon host" error by editing
|
|
79
|
+
`~/.coord/client.toml` to unset `board_service` on a thin client — that
|
|
80
|
+
changes what *every other* `coord` command on that machine reads too, not
|
|
81
|
+
just `portal`.
|
|
82
|
+
- Prefer `coord portal enqueue-status`/`enqueue-design-round`/`enqueue-question`
|
|
83
|
+
over `coord portal push` for anything the customer will see — `push` bypasses
|
|
84
|
+
the #835 ordering guard entirely.
|
|
@@ -271,6 +271,51 @@ class TestLoadExpectedRed:
|
|
|
271
271
|
(root / "ms11" / "manifest.yml").write_text("tests:\n a: 554\n")
|
|
272
272
|
assert load_expected_red(root) == {}
|
|
273
273
|
|
|
274
|
+
def test_driver_kind_excludes_a_different_driver_milestone(
|
|
275
|
+
self, tmp_path: Path
|
|
276
|
+
) -> None:
|
|
277
|
+
# #2339: a repo routing coord/** -> cli-pytest and tui/** ->
|
|
278
|
+
# tui-tuidriver must not merge a tui-tuidriver milestone's
|
|
279
|
+
# expected_red into a cli-pytest run's registry (or vice versa) —
|
|
280
|
+
# the other driver can never produce those test-ids, so an unscoped
|
|
281
|
+
# merge always reported them `missing_expected_red_ids`, a hard CI
|
|
282
|
+
# failure on every run of every OTHER driver the moment two
|
|
283
|
+
# milestones used different drivers.
|
|
284
|
+
root = tmp_path / "tests" / "acceptance"
|
|
285
|
+
ms_tui = root / "ms65"
|
|
286
|
+
ms_tui.mkdir(parents=True)
|
|
287
|
+
(ms_tui / "manifest.yml").write_text("expected_red:\n 2282:\n - board_tabs_2282::a\n")
|
|
288
|
+
(ms_tui / "mocks").mkdir()
|
|
289
|
+
(ms_tui / "mocks" / "board.screen").write_text("mock")
|
|
290
|
+
|
|
291
|
+
ms_cli = root / "ms37"
|
|
292
|
+
ms_cli.mkdir(parents=True)
|
|
293
|
+
(ms_cli / "manifest.yml").write_text("expected_red:\n 1118:\n - test_x\n")
|
|
294
|
+
(ms_cli / "mocks").mkdir()
|
|
295
|
+
(ms_cli / "mocks" / "usage.out").write_text("mock")
|
|
296
|
+
|
|
297
|
+
assert load_expected_red(root, driver_kind="cli-pytest") == {"test_x": 1118}
|
|
298
|
+
assert load_expected_red(root, driver_kind="tui-tuidriver") == {
|
|
299
|
+
"board_tabs_2282::a": 2282
|
|
300
|
+
}
|
|
301
|
+
# Unfiltered (default) behaviour is unchanged — everything merges.
|
|
302
|
+
assert load_expected_red(root) == {"board_tabs_2282::a": 2282, "test_x": 1118}
|
|
303
|
+
|
|
304
|
+
def test_driver_kind_includes_a_milestone_with_no_mocks_dir(
|
|
305
|
+
self, tmp_path: Path
|
|
306
|
+
) -> None:
|
|
307
|
+
# A directory whose driver can't be determined (no mocks/, mixed
|
|
308
|
+
# kinds, ...) must never be silently dropped — "unknown" is not
|
|
309
|
+
# "safe to skip" for a hard-failure check.
|
|
310
|
+
root = tmp_path / "tests" / "acceptance"
|
|
311
|
+
(root / "issue-9").mkdir(parents=True)
|
|
312
|
+
(root / "issue-9" / "manifest.yml").write_text(
|
|
313
|
+
"expected_red:\n 9:\n - bare_bug_test\n"
|
|
314
|
+
)
|
|
315
|
+
assert load_expected_red(root, driver_kind="web-playwright") == {
|
|
316
|
+
"bare_bug_test": 9
|
|
317
|
+
}
|
|
318
|
+
|
|
274
319
|
|
|
275
320
|
class TestApplyExpectedRed:
|
|
276
321
|
def test_no_expected_red_ids_is_a_no_op(self) -> None:
|
|
@@ -34,6 +34,21 @@ DISABLED_CONFIG_YAML = textwrap.dedent("""
|
|
|
34
34
|
repos: [coord]
|
|
35
35
|
""")
|
|
36
36
|
|
|
37
|
+
ENV_VAR_CONFIG_YAML = textwrap.dedent("""
|
|
38
|
+
repos:
|
|
39
|
+
- name: coord
|
|
40
|
+
github: owner/coord
|
|
41
|
+
machines:
|
|
42
|
+
- name: dellserver
|
|
43
|
+
host: dellserver
|
|
44
|
+
repos: [coord]
|
|
45
|
+
portal:
|
|
46
|
+
enabled: true
|
|
47
|
+
base_url: https://intake.heurontech.com
|
|
48
|
+
bridge_client_id: ${BRIDGE_CLIENT_ID}
|
|
49
|
+
bridge_client_secret: ${BRIDGE_CLIENT_SECRET}
|
|
50
|
+
""")
|
|
51
|
+
|
|
37
52
|
|
|
38
53
|
@pytest.fixture
|
|
39
54
|
def config_path(tmp_path):
|
|
@@ -49,6 +64,19 @@ def disabled_config_path(tmp_path):
|
|
|
49
64
|
return str(path)
|
|
50
65
|
|
|
51
66
|
|
|
67
|
+
@pytest.fixture
|
|
68
|
+
def env_var_config_path(tmp_path, monkeypatch):
|
|
69
|
+
# #2336: BRIDGE_CLIENT_ID/BRIDGE_CLIENT_SECRET deliberately left unset in
|
|
70
|
+
# this shell — mirrors a manual `ssh dellserver` session that never
|
|
71
|
+
# sourced ~/.coord/coord-serve.env, unlike the coord-serve systemd unit's
|
|
72
|
+
# EnvironmentFile=.
|
|
73
|
+
monkeypatch.delenv("BRIDGE_CLIENT_ID", raising=False)
|
|
74
|
+
monkeypatch.delenv("BRIDGE_CLIENT_SECRET", raising=False)
|
|
75
|
+
path = tmp_path / "coordinator.yml"
|
|
76
|
+
path.write_text(ENV_VAR_CONFIG_YAML)
|
|
77
|
+
return str(path)
|
|
78
|
+
|
|
79
|
+
|
|
52
80
|
def run(*args):
|
|
53
81
|
return CliRunner().invoke(main, list(args))
|
|
54
82
|
|
|
@@ -82,6 +110,23 @@ def test_status_reports_enabled_and_credentials(config_path):
|
|
|
82
110
|
assert "credentials=set" in result.output
|
|
83
111
|
|
|
84
112
|
|
|
113
|
+
def test_status_reports_credentials_missing_for_unexpanded_env_var(env_var_config_path):
|
|
114
|
+
"""#2336: portal.bridge_client_id/secret are non-empty '${VAR}' strings,
|
|
115
|
+
but the env var was never set in this shell — credentials_set must be
|
|
116
|
+
false, not true just because the placeholder text itself is non-empty."""
|
|
117
|
+
result = run("portal", "status", "--config", env_var_config_path, "--json")
|
|
118
|
+
assert result.exit_code == 0, result.output
|
|
119
|
+
assert '"credentials_set": false' in result.output
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def test_status_reports_credentials_set_once_env_var_resolves(env_var_config_path, monkeypatch):
|
|
123
|
+
monkeypatch.setenv("BRIDGE_CLIENT_ID", "id-from-env")
|
|
124
|
+
monkeypatch.setenv("BRIDGE_CLIENT_SECRET", "secret-from-env")
|
|
125
|
+
result = run("portal", "status", "--config", env_var_config_path, "--json")
|
|
126
|
+
assert result.exit_code == 0, result.output
|
|
127
|
+
assert '"credentials_set": true' in result.output
|
|
128
|
+
|
|
129
|
+
|
|
85
130
|
def test_heartbeat_refuses_when_disabled(disabled_config_path):
|
|
86
131
|
result = run("portal", "heartbeat", "--config", disabled_config_path)
|
|
87
132
|
assert result.exit_code != 0
|
|
@@ -260,3 +305,58 @@ def test_requeue_reports_an_unknown_row_cleanly():
|
|
|
260
305
|
result = run("portal", "requeue", "sub_1", "1")
|
|
261
306
|
assert result.exit_code != 0
|
|
262
307
|
assert "no outbox row" in result.output
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
# ── #2336: state-touching commands refuse to run on a thin client ──────────
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
@pytest.fixture
|
|
314
|
+
def thin_client(monkeypatch):
|
|
315
|
+
"""Simulate running on a machine with board_service configured — i.e. a
|
|
316
|
+
thin client, per coord/client.py's resolve_board_service() bootstrap
|
|
317
|
+
contract (flag > env > ~/.coord/client.toml)."""
|
|
318
|
+
monkeypatch.setenv("COORD_SERVICE_URL", "http://dellserver:7435")
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
@pytest.mark.parametrize(
|
|
322
|
+
"args",
|
|
323
|
+
[
|
|
324
|
+
("portal", "sync"),
|
|
325
|
+
("portal", "outbox"),
|
|
326
|
+
("portal", "events"),
|
|
327
|
+
("portal", "enqueue-status", "sub_1", "shipped"),
|
|
328
|
+
("portal", "enqueue-design-round", "sub_1", "{}"),
|
|
329
|
+
("portal", "enqueue-question", "sub_1", "why?"),
|
|
330
|
+
("portal", "requeue", "sub_1", "1"),
|
|
331
|
+
],
|
|
332
|
+
)
|
|
333
|
+
def test_state_touching_commands_refuse_on_a_thin_client(thin_client, args):
|
|
334
|
+
result = run(*args)
|
|
335
|
+
assert result.exit_code != 0
|
|
336
|
+
assert "must run on the daemon host" in result.output
|
|
337
|
+
assert "dellserver" in result.output
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def test_status_heartbeat_and_push_do_not_call_the_thin_client_guard(thin_client):
|
|
341
|
+
"""status/heartbeat/push never touch the local DB, so they must not be
|
|
342
|
+
gated by the #2336 guard — only sync/outbox/events/enqueue-*/requeue call
|
|
343
|
+
_refuse_if_thin_client. (A full CLI invocation isn't used here: setting
|
|
344
|
+
COORD_SERVICE_URL also reroutes _load_config's own config fetch to the
|
|
345
|
+
daemon per #1080, which is unrelated to this guard and would make the
|
|
346
|
+
assertion about a network error rather than about this guard.)"""
|
|
347
|
+
import coord.commands.portal as portal_mod
|
|
348
|
+
|
|
349
|
+
calls = []
|
|
350
|
+
real_guard = portal_mod._refuse_if_thin_client
|
|
351
|
+
|
|
352
|
+
def _tracking_guard(cmd_name):
|
|
353
|
+
calls.append(cmd_name)
|
|
354
|
+
return real_guard(cmd_name)
|
|
355
|
+
|
|
356
|
+
portal_mod._refuse_if_thin_client = _tracking_guard
|
|
357
|
+
try:
|
|
358
|
+
result = run("portal", "heartbeat", "--config", "/does/not/exist.yml")
|
|
359
|
+
finally:
|
|
360
|
+
portal_mod._refuse_if_thin_client = real_guard
|
|
361
|
+
assert result.exit_code != 0 # fails for an unrelated reason (bad --config)
|
|
362
|
+
assert calls == []
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
6
|
|
|
7
|
-
from coord.config import ConfigError, PortalConfig, _parse_portal
|
|
7
|
+
from coord.config import ConfigError, PortalConfig, _parse_portal, has_unexpanded_env_var
|
|
8
8
|
|
|
9
9
|
BASE = {
|
|
10
10
|
"enabled": True,
|
|
@@ -119,6 +119,25 @@ def test_timeout_secs_must_be_a_number():
|
|
|
119
119
|
_parse_portal({**BASE, "timeout_secs": "soon"})
|
|
120
120
|
|
|
121
121
|
|
|
122
|
+
# ── #2336: has_unexpanded_env_var — the "did this actually resolve" check ──
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def test_has_unexpanded_env_var_true_for_a_placeholder_left_as_is():
|
|
126
|
+
assert has_unexpanded_env_var("${DEFINITELY_NOT_SET_XYZ}") is True
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def test_has_unexpanded_env_var_false_for_a_resolved_value():
|
|
130
|
+
assert has_unexpanded_env_var("id-from-env") is False
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def test_has_unexpanded_env_var_false_for_none():
|
|
134
|
+
assert has_unexpanded_env_var(None) is False
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def test_has_unexpanded_env_var_false_for_empty_string():
|
|
138
|
+
assert has_unexpanded_env_var("") is False
|
|
139
|
+
|
|
140
|
+
|
|
122
141
|
def test_max_retries_must_be_an_int_not_a_bool():
|
|
123
142
|
with pytest.raises(ConfigError, match="non-negative integer"):
|
|
124
143
|
_parse_portal({**BASE, "max_retries": True})
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|