code-coordinator 0.5.92__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.92 → code_coordinator-0.5.94}/PKG-INFO +1 -1
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/scm_file_list.json +2 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/_common.py +72 -3
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/release.py +32 -6
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/config.py +21 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/release_cordon.py +110 -7
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/release_propagate.py +8 -0
- {code_coordinator-0.5.92 → 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.92 → code_coordinator-0.5.94}/tests/test_dist_name.py +8 -1
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_providers.py +39 -3
- code_coordinator-0.5.94/tests/test_release_cordon_daemon_leads_2176.py +313 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_cordon_deadlock_2240.py +10 -2
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_verify.py +115 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_version_single_source.py +15 -4
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.gitignore +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/CLAUDE.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/GOAL.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/LICENSE +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/MANIFEST.in +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/README.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/__init__.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agent.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/audit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/block_log.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/board_service.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/brain.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/claim.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/cli.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/client.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/comments.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dao.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/db.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deps.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/drive.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/events.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/filelock.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/freshness.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/gates.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/goal.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/context.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/models.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/render.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/units.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/hooks.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/interactive.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/models.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/network.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notify.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/openapi.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/parentage.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/plans.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/progress.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/release_window.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/reports.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/review.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/smoke.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/split_work.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/state.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/test_author.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/test_report.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/usage.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/install-agent.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/pyproject.toml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/setup.cfg +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/__init__.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/conftest.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_db.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_events.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_init.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_models.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_network.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_session.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_split.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_state.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.92 → 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
|
|
@@ -676,6 +677,7 @@ tests/test_reconcile_merges.py
|
|
|
676
677
|
tests/test_reconcile_usage_limit_done.py
|
|
677
678
|
tests/test_refine_chat.py
|
|
678
679
|
tests/test_release_cordon_2101.py
|
|
680
|
+
tests/test_release_cordon_daemon_leads_2176.py
|
|
679
681
|
tests/test_release_cordon_deadlock_2240.py
|
|
680
682
|
tests/test_release_propagate.py
|
|
681
683
|
tests/test_release_unified_1242.py
|
{code_coordinator-0.5.92 → 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",
|
|
@@ -706,6 +707,7 @@
|
|
|
706
707
|
"tests/test_reconcile_usage_limit_done.py",
|
|
707
708
|
"tests/test_refine_chat.py",
|
|
708
709
|
"tests/test_release_cordon_2101.py",
|
|
710
|
+
"tests/test_release_cordon_daemon_leads_2176.py",
|
|
709
711
|
"tests/test_release_cordon_deadlock_2240.py",
|
|
710
712
|
"tests/test_release_propagate.py",
|
|
711
713
|
"tests/test_release_unified_1242.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
|
|
|
@@ -694,11 +694,25 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
694
694
|
)
|
|
695
695
|
current = rp.hosts_already_current(_lane_versions_by_host(before), record.target_version)
|
|
696
696
|
|
|
697
|
+
# #2176: resolved here, ahead of cordoning, so the cordon plan can honour
|
|
698
|
+
# the same daemon-leads invariant the roll itself is bound by (see below).
|
|
699
|
+
# Purely a derivation from data already in hand (`machine_health`) — this
|
|
700
|
+
# does not move the "unorderable fleet" REFUSAL, which stays below the
|
|
701
|
+
# deferral branch on purpose (see its own comment).
|
|
702
|
+
daemon_name = _daemon_machine_name(config, daemon_host_override, machine_health)
|
|
703
|
+
|
|
697
704
|
# ── 3b. cordon the hosts that are behind, so they DRAIN (#2101) ──────
|
|
698
705
|
#
|
|
699
706
|
# Before the deferral return below, on purpose: cordoning is the thing
|
|
700
707
|
# that turns "no window" into "a window in a few minutes". A run that
|
|
701
708
|
# defers without cordoning has changed nothing about why it deferred.
|
|
709
|
+
#
|
|
710
|
+
# #2176: a non-daemon host with no busy signal of its own is exempted
|
|
711
|
+
# while the daemon host is itself busy and behind — see `plan_cordons`'s
|
|
712
|
+
# `daemon_host` handling. It cannot roll ahead of a busy daemon host
|
|
713
|
+
# regardless of its own drain state (the daemon-leads invariant below),
|
|
714
|
+
# so cordoning it protects nothing and just spends fleet capacity for an
|
|
715
|
+
# unbounded wait.
|
|
702
716
|
record.cordons = _apply_cordons(
|
|
703
717
|
hosts=hosts,
|
|
704
718
|
report=before,
|
|
@@ -712,6 +726,7 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
712
726
|
state_dir=state_dir,
|
|
713
727
|
max_deferrals=cordon_max_deferrals,
|
|
714
728
|
release_cooldown=cordon_cooldown,
|
|
729
|
+
daemon_host=daemon_name,
|
|
715
730
|
)
|
|
716
731
|
|
|
717
732
|
if fully_busy and not force:
|
|
@@ -722,12 +737,12 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
722
737
|
# meets a fleet that is actually draining.
|
|
723
738
|
_finish(rp.STATUS_DEFERRED, 0)
|
|
724
739
|
|
|
725
|
-
# #2101:
|
|
726
|
-
# about the ORDER a roll happens in; a run that is going
|
|
727
|
-
# has no order to get wrong, and turning "the fleet is
|
|
728
|
-
# `failed` record (exit 1, systemd marks the unit failed)
|
|
729
|
-
# operator to ignore the one signal that matters.
|
|
730
|
-
daemon_name
|
|
740
|
+
# #2101: this refusal is checked AFTER the deferral above, deliberately.
|
|
741
|
+
# This refusal is about the ORDER a roll happens in; a run that is going
|
|
742
|
+
# to roll nothing has no order to get wrong, and turning "the fleet is
|
|
743
|
+
# busy" into a `failed` record (exit 1, systemd marks the unit failed)
|
|
744
|
+
# would teach an operator to ignore the one signal that matters.
|
|
745
|
+
# (`daemon_name` itself was resolved earlier, before cordoning — #2176.)
|
|
731
746
|
if daemon_name is None and len(hosts) > 1:
|
|
732
747
|
# #2052 fault 2: this used to warn and roll in coordinator.yml order.
|
|
733
748
|
# It then briefly put the daemon host BEHIND both its callers during a
|
|
@@ -1082,6 +1097,7 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
|
|
|
1082
1097
|
state_dir: Path | None = None,
|
|
1083
1098
|
max_deferrals: int | None = None,
|
|
1084
1099
|
release_cooldown: float | None = None,
|
|
1100
|
+
daemon_host: str | None = None,
|
|
1085
1101
|
) -> dict:
|
|
1086
1102
|
"""Plan and apply this run's cordons. Returns the journal fragment.
|
|
1087
1103
|
|
|
@@ -1090,6 +1106,13 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
|
|
|
1090
1106
|
Failing the whole propagation because the cordon could not be renewed
|
|
1091
1107
|
would make #2101's fix strictly worse than not having it.
|
|
1092
1108
|
|
|
1109
|
+
*daemon_host* (#2176) lets :func:`~coord.release_cordon.plan_cordons`
|
|
1110
|
+
exempt a non-daemon host with no busy signal of its own from cordoning
|
|
1111
|
+
while the daemon host is itself busy and behind — see that function's
|
|
1112
|
+
docstring for the reasoning. ``None`` (an unorderable fleet) disables
|
|
1113
|
+
the exemption and falls back to cordoning every behind host, same as
|
|
1114
|
+
before #2176.
|
|
1115
|
+
|
|
1093
1116
|
#2240: *state_dir* is where the propagation journal lives, and the journal
|
|
1094
1117
|
is where "how many runs in a row has this cordon now deferred?" is stored
|
|
1095
1118
|
— the process holding the answer in memory is restarted by the roll it is
|
|
@@ -1162,10 +1185,13 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
|
|
|
1162
1185
|
if release_cooldown is None
|
|
1163
1186
|
else release_cooldown
|
|
1164
1187
|
),
|
|
1188
|
+
daemon_host=daemon_host,
|
|
1165
1189
|
)
|
|
1166
1190
|
for line in plan.render():
|
|
1167
1191
|
click.echo(line)
|
|
1168
1192
|
outcome.cooling_seconds = plan.cooling_seconds
|
|
1193
|
+
outcome.collateral_spared = list(plan.collateral_spared)
|
|
1194
|
+
outcome.blocked_behind = plan.blocked_behind
|
|
1169
1195
|
if plan.released is not None:
|
|
1170
1196
|
outcome.released = plan.released.to_dict()
|
|
1171
1197
|
# stderr as well as stdout: on the timer host this line IS the
|
|
@@ -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 *)",
|
|
@@ -142,6 +142,35 @@ and #2082 is the cost of tolerating that. The threshold is a knob
|
|
|
142
142
|
(``coord release propagate --cordon-after N``) precisely so a future cadence
|
|
143
143
|
change does not need a code change. Trap F.
|
|
144
144
|
|
|
145
|
+
CORDON-EVERY-BEHIND-HOST DOES NOT COVER A HOST THAT CANNOT ROLL EITHER WAY
|
|
146
|
+
----------------------------------------------------------------------------
|
|
147
|
+
Observed 2026-08-13 00:18 UTC: one busy signal, on dellserver, and the fleet
|
|
148
|
+
cordoned all three machines anyway. elitebook and precision reported
|
|
149
|
+
``online • idle`` throughout and stayed cordoned — launch-blocked — for
|
|
150
|
+
34+ minutes, unable to accept the very review dispatch #2240 needed.
|
|
151
|
+
|
|
152
|
+
The cordon-every-behind-host rule above is correct for a host whose OWN
|
|
153
|
+
draining is what a run is waiting on: skip it and it never drains, and a run
|
|
154
|
+
that defers without cordoning defers again in 20 minutes for the same
|
|
155
|
+
reason. It does not cover a host that has no busy signal against it AND is
|
|
156
|
+
blocked from rolling by the daemon-leads invariant (see
|
|
157
|
+
:mod:`coord.release_propagate`'s LANE ORDER section) rather than by its own
|
|
158
|
+
work — nothing may roll ahead of a busy daemon host, so such a host cannot
|
|
159
|
+
roll regardless of how drained it gets. Cordoning it protects nothing: its
|
|
160
|
+
drained state cannot be consumed until the daemon host rolls first, which
|
|
161
|
+
may be unbounded (any drive on the daemon host reproduces this, not just a
|
|
162
|
+
wedged one).
|
|
163
|
+
|
|
164
|
+
:func:`plan_cordons`'s *daemon_host* parameter is the fix: while the daemon
|
|
165
|
+
host is itself busy and behind, only it (and any host with its own busy
|
|
166
|
+
signal) is cordoned. Everyone else stays uncordoned and dispatchable —
|
|
167
|
+
released immediately if a previous run already cordoned them — until the
|
|
168
|
+
daemon host becomes rollable, at which point ordinary drain-everyone-behind
|
|
169
|
+
resumes. :attr:`CordonPlan.collateral_spared` /
|
|
170
|
+
:attr:`CordonPlan.blocked_behind` name exactly who was spared and why, so
|
|
171
|
+
the next puzzle like this one is one line of output, not a 40-minute read of
|
|
172
|
+
`/board`.
|
|
173
|
+
|
|
145
174
|
PURITY
|
|
146
175
|
------
|
|
147
176
|
Nothing here reads the clock, the filesystem, the network or the DB — same
|
|
@@ -618,6 +647,17 @@ class CordonPlan:
|
|
|
618
647
|
#: recorded rather than silent, because "no cordons planned" and "cordons
|
|
619
648
|
#: suppressed on purpose" are the same output otherwise.
|
|
620
649
|
cooling_seconds: float = 0.0
|
|
650
|
+
#: #2176: behind hosts this run deliberately did NOT cordon (and, if
|
|
651
|
+
#: already cordoned, released) because they have no busy signal of their
|
|
652
|
+
#: own and cannot roll ahead of `blocked_behind` anyway. Reported
|
|
653
|
+
#: separately from `uncordon` (which is "proven current") so the journal
|
|
654
|
+
#: and CLI output can name them as collateral rather than as a drain that
|
|
655
|
+
#: completed.
|
|
656
|
+
collateral_spared: tuple[str, ...] = ()
|
|
657
|
+
#: #2176: the daemon host these hosts are spared on account of — set
|
|
658
|
+
#: exactly when `collateral_spared` is non-empty. The single fact that
|
|
659
|
+
#: would have turned a 40-minute puzzle into one line of output.
|
|
660
|
+
blocked_behind: str | None = None
|
|
621
661
|
|
|
622
662
|
@property
|
|
623
663
|
def empty(self) -> bool:
|
|
@@ -627,6 +667,7 @@ class CordonPlan:
|
|
|
627
667
|
or self.escalations
|
|
628
668
|
or self.expired
|
|
629
669
|
or self.released
|
|
670
|
+
or self.collateral_spared
|
|
630
671
|
)
|
|
631
672
|
|
|
632
673
|
def to_dict(self) -> dict:
|
|
@@ -638,6 +679,8 @@ class CordonPlan:
|
|
|
638
679
|
"unknown": list(self.unknown),
|
|
639
680
|
"released": self.released.to_dict() if self.released else None,
|
|
640
681
|
"cooling_seconds": self.cooling_seconds,
|
|
682
|
+
"collateral_spared": list(self.collateral_spared),
|
|
683
|
+
"blocked_behind": self.blocked_behind,
|
|
641
684
|
}
|
|
642
685
|
|
|
643
686
|
def render(self) -> list[str]:
|
|
@@ -645,6 +688,14 @@ class CordonPlan:
|
|
|
645
688
|
lines: list[str] = []
|
|
646
689
|
for item in self.cordon:
|
|
647
690
|
lines.append(f" ⊘ cordon {item.machine}: {item.describe()}")
|
|
691
|
+
if self.collateral_spared:
|
|
692
|
+
lines.append(
|
|
693
|
+
" · "
|
|
694
|
+
+ ", ".join(sorted(self.collateral_spared))
|
|
695
|
+
+ f": left uncordoned — blocked behind daemon host "
|
|
696
|
+
f"{self.blocked_behind} either way, cordoning would not help "
|
|
697
|
+
"(#2176)"
|
|
698
|
+
)
|
|
648
699
|
for name in self.uncordon:
|
|
649
700
|
lines.append(f" ✓ uncordon {name}: up to date, work may resume")
|
|
650
701
|
for name in self.expired:
|
|
@@ -748,12 +799,15 @@ def plan_cordons(
|
|
|
748
799
|
pressure: DeferralPressure | None = None,
|
|
749
800
|
max_deferrals: int = DEFAULT_MAX_DEFERRALS,
|
|
750
801
|
release_cooldown: float = DEFAULT_RELEASE_COOLDOWN_SECONDS,
|
|
802
|
+
daemon_host: str | None = None,
|
|
751
803
|
) -> CordonPlan:
|
|
752
804
|
"""Decide this run's cordon writes. Pure.
|
|
753
805
|
|
|
754
806
|
*existing* is the store as read (expired records included — this function
|
|
755
807
|
is what notices they lapsed). *busy_reasons* maps a host to why it is not
|
|
756
|
-
yet drained, purely so an escalation can say what is holding it
|
|
808
|
+
yet drained, purely so an escalation can say what is holding it — and
|
|
809
|
+
(#2176) so this function can tell a genuinely busy host from an idle one
|
|
810
|
+
when deciding who is collateral.
|
|
757
811
|
|
|
758
812
|
``enabled=False`` (``coord release propagate --no-cordon``) plans no new
|
|
759
813
|
cordons but STILL clears the ones this owner already set: turning the
|
|
@@ -772,6 +826,21 @@ def plan_cordons(
|
|
|
772
826
|
Proven-current hosts are uncordoned in every one of these branches: that
|
|
773
827
|
is never the wrong move, and skipping it during a cooldown would leave a
|
|
774
828
|
rolled host cordoned for the length of the cooldown.
|
|
829
|
+
|
|
830
|
+
*daemon_host* (#2176) is the machine `coord release propagate` will roll
|
|
831
|
+
first (see `coord.release_propagate`'s LANE ORDER section) — the
|
|
832
|
+
daemon-leads invariant means no OTHER host's python lane may roll ahead
|
|
833
|
+
of it while it is itself busy and behind. A behind host with no busy
|
|
834
|
+
signal of its own is therefore collateral, not protected, by a cordon
|
|
835
|
+
while that holds: it cannot roll either way, so draining it buys nothing
|
|
836
|
+
and just spends fleet capacity for a wait that is unbounded from its own
|
|
837
|
+
perspective (#2067 made quiescence per-host; this closes the cordon's
|
|
838
|
+
matching gap). Such a host is left uncordoned — and released immediately
|
|
839
|
+
if a previous run already cordoned it — until the daemon host is
|
|
840
|
+
rollable (quiescent, or already on the target), at which point ordinary
|
|
841
|
+
drain-everyone-behind resumes exactly as before #2176. A host that is
|
|
842
|
+
itself busy is cordoned regardless: its own drain is still the thing
|
|
843
|
+
being waited on, whatever the daemon host is doing.
|
|
775
844
|
"""
|
|
776
845
|
records = _as_records(existing)
|
|
777
846
|
live = {name: c for name, c in records.items() if c.active(now)}
|
|
@@ -782,11 +851,30 @@ def plan_cordons(
|
|
|
782
851
|
if not enabled:
|
|
783
852
|
return CordonPlan(uncordon=tuple(sorted(live)), expired=expired)
|
|
784
853
|
|
|
785
|
-
#
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
854
|
+
# ── #2176: who is collateral to a busy, behind daemon host ────────────
|
|
855
|
+
daemon_blocked = bool(
|
|
856
|
+
daemon_host
|
|
857
|
+
and (busy_reasons or {}).get(daemon_host)
|
|
858
|
+
and daemon_host not in drift.current
|
|
859
|
+
)
|
|
860
|
+
collateral = frozenset(
|
|
861
|
+
host
|
|
862
|
+
for host in drift.behind
|
|
863
|
+
if daemon_blocked and host != daemon_host and not (busy_reasons or {}).get(host)
|
|
864
|
+
)
|
|
865
|
+
blocked_behind = daemon_host if collateral else None
|
|
866
|
+
|
|
867
|
+
# Uncordon: PROVEN current, plus (#2176) any collateral host a previous
|
|
868
|
+
# run already cordoned — "spared" means dispatchable now, not "merely not
|
|
869
|
+
# renewed". A host whose version could not be read otherwise keeps
|
|
870
|
+
# whatever cordon it has until that cordon EXPIRES — clearing on "we
|
|
871
|
+
# couldn't read the version" would open the fleet up mid-roll on the
|
|
872
|
+
# strength of one failed HTTP call.
|
|
873
|
+
to_uncordon = tuple(
|
|
874
|
+
sorted(
|
|
875
|
+
{name for name in live if name in drift.current} | (collateral & set(live))
|
|
876
|
+
)
|
|
877
|
+
)
|
|
790
878
|
|
|
791
879
|
# ── #2240: the deadlock bound ────────────────────────────────────────
|
|
792
880
|
pressure = pressure or DeferralPressure()
|
|
@@ -797,6 +885,8 @@ def plan_cordons(
|
|
|
797
885
|
expired=expired,
|
|
798
886
|
cooling_seconds=cooling,
|
|
799
887
|
unknown=tuple(sorted(drift.undecided & set(live))),
|
|
888
|
+
collateral_spared=tuple(sorted(collateral)),
|
|
889
|
+
blocked_behind=blocked_behind,
|
|
800
890
|
)
|
|
801
891
|
if max_deferrals > 0 and pressure.consecutive >= max_deferrals:
|
|
802
892
|
return CordonPlan(
|
|
@@ -809,11 +899,13 @@ def plan_cordons(
|
|
|
809
899
|
cooldown_seconds=release_cooldown,
|
|
810
900
|
target_version=target_version,
|
|
811
901
|
),
|
|
902
|
+
collateral_spared=tuple(sorted(collateral)),
|
|
903
|
+
blocked_behind=blocked_behind,
|
|
812
904
|
)
|
|
813
905
|
|
|
814
906
|
to_cordon: list[Cordon] = []
|
|
815
907
|
escalations: list[DrainEscalation] = []
|
|
816
|
-
for host in sorted(drift.behind):
|
|
908
|
+
for host in sorted(drift.behind - collateral):
|
|
817
909
|
previous = live.get(host)
|
|
818
910
|
created = previous.created_at if previous and previous.created_at else now
|
|
819
911
|
to_cordon.append(
|
|
@@ -844,6 +936,8 @@ def plan_cordons(
|
|
|
844
936
|
escalations=tuple(escalations),
|
|
845
937
|
expired=expired,
|
|
846
938
|
unknown=tuple(sorted(drift.undecided & set(live))),
|
|
939
|
+
collateral_spared=tuple(sorted(collateral)),
|
|
940
|
+
blocked_behind=blocked_behind,
|
|
847
941
|
)
|
|
848
942
|
|
|
849
943
|
|
|
@@ -883,6 +977,13 @@ class CordonOutcome:
|
|
|
883
977
|
#: out of the newest record instead of every caller of
|
|
884
978
|
#: :func:`describe_deferral_pressure` assuming the default.
|
|
885
979
|
max_deferrals: int = DEFAULT_MAX_DEFERRALS
|
|
980
|
+
#: #2176: behind hosts this run spared (or actively released) because
|
|
981
|
+
#: they have no busy signal of their own and cannot roll ahead of a busy,
|
|
982
|
+
#: behind daemon host anyway. Mirrors `CordonPlan.collateral_spared`.
|
|
983
|
+
collateral_spared: list[str] = field(default_factory=list)
|
|
984
|
+
#: #2176: the daemon host `collateral_spared` was spared on account of.
|
|
985
|
+
#: Mirrors `CordonPlan.blocked_behind`.
|
|
986
|
+
blocked_behind: str | None = None
|
|
886
987
|
|
|
887
988
|
def to_dict(self) -> dict:
|
|
888
989
|
return {
|
|
@@ -896,4 +997,6 @@ class CordonOutcome:
|
|
|
896
997
|
"cooling_seconds": self.cooling_seconds,
|
|
897
998
|
"pressure": dict(self.pressure),
|
|
898
999
|
"max_deferrals": self.max_deferrals,
|
|
1000
|
+
"collateral_spared": list(self.collateral_spared),
|
|
1001
|
+
"blocked_behind": self.blocked_behind,
|
|
899
1002
|
}
|
|
@@ -1247,6 +1247,14 @@ def render_record(record: PropagationRecord | Mapping[str, Any]) -> list[str]:
|
|
|
1247
1247
|
)
|
|
1248
1248
|
if cordons.get("uncordoned"):
|
|
1249
1249
|
lines.append(" uncordoned: " + ", ".join(cordons["uncordoned"]))
|
|
1250
|
+
# #2176: name the collateral hosts AND the single host they're collateral
|
|
1251
|
+
# to — the fact that would have turned a 40-minute puzzle into one line.
|
|
1252
|
+
if cordons.get("collateral_spared"):
|
|
1253
|
+
lines.append(
|
|
1254
|
+
" spared (blocked behind daemon host "
|
|
1255
|
+
f"{cordons.get('blocked_behind')} anyway): "
|
|
1256
|
+
+ ", ".join(cordons["collateral_spared"])
|
|
1257
|
+
)
|
|
1250
1258
|
if cordons.get("expired"):
|
|
1251
1259
|
lines.append(
|
|
1252
1260
|
" cordons that lapsed on their own: " + ", ".join(cordons["expired"])
|
|
@@ -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
|
|