code-coordinator 0.5.52__tar.gz → 0.5.55__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.52 → code_coordinator-0.5.55}/.github/workflows/test.yml +49 -0
- {code_coordinator-0.5.52/code_coordinator.egg-info → code_coordinator-0.5.55}/PKG-INFO +1 -1
- {code_coordinator-0.5.52 → code_coordinator-0.5.55/code_coordinator.egg-info}/PKG-INFO +1 -1
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/SOURCES.txt +4 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/scm_file_list.json +4 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/cli.py +3 -1
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/client.py +59 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/agent_ops.py +250 -1
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/status.py +11 -1
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/test_gate.py +33 -1
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/config.py +51 -22
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/machine_pause.py +304 -19
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notify.py +90 -11
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/progress.py +117 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/revalidate.py +103 -2
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/serve_app.py +80 -3
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/smoke.py +23 -4
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/OPERATING_GOTCHAS.md +85 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/coord-test-runner.sh +232 -2
- code_coordinator-0.5.55/scripts/run_tests_in_populated_home.sh +150 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_acceptance_drivers.py +34 -2
- code_coordinator-0.5.55/tests/test_ambient_home_isolation.py +392 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coord_test.py +77 -0
- code_coordinator-0.5.55/tests/test_coord_test_runner_baseline.py +364 -0
- code_coordinator-0.5.55/tests/test_cross_platform_imports.py +267 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_coord_db_backup.py +42 -1
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notify.py +112 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_progress.py +73 -0
- code_coordinator-0.5.55/tests/test_quiet_hours_store_2146.py +660 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_revalidate.py +200 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_smoke.py +20 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/data.rs +67 -4
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/dialogs.rs +262 -3
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/events.rs +31 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/fixtures.rs +2 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/mod.rs +58 -1
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/pipeline.rs +7 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/sidebar.rs +23 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/tests.rs +476 -0
- code_coordinator-0.5.52/tests/test_cross_platform_imports.py +0 -136
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/.gitignore +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/CLAUDE.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/GOAL.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/LICENSE +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/MANIFEST.in +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/README.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/__init__.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agent.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/audit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/board_service.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/brain.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/claim.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/comments.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dao.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/db.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/deps.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/drive.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/events.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/filelock.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/freshness.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/gates.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/goal.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/context.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/models.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/render.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/health/units.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/hooks.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/interactive.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/models.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/network.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/openapi.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/parentage.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/plans.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/release_window.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/reports.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/review.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/split_work.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/state.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/test_author.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/test_report.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/usage.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/install-agent.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/pyproject.toml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/setup.cfg +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/__init__.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/conftest.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_db.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_events.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_init.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_models.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_network.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_session.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_split.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_state.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.52 → code_coordinator-0.5.55}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -115,6 +115,55 @@ jobs:
|
|
|
115
115
|
- run: pip install -e ".[dev]"
|
|
116
116
|
- run: scripts/run_tests_without_gh.sh python -m pytest tests/ -q
|
|
117
117
|
|
|
118
|
+
# #2170: run the full suite in the environment of a REAL FLEET MACHINE — a
|
|
119
|
+
# populated `~/.coord/` (thin-client shaped), no `sqlite3` on PATH, and a
|
|
120
|
+
# `$TMPDIR` under an ancestor pytest config.
|
|
121
|
+
#
|
|
122
|
+
# This job exists because the `test` matrix above is structurally incapable
|
|
123
|
+
# of catching the class it covers. Six tests failed on `origin/main` on every
|
|
124
|
+
# fleet machine while `ubuntu-latest` stayed green on 3.12 AND 3.13 — the
|
|
125
|
+
# INVERSE of the familiar "passes locally, fails only in CI ⇒ ambient $HOME"
|
|
126
|
+
# pattern. They passed in CI *precisely because* CI's `$HOME` is empty, and a
|
|
127
|
+
# matrix whose only environment is the empty one can never see that.
|
|
128
|
+
#
|
|
129
|
+
# What it cost while invisible: the Test stage on `precision` could not
|
|
130
|
+
# produce a green verdict for this repo on ANY branch. Every dispatch there
|
|
131
|
+
# returned `SMOKE: fail`, the branch was blamed for breakage it did not
|
|
132
|
+
# cause, and a human read the log and adjudicated — 11m36s and $0.61 for zero
|
|
133
|
+
# signal about the branch, repeatedly, for months (claude-coordinator#2158).
|
|
134
|
+
#
|
|
135
|
+
# SAME SHAPE AS `no-gh-on-path` ABOVE, AND FOR THE SAME REASON. That job
|
|
136
|
+
# (#1484) exists because a host-dependent `gh` made the suite's result depend
|
|
137
|
+
# on the machine rather than the code; this one exists because a
|
|
138
|
+
# host-dependent `$HOME`/`$PATH`/`$TMPDIR` did the same thing in the opposite
|
|
139
|
+
# direction. Both mask by NAME rather than by dropping PATH directories — see
|
|
140
|
+
# `scripts/run_tests_in_populated_home.sh`'s header for why
|
|
141
|
+
# `PATH=/usr/bin:/bin` is the wrong recipe here.
|
|
142
|
+
#
|
|
143
|
+
# `tests/test_ambient_home_isolation.py` pins the specific affected targets
|
|
144
|
+
# on every run everywhere (including this job, and including a fleet
|
|
145
|
+
# machine's own Test leg) — that is the always-on gate, and it is what fails
|
|
146
|
+
# first if one of the three regresses. THIS job is the whole-suite sweep: it
|
|
147
|
+
# is what finds the NEXT test of this class before a fleet machine does.
|
|
148
|
+
# Verified at authoring time: 9590 passed, 13 skipped under these three knobs.
|
|
149
|
+
populated-home:
|
|
150
|
+
runs-on: ubuntu-latest
|
|
151
|
+
steps:
|
|
152
|
+
- uses: actions/checkout@v4
|
|
153
|
+
- uses: actions/setup-python@v5
|
|
154
|
+
with:
|
|
155
|
+
python-version: "3.12"
|
|
156
|
+
- run: pip install -e ".[dev]"
|
|
157
|
+
- run: scripts/run_tests_in_populated_home.sh python -m pytest tests/ -q
|
|
158
|
+
- name: What a red result here means
|
|
159
|
+
if: failure()
|
|
160
|
+
run: |
|
|
161
|
+
echo "::error::The suite is red under a POPULATED \$HOME (thin-client ~/.coord/, no sqlite3 on PATH, \$TMPDIR under an ancestor pytest config) while the plain 'test' job may well be green."
|
|
162
|
+
echo "That difference IS the finding, not noise: a test that needs an empty \$HOME cannot pass on any fleet machine, so the Test stage there can never go green and every dispatch costs a human adjudication (#2170)."
|
|
163
|
+
echo "Fix the TEST's isolation -- redirect \$HOME/XDG at tmp_path, drop COORD_SERVICE_URL/COORD_TOKEN/COORD_CONFIG, skip-guard an unprovisioned system binary, pin a nested pytest's --rootdir."
|
|
164
|
+
echo "Do NOT fix it by making the product trust an ambient path: 'coord config --config' is deliberately NOT authoritative on a thin client (CLAUDE.md, docs/EPHEMERAL_WORKERS.md)."
|
|
165
|
+
echo "Reproduce locally: scripts/run_tests_in_populated_home.sh python -m pytest tests/ -q"
|
|
166
|
+
|
|
118
167
|
# #906: run the test suite in thin-client mode with COORD_STRICT_LOCAL_BOARD=1
|
|
119
168
|
# so any board touch reachable from a thin-client path raises RuntimeError
|
|
120
169
|
# instead of silently no-oping against an empty local DB. This job catches
|
|
@@ -385,6 +385,7 @@ scripts/coord-test-runner.sh
|
|
|
385
385
|
scripts/drive-batch.sh
|
|
386
386
|
scripts/gen_board_fixture.py
|
|
387
387
|
scripts/next_release_tag.py
|
|
388
|
+
scripts/run_tests_in_populated_home.sh
|
|
388
389
|
scripts/run_tests_without_gh.sh
|
|
389
390
|
scripts/smoke_437_interactive.py
|
|
390
391
|
scripts/verify_878_review_capture.py
|
|
@@ -425,6 +426,7 @@ tests/test_agent_update.py
|
|
|
425
426
|
tests/test_agent_update_bluegreen.py
|
|
426
427
|
tests/test_agent_usage_limit.py
|
|
427
428
|
tests/test_agent_zero_commit.py
|
|
429
|
+
tests/test_ambient_home_isolation.py
|
|
428
430
|
tests/test_approve_reject_plan.py
|
|
429
431
|
tests/test_approve_usage_gate.py
|
|
430
432
|
tests/test_assignment_already_recorded_daemon.py
|
|
@@ -513,6 +515,7 @@ tests/test_config_usage_gate.py
|
|
|
513
515
|
tests/test_conflict_fix.py
|
|
514
516
|
tests/test_conflict_fix_semantic.py
|
|
515
517
|
tests/test_coord_test.py
|
|
518
|
+
tests/test_coord_test_runner_baseline.py
|
|
516
519
|
tests/test_coord_test_runner_routing.py
|
|
517
520
|
tests/test_coord_test_runner_toolchain.py
|
|
518
521
|
tests/test_coord_web_sse_restart_live.py
|
|
@@ -640,6 +643,7 @@ tests/test_providers.py
|
|
|
640
643
|
tests/test_providers_config_labels.py
|
|
641
644
|
tests/test_providers_pty.py
|
|
642
645
|
tests/test_quiet_hours.py
|
|
646
|
+
tests/test_quiet_hours_store_2146.py
|
|
643
647
|
tests/test_reap_merged_sessions.py
|
|
644
648
|
tests/test_reap_stale_interactive_tick.py
|
|
645
649
|
tests/test_reconcile_branch.py
|
{code_coordinator-0.5.52 → code_coordinator-0.5.55}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -375,6 +375,7 @@
|
|
|
375
375
|
"scripts/drive-batch.sh",
|
|
376
376
|
"scripts/gen_board_fixture.py",
|
|
377
377
|
"scripts/next_release_tag.py",
|
|
378
|
+
"scripts/run_tests_in_populated_home.sh",
|
|
378
379
|
"scripts/run_tests_without_gh.sh",
|
|
379
380
|
"scripts/smoke_437_interactive.py",
|
|
380
381
|
"scripts/verify_878_review_capture.py",
|
|
@@ -455,6 +456,7 @@
|
|
|
455
456
|
"tests/test_agent_update_bluegreen.py",
|
|
456
457
|
"tests/test_agent_usage_limit.py",
|
|
457
458
|
"tests/test_agent_zero_commit.py",
|
|
459
|
+
"tests/test_ambient_home_isolation.py",
|
|
458
460
|
"tests/test_approve_reject_plan.py",
|
|
459
461
|
"tests/test_approve_usage_gate.py",
|
|
460
462
|
"tests/test_assignment_already_recorded_daemon.py",
|
|
@@ -543,6 +545,7 @@
|
|
|
543
545
|
"tests/test_conflict_fix.py",
|
|
544
546
|
"tests/test_conflict_fix_semantic.py",
|
|
545
547
|
"tests/test_coord_test.py",
|
|
548
|
+
"tests/test_coord_test_runner_baseline.py",
|
|
546
549
|
"tests/test_coord_test_runner_routing.py",
|
|
547
550
|
"tests/test_coord_test_runner_toolchain.py",
|
|
548
551
|
"tests/test_coord_web_sse_restart_live.py",
|
|
@@ -670,6 +673,7 @@
|
|
|
670
673
|
"tests/test_providers_config_labels.py",
|
|
671
674
|
"tests/test_providers_pty.py",
|
|
672
675
|
"tests/test_quiet_hours.py",
|
|
676
|
+
"tests/test_quiet_hours_store_2146.py",
|
|
673
677
|
"tests/test_reap_merged_sessions.py",
|
|
674
678
|
"tests/test_reap_stale_interactive_tick.py",
|
|
675
679
|
"tests/test_reconcile_branch.py",
|
|
@@ -55,7 +55,7 @@ from coord.commands.setup import (
|
|
|
55
55
|
install_skills,
|
|
56
56
|
version,
|
|
57
57
|
)
|
|
58
|
-
from coord.commands.agent_ops import agent, pause, unpause
|
|
58
|
+
from coord.commands.agent_ops import agent, pause, quiet_hours, unpause
|
|
59
59
|
from coord.commands.gates import gates
|
|
60
60
|
from coord.commands.status import diagnose, doctor, show_plan, status, usage
|
|
61
61
|
from coord.commands.dispatch import (
|
|
@@ -376,6 +376,8 @@ main.add_command(bounce)
|
|
|
376
376
|
main.add_command(sync)
|
|
377
377
|
main.add_command(pause)
|
|
378
378
|
main.add_command(unpause)
|
|
379
|
+
# #2146: set a machine's quiet-hours window without a coordinator session.
|
|
380
|
+
main.add_command(quiet_hours)
|
|
379
381
|
main.add_command(refine_chat)
|
|
380
382
|
main.add_command(test_chat)
|
|
381
383
|
main.add_command(new_issue_chat)
|
|
@@ -283,6 +283,65 @@ def post_cordon(
|
|
|
283
283
|
return post_record(svc, "/pause", payload, timeout=timeout)
|
|
284
284
|
|
|
285
285
|
|
|
286
|
+
def fetch_quiet_hours(
|
|
287
|
+
svc: ServiceConfig, *, timeout: float = _DEFAULT_TIMEOUT
|
|
288
|
+
) -> dict[str, dict]:
|
|
289
|
+
"""GET /pause → the daemon's effective quiet-hours windows (#2146).
|
|
290
|
+
|
|
291
|
+
``{machine: {start, end, tz, source}}`` for every machine with a window,
|
|
292
|
+
whether it currently covers "now" or not — a thin client needs the whole
|
|
293
|
+
map to render `coord quiet-hours --list` and to pre-fill a dialog, not
|
|
294
|
+
just the subset that happens to be active this minute.
|
|
295
|
+
|
|
296
|
+
``{}`` when the daemon predates #2146 (the key is simply absent), which
|
|
297
|
+
is the right read for a daemon that has no operator-set store. Raises
|
|
298
|
+
``httpx.HTTPError`` on transport/HTTP failure —
|
|
299
|
+
`coord.machine_pause.effective_quiet_hours()` catches that and degrades
|
|
300
|
+
to "no windows known", the same fail-soft read posture as
|
|
301
|
+
`fetch_paused_machines`.
|
|
302
|
+
"""
|
|
303
|
+
resp = httpx.get(f"{svc.url}/pause", headers=_headers(svc), timeout=timeout)
|
|
304
|
+
resp.raise_for_status()
|
|
305
|
+
data = resp.json()
|
|
306
|
+
rows = data.get("quiet_hours") if isinstance(data, dict) else None
|
|
307
|
+
if not isinstance(rows, dict):
|
|
308
|
+
return {}
|
|
309
|
+
return {str(k): dict(v) for k, v in rows.items() if isinstance(v, dict)}
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def post_quiet_hours(
|
|
313
|
+
svc: ServiceConfig,
|
|
314
|
+
machine: str,
|
|
315
|
+
action: str,
|
|
316
|
+
*,
|
|
317
|
+
start: str | None = None,
|
|
318
|
+
end: str | None = None,
|
|
319
|
+
tz: str | None = None,
|
|
320
|
+
timeout: float = _WRITE_TIMEOUT,
|
|
321
|
+
) -> dict:
|
|
322
|
+
"""POST /pause {machine, action: set-quiet|clear-quiet, ...} (#2146).
|
|
323
|
+
|
|
324
|
+
Deliberately the SAME endpoint as pause/cordon: a quiet-hours window is
|
|
325
|
+
the same routing decision on a schedule, and one endpoint means one
|
|
326
|
+
place a thin client can be wrong about it.
|
|
327
|
+
|
|
328
|
+
Raises ``httpx.HTTPError`` on transport/HTTP failure — the whole point
|
|
329
|
+
of #2146 is that a thin client cannot edit `coordinator.yml` (its copy
|
|
330
|
+
is an overwritten cache), so a write that reported success and reached
|
|
331
|
+
nothing would rebuild the exact bug this closes. A daemon that predates
|
|
332
|
+
#2146 answers 400 ``unknown action``, which surfaces here as an
|
|
333
|
+
``HTTPStatusError`` rather than a silent no-op: deploy the daemon first.
|
|
334
|
+
"""
|
|
335
|
+
payload: dict = {"machine": machine, "action": action}
|
|
336
|
+
if start is not None:
|
|
337
|
+
payload["start"] = start
|
|
338
|
+
if end is not None:
|
|
339
|
+
payload["end"] = end
|
|
340
|
+
if tz is not None:
|
|
341
|
+
payload["tz"] = tz
|
|
342
|
+
return post_record(svc, "/pause", payload, timeout=timeout)
|
|
343
|
+
|
|
344
|
+
|
|
286
345
|
def post_pause(
|
|
287
346
|
svc: ServiceConfig, machine: str, action: str, *, timeout: float = _WRITE_TIMEOUT
|
|
288
347
|
) -> dict:
|
|
@@ -1386,4 +1386,253 @@ def unpause(config_path: Path, machine: str) -> None:
|
|
|
1386
1386
|
f"({outcome.tz}) — resumes its normal quiet schedule next window"
|
|
1387
1387
|
)
|
|
1388
1388
|
else:
|
|
1389
|
-
click.echo(f"not paused: {machine}")
|
|
1389
|
+
click.echo(f"not paused: {machine}")
|
|
1390
|
+
|
|
1391
|
+
|
|
1392
|
+
# ── #2146: `coord quiet-hours` ──────────────────────────────────────────────
|
|
1393
|
+
|
|
1394
|
+
|
|
1395
|
+
def _local_tz_name() -> str | None:
|
|
1396
|
+
"""The CLIENT's IANA zone name, or None if it can't be determined.
|
|
1397
|
+
|
|
1398
|
+
#2146: `--tz` must default to the operator's own zone — they mean "22:00
|
|
1399
|
+
MY time", and the daemon runs UTC, so defaulting to the daemon's clock
|
|
1400
|
+
would fire hours off. `datetime.now().astimezone().tzinfo` gives an
|
|
1401
|
+
ABBREVIATION ("CDT"), not an IANA name `ZoneInfo` can resolve, so this
|
|
1402
|
+
walks the usual POSIX sources first and only falls back to that.
|
|
1403
|
+
|
|
1404
|
+
Returning None (rather than guessing "UTC") is deliberate: the caller
|
|
1405
|
+
turns it into "pass --tz explicitly", because a silently-UTC window is
|
|
1406
|
+
exactly the wrong-hour failure #1862 made `tz` mandatory to prevent.
|
|
1407
|
+
"""
|
|
1408
|
+
from zoneinfo import ZoneInfo # noqa: PLC0415
|
|
1409
|
+
|
|
1410
|
+
def _ok(name: str | None) -> str | None:
|
|
1411
|
+
if not name or name in ("localtime", "UTC0"):
|
|
1412
|
+
return None
|
|
1413
|
+
try:
|
|
1414
|
+
ZoneInfo(name)
|
|
1415
|
+
except Exception: # noqa: BLE001 — not a resolvable zone, try the next source
|
|
1416
|
+
return None
|
|
1417
|
+
return name
|
|
1418
|
+
|
|
1419
|
+
candidates: list[str | None] = [os.environ.get("TZ")]
|
|
1420
|
+
try:
|
|
1421
|
+
candidates.append(Path("/etc/timezone").read_text(encoding="utf-8").strip())
|
|
1422
|
+
except OSError:
|
|
1423
|
+
pass
|
|
1424
|
+
try:
|
|
1425
|
+
parts = Path("/etc/localtime").resolve().parts
|
|
1426
|
+
if "zoneinfo" in parts:
|
|
1427
|
+
candidates.append("/".join(parts[parts.index("zoneinfo") + 1:]))
|
|
1428
|
+
except OSError:
|
|
1429
|
+
pass
|
|
1430
|
+
from datetime import datetime as _dt # noqa: PLC0415
|
|
1431
|
+
|
|
1432
|
+
candidates.append(_dt.now().astimezone().tzname())
|
|
1433
|
+
for candidate in candidates:
|
|
1434
|
+
resolved = _ok(candidate)
|
|
1435
|
+
if resolved is not None:
|
|
1436
|
+
return resolved
|
|
1437
|
+
return None
|
|
1438
|
+
|
|
1439
|
+
|
|
1440
|
+
def _parse_window_arg(window: str) -> tuple[str, str]:
|
|
1441
|
+
"""``"22:00-08:00"`` → ``("22:00", "08:00")``. Shape only — the real
|
|
1442
|
+
validation (HH:MM, IANA tz, start != end) is `coord.config`'s, so the
|
|
1443
|
+
CLI can never accept a window `coordinator.yml` would reject."""
|
|
1444
|
+
parts = window.split("-")
|
|
1445
|
+
if len(parts) != 2 or not parts[0].strip() or not parts[1].strip():
|
|
1446
|
+
raise ValueError(
|
|
1447
|
+
f"window must look like '22:00-08:00', got {window!r}"
|
|
1448
|
+
)
|
|
1449
|
+
return parts[0].strip(), parts[1].strip()
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
def _quiet_hours_rows(machines: Any) -> dict[str, dict]:
|
|
1453
|
+
from coord.machine_pause import effective_quiet_hours # noqa: PLC0415
|
|
1454
|
+
|
|
1455
|
+
return effective_quiet_hours(machines)
|
|
1456
|
+
|
|
1457
|
+
|
|
1458
|
+
def _describe_source(source: str) -> str:
|
|
1459
|
+
return "set here" if source == "store" else "coordinator.yml"
|
|
1460
|
+
|
|
1461
|
+
|
|
1462
|
+
@click.command(
|
|
1463
|
+
"quiet-hours",
|
|
1464
|
+
help=(
|
|
1465
|
+
"Show or set a machine's recurring no-new-dispatch window (#2146).\n\n"
|
|
1466
|
+
"\b\n"
|
|
1467
|
+
" coord quiet-hours MACHINE 22:00-08:00 [--tz America/Chicago]\n"
|
|
1468
|
+
" coord quiet-hours MACHINE --clear\n"
|
|
1469
|
+
" coord quiet-hours [MACHINE] --list\n"
|
|
1470
|
+
" coord quiet-hours MACHINE --print-yaml\n\n"
|
|
1471
|
+
"A window set here is stored on the DAEMON (alongside pauses and "
|
|
1472
|
+
"release cordons) and overrides that machine's coordinator.yml "
|
|
1473
|
+
"`quiet_hours:` block entirely — it does not rewrite the YAML. "
|
|
1474
|
+
"`--print-yaml` emits a paste-ready block for when a window should "
|
|
1475
|
+
"become permanent and version-controlled.\n\n"
|
|
1476
|
+
"--tz defaults to THIS machine's zone, never the daemon's UTC, and "
|
|
1477
|
+
"the resolved zone is echoed back so a wrong default is visible "
|
|
1478
|
+
"immediately."
|
|
1479
|
+
),
|
|
1480
|
+
)
|
|
1481
|
+
|
|
1482
|
+
|
|
1483
|
+
@_CONFIG_OPTION
|
|
1484
|
+
@click.argument("machine", required=False)
|
|
1485
|
+
@click.argument("window", required=False)
|
|
1486
|
+
@click.option("--tz", "tz", default=None, help="IANA zone (default: this machine's).")
|
|
1487
|
+
@click.option("--clear", "clear_", is_flag=True, help="Remove an operator-set window.")
|
|
1488
|
+
@click.option("--list", "list_", is_flag=True, help="Show windows and where they came from.")
|
|
1489
|
+
@click.option(
|
|
1490
|
+
"--print-yaml",
|
|
1491
|
+
"print_yaml",
|
|
1492
|
+
is_flag=True,
|
|
1493
|
+
help="Emit a coordinator.yml `quiet_hours:` block for MACHINE.",
|
|
1494
|
+
)
|
|
1495
|
+
def quiet_hours(
|
|
1496
|
+
config_path: Path,
|
|
1497
|
+
machine: str | None,
|
|
1498
|
+
window: str | None,
|
|
1499
|
+
tz: str | None,
|
|
1500
|
+
clear_: bool,
|
|
1501
|
+
list_: bool,
|
|
1502
|
+
print_yaml: bool,
|
|
1503
|
+
) -> None:
|
|
1504
|
+
from coord.machine_pause import clear_quiet_hours, set_quiet_hours # noqa: PLC0415
|
|
1505
|
+
|
|
1506
|
+
# Best-effort config, exactly like `unpause` above: an unloadable config
|
|
1507
|
+
# must not block the (fully functional) store path — it only means
|
|
1508
|
+
# coordinator.yml-sourced windows can't be listed alongside store ones.
|
|
1509
|
+
machines = None
|
|
1510
|
+
try:
|
|
1511
|
+
from coord.config import load as _load_yaml_config # noqa: PLC0415
|
|
1512
|
+
|
|
1513
|
+
machines = _load_yaml_config(config_path).machines
|
|
1514
|
+
except Exception: # noqa: BLE001
|
|
1515
|
+
pass
|
|
1516
|
+
|
|
1517
|
+
if list_ or (machine is None and not (clear_ or print_yaml or window)):
|
|
1518
|
+
rows = _quiet_hours_rows(machines)
|
|
1519
|
+
if machine is not None:
|
|
1520
|
+
rows = {k: v for k, v in rows.items() if k == machine}
|
|
1521
|
+
if not rows:
|
|
1522
|
+
click.echo(
|
|
1523
|
+
"no quiet hours set"
|
|
1524
|
+
+ (f" for {machine}" if machine else "")
|
|
1525
|
+
+ " (set one: coord quiet-hours MACHINE 22:00-08:00)"
|
|
1526
|
+
)
|
|
1527
|
+
return
|
|
1528
|
+
width = max(len(name) for name in rows)
|
|
1529
|
+
for name, row in sorted(rows.items()):
|
|
1530
|
+
click.echo(
|
|
1531
|
+
f"{name.ljust(width)} {row.get('start')}-{row.get('end')} "
|
|
1532
|
+
f"{row.get('tz')} [{_describe_source(str(row.get('source') or ''))}]"
|
|
1533
|
+
)
|
|
1534
|
+
return
|
|
1535
|
+
|
|
1536
|
+
if machine is None:
|
|
1537
|
+
click.echo("error: MACHINE is required", err=True)
|
|
1538
|
+
sys.exit(2)
|
|
1539
|
+
|
|
1540
|
+
if print_yaml:
|
|
1541
|
+
# The promotion path: a window that has proved itself belongs in
|
|
1542
|
+
# version control, where a daemon rebuild can't lose it.
|
|
1543
|
+
if window is not None:
|
|
1544
|
+
try:
|
|
1545
|
+
start, end = _parse_window_arg(window)
|
|
1546
|
+
except ValueError as e:
|
|
1547
|
+
click.echo(f"error: {e}", err=True)
|
|
1548
|
+
sys.exit(2)
|
|
1549
|
+
zone = tz or _local_tz_name()
|
|
1550
|
+
else:
|
|
1551
|
+
row = _quiet_hours_rows(machines).get(machine)
|
|
1552
|
+
if row is None:
|
|
1553
|
+
click.echo(
|
|
1554
|
+
f"error: no quiet hours known for {machine!r} — pass a window "
|
|
1555
|
+
"(e.g. `coord quiet-hours MACHINE 22:00-08:00 --print-yaml`)",
|
|
1556
|
+
err=True,
|
|
1557
|
+
)
|
|
1558
|
+
sys.exit(1)
|
|
1559
|
+
start, end, zone = row.get("start"), row.get("end"), tz or row.get("tz")
|
|
1560
|
+
if not zone:
|
|
1561
|
+
click.echo(
|
|
1562
|
+
"error: could not determine a time zone — pass --tz "
|
|
1563
|
+
"(e.g. --tz America/Chicago)",
|
|
1564
|
+
err=True,
|
|
1565
|
+
)
|
|
1566
|
+
sys.exit(2)
|
|
1567
|
+
click.echo(f" # machines[] entry for {machine!r} in coordinator.yml")
|
|
1568
|
+
click.echo(" quiet_hours:")
|
|
1569
|
+
click.echo(f' start: "{start}"')
|
|
1570
|
+
click.echo(f' end: "{end}"')
|
|
1571
|
+
click.echo(f' tz: "{zone}"')
|
|
1572
|
+
return
|
|
1573
|
+
|
|
1574
|
+
if clear_:
|
|
1575
|
+
# #2146 acceptance: "nothing set" is NOT success. A machine can still
|
|
1576
|
+
# have a coordinator.yml block this cannot touch, and reporting
|
|
1577
|
+
# "cleared" for a no-op is the failure class this feature exists to
|
|
1578
|
+
# avoid.
|
|
1579
|
+
try:
|
|
1580
|
+
changed = clear_quiet_hours(machine)
|
|
1581
|
+
except Exception as e: # noqa: BLE001
|
|
1582
|
+
click.echo(
|
|
1583
|
+
f"error: could not confirm clearing quiet hours for {machine!r} "
|
|
1584
|
+
f"with the daemon: {e}",
|
|
1585
|
+
err=True,
|
|
1586
|
+
)
|
|
1587
|
+
sys.exit(1)
|
|
1588
|
+
if not changed:
|
|
1589
|
+
click.echo(f"nothing set: {machine} has no operator-set quiet hours")
|
|
1590
|
+
return
|
|
1591
|
+
click.echo(f"cleared: {machine} quiet hours")
|
|
1592
|
+
row = _quiet_hours_rows(machines).get(machine)
|
|
1593
|
+
if row is not None:
|
|
1594
|
+
click.echo(
|
|
1595
|
+
f"note: {machine} still has a coordinator.yml window "
|
|
1596
|
+
f"{row.get('start')}-{row.get('end')} ({row.get('tz')})"
|
|
1597
|
+
)
|
|
1598
|
+
return
|
|
1599
|
+
|
|
1600
|
+
if window is None:
|
|
1601
|
+
click.echo(
|
|
1602
|
+
"error: pass a window (e.g. `coord quiet-hours MACHINE 22:00-08:00`), "
|
|
1603
|
+
"--clear, --list or --print-yaml",
|
|
1604
|
+
err=True,
|
|
1605
|
+
)
|
|
1606
|
+
sys.exit(2)
|
|
1607
|
+
try:
|
|
1608
|
+
start, end = _parse_window_arg(window)
|
|
1609
|
+
except ValueError as e:
|
|
1610
|
+
click.echo(f"error: {e}", err=True)
|
|
1611
|
+
sys.exit(2)
|
|
1612
|
+
zone = tz or _local_tz_name()
|
|
1613
|
+
if not zone:
|
|
1614
|
+
click.echo(
|
|
1615
|
+
"error: could not determine this machine's time zone — pass --tz "
|
|
1616
|
+
"(e.g. --tz America/Chicago). Quiet hours never default to the "
|
|
1617
|
+
"daemon's UTC clock: it would fire at the wrong local hour.",
|
|
1618
|
+
err=True,
|
|
1619
|
+
)
|
|
1620
|
+
sys.exit(2)
|
|
1621
|
+
|
|
1622
|
+
# #1563/#2146: fail loudly. A thin client's write that never reaches the
|
|
1623
|
+
# daemon must not print a confirmation.
|
|
1624
|
+
try:
|
|
1625
|
+
stored = set_quiet_hours(machine, start=start, end=end, tz=zone)
|
|
1626
|
+
except Exception as e: # noqa: BLE001
|
|
1627
|
+
click.echo(
|
|
1628
|
+
f"error: could not set quiet hours for {machine!r}: {e}",
|
|
1629
|
+
err=True,
|
|
1630
|
+
)
|
|
1631
|
+
sys.exit(1)
|
|
1632
|
+
# Echo the RESOLVED zone: a wrong `--tz` default is otherwise invisible
|
|
1633
|
+
# until the machine goes quiet at the wrong hour.
|
|
1634
|
+
click.echo(
|
|
1635
|
+
f"quiet hours set: {machine} {stored.get('start')}-{stored.get('end')} "
|
|
1636
|
+
f"({stored.get('tz')}) — overrides any coordinator.yml block for this "
|
|
1637
|
+
f"machine; `coord quiet-hours {machine} --print-yaml` to make it permanent"
|
|
1638
|
+
)
|
|
@@ -130,13 +130,21 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
|
|
|
130
130
|
# render "PAUSED" for a machine nobody paused and no `coord unpause` will
|
|
131
131
|
# free — work stopping with no stated reason, which is the exact failure
|
|
132
132
|
# the cordon mechanism is supposed to stop repeating.
|
|
133
|
+
# #2146: an operator-SET quiet-hours window lives in the daemon's state
|
|
134
|
+
# file, not in coordinator.yml, so a thin client resolving it locally
|
|
135
|
+
# would see the machine in `paused` with no local explanation and print
|
|
136
|
+
# the flatly wrong "PAUSED". Fetch the effective window map (daemon-aware,
|
|
137
|
+
# fail-soft) and hand it to describe_pause_state, which also names where
|
|
138
|
+
# each window came from — "set here" vs "from coordinator.yml".
|
|
133
139
|
from coord.machine_pause import ( # noqa: PLC0415
|
|
134
140
|
cordons as fetch_cordons,
|
|
135
141
|
describe_pause_state,
|
|
142
|
+
effective_quiet_hours,
|
|
136
143
|
paused_set,
|
|
137
144
|
)
|
|
138
145
|
paused = paused_set(cfg.machines)
|
|
139
146
|
cordons = fetch_cordons()
|
|
147
|
+
quiet_windows = effective_quiet_hours(cfg.machines)
|
|
140
148
|
|
|
141
149
|
statuses = check_all(machines, timeout=timeout)
|
|
142
150
|
agent_completed: dict[str, dict] = {}
|
|
@@ -196,7 +204,9 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
|
|
|
196
204
|
# pause — an operator debugging a stalled queue at 1AM needs to
|
|
197
205
|
# know whether the machine will wake itself up or is waiting on
|
|
198
206
|
# `coord unpause`.
|
|
199
|
-
pause_state = describe_pause_state(
|
|
207
|
+
pause_state = describe_pause_state(
|
|
208
|
+
m, paused, cordons=cordons, quiet_hours=quiet_windows
|
|
209
|
+
)
|
|
200
210
|
if pause_state is not None and pause_state.kind == "cordon":
|
|
201
211
|
# #2101 trap E: name the version it is draining for, so a stopped
|
|
202
212
|
# machine reads as "the fleet is upgrading itself" rather than as
|
|
@@ -649,8 +649,40 @@ def test(assignment_id: str, config_path: Path, verdict: str | None, reason: str
|
|
|
649
649
|
|
|
650
650
|
if repo and repo.test_command:
|
|
651
651
|
click.echo(f"Running tests: {repo.test_command}")
|
|
652
|
-
|
|
652
|
+
# #2170: capture (stdout+stderr merged, same as an unpiped terminal
|
|
653
|
+
# would show) so a failure can be checked for the runner's `RESULT:
|
|
654
|
+
# BASELINE-RED` marker below — a failure the runner itself has
|
|
655
|
+
# already confirmed also reproduces on the merge-base is a
|
|
656
|
+
# statement about THIS MACHINE, not this branch, and must not be
|
|
657
|
+
# nudged towards `coord test --fail`. Relayed to the terminal after
|
|
658
|
+
# the run finishes rather than streamed live — the trade-off that
|
|
659
|
+
# buys the marker check `subprocess.run` (not `Popen`) keeps this
|
|
660
|
+
# call mockable exactly like every other one in this function.
|
|
661
|
+
result = subprocess.run(
|
|
662
|
+
repo.test_command, shell=True, cwd=str(wt_path),
|
|
663
|
+
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True,
|
|
664
|
+
)
|
|
665
|
+
if result.stdout:
|
|
666
|
+
click.echo(result.stdout, nl=False)
|
|
653
667
|
if result.returncode != 0:
|
|
668
|
+
from coord.revalidate import is_baseline_red_failure # noqa: PLC0415
|
|
669
|
+
|
|
670
|
+
if is_baseline_red_failure(result.returncode, result.stdout or ""):
|
|
671
|
+
click.echo(
|
|
672
|
+
f"\nTests failed (exit {result.returncode}) — but the "
|
|
673
|
+
"runner already confirmed every failure reproduces "
|
|
674
|
+
"identically on the merge-base (#2170): this machine's "
|
|
675
|
+
"BASELINE is red, not this branch.",
|
|
676
|
+
err=True,
|
|
677
|
+
)
|
|
678
|
+
click.echo(f" worktree kept for inspection: {wt_path}")
|
|
679
|
+
click.echo(
|
|
680
|
+
" run: coord test --skipped "
|
|
681
|
+
f"{assignment_id} --reason \"baseline-red (#2170): "
|
|
682
|
+
"pre-existing failures on this machine\" "
|
|
683
|
+
"# NOT --fail — the branch made nothing worse"
|
|
684
|
+
)
|
|
685
|
+
sys.exit(1)
|
|
654
686
|
click.echo(f"Tests failed (exit {result.returncode})", err=True)
|
|
655
687
|
click.echo(f" worktree kept for inspection: {wt_path}")
|
|
656
688
|
sys.exit(1)
|
|
@@ -1951,6 +1951,50 @@ def _parse_hhmm(raw: Any, *, field_path: str) -> time:
|
|
|
1951
1951
|
return time(int(m.group(1)), int(m.group(2)))
|
|
1952
1952
|
|
|
1953
1953
|
|
|
1954
|
+
def parse_quiet_hours_window(
|
|
1955
|
+
start: Any, end: Any, tz: Any, *, prefix: str = "quiet_hours"
|
|
1956
|
+
) -> QuietHours:
|
|
1957
|
+
"""Validate a raw ``start``/``end``/``tz`` triple into a `QuietHours`.
|
|
1958
|
+
|
|
1959
|
+
#2146: THE definition of "a valid quiet-hours window", shared by the
|
|
1960
|
+
YAML path (`_parse_quiet_hours_block` below, i.e.
|
|
1961
|
+
``machines[i].quiet_hours`` and ``notifications.quiet_hours``) and by
|
|
1962
|
+
the operator-set store path (`coord.machine_pause.local_set_quiet_hours`,
|
|
1963
|
+
written by `coord quiet-hours` / the daemon's `/pause` endpoint).
|
|
1964
|
+
|
|
1965
|
+
The two sources must never diverge on what they accept: a window a
|
|
1966
|
+
`coord quiet-hours` call takes but `coordinator.yml` rejects (or vice
|
|
1967
|
+
versa) would make `--print-yaml`'s promotion path — the whole point of
|
|
1968
|
+
which is "make this temporary window permanent" — emit a block that
|
|
1969
|
+
fails to load. One validator, one answer.
|
|
1970
|
+
|
|
1971
|
+
Raises `ConfigError` (with *prefix* naming the offending field) on
|
|
1972
|
+
anything invalid; the daemon endpoint relays that message verbatim in
|
|
1973
|
+
its 400 so an operator sees the real reason, not "bad request".
|
|
1974
|
+
"""
|
|
1975
|
+
parsed_start = _parse_hhmm(start, field_path=f"{prefix}.start")
|
|
1976
|
+
parsed_end = _parse_hhmm(end, field_path=f"{prefix}.end")
|
|
1977
|
+
|
|
1978
|
+
if not tz or not isinstance(tz, str):
|
|
1979
|
+
raise ConfigError(
|
|
1980
|
+
f"{prefix}.tz is required (IANA zone name, e.g. 'America/Chicago') — "
|
|
1981
|
+
"quiet hours never default to the daemon's own UTC clock, since that "
|
|
1982
|
+
"would silently fire at the wrong local hour"
|
|
1983
|
+
)
|
|
1984
|
+
try:
|
|
1985
|
+
ZoneInfo(tz)
|
|
1986
|
+
except (ZoneInfoNotFoundError, ValueError, OSError) as e:
|
|
1987
|
+
raise ConfigError(f"{prefix}.tz {tz!r} is not a known IANA zone name: {e}") from e
|
|
1988
|
+
|
|
1989
|
+
if parsed_start == parsed_end:
|
|
1990
|
+
raise ConfigError(
|
|
1991
|
+
f"{prefix}: start and end must differ ('always quiet' is ambiguous — "
|
|
1992
|
+
"use `coord pause` to take a machine out of rotation indefinitely instead)"
|
|
1993
|
+
)
|
|
1994
|
+
|
|
1995
|
+
return QuietHours(start=parsed_start, end=parsed_end, tz=tz)
|
|
1996
|
+
|
|
1997
|
+
|
|
1954
1998
|
def _parse_quiet_hours_block(raw: Any, *, prefix: str) -> QuietHours | None:
|
|
1955
1999
|
"""Parse a ``{start, end, tz}`` quiet-hours mapping. ``None`` → ``None``.
|
|
1956
2000
|
|
|
@@ -1967,34 +2011,19 @@ def _parse_quiet_hours_block(raw: Any, *, prefix: str) -> QuietHours | None:
|
|
|
1967
2011
|
operator wrote — a quiet-hours feature that activates early is worse
|
|
1968
2012
|
than none, because it silently pulls the machine out of the fleet
|
|
1969
2013
|
during the working day. Fail loudly here rather than default quietly.
|
|
2014
|
+
|
|
2015
|
+
#2146: the field-level rules themselves now live in
|
|
2016
|
+
`parse_quiet_hours_window` above, so the operator-set store validates
|
|
2017
|
+
identically to this YAML path.
|
|
1970
2018
|
"""
|
|
1971
2019
|
if raw is None:
|
|
1972
2020
|
return None
|
|
1973
2021
|
if not isinstance(raw, dict):
|
|
1974
2022
|
raise ConfigError(f"{prefix} must be a mapping")
|
|
1975
2023
|
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
tz = raw.get("tz")
|
|
1980
|
-
if not tz or not isinstance(tz, str):
|
|
1981
|
-
raise ConfigError(
|
|
1982
|
-
f"{prefix}.tz is required (IANA zone name, e.g. 'America/Chicago') — "
|
|
1983
|
-
"quiet hours never default to the daemon's own UTC clock, since that "
|
|
1984
|
-
"would silently fire at the wrong local hour"
|
|
1985
|
-
)
|
|
1986
|
-
try:
|
|
1987
|
-
ZoneInfo(tz)
|
|
1988
|
-
except (ZoneInfoNotFoundError, ValueError, OSError) as e:
|
|
1989
|
-
raise ConfigError(f"{prefix}.tz {tz!r} is not a known IANA zone name: {e}") from e
|
|
1990
|
-
|
|
1991
|
-
if start == end:
|
|
1992
|
-
raise ConfigError(
|
|
1993
|
-
f"{prefix}: start and end must differ ('always quiet' is ambiguous — "
|
|
1994
|
-
"use `coord pause` to take a machine out of rotation indefinitely instead)"
|
|
1995
|
-
)
|
|
1996
|
-
|
|
1997
|
-
return QuietHours(start=start, end=end, tz=tz)
|
|
2024
|
+
return parse_quiet_hours_window(
|
|
2025
|
+
raw.get("start"), raw.get("end"), raw.get("tz"), prefix=prefix
|
|
2026
|
+
)
|
|
1998
2027
|
|
|
1999
2028
|
|
|
2000
2029
|
def _parse_quiet_hours(raw: Any, *, machine_index: int, machine_name: str) -> QuietHours | None:
|