code-coordinator 0.5.93__tar.gz → 0.5.94__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.93 → code_coordinator-0.5.94}/PKG-INFO +1 -1
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/_common.py +72 -3
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/config.py +21 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_config.py +48 -0
- code_coordinator-0.5.94/tests/test_config_snapshot_noncanonical_2208.py +299 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_dist_name.py +8 -1
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_providers.py +39 -3
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_version_single_source.py +15 -4
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/.gitignore +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/CLAUDE.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/GOAL.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/LICENSE +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/MANIFEST.in +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/README.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/__init__.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/agent.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/audit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/block_log.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/board_service.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/brain.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/claim.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/cli.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/client.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/comments.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dao.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/db.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/deps.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/drive.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/events.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/filelock.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/freshness.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/gates.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/goal.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/context.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/models.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/render.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/health/units.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/hooks.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/interactive.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/models.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/network.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/notify.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/openapi.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/parentage.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/plans.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/progress.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/release_window.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/reports.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/review.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/smoke.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/split_work.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/state.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/test_author.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/test_report.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/usage.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/install-agent.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/pyproject.toml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/setup.cfg +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/__init__.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/conftest.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_db.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_events.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_init.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_models.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_network.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_review.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_session.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_split.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_state.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.93 → code_coordinator-0.5.94}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -529,6 +529,7 @@ tests/test_config.py
|
|
|
529
529
|
tests/test_config_acceptance.py
|
|
530
530
|
tests/test_config_audit.py
|
|
531
531
|
tests/test_config_pricing.py
|
|
532
|
+
tests/test_config_snapshot_noncanonical_2208.py
|
|
532
533
|
tests/test_config_usage_gate.py
|
|
533
534
|
tests/test_conflict_fix.py
|
|
534
535
|
tests/test_conflict_fix_semantic.py
|
{code_coordinator-0.5.93 → code_coordinator-0.5.94}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -559,6 +559,7 @@
|
|
|
559
559
|
"tests/test_config_acceptance.py",
|
|
560
560
|
"tests/test_config_audit.py",
|
|
561
561
|
"tests/test_config_pricing.py",
|
|
562
|
+
"tests/test_config_snapshot_noncanonical_2208.py",
|
|
562
563
|
"tests/test_config_usage_gate.py",
|
|
563
564
|
"tests/test_conflict_fix.py",
|
|
564
565
|
"tests/test_conflict_fix_semantic.py",
|
|
@@ -27,7 +27,13 @@ from typing import TYPE_CHECKING
|
|
|
27
27
|
|
|
28
28
|
import click
|
|
29
29
|
|
|
30
|
-
from coord.config import
|
|
30
|
+
from coord.config import (
|
|
31
|
+
Config,
|
|
32
|
+
ConfigError,
|
|
33
|
+
is_canonical_config_path,
|
|
34
|
+
load,
|
|
35
|
+
resolve_config_path,
|
|
36
|
+
)
|
|
31
37
|
|
|
32
38
|
if TYPE_CHECKING: # pragma: no cover — typing only
|
|
33
39
|
from collections.abc import Iterator
|
|
@@ -100,7 +106,55 @@ _CONFIG_OPTION = click.option(
|
|
|
100
106
|
)
|
|
101
107
|
|
|
102
108
|
|
|
103
|
-
def
|
|
109
|
+
def _note_withheld_snapshot(config: Config, config_path: Path) -> None:
|
|
110
|
+
"""Tell the operator that the #2208 guard just withheld a snapshot — but
|
|
111
|
+
only when withholding it actually changed the outcome.
|
|
112
|
+
|
|
113
|
+
Silence is what turned the original incident into an hour of
|
|
114
|
+
misdiagnosis: the fleet's ``machines`` table said ``ci-runner`` and
|
|
115
|
+
nothing anywhere said why. So when a non-canonical ``--config`` would
|
|
116
|
+
have *replaced a populated table with a different fleet* — the exact
|
|
117
|
+
shape of that incident — say so on stderr.
|
|
118
|
+
|
|
119
|
+
Everything else stays quiet, and that restraint is load-bearing rather
|
|
120
|
+
than cosmetic. ``--config <tmpfile>`` is the normal way to run coord
|
|
121
|
+
against a scratch config: CI stubs, the config *validator* in
|
|
122
|
+
``scripts/azure-workers/coordinator-machine.py``, and every one of this
|
|
123
|
+
repo's ~110 CLI test modules. Emitting a note on each of those would
|
|
124
|
+
have made the guard a per-invocation nag, and — because Click's
|
|
125
|
+
``CliRunner`` folds stderr into ``result.output`` — would have corrupted
|
|
126
|
+
the machine-readable stdout of commands like ``coord plans --json`` and
|
|
127
|
+
``coord scorecard --json`` for anyone parsing combined output.
|
|
128
|
+
|
|
129
|
+
A skip with nothing to clobber (empty table, or a table that already
|
|
130
|
+
matches) withheld nothing observable, so it warrants no words.
|
|
131
|
+
"""
|
|
132
|
+
try:
|
|
133
|
+
from coord.db import get_connection
|
|
134
|
+
conn = get_connection()
|
|
135
|
+
existing = [
|
|
136
|
+
str(row[0])
|
|
137
|
+
for row in conn.execute("SELECT name FROM machines ORDER BY name")
|
|
138
|
+
]
|
|
139
|
+
except Exception: # noqa: BLE001 — advisory only; never break the command
|
|
140
|
+
return
|
|
141
|
+
if not existing:
|
|
142
|
+
# Nothing to protect: no snapshot has ever landed here (a fresh
|
|
143
|
+
# host, or a CI runner whose DB only exists for this one command).
|
|
144
|
+
return
|
|
145
|
+
if existing == sorted(m.name for m in config.machines):
|
|
146
|
+
# The override names the same fleet — the write would have been a
|
|
147
|
+
# no-op, so the skip cost the operator nothing.
|
|
148
|
+
return
|
|
149
|
+
click.echo(
|
|
150
|
+
f"note: --config points at a non-canonical path ({config_path}); "
|
|
151
|
+
f"leaving the shared machines/pipeline snapshot untouched (#2208). "
|
|
152
|
+
f"Fleet machines on record: {', '.join(existing)}.",
|
|
153
|
+
err=True,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _save_config_snapshot(config: Config, config_path: Path | None = None) -> None:
|
|
104
158
|
"""Persist machine + pipeline metadata to the DB so dashboards can read it.
|
|
105
159
|
|
|
106
160
|
Writes:
|
|
@@ -111,6 +165,13 @@ def _save_config_snapshot(config: Config) -> None:
|
|
|
111
165
|
|
|
112
166
|
The pipeline keys let the TUI Pipeline panel pick up coordinator.yml
|
|
113
167
|
settings without having to parse YAML itself.
|
|
168
|
+
|
|
169
|
+
*config_path* is the file *config* was actually loaded from. When given
|
|
170
|
+
and it is not the canonical resolution (see
|
|
171
|
+
``coord.config.is_canonical_config_path``), the write is skipped
|
|
172
|
+
entirely — see the #2208 guard below. Callers that omit it (mainly
|
|
173
|
+
direct unit tests exercising the write itself) get the pre-#2208
|
|
174
|
+
behavior: always write.
|
|
114
175
|
"""
|
|
115
176
|
# #584: a thin client (board_service configured) must not create/write a
|
|
116
177
|
# local DB — the daemon/host owns the config snapshot. On the host
|
|
@@ -118,6 +179,14 @@ def _save_config_snapshot(config: Config) -> None:
|
|
|
118
179
|
from coord.client import resolve_board_service
|
|
119
180
|
if resolve_board_service() is not None:
|
|
120
181
|
return
|
|
182
|
+
# #2208: an explicit `--config <file>` pointed away from the fleet's real
|
|
183
|
+
# config (a scratch fixture, a CI-only stub) must not be treated as a
|
|
184
|
+
# request to redefine the shared `machines` table — that table is global
|
|
185
|
+
# state every client's `/board` and the TUI read, not something a single
|
|
186
|
+
# throwaway invocation should own.
|
|
187
|
+
if config_path is not None and not is_canonical_config_path(config_path):
|
|
188
|
+
_note_withheld_snapshot(config, config_path)
|
|
189
|
+
return
|
|
121
190
|
conn = None
|
|
122
191
|
try:
|
|
123
192
|
from coord.db import get_connection
|
|
@@ -270,7 +339,7 @@ def _load_config(path: Path | None) -> Config:
|
|
|
270
339
|
except ConfigError as e:
|
|
271
340
|
click.echo(f"error: {e}", err=True)
|
|
272
341
|
sys.exit(2)
|
|
273
|
-
_save_config_snapshot(cfg)
|
|
342
|
+
_save_config_snapshot(cfg, path)
|
|
274
343
|
return cfg
|
|
275
344
|
|
|
276
345
|
|
|
@@ -51,6 +51,27 @@ def resolve_config_path() -> Path:
|
|
|
51
51
|
return candidate
|
|
52
52
|
return USER_CONFIG_PATH
|
|
53
53
|
|
|
54
|
+
|
|
55
|
+
def is_canonical_config_path(path: Path) -> bool:
|
|
56
|
+
"""Whether *path* is what :func:`resolve_config_path` resolves to *right now*.
|
|
57
|
+
|
|
58
|
+
#2208: a coord command run with an explicit ``--config <file>`` pointed
|
|
59
|
+
somewhere other than the fleet's real config — a scratch fixture, a
|
|
60
|
+
CI-only stub someone wrote specifically so ``coord.config.load()`` has
|
|
61
|
+
something to parse — is not a request to redefine the fleet. This gates
|
|
62
|
+
the shared machines/pipeline DB snapshot (``_save_config_snapshot`` in
|
|
63
|
+
``coord/commands/_common.py``): only a *path* that matches the ordinary
|
|
64
|
+
resolution order ($COORD_CONFIG → ``~/.coord/coordinator.yml`` →
|
|
65
|
+
``./coordinator.yml``) counts as canonical and is allowed to overwrite
|
|
66
|
+
that shared table. An explicit ``--config`` that happens to name the
|
|
67
|
+
same file the default resolution would have picked still counts as
|
|
68
|
+
canonical — this only catches a genuine *override*.
|
|
69
|
+
"""
|
|
70
|
+
candidate = Path(path).expanduser().resolve()
|
|
71
|
+
canonical = resolve_config_path().expanduser().resolve()
|
|
72
|
+
return candidate == canonical
|
|
73
|
+
|
|
74
|
+
|
|
54
75
|
# Safety-by-default: repos without explicit worker_permissions get this deny-list.
|
|
55
76
|
DEFAULT_DENY_COMMANDS: list[str] = [
|
|
56
77
|
"Bash(gh *)",
|
|
@@ -498,6 +498,54 @@ def test_load_with_no_arg_resolves_default(tmp_path, monkeypatch) -> None:
|
|
|
498
498
|
assert [r.name for r in cfg.repos] == ["api"]
|
|
499
499
|
|
|
500
500
|
|
|
501
|
+
# ── is_canonical_config_path (#2208) ─────────────────────────────────────────
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def test_is_canonical_config_path_true_for_the_resolved_default(tmp_path, monkeypatch) -> None:
|
|
505
|
+
from coord import config as cfgmod
|
|
506
|
+
|
|
507
|
+
monkeypatch.delenv("COORD_CONFIG", raising=False)
|
|
508
|
+
home_cfg = tmp_path / "home.yml"
|
|
509
|
+
home_cfg.write_text("x")
|
|
510
|
+
monkeypatch.setattr(cfgmod, "USER_CONFIG_PATH", home_cfg)
|
|
511
|
+
monkeypatch.setattr(cfgmod, "DEFAULT_CONFIG_PATH", tmp_path / "absent-cwd.yml")
|
|
512
|
+
|
|
513
|
+
assert cfgmod.is_canonical_config_path(home_cfg) is True
|
|
514
|
+
# An equivalent (non-normalized) spelling of the same file still counts.
|
|
515
|
+
assert cfgmod.is_canonical_config_path(tmp_path / "." / "home.yml") is True
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
def test_is_canonical_config_path_false_for_a_scratch_override(tmp_path, monkeypatch) -> None:
|
|
519
|
+
"""#2208: a throwaway --config pointed elsewhere is NOT canonical, even
|
|
520
|
+
though coord.config.load() parses it fine."""
|
|
521
|
+
from coord import config as cfgmod
|
|
522
|
+
|
|
523
|
+
monkeypatch.delenv("COORD_CONFIG", raising=False)
|
|
524
|
+
home_cfg = tmp_path / "home.yml"
|
|
525
|
+
home_cfg.write_text("x")
|
|
526
|
+
monkeypatch.setattr(cfgmod, "USER_CONFIG_PATH", home_cfg)
|
|
527
|
+
monkeypatch.setattr(cfgmod, "DEFAULT_CONFIG_PATH", tmp_path / "absent-cwd.yml")
|
|
528
|
+
|
|
529
|
+
scratch = tmp_path / "mini2.yml"
|
|
530
|
+
scratch.write_text("machines:\n - name: ci-runner\n host: ci-runner\n")
|
|
531
|
+
|
|
532
|
+
assert cfgmod.is_canonical_config_path(scratch) is False
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
def test_is_canonical_config_path_respects_coord_config_env(tmp_path, monkeypatch) -> None:
|
|
536
|
+
"""When $COORD_CONFIG is set, THAT is the canonical path for this
|
|
537
|
+
environment — matching it counts as canonical, same as any other
|
|
538
|
+
ordinary (non-override) resolution."""
|
|
539
|
+
from coord import config as cfgmod
|
|
540
|
+
|
|
541
|
+
env_file = tmp_path / "env.yml"
|
|
542
|
+
env_file.write_text("x")
|
|
543
|
+
monkeypatch.setenv("COORD_CONFIG", str(env_file))
|
|
544
|
+
|
|
545
|
+
assert cfgmod.is_canonical_config_path(env_file) is True
|
|
546
|
+
assert cfgmod.is_canonical_config_path(tmp_path / "other.yml") is False
|
|
547
|
+
|
|
548
|
+
|
|
501
549
|
# ── PipelineConfig helpers ──────────────────────────────────────────────────
|
|
502
550
|
|
|
503
551
|
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"""#2208: `--config <scratch-file>` on the daemon host must not wipe the
|
|
2
|
+
shared ``machines`` table.
|
|
3
|
+
|
|
4
|
+
Root cause: ``_load_config`` always called ``_save_config_snapshot``, which
|
|
5
|
+
unconditionally ``DELETE FROM machines`` + re-inserts from whatever config was
|
|
6
|
+
just loaded — including a throwaway ``--config /tmp/mini2.yml`` a worker
|
|
7
|
+
pointed at purely so ``coord.config.load()`` had something to parse. The
|
|
8
|
+
#584 guard immediately above the ``DELETE`` only protects a *thin client*
|
|
9
|
+
(``board_service`` configured); it does nothing about a host-side invocation
|
|
10
|
+
carrying a non-canonical ``--config``, which is exactly the dangerous case:
|
|
11
|
+
on the daemon host that guard is inert and the write always lands.
|
|
12
|
+
|
|
13
|
+
Fix: ``_save_config_snapshot`` now takes the ``config_path`` the config was
|
|
14
|
+
actually loaded from and skips the write (emitting a one-line stderr note
|
|
15
|
+
instead of failing silently) unless that path is exactly what
|
|
16
|
+
``coord.config.resolve_config_path()`` resolves to on its own — i.e. unless
|
|
17
|
+
the caller did not actually override anything. This covers the acceptance
|
|
18
|
+
criteria verbatim:
|
|
19
|
+
|
|
20
|
+
1. ``--config <tmpfile>`` whose ``machines:`` differ from the canonical
|
|
21
|
+
config leaves the ``machines`` table unchanged (the exact regression).
|
|
22
|
+
2. The same command with the canonical config still snapshots normally.
|
|
23
|
+
3. A thin client still never writes (the #584 guard is preserved).
|
|
24
|
+
4. The ``machines`` table after a ``--config`` override still lists the
|
|
25
|
+
real fleet — a plain follow-up run (no override) repairs it either way.
|
|
26
|
+
|
|
27
|
+
The note is deliberately **scoped to skips that actually withheld a
|
|
28
|
+
change** (:func:`coord.commands._common._note_withheld_snapshot`). A first
|
|
29
|
+
cut printed it on every non-canonical ``--config``, which broke 21 tests
|
|
30
|
+
across this suite: ``--config <tmpfile>`` is how essentially every CLI test
|
|
31
|
+
here (and CI, and the config *validator* in
|
|
32
|
+
``scripts/azure-workers/coordinator-machine.py``) runs coord, and Click's
|
|
33
|
+
``CliRunner`` folds stderr into ``result.output`` — so a per-invocation nag
|
|
34
|
+
corrupted the machine-readable stdout of ``coord plans --json`` /
|
|
35
|
+
``coord scorecard --json`` for anyone parsing combined output.
|
|
36
|
+
``TestTheNoteIsScopedToConsequentialSkips`` below is the regression gate for
|
|
37
|
+
that.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from __future__ import annotations
|
|
41
|
+
|
|
42
|
+
from pathlib import Path
|
|
43
|
+
|
|
44
|
+
import pytest
|
|
45
|
+
from click.testing import CliRunner
|
|
46
|
+
|
|
47
|
+
from coord.cli import main
|
|
48
|
+
from coord.commands._common import _load_config, _save_config_snapshot
|
|
49
|
+
from coord.config import Config
|
|
50
|
+
from coord.models import Machine, Repo
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
REAL_FLEET_YAML = """\
|
|
54
|
+
repos:
|
|
55
|
+
- name: real-repo
|
|
56
|
+
github: acme/real-repo
|
|
57
|
+
machines:
|
|
58
|
+
- name: laptop
|
|
59
|
+
host: laptop.tailnet
|
|
60
|
+
capabilities: [python]
|
|
61
|
+
repos: [real-repo]
|
|
62
|
+
- name: server
|
|
63
|
+
host: server.tailnet
|
|
64
|
+
capabilities: [python, docker]
|
|
65
|
+
repos: [real-repo]
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
# Mirrors the issue's exact repro file (#2180's worker's /tmp/mini2.yml):
|
|
69
|
+
# just enough for coord.config.load() to parse, explicitly not a real
|
|
70
|
+
# fleet machine.
|
|
71
|
+
SCRATCH_YAML = """\
|
|
72
|
+
# Not a real fleet machine -- just enough for coord.config.load() to parse.
|
|
73
|
+
repos:
|
|
74
|
+
- name: scratch-repo
|
|
75
|
+
github: acme/scratch-repo
|
|
76
|
+
machines:
|
|
77
|
+
- name: ci-runner
|
|
78
|
+
host: ci-runner
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _real_fleet_config() -> Config:
|
|
83
|
+
return Config(
|
|
84
|
+
repos=[Repo(name="real-repo", github="acme/real-repo")],
|
|
85
|
+
machines=[
|
|
86
|
+
Machine(name="laptop", host="laptop.tailnet",
|
|
87
|
+
capabilities=["python"], repos=["real-repo"]),
|
|
88
|
+
Machine(name="server", host="server.tailnet",
|
|
89
|
+
capabilities=["python", "docker"], repos=["real-repo"]),
|
|
90
|
+
],
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@pytest.fixture
|
|
95
|
+
def canonical_config_path(tmp_path: Path, monkeypatch) -> Path:
|
|
96
|
+
"""Point ``resolve_config_path()``'s canonical home at a real-looking
|
|
97
|
+
fleet config, mirroring ``~/.coord/coordinator.yml`` on the daemon host.
|
|
98
|
+
"""
|
|
99
|
+
import coord.config as cfgmod
|
|
100
|
+
|
|
101
|
+
monkeypatch.delenv("COORD_CONFIG", raising=False)
|
|
102
|
+
p = tmp_path / "home-coordinator.yml"
|
|
103
|
+
p.write_text(REAL_FLEET_YAML)
|
|
104
|
+
monkeypatch.setattr(cfgmod, "USER_CONFIG_PATH", p)
|
|
105
|
+
monkeypatch.setattr(cfgmod, "DEFAULT_CONFIG_PATH", tmp_path / "absent-cwd-coordinator.yml")
|
|
106
|
+
return p
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@pytest.fixture
|
|
110
|
+
def scratch_config_path(tmp_path: Path) -> Path:
|
|
111
|
+
p = tmp_path / "mini2.yml"
|
|
112
|
+
p.write_text(SCRATCH_YAML)
|
|
113
|
+
return p
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _machine_names(coord_db) -> list[str]:
|
|
117
|
+
rows = coord_db.execute("SELECT name FROM machines ORDER BY name").fetchall()
|
|
118
|
+
return [r["name"] for r in rows]
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class TestNonCanonicalConfigLeavesMachinesUnchanged:
|
|
122
|
+
"""Acceptance criterion 1 (the exact regression): --config <tmpfile>
|
|
123
|
+
whose machines: differ from the canonical config leaves `machines`
|
|
124
|
+
unchanged. This must fail before the fix."""
|
|
125
|
+
|
|
126
|
+
def test_load_config_with_scratch_override_does_not_wipe_machines(
|
|
127
|
+
self, coord_db, canonical_config_path, scratch_config_path, capsys
|
|
128
|
+
):
|
|
129
|
+
# Seed the table with the real fleet, as if a prior `coord config`
|
|
130
|
+
# had already snapshotted it from the canonical file.
|
|
131
|
+
_save_config_snapshot(_real_fleet_config())
|
|
132
|
+
assert _machine_names(coord_db) == ["laptop", "server"]
|
|
133
|
+
|
|
134
|
+
cfg = _load_config(scratch_config_path)
|
|
135
|
+
|
|
136
|
+
# The scratch config parsed fine — that's its whole point...
|
|
137
|
+
assert [m.name for m in cfg.machines] == ["ci-runner"]
|
|
138
|
+
# ...but the shared table is untouched.
|
|
139
|
+
assert _machine_names(coord_db) == ["laptop", "server"]
|
|
140
|
+
|
|
141
|
+
err = capsys.readouterr().err
|
|
142
|
+
assert "non-canonical" in err
|
|
143
|
+
assert str(scratch_config_path) in err
|
|
144
|
+
# The note names the fleet it protected, so the operator does not
|
|
145
|
+
# have to go and ask the DB what it just declined to overwrite —
|
|
146
|
+
# silence about *that* is what cost an hour in the original
|
|
147
|
+
# incident.
|
|
148
|
+
assert "laptop, server" in err
|
|
149
|
+
|
|
150
|
+
def test_cli_config_command_with_scratch_override_does_not_wipe_machines(
|
|
151
|
+
self, coord_db, canonical_config_path, scratch_config_path
|
|
152
|
+
):
|
|
153
|
+
"""Mirrors the issue's exact repro: a `coord ... --config
|
|
154
|
+
/tmp/mini2.yml` invocation on the host must not clobber `machines`,
|
|
155
|
+
and /board would agree with `coord config`'s own parsed-config
|
|
156
|
+
output since neither touches the shared table here."""
|
|
157
|
+
_save_config_snapshot(_real_fleet_config())
|
|
158
|
+
|
|
159
|
+
runner = CliRunner()
|
|
160
|
+
result = runner.invoke(main, ["config", "--config", str(scratch_config_path)])
|
|
161
|
+
|
|
162
|
+
assert result.exit_code == 0, result.output
|
|
163
|
+
assert "ci-runner" in result.output # `coord config` itself is unaffected
|
|
164
|
+
assert _machine_names(coord_db) == ["laptop", "server"]
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class TestCanonicalConfigStillSnapshotsNormally:
|
|
168
|
+
"""Acceptance criterion 2: the same command with the canonical config
|
|
169
|
+
still snapshots normally."""
|
|
170
|
+
|
|
171
|
+
def test_load_config_with_explicit_canonical_path_snapshots(
|
|
172
|
+
self, coord_db, canonical_config_path
|
|
173
|
+
):
|
|
174
|
+
# Explicitly passing --config pointed at the very file the default
|
|
175
|
+
# resolution would have picked is NOT an override — it must still
|
|
176
|
+
# write.
|
|
177
|
+
cfg = _load_config(canonical_config_path)
|
|
178
|
+
assert [m.name for m in cfg.machines] == ["laptop", "server"]
|
|
179
|
+
assert _machine_names(coord_db) == ["laptop", "server"]
|
|
180
|
+
|
|
181
|
+
def test_load_config_with_no_override_snapshots(self, coord_db, canonical_config_path):
|
|
182
|
+
"""The default resolution path (no explicit --config at all) must
|
|
183
|
+
still write — this is what `coord config` on the daemon host relies
|
|
184
|
+
on to repair a wiped table per the issue's documented runbook."""
|
|
185
|
+
cfg = _load_config(None)
|
|
186
|
+
assert [m.name for m in cfg.machines] == ["laptop", "server"]
|
|
187
|
+
assert _machine_names(coord_db) == ["laptop", "server"]
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
class TestThinClientStillNeverWrites:
|
|
191
|
+
"""Acceptance criterion 3: a thin client still never writes (the #584
|
|
192
|
+
guard is preserved), independent of whether the resolved path looks
|
|
193
|
+
canonical."""
|
|
194
|
+
|
|
195
|
+
def test_thin_client_does_not_write_even_with_canonical_looking_path(
|
|
196
|
+
self, coord_db, canonical_config_path, monkeypatch
|
|
197
|
+
):
|
|
198
|
+
import coord.client as cc
|
|
199
|
+
|
|
200
|
+
monkeypatch.setattr(
|
|
201
|
+
cc, "resolve_board_service",
|
|
202
|
+
lambda *a, **k: cc.ServiceConfig("http://daemon:7435"),
|
|
203
|
+
)
|
|
204
|
+
monkeypatch.setattr(cc, "fetch_remote_config", lambda svc, **kw: canonical_config_path)
|
|
205
|
+
|
|
206
|
+
_load_config(canonical_config_path)
|
|
207
|
+
|
|
208
|
+
assert _machine_names(coord_db) == []
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class TestTheNoteIsScopedToConsequentialSkips:
|
|
212
|
+
"""The guard must be *silent* when the skip withheld nothing.
|
|
213
|
+
|
|
214
|
+
Regression gate for the first cut of this fix, which echoed the note on
|
|
215
|
+
every non-canonical ``--config`` and thereby broke 21 tests across this
|
|
216
|
+
suite — including every command that emits JSON, because Click's
|
|
217
|
+
``CliRunner`` folds stderr into ``result.output``.
|
|
218
|
+
"""
|
|
219
|
+
|
|
220
|
+
def test_no_note_when_the_machines_table_is_empty(
|
|
221
|
+
self, coord_db, canonical_config_path, scratch_config_path, capsys
|
|
222
|
+
):
|
|
223
|
+
"""A fresh host / CI runner has nothing to protect, so there is
|
|
224
|
+
nothing to say. This is the shape of ~110 CLI test modules here and
|
|
225
|
+
of every `coord ... --config` step in `.github/workflows/`."""
|
|
226
|
+
assert _machine_names(coord_db) == []
|
|
227
|
+
|
|
228
|
+
_load_config(scratch_config_path)
|
|
229
|
+
|
|
230
|
+
assert capsys.readouterr().err == ""
|
|
231
|
+
|
|
232
|
+
def test_no_note_when_the_override_names_the_same_fleet(
|
|
233
|
+
self, coord_db, canonical_config_path, tmp_path, capsys
|
|
234
|
+
):
|
|
235
|
+
"""The write would have been a no-op, so the skip cost nothing and
|
|
236
|
+
warrants no words."""
|
|
237
|
+
_save_config_snapshot(_real_fleet_config())
|
|
238
|
+
|
|
239
|
+
same_fleet = tmp_path / "copy-of-the-real-fleet.yml"
|
|
240
|
+
same_fleet.write_text(REAL_FLEET_YAML)
|
|
241
|
+
|
|
242
|
+
_load_config(same_fleet)
|
|
243
|
+
|
|
244
|
+
assert _machine_names(coord_db) == ["laptop", "server"]
|
|
245
|
+
assert capsys.readouterr().err == ""
|
|
246
|
+
|
|
247
|
+
def test_json_command_output_stays_parseable_under_an_override(
|
|
248
|
+
self, coord_db, canonical_config_path, scratch_config_path
|
|
249
|
+
):
|
|
250
|
+
"""The concrete breakage: `coord plans --json --config <tmpfile>`
|
|
251
|
+
must emit JSON and nothing else, even though `CliRunner` merges
|
|
252
|
+
stderr into `result.output`."""
|
|
253
|
+
import json
|
|
254
|
+
from unittest.mock import patch
|
|
255
|
+
|
|
256
|
+
with (
|
|
257
|
+
patch("coord.github_ops.get_repo_milestones", return_value=[]),
|
|
258
|
+
patch("coord.github_ops.get_open_issues", return_value=[]),
|
|
259
|
+
patch("coord.github_ops.get_closed_epics", return_value=[]),
|
|
260
|
+
):
|
|
261
|
+
result = CliRunner().invoke(
|
|
262
|
+
main, ["plans", "--json", "--config", str(scratch_config_path)]
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
assert result.exit_code == 0, result.output
|
|
266
|
+
assert json.loads(result.output) == []
|
|
267
|
+
|
|
268
|
+
def test_a_db_failure_never_breaks_the_command(
|
|
269
|
+
self, canonical_config_path, scratch_config_path, monkeypatch, capsys
|
|
270
|
+
):
|
|
271
|
+
"""The note is advisory. If the DB cannot be read at all, the guard
|
|
272
|
+
still skips the write and the command still succeeds."""
|
|
273
|
+
import coord.db as dbmod
|
|
274
|
+
|
|
275
|
+
def _boom():
|
|
276
|
+
raise RuntimeError("no database here")
|
|
277
|
+
|
|
278
|
+
monkeypatch.setattr(dbmod, "get_connection", _boom)
|
|
279
|
+
|
|
280
|
+
cfg = _load_config(scratch_config_path)
|
|
281
|
+
|
|
282
|
+
assert [m.name for m in cfg.machines] == ["ci-runner"]
|
|
283
|
+
assert capsys.readouterr().err == ""
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
class TestOverrideThenRepairRestoresRealFleet:
|
|
287
|
+
"""Acceptance criterion 4: the machines table after a --config override
|
|
288
|
+
still lists the real fleet, and a plain follow-up run agrees."""
|
|
289
|
+
|
|
290
|
+
def test_repair_after_override(self, coord_db, canonical_config_path, scratch_config_path):
|
|
291
|
+
_save_config_snapshot(_real_fleet_config())
|
|
292
|
+
|
|
293
|
+
_load_config(scratch_config_path) # the bogus override: now a no-op
|
|
294
|
+
assert _machine_names(coord_db) == ["laptop", "server"]
|
|
295
|
+
|
|
296
|
+
# Even if the table HAD been left stale, a plain `coord config` run
|
|
297
|
+
# (no override) repairs it from the canonical file.
|
|
298
|
+
_load_config(None)
|
|
299
|
+
assert _machine_names(coord_db) == ["laptop", "server"]
|
|
@@ -187,8 +187,15 @@ def _renamed_tagged_clone(tmp_path: Path, new_name: str, version: str) -> Path:
|
|
|
187
187
|
to `claude-coordinator` to model a not-yet-upgraded agent.
|
|
188
188
|
"""
|
|
189
189
|
clone = tmp_path / f"renamed_clone_{new_name}"
|
|
190
|
+
# `--no-hardlinks`: `git clone --local` hardlinks `.git/objects` by
|
|
191
|
+
# default, which dies with "Invalid cross-device link" whenever pytest's
|
|
192
|
+
# tmp_path (/tmp) and the checkout sit on different filesystems — the
|
|
193
|
+
# normal shape of a worker worktree under ~/.coord/worktrees on a box
|
|
194
|
+
# with a separate /home. Copying the objects costs a fraction of a
|
|
195
|
+
# second here and makes the test filesystem-layout independent.
|
|
190
196
|
result = _run(
|
|
191
|
-
["git", "clone", "--quiet", "--local", "--no-
|
|
197
|
+
["git", "clone", "--quiet", "--local", "--no-hardlinks", "--no-tags",
|
|
198
|
+
str(REPO_ROOT), str(clone)],
|
|
192
199
|
cwd=tmp_path,
|
|
193
200
|
)
|
|
194
201
|
assert result.returncode == 0, result.stderr
|
|
@@ -2259,6 +2259,37 @@ def _edit_tool_calls(events: list[dict]) -> list[dict]:
|
|
|
2259
2259
|
]
|
|
2260
2260
|
|
|
2261
2261
|
|
|
2262
|
+
def _require_attempt(events: list[dict], calls: list[dict], expectation: str) -> None:
|
|
2263
|
+
"""Skip (never fail) when the model refused to even ATTEMPT the
|
|
2264
|
+
forbidden call.
|
|
2265
|
+
|
|
2266
|
+
The DENY tests below prove opencode's *permission system* blocks a
|
|
2267
|
+
call — which requires the model to actually emit the tool_use event.
|
|
2268
|
+
work.md's own system-prompt text ALSO forbids the same actions, and a
|
|
2269
|
+
reasoning-capable free-tier model sometimes refuses in prose without
|
|
2270
|
+
ever calling a tool, e.g. (observed live, 2026-08-14, against the
|
|
2271
|
+
`gh --version` wording that was specifically chosen to avoid this):
|
|
2272
|
+
"I can't run that — my session rules explicitly prohibit running `gh`
|
|
2273
|
+
commands". That outcome exercised the *advisory*, not the enforcement
|
|
2274
|
+
under test; per ``_run_real_opencode_work``'s contract ("skips on any
|
|
2275
|
+
problem that isn't permission enforcement itself") it is skip
|
|
2276
|
+
territory, not a failure — no coord-side change can force a live model
|
|
2277
|
+
to attempt a call its instructions forbid, so a hard assert here is a
|
|
2278
|
+
coin-flip red on every branch (~2 in 4 local runs)."""
|
|
2279
|
+
if calls:
|
|
2280
|
+
return
|
|
2281
|
+
texts = " | ".join(
|
|
2282
|
+
e.get("part", {}).get("text", "")
|
|
2283
|
+
for e in events
|
|
2284
|
+
if e.get("type") == "text"
|
|
2285
|
+
).strip()
|
|
2286
|
+
pytest.skip(
|
|
2287
|
+
f"model never attempted {expectation} (no matching tool_use event) — "
|
|
2288
|
+
f"the system-prompt advisory preempted it, so permission enforcement "
|
|
2289
|
+
f"was not exercised this run; model said: {texts[:300]!r}"
|
|
2290
|
+
)
|
|
2291
|
+
|
|
2292
|
+
|
|
2262
2293
|
@_requires_real_opencode
|
|
2263
2294
|
def test_opencode_work_agent_blocks_gh_end_to_end(tmp_path: Path) -> None:
|
|
2264
2295
|
"""PROOF for capabilities().enforces_deny_list=True: a real `work`-agent
|
|
@@ -2279,6 +2310,11 @@ def test_opencode_work_agent_blocks_gh_end_to_end(tmp_path: Path) -> None:
|
|
|
2279
2310
|
GitHub interaction" to the model (verified: it reliably attempts it),
|
|
2280
2311
|
while still matching work.md's `"gh *": "deny"` pattern, which is
|
|
2281
2312
|
genuinely what's under test here.
|
|
2313
|
+
|
|
2314
|
+
"Reliably" decayed: by 2026-08-14 the live model refuses even
|
|
2315
|
+
`gh --version` on the advisory alone in roughly half of runs. When
|
|
2316
|
+
that happens there is no enforcement to observe — see
|
|
2317
|
+
``_require_attempt``, which skips instead of failing.
|
|
2282
2318
|
"""
|
|
2283
2319
|
repo = _init_oc_throwaway_repo(tmp_path)
|
|
2284
2320
|
events = _run_real_opencode_work(
|
|
@@ -2291,7 +2327,7 @@ def test_opencode_work_agent_blocks_gh_end_to_end(tmp_path: Path) -> None:
|
|
|
2291
2327
|
if e["part"].get("state", {}).get("input", {}).get("command", "").strip()
|
|
2292
2328
|
== "gh --version"
|
|
2293
2329
|
]
|
|
2294
|
-
|
|
2330
|
+
_require_attempt(events, gh_calls, "'gh --version' via bash")
|
|
2295
2331
|
for call in gh_calls:
|
|
2296
2332
|
state = call["part"]["state"]
|
|
2297
2333
|
assert state.get("status") == "error", f"gh call was not blocked: {call}"
|
|
@@ -2334,7 +2370,7 @@ def test_opencode_work_agent_blocks_external_directory_access_end_to_end(
|
|
|
2334
2370
|
if e.get("type") == "tool_use"
|
|
2335
2371
|
and str(victim) in json.dumps(e.get("part", {}).get("state", {}).get("input", {}))
|
|
2336
2372
|
]
|
|
2337
|
-
|
|
2373
|
+
_require_attempt(events, outside_calls, f"a tool call against {victim}")
|
|
2338
2374
|
for call in outside_calls:
|
|
2339
2375
|
assert call["part"]["state"].get("status") == "error", (
|
|
2340
2376
|
f"call against the external path was not blocked: {call}"
|
|
@@ -2363,7 +2399,7 @@ def test_opencode_work_agent_blocks_tests_acceptance_edit_end_to_end(
|
|
|
2363
2399
|
for e in edit_calls
|
|
2364
2400
|
if "tests/acceptance/" in e["part"].get("state", {}).get("input", {}).get("filePath", "")
|
|
2365
2401
|
]
|
|
2366
|
-
|
|
2402
|
+
_require_attempt(events, acceptance_edits, "the edit under tests/acceptance/")
|
|
2367
2403
|
for call in acceptance_edits:
|
|
2368
2404
|
assert call["part"]["state"].get("status") == "error", (
|
|
2369
2405
|
f"edit under tests/acceptance/ was not blocked: {call}"
|
|
@@ -342,10 +342,19 @@ def tagged_clone(tmp_path: Path) -> Path:
|
|
|
342
342
|
"""A throwaway local clone of this repo, cloned with no tags and then
|
|
343
343
|
given exactly one synthetic `v9.9.9` tag on HEAD — models a tagged
|
|
344
344
|
release checkout without depending on this repo's real (and
|
|
345
|
-
ever-changing) tag history.
|
|
345
|
+
ever-changing) tag history.
|
|
346
|
+
|
|
347
|
+
`--no-hardlinks`: `git clone --local` hardlinks `.git/objects` by
|
|
348
|
+
default, which fails with "Invalid cross-device link" whenever pytest's
|
|
349
|
+
tmp_path (/tmp) and the checkout live on different filesystems — the
|
|
350
|
+
normal shape of a worker worktree under ~/.coord/worktrees on a box with
|
|
351
|
+
a separate /home. Copying instead keeps this fixture independent of the
|
|
352
|
+
runner's disk layout.
|
|
353
|
+
"""
|
|
346
354
|
clone = tmp_path / "tagged_clone"
|
|
347
355
|
result = _run(
|
|
348
|
-
["git", "clone", "--quiet", "--local", "--no-
|
|
356
|
+
["git", "clone", "--quiet", "--local", "--no-hardlinks", "--no-tags",
|
|
357
|
+
str(REPO_ROOT), str(clone)],
|
|
349
358
|
cwd=tmp_path,
|
|
350
359
|
)
|
|
351
360
|
assert result.returncode == 0, result.stderr
|
|
@@ -357,10 +366,12 @@ def tagged_clone(tmp_path: Path) -> Path:
|
|
|
357
366
|
@pytest.fixture
|
|
358
367
|
def tagless_clone(tmp_path: Path) -> Path:
|
|
359
368
|
"""A throwaway local clone of this repo with no tags reachable at
|
|
360
|
-
all — models a shallow/tagless CI checkout.
|
|
369
|
+
all — models a shallow/tagless CI checkout. See `tagged_clone` for why
|
|
370
|
+
the clone is `--no-hardlinks`."""
|
|
361
371
|
clone = tmp_path / "tagless_clone"
|
|
362
372
|
result = _run(
|
|
363
|
-
["git", "clone", "--quiet", "--local", "--no-
|
|
373
|
+
["git", "clone", "--quiet", "--local", "--no-hardlinks", "--no-tags",
|
|
374
|
+
str(REPO_ROOT), str(clone)],
|
|
364
375
|
cwd=tmp_path,
|
|
365
376
|
)
|
|
366
377
|
assert result.returncode == 0, result.stderr
|