code-coordinator 0.5.64__tar.gz → 0.5.66__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.64 → code_coordinator-0.5.66}/PKG-INFO +1 -1
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/agent_app.py +16 -6
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/drive_queue.py +105 -4
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/release.py +107 -2
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy_units.py +92 -28
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/drive_queue.py +57 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/timer_active.py +13 -3
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/AGENT_OPERATIONS.md +23 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_deploy_units_endpoint.py +75 -6
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_drive_queue.py +112 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_release_propagate.py +215 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_deploy_units_lane.py +142 -13
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/.gitignore +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/CLAUDE.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/GOAL.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/LICENSE +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/MANIFEST.in +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/README.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/__init__.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/agent.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/audit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/board_service.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/brain.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/claim.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/cli.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/client.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/comments.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/config.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dao.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/db.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/deps.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/drive.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/events.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/filelock.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/freshness.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/gates.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/goal.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/context.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/models.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/render.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/health/units.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/hooks.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/interactive.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/models.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/network.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/notify.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/openapi.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/parentage.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/plans.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/progress.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/release_window.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/reports.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/review.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/smoke.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/split_work.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/state.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/test_author.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/test_report.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/usage.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/install-agent.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/pyproject.toml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/setup.cfg +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/__init__.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/conftest.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_config.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_db.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_events.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_init.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_models.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_network.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_review.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_session.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_split.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_state.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.64 → code_coordinator-0.5.66}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -1463,13 +1463,23 @@ def build_app(
|
|
|
1463
1463
|
installed, and keeps a ``.bak`` of each — see
|
|
1464
1464
|
:mod:`coord.deploy_units` for why both are deliberate.
|
|
1465
1465
|
|
|
1466
|
-
Also asserts every installed *timer* is enabled
|
|
1466
|
+
Also asserts every installed *timer* is enabled
|
|
1467
1467
|
(:func:`coord.deploy_units.enable_timers`, #2082): refreshing a
|
|
1468
1468
|
timer's content has never implied enabling it, and that gap is
|
|
1469
1469
|
exactly how ``coord-release-propagate.timer`` reached this host with
|
|
1470
1470
|
matching content and sat disabled for a day with nothing noticing.
|
|
1471
|
-
|
|
1472
|
-
|
|
1471
|
+
This runs on every non-dry-run call, not just when content changed —
|
|
1472
|
+
an already-enabled timer's *enablement* is untouched (idempotent).
|
|
1473
|
+
|
|
1474
|
+
It does **not**, as of #2124, force a start (``--now``) on a timer
|
|
1475
|
+
that is already enabled: that used to restart a timer an operator
|
|
1476
|
+
had deliberately stopped moments earlier — the exact window the
|
|
1477
|
+
documented manual-roll sequence exists to create — because ``enable
|
|
1478
|
+
--now`` cannot tell "never enabled" (#2082's actual bug) apart from
|
|
1479
|
+
"enabled, but stopped on purpose" (never a bug at all). See
|
|
1480
|
+
:func:`coord.deploy_units.enable_timers` for how it now tells the
|
|
1481
|
+
two apart, and ``timers_enabled[<unit>]["changed"]`` below for
|
|
1482
|
+
which case each timer landed in.
|
|
1473
1483
|
"""
|
|
1474
1484
|
from coord import deploy_units as du # noqa: PLC0415
|
|
1475
1485
|
from coord.brain import AGENT_PORT # noqa: PLC0415
|
|
@@ -1504,10 +1514,10 @@ def build_app(
|
|
|
1504
1514
|
if not dry_run:
|
|
1505
1515
|
timer_results = du.enable_timers(report)
|
|
1506
1516
|
payload["timers_enabled"] = {
|
|
1507
|
-
name: {"ok": ok, "detail": detail}
|
|
1508
|
-
for name, (ok, detail) in timer_results.items()
|
|
1517
|
+
name: {"ok": ok, "changed": changed, "detail": detail}
|
|
1518
|
+
for name, (ok, changed, detail) in timer_results.items()
|
|
1509
1519
|
}
|
|
1510
|
-
if any(not ok for ok,
|
|
1520
|
+
if any(not ok for ok, _changed, _detail in timer_results.values()):
|
|
1511
1521
|
payload["ok"] = False
|
|
1512
1522
|
return JSONResponse(payload, status_code=200 if payload.get("ok") else 500)
|
|
1513
1523
|
|
|
@@ -50,6 +50,7 @@ from coord.drive_queue import (
|
|
|
50
50
|
QUEUE_ALERT_STAGE,
|
|
51
51
|
RESUME_PROBE_TIMEOUT_SECONDS,
|
|
52
52
|
STATE_BLOCKED,
|
|
53
|
+
STATE_FAILED,
|
|
53
54
|
STATE_PARKED,
|
|
54
55
|
STATE_RUNNING,
|
|
55
56
|
STATE_WAITING,
|
|
@@ -59,8 +60,10 @@ from coord.drive_queue import (
|
|
|
59
60
|
QueueError,
|
|
60
61
|
TickPlan,
|
|
61
62
|
build_board_view,
|
|
63
|
+
diagnose_blocked_after,
|
|
62
64
|
entries_from_rows,
|
|
63
65
|
entry_key,
|
|
66
|
+
find_cycle,
|
|
64
67
|
fired_holds,
|
|
65
68
|
parse_after_spec,
|
|
66
69
|
parse_key,
|
|
@@ -300,6 +303,50 @@ def validate_config_repo(config_path: Path, repo: str) -> None:
|
|
|
300
303
|
|
|
301
304
|
# ── list ─────────────────────────────────────────────────────────────────────
|
|
302
305
|
|
|
306
|
+
# `blocked`/`failed` are the two states #2183's re-diagnosis applies to: both
|
|
307
|
+
# are in `TERMINAL_QUEUE_STATES` (the tick will never look at this row's
|
|
308
|
+
# `after=` graph again), so both are exactly where a stale `after=` reading
|
|
309
|
+
# can survive indefinitely. `done` is also terminal but carries no live
|
|
310
|
+
# "why is this stuck" question — nothing to re-diagnose.
|
|
311
|
+
_DIAGNOSABLE_STATES = (STATE_BLOCKED, STATE_FAILED)
|
|
312
|
+
|
|
313
|
+
# How much of a (possibly multi-line, possibly paragraph-length) `last_reason`
|
|
314
|
+
# fits on the summary row itself, next to `attempts=`/`deferrals=`, without
|
|
315
|
+
# wrapping a normal terminal. The FULL text always still prints on the `last:`
|
|
316
|
+
# continuation line right below — this is only the on-row teaser.
|
|
317
|
+
_ROW_CAUSE_MAX_CHARS = 88
|
|
318
|
+
|
|
319
|
+
_BLOCKED_REMEDY = (
|
|
320
|
+
"remedy: {state} is terminal — the queue will not re-check this row "
|
|
321
|
+
"on its own; `coord drive-queue remove` + `add` only helps once the "
|
|
322
|
+
"cause above is actually fixed, not merely because a pre-req merged"
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def _row_cause(reason: str) -> str:
|
|
327
|
+
"""The first line of *reason*, clipped to fit the summary row (#2183)."""
|
|
328
|
+
first_line = reason.strip().splitlines()[0] if reason.strip() else ""
|
|
329
|
+
if len(first_line) > _ROW_CAUSE_MAX_CHARS:
|
|
330
|
+
return first_line[: _ROW_CAUSE_MAX_CHARS - 1].rstrip() + "…"
|
|
331
|
+
return first_line
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def _board_for_list_diagnosis() -> BoardView | None:
|
|
335
|
+
"""The board, for `list`'s #2183 re-diagnosis — ``None`` when unreachable.
|
|
336
|
+
|
|
337
|
+
Unlike `tick`, `list` is a read-only inspection command an operator runs
|
|
338
|
+
often and expects to be fast and always available, so an unreachable
|
|
339
|
+
board must never make it fail or hang the way `tick`'s fail-closed abort
|
|
340
|
+
does. ``None`` here means "skip the re-diagnosis" — every row falls back
|
|
341
|
+
to exactly today's rendering (the `after=` list unfiltered, no cause on
|
|
342
|
+
the row itself), never a crash or a misleading empty board's worth of
|
|
343
|
+
"everything is unsatisfied".
|
|
344
|
+
"""
|
|
345
|
+
try:
|
|
346
|
+
return _fetch_board_view()
|
|
347
|
+
except Exception: # noqa: BLE001 — see docstring: this must never fail `list`
|
|
348
|
+
return None
|
|
349
|
+
|
|
303
350
|
|
|
304
351
|
@drive_queue_group.command("list")
|
|
305
352
|
@click.option("--repo", "repo", default=None, help="Restrict to one repo (default: every repo).")
|
|
@@ -317,12 +364,61 @@ def drive_queue_list(repo: str | None, output_json: bool, config_path: Path) ->
|
|
|
317
364
|
click.echo("(drive queue is empty)")
|
|
318
365
|
return
|
|
319
366
|
now = time.time()
|
|
320
|
-
|
|
321
|
-
|
|
367
|
+
entries = entries_from_rows(rows)
|
|
368
|
+
|
|
369
|
+
# #2183: a `blocked`/`failed` row's `after=` graph needs to be re-checked
|
|
370
|
+
# against the FULL queue (cross-repo pre-reqs), not just whatever `--repo`
|
|
371
|
+
# filtered down to — otherwise a `--repo` view would misdiagnose an
|
|
372
|
+
# out-of-repo pre-req as "unknown to the queue" purely from the filter,
|
|
373
|
+
# not from anything actually true.
|
|
374
|
+
all_entries = entries if repo is None else entries_from_rows(list_drive_queue())
|
|
375
|
+
# A row with no `after=` at all has nothing for #2183's re-diagnosis to
|
|
376
|
+
# do — criterion "entries with no after= are unaffected" — so both the
|
|
377
|
+
# board fetch and the per-row diagnosis below are gated on `entry.after`
|
|
378
|
+
# being non-empty, not just on the state being terminal.
|
|
379
|
+
needs_diagnosis = any(
|
|
380
|
+
e.state in _DIAGNOSABLE_STATES and e.after for e in entries
|
|
381
|
+
)
|
|
382
|
+
board = _board_for_list_diagnosis() if needs_diagnosis else None
|
|
383
|
+
states = {e.key: e.state for e in all_entries}
|
|
384
|
+
cycle_keys: dict[str, str] = {}
|
|
385
|
+
cycle = find_cycle({e.key: list(e.after) for e in all_entries})
|
|
386
|
+
if cycle is not None:
|
|
387
|
+
message = "dependency cycle: " + " -> ".join(cycle)
|
|
388
|
+
for key in cycle:
|
|
389
|
+
cycle_keys[key] = message
|
|
390
|
+
|
|
391
|
+
for entry in entries:
|
|
392
|
+
diagnosed = (
|
|
393
|
+
board is not None and entry.state in _DIAGNOSABLE_STATES and bool(entry.after)
|
|
394
|
+
)
|
|
395
|
+
unsatisfied = entry.after
|
|
396
|
+
dependency_reason = ""
|
|
397
|
+
if diagnosed:
|
|
398
|
+
diagnosis = diagnose_blocked_after(entry, board, states, cycle_keys)
|
|
399
|
+
unsatisfied = diagnosis.unsatisfied
|
|
400
|
+
dependency_reason = diagnosis.dependency_reason
|
|
401
|
+
|
|
402
|
+
# A diagnosed row whose block is NOT (or no longer) caused by its
|
|
403
|
+
# `after=` graph gets its own cause on the state token itself — #2183
|
|
404
|
+
# point 2: the terminal reason leads, not a dependency list that may
|
|
405
|
+
# have nothing to do with it. A row that IS dependency-caused (or
|
|
406
|
+
# wasn't diagnosed at all) keeps the plain state token unchanged.
|
|
407
|
+
state_label = entry.state
|
|
408
|
+
if diagnosed and not dependency_reason and entry.last_reason:
|
|
409
|
+
state_label = f"{entry.state}: {_row_cause(entry.last_reason)}"
|
|
410
|
+
|
|
411
|
+
bits = [f"{entry.position:>2} {entry.key:<28} {state_label}"]
|
|
322
412
|
if entry.machine:
|
|
323
413
|
bits.append(f"machine={entry.machine}")
|
|
324
|
-
|
|
325
|
-
|
|
414
|
+
# Suppress `after=` entirely on a diagnosed row that is NOT
|
|
415
|
+
# dependency-caused: every named pre-req is either satisfied or was
|
|
416
|
+
# never the reason this row is stuck, so showing it invites exactly
|
|
417
|
+
# the misreading #2183 exists to stop. Otherwise (not diagnosed, or
|
|
418
|
+
# genuinely dependency-caused) show whatever is still unsatisfied.
|
|
419
|
+
show_after = () if (diagnosed and not dependency_reason) else unsatisfied
|
|
420
|
+
if show_after:
|
|
421
|
+
bits.append(f"after={','.join(show_after)}")
|
|
326
422
|
if entry.attempts:
|
|
327
423
|
bits.append(f"attempts={entry.attempts}")
|
|
328
424
|
if entry.deferrals:
|
|
@@ -334,6 +430,11 @@ def drive_queue_list(repo: str | None, output_json: bool, config_path: Path) ->
|
|
|
334
430
|
click.echo(" ".join(bits))
|
|
335
431
|
if entry.last_reason:
|
|
336
432
|
click.echo(f" last{_reason_age_suffix(entry, now)}: {entry.last_reason}")
|
|
433
|
+
if diagnosed:
|
|
434
|
+
# #2183 point 4: `blocked`/`failed` is terminal — say so where the
|
|
435
|
+
# operator is already reading the row, not just in an unrelated
|
|
436
|
+
# operator's hand-written `--hold-after` note.
|
|
437
|
+
click.echo(f" {_BLOCKED_REMEDY.format(state=entry.state)}")
|
|
337
438
|
for line in _hold_lines(entry):
|
|
338
439
|
click.echo(line)
|
|
339
440
|
|
|
@@ -16,6 +16,7 @@ via setuptools-scm). It does not push, tag, or modify anything itself.
|
|
|
16
16
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
+
import re
|
|
19
20
|
import subprocess
|
|
20
21
|
import sys
|
|
21
22
|
from pathlib import Path
|
|
@@ -1339,7 +1340,26 @@ def _roll_units(machine, *, agent_port: int) -> tuple[bool | None, str]:
|
|
|
1339
1340
|
Returns ``ok=None`` when this host offers no channel for the lane at all
|
|
1340
1341
|
(see :func:`_roll_tui` and #2052): the run is not accountable for a lane
|
|
1341
1342
|
it was structurally unable to roll.
|
|
1343
|
+
|
|
1344
|
+
Also names every timer whose *enablement* state this call changed
|
|
1345
|
+
(#2124 item 3) — and, separately, every timer it deliberately left
|
|
1346
|
+
alone because it was already enabled (see
|
|
1347
|
+
:func:`coord.deploy_units.enable_timers`) — so "the queue came back
|
|
1348
|
+
mid-roll" (or, after this fix, "it didn't") is legible in this output
|
|
1349
|
+
rather than reconstructed afterwards from journal timestamps.
|
|
1350
|
+
|
|
1351
|
+
``ok`` (#2124 review) reflects every way ``agent_app.py``'s
|
|
1352
|
+
``deploy_units`` endpoint can fail, not just a failed timer: a unit
|
|
1353
|
+
whose install itself failed (``action == "failed"`` — e.g. an unreadable
|
|
1354
|
+
installed unit file, :mod:`coord.deploy_units` lines ~249/264/284), a
|
|
1355
|
+
top-level ``error``, or a ``daemon-reload`` that was attempted and
|
|
1356
|
+
failed. Before this check existed, ``ok`` was derived from
|
|
1357
|
+
``failed_timers`` alone, so any of those three could return HTTP 500
|
|
1358
|
+
with ``payload["ok"]=False`` and still be recorded here as a green
|
|
1359
|
+
lane — exactly the "unconfirmed success" defect #2096 exists to catch.
|
|
1342
1360
|
"""
|
|
1361
|
+
from coord.deploy_units import ACTION_FAILED # noqa: PLC0415
|
|
1362
|
+
|
|
1343
1363
|
status, body, error = _post(
|
|
1344
1364
|
f"http://{machine.host}:{agent_port}/deploy-units", {}, timeout=30.0
|
|
1345
1365
|
)
|
|
@@ -1352,11 +1372,24 @@ def _roll_units(machine, *, agent_port: int) -> tuple[bool | None, str]:
|
|
|
1352
1372
|
# gate to revert everything else this run got right (#2052).
|
|
1353
1373
|
return None, ("agent has no /deploy-units yet (predates #1835) — "
|
|
1354
1374
|
"the next propagation will roll this lane")
|
|
1355
|
-
|
|
1375
|
+
# The endpoint (`agent_app.py`'s `deploy_units`) returns HTTP 500 — with
|
|
1376
|
+
# the SAME body shape as 200 — whenever a daemon-reload or a single
|
|
1377
|
+
# timer's enablement fails. That is exactly the partial-failure path
|
|
1378
|
+
# this function exists to narrate in detail, so a 500 *with a `units`
|
|
1379
|
+
# body* must still be parsed below rather than treated as opaque. A 500
|
|
1380
|
+
# WITHOUT a `units` body is a different, genuinely-unexpected failure
|
|
1381
|
+
# (an unhandled exception, a proxy error, ...) and must still
|
|
1382
|
+
# short-circuit, or a real crash would be misread as "nothing to
|
|
1383
|
+
# report" / a false-positive success.
|
|
1384
|
+
if status != 200 and not (status == 500 and "units" in body):
|
|
1356
1385
|
return False, str(body.get("error") or body.get("summary") or f"HTTP {status}")
|
|
1357
1386
|
units = body.get("units") or []
|
|
1358
1387
|
changed = [u.get("name") for u in units if u.get("action") == "updated"]
|
|
1359
1388
|
new = [u.get("name") for u in units if u.get("action") == "new"]
|
|
1389
|
+
failed_units = {
|
|
1390
|
+
(u.get("name") or "?"): (u.get("detail") or "?")
|
|
1391
|
+
for u in units if u.get("action") == ACTION_FAILED
|
|
1392
|
+
}
|
|
1360
1393
|
parts = []
|
|
1361
1394
|
parts.append(f"{len(changed)} unit(s) refreshed" if changed else "units already current")
|
|
1362
1395
|
if body.get("reloaded"):
|
|
@@ -1366,7 +1399,79 @@ def _roll_units(machine, *, agent_port: int) -> tuple[bool | None, str]:
|
|
|
1366
1399
|
f"{len(new)} packaged unit(s) NOT installed here ({', '.join(sorted(map(str, new)))}) "
|
|
1367
1400
|
"— a release does not decide which services a host runs"
|
|
1368
1401
|
)
|
|
1369
|
-
|
|
1402
|
+
if failed_units:
|
|
1403
|
+
parts.append(
|
|
1404
|
+
"FAILED to install unit(s): "
|
|
1405
|
+
+ ", ".join(f"{u} ({detail})" for u, detail in sorted(failed_units.items()))
|
|
1406
|
+
)
|
|
1407
|
+
|
|
1408
|
+
# A daemon-reload is only attempted when a unit's bytes actually
|
|
1409
|
+
# changed (`agent_app.py`'s `deploy_units`); "not reloaded" is a
|
|
1410
|
+
# failure only when the report itself says a reload was attempted
|
|
1411
|
+
# (`body["changed"]`, `InstallReport.changed`) — absent that, "not
|
|
1412
|
+
# reloaded" just means there was nothing to reload, never a failure.
|
|
1413
|
+
reload_failed = bool(body.get("changed")) and not body.get("reloaded")
|
|
1414
|
+
if reload_failed:
|
|
1415
|
+
parts.append(
|
|
1416
|
+
"daemon-reload FAILED: " + str(body.get("reload_detail") or "?")
|
|
1417
|
+
)
|
|
1418
|
+
|
|
1419
|
+
top_level_error = body.get("error")
|
|
1420
|
+
if top_level_error:
|
|
1421
|
+
parts.append(f"deploy-units error: {top_level_error}")
|
|
1422
|
+
|
|
1423
|
+
timers = body.get("timers_enabled") or {}
|
|
1424
|
+
started = sorted(
|
|
1425
|
+
name for name, r in timers.items()
|
|
1426
|
+
if isinstance(r, dict) and r.get("ok") and r.get("changed")
|
|
1427
|
+
)
|
|
1428
|
+
# Held timers (confirmed already-enabled, left alone) split on the
|
|
1429
|
+
# confirmed `ActiveState` carried in `enable_timers`'s own detail text
|
|
1430
|
+
# (coord/deploy_units.py's `already enabled (ActiveState=...)` branch)
|
|
1431
|
+
# — NOT on `changed` alone, which is equally true for the #2124 case
|
|
1432
|
+
# (operator stopped it) and for the routine, overwhelmingly common case
|
|
1433
|
+
# of a timer that was never touched because it is already enabled AND
|
|
1434
|
+
# already running. Reporting "left stopped as-is" for the latter names
|
|
1435
|
+
# a state (stopped) this call never confirmed — the #2124 review's
|
|
1436
|
+
# reporting-accuracy fix.
|
|
1437
|
+
held_stopped = []
|
|
1438
|
+
held_other = []
|
|
1439
|
+
for name, r in timers.items():
|
|
1440
|
+
if not (isinstance(r, dict) and r.get("ok") and not r.get("changed")):
|
|
1441
|
+
continue
|
|
1442
|
+
match = re.search(r"ActiveState=(\w+)", r.get("detail") or "")
|
|
1443
|
+
if match and match.group(1) == "inactive":
|
|
1444
|
+
held_stopped.append(name)
|
|
1445
|
+
else:
|
|
1446
|
+
held_other.append(name)
|
|
1447
|
+
held_stopped.sort()
|
|
1448
|
+
held_other.sort()
|
|
1449
|
+
failed_timers = {
|
|
1450
|
+
name: (r.get("detail") or "?")
|
|
1451
|
+
for name, r in timers.items() if isinstance(r, dict) and not r.get("ok")
|
|
1452
|
+
}
|
|
1453
|
+
if started:
|
|
1454
|
+
parts.append(f"enabled timer(s): {', '.join(started)}")
|
|
1455
|
+
if held_stopped:
|
|
1456
|
+
# Confirmed inactive (ActiveState=inactive) and deliberately left
|
|
1457
|
+
# alone — the #2124 fix in one word: a timer an operator stopped is
|
|
1458
|
+
# still here.
|
|
1459
|
+
parts.append(
|
|
1460
|
+
f"left stopped as-is (already enabled, #2124): {', '.join(held_stopped)}"
|
|
1461
|
+
)
|
|
1462
|
+
if held_other:
|
|
1463
|
+
# Already enabled and left alone, but NOT confirmed stopped — most
|
|
1464
|
+
# commonly a timer that is already enabled and already running
|
|
1465
|
+
# normally. Reported distinctly so it never gets read as "the
|
|
1466
|
+
# timer I stopped is still stopped" for a timer nobody stopped.
|
|
1467
|
+
parts.append(f"already enabled (unchanged): {', '.join(held_other)}")
|
|
1468
|
+
if failed_timers:
|
|
1469
|
+
parts.append(
|
|
1470
|
+
"FAILED to enable timer(s): "
|
|
1471
|
+
+ ", ".join(f"{u} ({detail})" for u, detail in sorted(failed_timers.items()))
|
|
1472
|
+
)
|
|
1473
|
+
ok = not (failed_units or reload_failed or top_level_error or failed_timers)
|
|
1474
|
+
return ok, "; ".join(parts)
|
|
1370
1475
|
|
|
1371
1476
|
|
|
1372
1477
|
def _roll_tui(
|
|
@@ -65,6 +65,13 @@ from coord.health.checks.unit_drift import (
|
|
|
65
65
|
packaged_unit_dir,
|
|
66
66
|
)
|
|
67
67
|
|
|
68
|
+
# Same reuse rule as above, one module over: `timer_active` is the DETECTOR
|
|
69
|
+
# for "is this timer actually enabled" (#2082); `enable_timers` below is the
|
|
70
|
+
# FIXER for the identical question (#2124). Querying state through its own
|
|
71
|
+
# `_timer_states` — rather than a second `systemctl --user show` parser here
|
|
72
|
+
# — is what keeps those two answers from being able to drift apart.
|
|
73
|
+
from coord.health.checks.timer_active import _INACTIVE_STATES, _timer_states
|
|
74
|
+
|
|
68
75
|
#: Placeholder -> how to fill it, given the host facts we actually know.
|
|
69
76
|
#: ``unit_drift`` renders these as *shell* text for a copy-pasteable remedy
|
|
70
77
|
#: (``$(hostname -s)``); here they must be real values, so the mapping is
|
|
@@ -326,45 +333,102 @@ _PRESENT_ACTIONS = frozenset({ACTION_UNCHANGED, ACTION_UPDATED})
|
|
|
326
333
|
|
|
327
334
|
def enable_timers(
|
|
328
335
|
report: InstallReport, *, runner=None, timeout: float = 30.0,
|
|
329
|
-
) -> dict[str, tuple[bool, str]]:
|
|
330
|
-
"""
|
|
331
|
-
*
|
|
336
|
+
) -> dict[str, tuple[bool, bool, str]]:
|
|
337
|
+
"""Assert every installed timer in *report* is *enabled* (#2082) —
|
|
338
|
+
without forcing a *stopped* one back to running (#2124).
|
|
332
339
|
|
|
333
340
|
#2082: ``coord-release-propagate.timer`` reached three hosts'
|
|
334
341
|
``~/.config/systemd/user/`` and sat there — :func:`install_units`
|
|
335
342
|
refreshed its *content* on every release, but nothing ever ran
|
|
336
|
-
``
|
|
337
|
-
file looks byte-for-byte identical to an active one's
|
|
338
|
-
:mod:`coord.health.checks.timer_active`, the detector for exactly
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
343
|
+
``systemctl --user enable`` on it, and nothing noticed because a
|
|
344
|
+
disabled timer's file looks byte-for-byte identical to an active one's
|
|
345
|
+
(see :mod:`coord.health.checks.timer_active`, the detector for exactly
|
|
346
|
+
this). The fix that shipped for #2082 was ``enable --now`` on every
|
|
347
|
+
installed timer, every deploy — and ``--now`` is the collision #2124
|
|
348
|
+
reports: it also **starts** a timer an operator deliberately stopped,
|
|
349
|
+
five minutes earlier, to create the very quiescence window the deploy
|
|
350
|
+
calling this function is running inside of. The daemon host rolls
|
|
351
|
+
first, so that operator's window closes mid-roll, not after it.
|
|
352
|
+
|
|
353
|
+
#2082 and #2124 turn out to be two different questions systemd already
|
|
354
|
+
answers separately, and this function's whole fix is asking the right
|
|
355
|
+
one of them *first*:
|
|
356
|
+
|
|
357
|
+
* **Persistent enablement** (``UnitFileState`` — ``enabled`` vs.
|
|
358
|
+
``disabled``/``linked``/``masked``, :data:`_INACTIVE_STATES`) is what
|
|
359
|
+
#2082 was actually missing. It is a one-time fact that only becomes
|
|
360
|
+
false again if something explicitly disables the unit — ``systemctl
|
|
361
|
+
--user stop`` never touches it.
|
|
362
|
+
* **Current run state** (``ActiveState``) is what an operator's
|
|
363
|
+
deliberate ``stop`` changes, and it is *never* this function's business
|
|
364
|
+
to override: a timer already carrying ``UnitFileState=enabled`` has
|
|
365
|
+
already had its #2082 assertion satisfied by some earlier deploy (or
|
|
366
|
+
this one), so nothing here re-starts it. ``enable`` alone is not even
|
|
367
|
+
called in that case — no subprocess invocation touches the unit at
|
|
368
|
+
all, so there is no risk of this idempotent-by-design call itself
|
|
369
|
+
having a side effect an operator did not ask for.
|
|
370
|
+
|
|
371
|
+
So: a timer whose queried ``UnitFileState`` is *not* one of
|
|
372
|
+
:data:`_INACTIVE_STATES` is left completely alone, whatever its
|
|
373
|
+
``ActiveState`` — that is the acceptance case "a timer stopped by an
|
|
374
|
+
operator is still down after a deploy". A timer that *is* in one of
|
|
375
|
+
those states (never enabled at all, or masked) is the actual #2082
|
|
376
|
+
defect and gets ``enable --now`` exactly as before — there is no
|
|
377
|
+
operator intent to preserve for a timer that has never run, and leaving
|
|
378
|
+
it disabled is the invisible-self-heals-never failure #2082 closed.
|
|
379
|
+
|
|
380
|
+
State is queried once, in a single batched ``systemctl --user show``
|
|
381
|
+
(:func:`coord.health.checks.timer_active._timer_states` — the same
|
|
382
|
+
query the detector itself uses, so the detector and this fixer cannot
|
|
383
|
+
silently disagree about what "enabled" means), scoped to units *this*
|
|
384
|
+
report found actually installed (:data:`_PRESENT_ACTIONS`), matching the
|
|
385
|
+
deploy step's own "only touch what this host already runs" rule.
|
|
386
|
+
|
|
387
|
+
Returns ``{unit: (ok, changed, detail)}``. ``changed`` is true only when
|
|
388
|
+
this call is confirmed to have moved the unit's state — never true for
|
|
389
|
+
the "already enabled, left alone" branch (no subprocess call was made to
|
|
390
|
+
confirm anything), and never true for a failed ``enable --now`` either
|
|
391
|
+
(an attempt that failed is not a confirmed change) — the deploy's
|
|
392
|
+
caller uses this to name, precisely, which timers it actually touched
|
|
393
|
+
(#2124 item 3) rather than reporting a state it did not confirm.
|
|
357
394
|
"""
|
|
358
395
|
import subprocess # noqa: PLC0415
|
|
359
396
|
|
|
360
397
|
run = runner or subprocess.run
|
|
361
|
-
out: dict[str, tuple[bool, str]] = {}
|
|
398
|
+
out: dict[str, tuple[bool, bool, str]] = {}
|
|
362
399
|
timers = sorted(
|
|
363
400
|
u.name
|
|
364
401
|
for u in report.units
|
|
365
402
|
if u.name.endswith(".timer") and u.action in _PRESENT_ACTIONS
|
|
366
403
|
)
|
|
404
|
+
if not timers:
|
|
405
|
+
return out
|
|
406
|
+
|
|
407
|
+
states = _timer_states(tuple(timers), runner=run, timeout=timeout)
|
|
408
|
+
|
|
367
409
|
for name in timers:
|
|
410
|
+
fields = states.get(name) or {}
|
|
411
|
+
file_state = fields.get("UnitFileState", "")
|
|
412
|
+
if file_state and file_state not in _INACTIVE_STATES:
|
|
413
|
+
# Already enabled (#2082's assertion already holds for this
|
|
414
|
+
# unit) — leave its run state exactly as it is. No systemctl
|
|
415
|
+
# call at all, so the report below can only ever say what was
|
|
416
|
+
# actually queried, never what this call assumed.
|
|
417
|
+
active = fields.get("ActiveState") or "unknown"
|
|
418
|
+
out[name] = (
|
|
419
|
+
True,
|
|
420
|
+
False,
|
|
421
|
+
f"already enabled (ActiveState={active}) — left its current "
|
|
422
|
+
"run state alone; a timer an operator stopped stays stopped "
|
|
423
|
+
"across a deploy (#2124)",
|
|
424
|
+
)
|
|
425
|
+
continue
|
|
426
|
+
|
|
427
|
+
# Never enabled at all — disabled/linked/masked, or unreadable (no
|
|
428
|
+
# systemd, or the batched query above failed and this unit simply
|
|
429
|
+
# has no entry). This is the actual #2082 defect: no operator ever
|
|
430
|
+
# ran `stop` on a timer that was never running, so forcing a start
|
|
431
|
+
# here has no operator intent to override.
|
|
368
432
|
try:
|
|
369
433
|
proc = run(
|
|
370
434
|
["systemctl", "--user", "enable", "--now", name],
|
|
@@ -373,12 +437,12 @@ def enable_timers(
|
|
|
373
437
|
timeout=timeout,
|
|
374
438
|
)
|
|
375
439
|
except FileNotFoundError:
|
|
376
|
-
out[name] = (False, "systemctl not found (no systemd on this host)")
|
|
440
|
+
out[name] = (False, False, "systemctl not found (no systemd on this host)")
|
|
377
441
|
continue
|
|
378
442
|
except Exception as exc: # noqa: BLE001 — must never crash a deploy
|
|
379
|
-
out[name] = (False, f"{type(exc).__name__}: {exc}")
|
|
443
|
+
out[name] = (False, False, f"{type(exc).__name__}: {exc}")
|
|
380
444
|
continue
|
|
381
445
|
ok = getattr(proc, "returncode", 1) == 0
|
|
382
446
|
detail = (getattr(proc, "stderr", "") or getattr(proc, "stdout", "") or "").strip()
|
|
383
|
-
out[name] = (ok, detail or ("enabled" if ok else "enable failed"))
|
|
447
|
+
out[name] = (ok, ok, detail or ("enabled" if ok else "enable failed"))
|
|
384
448
|
return out
|
|
@@ -1182,6 +1182,63 @@ def _resolve_prereqs(
|
|
|
1182
1182
|
return _Verdict(True)
|
|
1183
1183
|
|
|
1184
1184
|
|
|
1185
|
+
@dataclass(frozen=True)
|
|
1186
|
+
class BlockedAfterDiagnosis:
|
|
1187
|
+
"""How #2183's rendering should treat a terminal row's `after=` graph.
|
|
1188
|
+
|
|
1189
|
+
``unsatisfied`` is *entry*'s declared ``after=`` list with every
|
|
1190
|
+
now-landed pre-req dropped. ``dependency_reason`` is the CURRENT
|
|
1191
|
+
``_resolve_prereqs`` verdict against that same graph — ``''`` when the
|
|
1192
|
+
graph is not (or no longer) why the entry is stuck.
|
|
1193
|
+
"""
|
|
1194
|
+
|
|
1195
|
+
unsatisfied: tuple[str, ...] = ()
|
|
1196
|
+
dependency_reason: str = ""
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
def diagnose_blocked_after(
|
|
1200
|
+
entry: QueueEntry,
|
|
1201
|
+
board: BoardView,
|
|
1202
|
+
states: Mapping[str, str],
|
|
1203
|
+
cycle_keys: Mapping[str, str],
|
|
1204
|
+
) -> BlockedAfterDiagnosis:
|
|
1205
|
+
"""Re-check a `blocked`/`failed` row's `after=` graph against the CURRENT
|
|
1206
|
+
board, fresh on every render (#2183).
|
|
1207
|
+
|
|
1208
|
+
``entry.after`` is what ``add`` declared, frozen at enqueue time — and a
|
|
1209
|
+
`blocked`/`failed` entry's own state never re-evaluates it again
|
|
1210
|
+
(:data:`TERMINAL_QUEUE_STATES` is exactly "the tick will not look at this
|
|
1211
|
+
row again"). By the time an operator reads the row, a pre-req that has
|
|
1212
|
+
since merged is stale information still rendered as if current — the
|
|
1213
|
+
quadraui#542 incident this closes: the row's `after=` named a pre-req
|
|
1214
|
+
that had merged an hour earlier, reading as "blocked on a dependency
|
|
1215
|
+
that is already satisfied" when the real cause was an unrelated red
|
|
1216
|
+
slice PR.
|
|
1217
|
+
|
|
1218
|
+
Two things are recomputed, never read off the entry's own frozen
|
|
1219
|
+
``last_reason``:
|
|
1220
|
+
|
|
1221
|
+
* which of ``entry.after`` are still NOT landed — the merged ones drop
|
|
1222
|
+
out entirely; a satisfied ``after=`` entry displayed on a terminal row
|
|
1223
|
+
is not a dependency, it is a caption for a fact that no longer holds;
|
|
1224
|
+
* whether the CURRENT pre-req graph is even a plausible cause —
|
|
1225
|
+
delegated to :func:`_resolve_prereqs`, the exact function a live tick
|
|
1226
|
+
uses to decide this, so a render can never disagree with what the tick
|
|
1227
|
+
itself would conclude. An empty ``dependency_reason`` means the
|
|
1228
|
+
answer is no: every named pre-req is now satisfied (or the entry
|
|
1229
|
+
declared none), so whatever originally blocked this row — a red build,
|
|
1230
|
+
an exhausted retry budget, a refused pre-dispatch guard — was NOT its
|
|
1231
|
+
``after=`` list, and the row's own ``last_reason`` is the real story.
|
|
1232
|
+
"""
|
|
1233
|
+
unsatisfied = tuple(dep for dep in entry.after if not board.facts(dep).landed)
|
|
1234
|
+
if not entry.after:
|
|
1235
|
+
return BlockedAfterDiagnosis(unsatisfied)
|
|
1236
|
+
verdict = _resolve_prereqs(entry, board, states, cycle_keys, held_gates={})
|
|
1237
|
+
return BlockedAfterDiagnosis(
|
|
1238
|
+
unsatisfied, "" if verdict.satisfied else verdict.reason
|
|
1239
|
+
)
|
|
1240
|
+
|
|
1241
|
+
|
|
1185
1242
|
# ── reconciliation ───────────────────────────────────────────────────────────
|
|
1186
1243
|
|
|
1187
1244
|
|
|
@@ -65,7 +65,9 @@ _INACTIVE_STATES = frozenset(
|
|
|
65
65
|
)
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
def _timer_states(
|
|
68
|
+
def _timer_states(
|
|
69
|
+
units: tuple[str, ...], *, runner=None, timeout: float = _SYSTEMCTL_TIMEOUT,
|
|
70
|
+
) -> dict[str, dict[str, str]]:
|
|
69
71
|
"""One ``systemctl --user show`` call for every timer in *units*.
|
|
70
72
|
|
|
71
73
|
Batched into a single subprocess the same way
|
|
@@ -74,6 +76,13 @@ def _timer_states(units: tuple[str, ...]) -> dict[str, dict[str, str]]:
|
|
|
74
76
|
subprocess, not N. Returns ``{}`` when there is no systemd on this host
|
|
75
77
|
(macOS, a container, a thin client) — that is "no data", handled by the
|
|
76
78
|
caller, not a crash.
|
|
79
|
+
|
|
80
|
+
*runner*/*timeout* are injectable (default: ``subprocess.run`` and this
|
|
81
|
+
module's own budget) so :mod:`coord.deploy_units` can reuse this exact
|
|
82
|
+
query — rather than re-implementing "is this timer already enabled" a
|
|
83
|
+
second time — for its own ``enable --now`` vs. leave-it-alone decision
|
|
84
|
+
(#2124). Two independent readings of the same systemd state is how a
|
|
85
|
+
detector and its fixer end up disagreeing about what "enabled" means.
|
|
77
86
|
"""
|
|
78
87
|
if not units:
|
|
79
88
|
return {}
|
|
@@ -88,12 +97,13 @@ def _timer_states(units: tuple[str, ...]) -> dict[str, dict[str, str]]:
|
|
|
88
97
|
"--property=SubState",
|
|
89
98
|
*units,
|
|
90
99
|
]
|
|
100
|
+
run = runner or subprocess.run
|
|
91
101
|
try:
|
|
92
|
-
proc =
|
|
102
|
+
proc = run(
|
|
93
103
|
argv,
|
|
94
104
|
capture_output=True,
|
|
95
105
|
text=True,
|
|
96
|
-
timeout=
|
|
106
|
+
timeout=timeout,
|
|
97
107
|
check=False,
|
|
98
108
|
)
|
|
99
109
|
except (OSError, subprocess.SubprocessError):
|
|
@@ -760,6 +760,29 @@ coord release propagate --daemon-host dellserver
|
|
|
760
760
|
systemctl --user start coord-drive-queue.timer
|
|
761
761
|
```
|
|
762
762
|
|
|
763
|
+
**#2124 (fixed 2026-08-13):** step 3 used to undo step 1. `coord release
|
|
764
|
+
propagate`'s own `deploy/**` lane (`POST /deploy-units`) asserts every
|
|
765
|
+
installed timer is enabled (#2082 — a *different* bug: a timer nobody ever
|
|
766
|
+
ran `systemctl --user enable` on at all). #2082's fix was `enable --now`,
|
|
767
|
+
and `--now` **starts** a timer unconditionally — so step 3 restarted the
|
|
768
|
+
timer step 1 had just stopped, on dellserver first (the daemon-leads
|
|
769
|
+
invariant), while precision and elitebook were still mid-roll: the exact
|
|
770
|
+
gap this sequence exists to hold open. `enable` and `--now` are idempotent,
|
|
771
|
+
so this was invisible for every roll where nobody had deliberately stopped
|
|
772
|
+
a timer, and only bit the one sequence documented above.
|
|
773
|
+
|
|
774
|
+
Fixed: `coord.deploy_units.enable_timers` now asks systemd whether a timer
|
|
775
|
+
is already enabled *before* deciding what to do. `systemctl --user stop`
|
|
776
|
+
never changes a unit's persistent enablement, only its current run state —
|
|
777
|
+
so a timer already `enabled` is left exactly as it is, whatever its run
|
|
778
|
+
state, and only a timer that was never enabled at all still gets `enable
|
|
779
|
+
--now`. Reaching for `systemctl --user mask` instead of `stop` is no longer
|
|
780
|
+
necessary; the sequence above is safe to run literally as written. The
|
|
781
|
+
`deploy/**` lane's own output now names which timers it started and which
|
|
782
|
+
it left alone (`coord release propagate`'s per-lane line for this host), so
|
|
783
|
+
"did step 3 leave my stopped timer alone" is directly checkable in the run
|
|
784
|
+
output rather than something to reconstruct from journal timestamps.
|
|
785
|
+
|
|
763
786
|
**#2110 (fixed 2026-08-11):** stopping the timer used to deadlock this
|
|
764
787
|
sequence. The reconciler that moves a completed entry from `running` to
|
|
765
788
|
`done` runs inside `coord drive-queue tick`; with the timer stopped, no tick
|