code-coordinator 0.5.65__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.65 → code_coordinator-0.5.66}/PKG-INFO +1 -1
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agent_app.py +16 -6
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/release.py +107 -2
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy_units.py +92 -28
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/timer_active.py +13 -3
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/AGENT_OPERATIONS.md +23 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_deploy_units_endpoint.py +75 -6
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_release_propagate.py +215 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_units_lane.py +142 -13
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.gitignore +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/CLAUDE.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/GOAL.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/LICENSE +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/MANIFEST.in +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/README.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/__init__.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agent.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/audit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/board_service.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/brain.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/claim.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/cli.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/client.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/comments.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/config.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dao.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/db.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deps.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/drive.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/events.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/filelock.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/freshness.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/gates.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/goal.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/context.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/models.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/render.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/units.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/hooks.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/interactive.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/models.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/network.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notify.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/openapi.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/parentage.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/plans.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/progress.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/release_window.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/reports.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/review.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/smoke.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/split_work.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/state.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/test_author.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/test_report.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/usage.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/install-agent.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/pyproject.toml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/setup.cfg +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/__init__.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/conftest.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_db.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_events.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_init.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_models.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_network.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_session.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_split.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_state.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.65 → 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
|
|
|
@@ -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
|
|
@@ -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
|
{code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_deploy_units_endpoint.py
RENAMED
|
@@ -139,17 +139,42 @@ def test_the_endpoint_enables_installed_timers(client, lane_with_timer, monkeypa
|
|
|
139
139
|
|
|
140
140
|
def _fake_enable(report, **_kwargs):
|
|
141
141
|
calls.append(sorted(u.name for u in report.units if u.name.endswith(".timer")))
|
|
142
|
-
return {"coord-agent.timer": (True, "enabled")}
|
|
142
|
+
return {"coord-agent.timer": (True, True, "enabled")}
|
|
143
143
|
|
|
144
144
|
monkeypatch.setattr(du, "enable_timers", _fake_enable)
|
|
145
145
|
|
|
146
146
|
resp = client.post("/deploy-units", json={})
|
|
147
147
|
assert resp.status_code == 200
|
|
148
148
|
body = resp.json()
|
|
149
|
-
assert body["timers_enabled"] == {
|
|
149
|
+
assert body["timers_enabled"] == {
|
|
150
|
+
"coord-agent.timer": {"ok": True, "changed": True, "detail": "enabled"}
|
|
151
|
+
}
|
|
150
152
|
assert calls == [["coord-agent.timer"]]
|
|
151
153
|
|
|
152
154
|
|
|
155
|
+
def test_the_endpoint_reports_a_timer_it_left_alone(client, lane_with_timer, monkeypatch):
|
|
156
|
+
"""#2124: a timer `enable_timers` found already enabled (e.g. stopped by
|
|
157
|
+
an operator on purpose) is reported with `changed: False` — the signal
|
|
158
|
+
`coord release propagate`'s own output (`_roll_units`) uses to name it
|
|
159
|
+
as held rather than started."""
|
|
160
|
+
monkeypatch.setattr(
|
|
161
|
+
du, "enable_timers",
|
|
162
|
+
lambda report, **k: {
|
|
163
|
+
"coord-agent.timer": (True, False, "already enabled (ActiveState=inactive)"),
|
|
164
|
+
},
|
|
165
|
+
)
|
|
166
|
+
resp = client.post("/deploy-units", json={})
|
|
167
|
+
assert resp.status_code == 200
|
|
168
|
+
body = resp.json()
|
|
169
|
+
assert body["ok"] is True
|
|
170
|
+
assert body["timers_enabled"] == {
|
|
171
|
+
"coord-agent.timer": {
|
|
172
|
+
"ok": True, "changed": False,
|
|
173
|
+
"detail": "already enabled (ActiveState=inactive)",
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
|
|
153
178
|
def test_a_dry_run_never_enables_timers(client, lane_with_timer, monkeypatch):
|
|
154
179
|
calls: list = []
|
|
155
180
|
monkeypatch.setattr(
|
|
@@ -164,20 +189,25 @@ def test_a_dry_run_never_enables_timers(client, lane_with_timer, monkeypatch):
|
|
|
164
189
|
def test_a_failed_timer_enable_fails_the_response(client, lane_with_timer, monkeypatch):
|
|
165
190
|
monkeypatch.setattr(
|
|
166
191
|
du, "enable_timers",
|
|
167
|
-
lambda report, **k: {"coord-agent.timer": (False, "enable failed")},
|
|
192
|
+
lambda report, **k: {"coord-agent.timer": (False, False, "enable failed")},
|
|
168
193
|
)
|
|
169
194
|
resp = client.post("/deploy-units", json={})
|
|
170
195
|
assert resp.status_code == 500
|
|
171
196
|
body = resp.json()
|
|
172
197
|
assert body["ok"] is False
|
|
173
198
|
assert body["timers_enabled"]["coord-agent.timer"]["ok"] is False
|
|
199
|
+
assert body["timers_enabled"]["coord-agent.timer"]["changed"] is False
|
|
174
200
|
|
|
175
201
|
|
|
176
202
|
def test_the_real_enable_timers_is_exercised_end_to_end(client, lane_with_timer, monkeypatch):
|
|
177
203
|
"""No monkeypatch of `enable_timers` itself here — only the subprocess
|
|
178
204
|
boundary — so this exercises the real wiring from HTTP request through
|
|
179
205
|
`install_units` to the actual `systemctl --user enable --now` argv,
|
|
180
|
-
which is the thing that was silently never happening before #2082.
|
|
206
|
+
which is the thing that was silently never happening before #2082.
|
|
207
|
+
`coord-agent.timer` has no prior state as far as this fake is
|
|
208
|
+
concerned (empty `show` output), which `enable_timers` (#2124) must
|
|
209
|
+
read the same way it reads genuinely never-enabled: go ahead and
|
|
210
|
+
enable it."""
|
|
181
211
|
calls: list = []
|
|
182
212
|
|
|
183
213
|
def _fake_run(argv, **_kwargs):
|
|
@@ -193,8 +223,47 @@ def test_the_real_enable_timers_is_exercised_end_to_end(client, lane_with_timer,
|
|
|
193
223
|
monkeypatch.setattr(subprocess, "run", _fake_run)
|
|
194
224
|
resp = client.post("/deploy-units", json={})
|
|
195
225
|
assert resp.status_code == 200
|
|
196
|
-
assert resp.json()["timers_enabled"] == {
|
|
197
|
-
|
|
226
|
+
assert resp.json()["timers_enabled"] == {
|
|
227
|
+
"coord-agent.timer": {"ok": True, "changed": True, "detail": "enabled"}
|
|
228
|
+
}
|
|
229
|
+
assert calls[0][:3] == ["systemctl", "--user", "show"]
|
|
230
|
+
assert calls[-1] == ["systemctl", "--user", "enable", "--now", "coord-agent.timer"]
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def test_the_real_enable_timers_leaves_a_stopped_timer_stopped_end_to_end(
|
|
234
|
+
client, lane_with_timer, monkeypatch
|
|
235
|
+
):
|
|
236
|
+
"""#2124's acceptance shape, exercised through the same real wiring as
|
|
237
|
+
the test above: `coord-agent.timer` is already enabled but its
|
|
238
|
+
`ActiveState` is `inactive` — exactly what `systemctl --user stop`
|
|
239
|
+
leaves behind. No `enable`/`start` call may reach systemd for it."""
|
|
240
|
+
calls: list = []
|
|
241
|
+
|
|
242
|
+
def _fake_run(argv, **_kwargs):
|
|
243
|
+
calls.append(list(argv))
|
|
244
|
+
|
|
245
|
+
class _Proc:
|
|
246
|
+
returncode = 0
|
|
247
|
+
stdout = ""
|
|
248
|
+
stderr = ""
|
|
249
|
+
|
|
250
|
+
if len(argv) > 2 and argv[2] == "show":
|
|
251
|
+
_Proc.stdout = (
|
|
252
|
+
"Id=coord-agent.timer\n"
|
|
253
|
+
"UnitFileState=enabled\n"
|
|
254
|
+
"ActiveState=inactive\n"
|
|
255
|
+
"SubState=dead\n"
|
|
256
|
+
)
|
|
257
|
+
return _Proc()
|
|
258
|
+
|
|
259
|
+
monkeypatch.setattr(subprocess, "run", _fake_run)
|
|
260
|
+
resp = client.post("/deploy-units", json={})
|
|
261
|
+
assert resp.status_code == 200
|
|
262
|
+
body = resp.json()["timers_enabled"]["coord-agent.timer"]
|
|
263
|
+
assert body["ok"] is True
|
|
264
|
+
assert body["changed"] is False
|
|
265
|
+
assert "ActiveState=inactive" in body["detail"]
|
|
266
|
+
assert all(argv[2] != "enable" for argv in calls)
|
|
198
267
|
|
|
199
268
|
|
|
200
269
|
def test_a_bodyless_post_is_accepted(client, lane):
|