code-coordinator 0.5.104__tar.gz → 0.5.106__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.104 → code_coordinator-0.5.106}/PKG-INFO +1 -1
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agent.py +279 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/agent_ops.py +22 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/dispatch.py +16 -6
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/repo.py +7 -4
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/status.py +7 -1
- code_coordinator-0.5.106/coord/config_reload.py +102 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/merge_queue.py +121 -10
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/repo_onboard.py +19 -8
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/serve_app.py +13 -58
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/AGENT_OPERATIONS.md +51 -7
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent.py +420 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_repo_2220.py +9 -2
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_merge_queue.py +109 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_repo_onboard_2220.py +9 -2
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.gitignore +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/CLAUDE.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/GOAL.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/LICENSE +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/MANIFEST.in +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/README.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/__init__.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/audit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/block_log.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/board_service.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/brain.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/claim.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/cli.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/client.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/comments.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/config.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dao.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/db.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deps.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/drive.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/events.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/filelock.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/freshness.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/gates.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/goal.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/context.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/models.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/render.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/units.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/hooks.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/interactive.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/models.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/network.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notify.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/openapi.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/parentage.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/plans.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/progress.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/release_window.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/reports.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/review.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/smoke.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/split_work.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/state.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/test_author.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/test_report.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/usage.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/install-agent.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/pyproject.toml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/setup.cfg +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/__init__.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/conftest.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_db.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_events.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_init.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_models.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_network.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_session.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_split.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_state.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -26,6 +26,7 @@ from pathlib import Path
|
|
|
26
26
|
from typing import TYPE_CHECKING, Any, Callable, Iterable
|
|
27
27
|
|
|
28
28
|
from coord import cargo_cache
|
|
29
|
+
from coord.config_reload import reload_config_if_stale
|
|
29
30
|
from coord.models import DELIVERABLE_ANALYSIS_LABEL
|
|
30
31
|
from coord.platform_paths import default_coord_dir
|
|
31
32
|
|
|
@@ -4010,6 +4011,25 @@ WRITE_CAPABLE_SPEC_TYPES: frozenset[str] = frozenset({
|
|
|
4010
4011
|
})
|
|
4011
4012
|
|
|
4012
4013
|
|
|
4014
|
+
def _config_mtime_of(config: "Any | None") -> float | None:
|
|
4015
|
+
"""mtime of *config*'s backing ``coordinator.yml``, or None (#2299).
|
|
4016
|
+
|
|
4017
|
+
None whenever there is nothing to watch: config-free mode (no config at
|
|
4018
|
+
all), thin-client mode (the config came from the daemon's ``GET /config``
|
|
4019
|
+
and has no local ``path``), or a file that vanished between load and now.
|
|
4020
|
+
Every one of those cases makes :meth:`AgentServer._maybe_reload_config` a
|
|
4021
|
+
no-op, which is the correct degradation — an agent with no local file has
|
|
4022
|
+
nothing to re-read.
|
|
4023
|
+
"""
|
|
4024
|
+
path = getattr(config, "path", None) if config is not None else None
|
|
4025
|
+
if path is None:
|
|
4026
|
+
return None
|
|
4027
|
+
try:
|
|
4028
|
+
return Path(path).stat().st_mtime
|
|
4029
|
+
except OSError:
|
|
4030
|
+
return None
|
|
4031
|
+
|
|
4032
|
+
|
|
4013
4033
|
class AgentServer:
|
|
4014
4034
|
"""Owns assignment state and subprocesses. Thread-safe."""
|
|
4015
4035
|
|
|
@@ -4022,6 +4042,14 @@ class AgentServer:
|
|
|
4022
4042
|
state_dir: Path = DEFAULT_STATE_DIR,
|
|
4023
4043
|
worker_command: WorkerCommandBuilder | None = None,
|
|
4024
4044
|
repo_paths: dict[str, str] | None = None,
|
|
4045
|
+
# RESTART-ONLY (#2299). These two are read by `_spawn` for every
|
|
4046
|
+
# worker, but they are *process* tuning (how the daemon forks and how
|
|
4047
|
+
# long it waits for first output), not fleet topology — they are NOT
|
|
4048
|
+
# refreshed by the config reload below. Changing
|
|
4049
|
+
# `concurrency.bash_wrap_spawn` / `concurrency.first_output_timeout`
|
|
4050
|
+
# in coordinator.yml still requires `systemctl --user restart
|
|
4051
|
+
# coord-agent`, as do the bind host/port (owned by uvicorn, which has
|
|
4052
|
+
# already bound the socket by the time any reload could run).
|
|
4025
4053
|
bash_wrap_spawn: bool = True,
|
|
4026
4054
|
first_output_timeout: float = _FIRST_OUTPUT_TIMEOUT,
|
|
4027
4055
|
# #305: per-repo artifact glob patterns; repo_name → list of globs.
|
|
@@ -4091,11 +4119,51 @@ class AgentServer:
|
|
|
4091
4119
|
# :mod:`coord.providers` at module load time — concrete instances
|
|
4092
4120
|
# are duck-typed (``build_command``, ``initial_input``,
|
|
4093
4121
|
# ``capabilities``, ``env``) at call sites.
|
|
4122
|
+
#
|
|
4123
|
+
# RESTART-ONLY (#2299): the registry is deliberately NOT refreshed by
|
|
4124
|
+
# the config reload. A running worker holds a provider resolved at
|
|
4125
|
+
# dispatch time (`_resolve_provider`), and `_reap` re-resolves the
|
|
4126
|
+
# SAME spec afterwards to pick a log parser — swapping the registry
|
|
4127
|
+
# underneath would let a live session's provider silently change
|
|
4128
|
+
# identity mid-flight (retargeting its model / log format), which is
|
|
4129
|
+
# exactly the "never mutate state a running worker depends on"
|
|
4130
|
+
# invariant this feature is bounded by. Adding or editing a provider
|
|
4131
|
+
# still needs a restart.
|
|
4094
4132
|
self._providers: dict[str, object] = dict(providers or {})
|
|
4095
4133
|
self._worktree_writable_settings_files = worktree_writable_settings_files
|
|
4096
4134
|
self._health_config = health_config
|
|
4097
4135
|
self.config_free_reason = config_free_reason
|
|
4098
4136
|
|
|
4137
|
+
# ── #2299: hot config reload ────────────────────────────────────────
|
|
4138
|
+
# The agent used to freeze every config-derived field above at process
|
|
4139
|
+
# start, so adding a repo to coordinator.yml required `systemctl --user
|
|
4140
|
+
# restart coord-agent` on every machine that should serve it — the one
|
|
4141
|
+
# action that also kills live workers, which in practice meant waiting
|
|
4142
|
+
# for the whole fleet to go quiet before a repo could be onboarded at
|
|
4143
|
+
# all. Worse, the skew was silent and asymmetric: `coord config`,
|
|
4144
|
+
# `coord status` and `coord assign --dry-run` all read the *file* and
|
|
4145
|
+
# reported the repo as supported while `assign()` refused every single
|
|
4146
|
+
# dispatch for it.
|
|
4147
|
+
#
|
|
4148
|
+
# `_maybe_reload_config` closes that, driven off the existing /health
|
|
4149
|
+
# poll and the dispatch path (no new timer, no background thread).
|
|
4150
|
+
# `_config_mtime` is seeded here from the file we were built from so
|
|
4151
|
+
# the first poll after startup is a no-op stat(), not a redundant
|
|
4152
|
+
# reparse.
|
|
4153
|
+
self._config_mtime: float | None = _config_mtime_of(health_config)
|
|
4154
|
+
# Serializes reload attempts so two concurrent /health polls (or a
|
|
4155
|
+
# poll racing a dispatch) can't both parse the file and apply
|
|
4156
|
+
# overlapping swaps. Held across stat + parse + apply. Lock order is
|
|
4157
|
+
# always `_config_reload_lock` → `_lock`; nothing takes them the other
|
|
4158
|
+
# way round.
|
|
4159
|
+
self._config_reload_lock = threading.Lock()
|
|
4160
|
+
# Observability for /health: how many times the on-disk config was
|
|
4161
|
+
# successfully re-read into this process, and when. In-memory only —
|
|
4162
|
+
# it exists to answer "did this agent pick up my edit?" without an
|
|
4163
|
+
# SSH + journalctl, which is the question #2299 was really about.
|
|
4164
|
+
self._config_reloads: int = 0
|
|
4165
|
+
self._config_reloaded_at: float | None = None
|
|
4166
|
+
|
|
4099
4167
|
self._lock = threading.Lock()
|
|
4100
4168
|
self._assignments: dict[str, AgentAssignment] = {}
|
|
4101
4169
|
self._processes: dict[str, subprocess.Popen] = {}
|
|
@@ -4227,9 +4295,198 @@ class AgentServer:
|
|
|
4227
4295
|
self.log_dir.mkdir(parents=True, exist_ok=True)
|
|
4228
4296
|
self._load_state()
|
|
4229
4297
|
|
|
4298
|
+
# ── #2299: hot config reload ────────────────────────────────────────────
|
|
4299
|
+
|
|
4300
|
+
#: Config-derived state that a reload refreshes, versus the state it must
|
|
4301
|
+
#: leave alone. Kept as a docstring-adjacent constant so the *decision*
|
|
4302
|
+
#: (issue #2299's "needs a decision, not an assumption" list) is recorded
|
|
4303
|
+
#: in the code rather than only in the issue thread.
|
|
4304
|
+
#:
|
|
4305
|
+
#: HOT (refreshed on the next health poll / dispatch):
|
|
4306
|
+
#: * ``repos`` — the point of the feature; gates ``assign()``
|
|
4307
|
+
#: and is what ``/health`` advertises.
|
|
4308
|
+
#: * ``repo_paths`` — resolved per dispatch.
|
|
4309
|
+
#: * ``artifact_paths`` — read when a finished worker's artifacts are
|
|
4310
|
+
#: stashed.
|
|
4311
|
+
#: * ``build_commands`` — read just before that stash.
|
|
4312
|
+
#: * ``capabilities`` — published in ``/health``; the coordinator does
|
|
4313
|
+
#: smoke/review routing from that published list,
|
|
4314
|
+
#: and nothing in the *worker* path reads it, so a
|
|
4315
|
+
#: capability that disappears simply stops
|
|
4316
|
+
#: attracting new work (degrade) instead of
|
|
4317
|
+
#: stranding anything in flight.
|
|
4318
|
+
#:
|
|
4319
|
+
#: RESTART-ONLY (documented at their assignment sites in ``__init__``):
|
|
4320
|
+
#: * ``providers`` — a live worker holds a resolved provider.
|
|
4321
|
+
#: * ``bash_wrap_spawn`` / ``first_output_timeout`` — process tuning.
|
|
4322
|
+
#: * bind host/port — uvicorn has already bound the socket.
|
|
4323
|
+
_RELOADABLE_FIELDS = (
|
|
4324
|
+
"repos",
|
|
4325
|
+
"repo_paths",
|
|
4326
|
+
"artifact_paths",
|
|
4327
|
+
"build_commands",
|
|
4328
|
+
"capabilities",
|
|
4329
|
+
)
|
|
4330
|
+
|
|
4331
|
+
def _maybe_reload_config(self) -> bool:
|
|
4332
|
+
"""Re-read ``coordinator.yml`` if it changed on disk; return True if applied.
|
|
4333
|
+
|
|
4334
|
+
This is #2299's whole mechanism. It reuses the board daemon's #1081
|
|
4335
|
+
helper (:func:`coord.config_reload.reload_config_if_stale`) rather than
|
|
4336
|
+
inventing a second one, so the malformed-edit behaviour is identical by
|
|
4337
|
+
construction: a bad hand-edit is logged and swallowed, the agent keeps
|
|
4338
|
+
running on the last-good config, and the tracked mtime still advances
|
|
4339
|
+
so the bad edit is not re-parsed on every subsequent poll.
|
|
4340
|
+
|
|
4341
|
+
Cheap enough to call on the hot paths that already exist (``health()``
|
|
4342
|
+
and ``assign()``): the steady-state cost is one ``stat()`` under an
|
|
4343
|
+
uncontended lock — no new timer and no background thread.
|
|
4344
|
+
|
|
4345
|
+
Fail-soft in every direction. A missing/thin-client config, a vanished
|
|
4346
|
+
file, a malformed edit, or a config whose ``machines:`` list no longer
|
|
4347
|
+
contains this machine all leave the agent exactly as it was.
|
|
4348
|
+
"""
|
|
4349
|
+
cfg = self._health_config
|
|
4350
|
+
if cfg is None or getattr(cfg, "path", None) is None:
|
|
4351
|
+
# Config-free (docs/EPHEMERAL_WORKERS.md) or thin-client mode —
|
|
4352
|
+
# there is no local file to watch. Both are legitimate; neither
|
|
4353
|
+
# can drift against a file it doesn't have.
|
|
4354
|
+
return False
|
|
4355
|
+
|
|
4356
|
+
with self._config_reload_lock:
|
|
4357
|
+
# Re-read under the lock: a concurrent caller may already have
|
|
4358
|
+
# applied this same edit while we waited, in which case
|
|
4359
|
+
# `_config_mtime` has moved past it and the helper no-ops.
|
|
4360
|
+
cfg = self._health_config
|
|
4361
|
+
reloaded, mtime = reload_config_if_stale(
|
|
4362
|
+
cfg,
|
|
4363
|
+
self._config_mtime,
|
|
4364
|
+
log_name=__name__,
|
|
4365
|
+
label="coord agent",
|
|
4366
|
+
)
|
|
4367
|
+
self._config_mtime = mtime
|
|
4368
|
+
if reloaded is cfg:
|
|
4369
|
+
return False
|
|
4370
|
+
|
|
4371
|
+
machine = next(
|
|
4372
|
+
(m for m in reloaded.machines if m.name == self.machine_name), None
|
|
4373
|
+
)
|
|
4374
|
+
if machine is None:
|
|
4375
|
+
# The edit removed/renamed this machine. Adopting a config
|
|
4376
|
+
# that doesn't describe us would mean publishing an empty repo
|
|
4377
|
+
# list and refusing every dispatch — a far worse outcome than
|
|
4378
|
+
# staying on the last-good snapshot until an operator notices.
|
|
4379
|
+
# `_config_mtime` has still advanced, so this logs once per
|
|
4380
|
+
# edit rather than once per poll.
|
|
4381
|
+
_log.warning(
|
|
4382
|
+
"coord agent: %s reloaded but no longer declares machine "
|
|
4383
|
+
"%r (has: %s); keeping the previous config",
|
|
4384
|
+
reloaded.path,
|
|
4385
|
+
self.machine_name,
|
|
4386
|
+
[m.name for m in reloaded.machines],
|
|
4387
|
+
)
|
|
4388
|
+
return False
|
|
4389
|
+
|
|
4390
|
+
self._apply_reloaded_config(reloaded, machine)
|
|
4391
|
+
return True
|
|
4392
|
+
|
|
4393
|
+
def _apply_reloaded_config(self, cfg: "Any", machine: "Any") -> None:
|
|
4394
|
+
"""Swap the reloadable fields in place, pinning anything in flight.
|
|
4395
|
+
|
|
4396
|
+
The invariant from #2299: *a reload must never mutate state a running
|
|
4397
|
+
worker depends on.* In-flight assignments keep the values they started
|
|
4398
|
+
with; the new config governs the next dispatch onward.
|
|
4399
|
+
|
|
4400
|
+
Concretely, any repo with a PENDING or RUNNING assignment is "pinned":
|
|
4401
|
+
its ``repo_paths`` / ``artifact_paths`` / ``build_commands`` entries
|
|
4402
|
+
keep their pre-reload values (including *absence* — a repo that had no
|
|
4403
|
+
build command before must not acquire one halfway through a worker's
|
|
4404
|
+
leg, or the pre-stash build would run a command the worker never
|
|
4405
|
+
expected). The pin lifts as soon as that assignment reaches a terminal
|
|
4406
|
+
state and the next reload runs.
|
|
4407
|
+
|
|
4408
|
+
``repos`` and ``capabilities`` are replaced wholesale: they gate and
|
|
4409
|
+
advertise *new* work only, so removing a repo correctly means "take no
|
|
4410
|
+
more dispatches for it", not "abandon the worker already running".
|
|
4411
|
+
|
|
4412
|
+
Every field is *rebound* to a freshly-built list/dict rather than
|
|
4413
|
+
mutated in place, so the many unsynchronized readers elsewhere in this
|
|
4414
|
+
class (``_servable_repos``, ``_stash_artifacts``, ``assign``, ...) see
|
|
4415
|
+
either the whole old value or the whole new one — never a half-updated
|
|
4416
|
+
dict.
|
|
4417
|
+
"""
|
|
4418
|
+
new_repos = list(machine.repos)
|
|
4419
|
+
new_capabilities = list(machine.capabilities)
|
|
4420
|
+
new_repo_paths = dict(machine.repo_paths or {})
|
|
4421
|
+
new_artifact_paths: dict[str, list[str]] = {
|
|
4422
|
+
r.name: list(r.artifact_paths) for r in cfg.repos if r.artifact_paths
|
|
4423
|
+
}
|
|
4424
|
+
new_build_commands: dict[str, str] = {
|
|
4425
|
+
r.name: r.build_command for r in cfg.repos if r.build_command
|
|
4426
|
+
}
|
|
4427
|
+
|
|
4428
|
+
def _pin(old: dict, new: dict, keys: "Iterable[str]") -> None:
|
|
4429
|
+
"""Restore *old*'s entry for each pinned key — including absence."""
|
|
4430
|
+
for key in keys:
|
|
4431
|
+
if key in old:
|
|
4432
|
+
new[key] = old[key]
|
|
4433
|
+
else:
|
|
4434
|
+
new.pop(key, None)
|
|
4435
|
+
|
|
4436
|
+
with self._lock:
|
|
4437
|
+
in_flight = {
|
|
4438
|
+
a.spec.repo_name
|
|
4439
|
+
for a in self._assignments.values()
|
|
4440
|
+
if a.status in (PENDING, RUNNING)
|
|
4441
|
+
}
|
|
4442
|
+
_pin(self.repo_paths, new_repo_paths, in_flight)
|
|
4443
|
+
_pin(self.artifact_paths, new_artifact_paths, in_flight)
|
|
4444
|
+
_pin(self.build_commands, new_build_commands, in_flight)
|
|
4445
|
+
|
|
4446
|
+
added = [r for r in new_repos if r not in self.repos]
|
|
4447
|
+
removed = [r for r in self.repos if r not in new_repos]
|
|
4448
|
+
caps_changed = new_capabilities != self.capabilities
|
|
4449
|
+
|
|
4450
|
+
self.repos = new_repos
|
|
4451
|
+
self.capabilities = new_capabilities
|
|
4452
|
+
self.repo_paths = new_repo_paths
|
|
4453
|
+
self.artifact_paths = new_artifact_paths
|
|
4454
|
+
self.build_commands = new_build_commands
|
|
4455
|
+
self._health_config = cfg
|
|
4456
|
+
self._config_reloads += 1
|
|
4457
|
+
self._config_reloaded_at = time.time()
|
|
4458
|
+
|
|
4459
|
+
# The H-1 block in /health is built from `_health_config`'s checkouts,
|
|
4460
|
+
# so a stale cache would keep reporting the pre-reload repo set for up
|
|
4461
|
+
# to a full TTL after the swap — exactly the skew this issue is about,
|
|
4462
|
+
# just moved one layer down.
|
|
4463
|
+
self._local_health_cache = None
|
|
4464
|
+
|
|
4465
|
+
_log.info(
|
|
4466
|
+
"coord agent: applied config reload from %s — repos=%s "
|
|
4467
|
+
"(added=%s removed=%s) capabilities=%s%s",
|
|
4468
|
+
getattr(cfg, "path", None),
|
|
4469
|
+
new_repos,
|
|
4470
|
+
added or "[]",
|
|
4471
|
+
removed or "[]",
|
|
4472
|
+
new_capabilities if caps_changed else "unchanged",
|
|
4473
|
+
(
|
|
4474
|
+
f" (pinned in-flight repos: {sorted(in_flight)})"
|
|
4475
|
+
if in_flight
|
|
4476
|
+
else ""
|
|
4477
|
+
),
|
|
4478
|
+
)
|
|
4479
|
+
|
|
4230
4480
|
# ── Public API ──────────────────────────────────────────────────────────
|
|
4231
4481
|
|
|
4232
4482
|
def health(self) -> dict:
|
|
4483
|
+
# #2299: the health poll IS the reload tick. The coordinator polls
|
|
4484
|
+
# every agent's /health continuously, so piggybacking here means a
|
|
4485
|
+
# coordinator.yml edit lands within one poll with no new timer, and —
|
|
4486
|
+
# critically — the `repos` list published below is the post-reload one,
|
|
4487
|
+
# so `coord repo doctor`'s `machines.agent_repo_skew` clears itself
|
|
4488
|
+
# instead of instructing an operator to restart a busy agent.
|
|
4489
|
+
self._maybe_reload_config()
|
|
4233
4490
|
with self._lock:
|
|
4234
4491
|
active = sum(1 for a in self._assignments.values() if a.status == RUNNING)
|
|
4235
4492
|
completed = sum(
|
|
@@ -4240,6 +4497,9 @@ class AgentServer:
|
|
|
4240
4497
|
worktree_bytes = self._cached_worktree_bytes()
|
|
4241
4498
|
artifact_bytes = self._cached_artifact_bytes()
|
|
4242
4499
|
servable_repos, degraded_repos = self._servable_repos()
|
|
4500
|
+
# #2299: the coordinator.yml this agent re-reads on every poll, or
|
|
4501
|
+
# None when there is nothing local to watch (config-free / thin-client).
|
|
4502
|
+
watched_config = getattr(self._health_config, "path", None)
|
|
4243
4503
|
return {
|
|
4244
4504
|
"machine": self.machine_name,
|
|
4245
4505
|
"capabilities": self.capabilities,
|
|
@@ -4309,6 +4569,18 @@ class AgentServer:
|
|
|
4309
4569
|
"skipped_active": self._graph_heal_skipped_active,
|
|
4310
4570
|
"last_skip_at": self._graph_heal_last_skip_at,
|
|
4311
4571
|
},
|
|
4572
|
+
# #2299: is this agent actually watching a coordinator.yml, and
|
|
4573
|
+
# has it picked anything up? `watching` is None for a
|
|
4574
|
+
# config-free/thin-client agent (nothing local to re-read), which
|
|
4575
|
+
# is the one case where a restart IS still the only way to change
|
|
4576
|
+
# the repo list. Lets an operator answer "did my edit land?"
|
|
4577
|
+
# from `coord doctor` instead of SSH + journalctl — the whole
|
|
4578
|
+
# complaint in #2299 was that the skew was invisible from outside.
|
|
4579
|
+
"config_reload": {
|
|
4580
|
+
"watching": str(watched_config) if watched_config else None,
|
|
4581
|
+
"reloads": self._config_reloads,
|
|
4582
|
+
"last_reload_at": self._config_reloaded_at,
|
|
4583
|
+
},
|
|
4312
4584
|
}
|
|
4313
4585
|
|
|
4314
4586
|
def _cached_local_health(self) -> dict:
|
|
@@ -5614,6 +5886,13 @@ class AgentServer:
|
|
|
5614
5886
|
|
|
5615
5887
|
def assign(self, spec: AssignmentSpec) -> AgentAssignment:
|
|
5616
5888
|
"""Accept an assignment and spawn the worker. Returns immediately."""
|
|
5889
|
+
# #2299: refresh from coordinator.yml before the repo gate below.
|
|
5890
|
+
# /health already reloads on every poll, but gating dispatch on
|
|
5891
|
+
# "someone happened to poll first" would make repo onboarding depend
|
|
5892
|
+
# on poll timing; this costs one stat() in the steady state and makes
|
|
5893
|
+
# the guarantee unconditional — the dispatch that arrives after the
|
|
5894
|
+
# edit is served, full stop.
|
|
5895
|
+
self._maybe_reload_config()
|
|
5617
5896
|
if self.repos and spec.repo_name not in self.repos:
|
|
5618
5897
|
raise ValueError(
|
|
5619
5898
|
f"this agent does not handle repo {spec.repo_name!r} "
|
|
@@ -323,6 +323,28 @@ def _resolve_agent_startup(
|
|
|
323
323
|
f"coord agent: config source={source} machine={machine.name} "
|
|
324
324
|
f"capabilities={list(machine.capabilities)}"
|
|
325
325
|
)
|
|
326
|
+
# #2299: say up front whether this process will notice a coordinator.yml
|
|
327
|
+
# edit, because the answer differs by deployment and the failure mode of
|
|
328
|
+
# guessing wrong is silent. An agent with a local file re-reads it on the
|
|
329
|
+
# next /health poll; a thin client has no local file to watch and its repo
|
|
330
|
+
# list really is fixed for the life of the process. Naming the
|
|
331
|
+
# restart-only fields here means the journal answers "do I need to
|
|
332
|
+
# restart?" without anyone having to remember the issue thread.
|
|
333
|
+
if cfg.path is not None:
|
|
334
|
+
notices.append(
|
|
335
|
+
f"coord agent: watching {cfg.path} for edits — repos, repo_paths, "
|
|
336
|
+
"capabilities, artifact_paths and build_command are re-read on the "
|
|
337
|
+
"next /health poll, no restart needed (#2299). RESTART-ONLY: "
|
|
338
|
+
"providers, concurrency (bash_wrap_spawn/first_output_timeout), "
|
|
339
|
+
"and the bind host/port."
|
|
340
|
+
)
|
|
341
|
+
else:
|
|
342
|
+
notices.append(
|
|
343
|
+
"coord agent: NOTICE config came from the daemon, not a local "
|
|
344
|
+
"file — there is nothing on this machine to re-read, so this "
|
|
345
|
+
"agent's repo list IS fixed until it restarts (#2299)."
|
|
346
|
+
)
|
|
347
|
+
|
|
326
348
|
if not machine.capabilities:
|
|
327
349
|
# Declaring no capabilities is legal, but it means dispatch_smoke can
|
|
328
350
|
# never pick this machine for capability-gated work — say so once at
|
|
@@ -104,9 +104,14 @@ def _repo_capability_refusal(
|
|
|
104
104
|
``assign()``'s ``machine_obj.can_work_on(repo)`` check (just above this
|
|
105
105
|
call site) only ever reads ``coordinator.yml`` — which the operator can
|
|
106
106
|
edit any time — never the agent process actually running on that
|
|
107
|
-
machine. A repo added to config
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
machine. A repo added to config used to stay invisible to a running
|
|
108
|
+
agent until a full ``systemctl --user restart coord-agent``; since #2299
|
|
109
|
+
the agent re-reads its own ``coordinator.yml`` on the next ``/health``
|
|
110
|
+
poll, so the remaining ways the two can disagree are a *stale file* on
|
|
111
|
+
that machine, a malformed edit the agent refused to adopt, or an agent
|
|
112
|
+
too old to reload — all of which this refusal still catches, because it
|
|
113
|
+
compares against live ``/health`` rather than trusting either side.
|
|
114
|
+
Every pre-flight surface an operator would
|
|
110
115
|
check before spending a dispatch reads config too: ``coord config``,
|
|
111
116
|
``coord status``, and — worst of all — ``coord assign ... --dry-run``,
|
|
112
117
|
which is the documented way to sanity-check a dispatch before paying
|
|
@@ -169,9 +174,14 @@ def _repo_capability_refusal(
|
|
|
169
174
|
return (
|
|
170
175
|
f"{machine_obj.name!r} rejected the assignment: this agent does "
|
|
171
176
|
f"not handle repo {repo!r} (supported: {live_repos}) — "
|
|
172
|
-
f"coordinator.yml lists it, but the live agent process
|
|
173
|
-
f"
|
|
174
|
-
f"
|
|
177
|
+
f"coordinator.yml lists it, but the live agent process is running "
|
|
178
|
+
f"on a different repo list (#2219). Agents re-read coordinator.yml "
|
|
179
|
+
f"on their own /health poll since #2299, so retry in a moment "
|
|
180
|
+
f"first; if it persists, that machine's own copy of the config is "
|
|
181
|
+
f"stale (`git pull` the settings checkout on "
|
|
182
|
+
f"{machine_obj.name!r}), the edit is malformed (its journal will "
|
|
183
|
+
f"say `failed to reload`), or the agent predates #2299 "
|
|
184
|
+
f"(`coord agent update`)."
|
|
175
185
|
)
|
|
176
186
|
|
|
177
187
|
|
|
@@ -273,10 +273,13 @@ def repo_add( # noqa: PLR0913 — one option per thing the command can set
|
|
|
273
273
|
f"{machine} — this is the worker WORKTREE BASE"
|
|
274
274
|
)
|
|
275
275
|
click.echo(
|
|
276
|
-
" 3.
|
|
277
|
-
"
|
|
278
|
-
"
|
|
279
|
-
"
|
|
276
|
+
" 3. `git pull` the settings checkout on each of those machines. "
|
|
277
|
+
"Since #2299 a running coord-agent re-reads its own coordinator.yml "
|
|
278
|
+
"on the next /health poll and serves the repo with NO restart — but "
|
|
279
|
+
"it can only re-read the file that is actually on ITS disk. No "
|
|
280
|
+
"restart needed (and none wanted: it kills live workers). If "
|
|
281
|
+
"`coord repo doctor` still flags agent_repo_skew a poll later, check "
|
|
282
|
+
"`journalctl --user -u coord-agent` for a `failed to reload` line."
|
|
280
283
|
)
|
|
281
284
|
click.echo(
|
|
282
285
|
" 4. add a CLAUDE.md to the repo — the Test agent auto-loads it and "
|
|
@@ -885,7 +885,13 @@ def _health_vs_config_lines(machine, health: dict) -> list[tuple[bool, str]]:
|
|
|
885
885
|
"it hasn't re-read them; a dispatch to any of "
|
|
886
886
|
f"{stale} on this machine will be refused despite `coord "
|
|
887
887
|
"config`/`coord status` showing it as supported (#2219). "
|
|
888
|
-
"
|
|
888
|
+
"Agents re-read coordinator.yml on their own /health poll "
|
|
889
|
+
"since #2299, so re-check in a moment before doing anything: "
|
|
890
|
+
"a gap that persists means this machine's copy of the config "
|
|
891
|
+
"is stale (`git pull` the settings checkout HERE), the edit "
|
|
892
|
+
"is malformed (`journalctl --user -u coord-agent` will say "
|
|
893
|
+
"`failed to reload`), or this agent predates #2299 "
|
|
894
|
+
"(`coord agent update`).",
|
|
889
895
|
))
|
|
890
896
|
for repo in drifted:
|
|
891
897
|
if repo in degraded:
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""Shared mtime-guarded ``coordinator.yml`` reload (#1081, lifted in #2299).
|
|
2
|
+
|
|
3
|
+
Every long-lived coord process (``coord serve``, ``coord agent``) parses
|
|
4
|
+
``coordinator.yml`` exactly once, at startup, and then runs on that in-memory
|
|
5
|
+
snapshot forever. That is fine until an operator edits the file: from then on
|
|
6
|
+
the *file* and the *process* disagree, and nothing on the operator's side says
|
|
7
|
+
so — ``coord config``/``coord status``/``coord assign --dry-run`` all read the
|
|
8
|
+
file and cheerfully agree with the edit while the daemon quietly keeps acting
|
|
9
|
+
on the pre-edit snapshot.
|
|
10
|
+
|
|
11
|
+
:func:`reload_config_if_stale` is the one mechanism that closes that gap. It
|
|
12
|
+
was written for the board daemon in #1081 (``coord/serve_app.py``) and lifted
|
|
13
|
+
here verbatim in #2299 so the agent could reuse it rather than grow a second,
|
|
14
|
+
subtly-different copy. The behaviour is unchanged from #1081; only the logger
|
|
15
|
+
name and the human-facing prefix are parameterised, so each caller's journal
|
|
16
|
+
lines still read as that daemon's.
|
|
17
|
+
|
|
18
|
+
The contract, in one line: **a bad hand-edit must never take a running daemon
|
|
19
|
+
down, and must never be retried in a loop.**
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import logging
|
|
25
|
+
from typing import TYPE_CHECKING
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING: # pragma: no cover - typing only
|
|
28
|
+
from coord.config import Config
|
|
29
|
+
|
|
30
|
+
__all__ = ["reload_config_if_stale"]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def reload_config_if_stale(
|
|
34
|
+
current: "Config",
|
|
35
|
+
last_mtime: float | None,
|
|
36
|
+
*,
|
|
37
|
+
log_name: str = "coord.serve",
|
|
38
|
+
label: str = "coord serve",
|
|
39
|
+
) -> tuple["Config", float | None]:
|
|
40
|
+
"""Re-parse *current*'s backing ``coordinator.yml`` if it changed on disk (#1081).
|
|
41
|
+
|
|
42
|
+
A daemon's in-memory ``Config`` is otherwise fixed at process startup, so
|
|
43
|
+
a hand-edit to ``coordinator.yml`` on the daemon host silently diverges
|
|
44
|
+
from the file until a restart — even though ``GET /config`` (which serves
|
|
45
|
+
the raw bytes fresh every request) shows the new content immediately. This
|
|
46
|
+
closes that gap for the daemon's *own* decisions by tracking the file's
|
|
47
|
+
mtime and swapping in a freshly-parsed ``Config`` whenever a caller
|
|
48
|
+
notices it moved.
|
|
49
|
+
|
|
50
|
+
Returns ``(config, mtime)`` — either *current* unchanged (no backing path,
|
|
51
|
+
a ``stat()`` failure, or no on-disk change since *last_mtime*) or a
|
|
52
|
+
freshly-loaded ``Config`` paired with its new mtime. A malformed hand-edit
|
|
53
|
+
(invalid YAML, a validation error, a permissions change, a TOCTOU race
|
|
54
|
+
where the file vanishes between our ``stat()`` and ``load()``'s read, or a
|
|
55
|
+
bad-encoding write caught mid-edit) is logged and swallowed rather than
|
|
56
|
+
raised into a request handler or the tick loop — the daemon keeps serving
|
|
57
|
+
the last-good config. *last_mtime* still advances past a bad edit so it
|
|
58
|
+
isn't re-parsed (and re-logged) on every subsequent call; it will be
|
|
59
|
+
retried once the file changes again (e.g. the edit is fixed).
|
|
60
|
+
|
|
61
|
+
*log_name* / *label* only affect the journal lines (``coord.serve`` /
|
|
62
|
+
``"coord serve"`` for the board daemon, ``coord.agent`` / ``"coord
|
|
63
|
+
agent"`` for the agent) — the reload semantics are identical for every
|
|
64
|
+
caller by construction, which is the entire point of sharing this.
|
|
65
|
+
"""
|
|
66
|
+
path = current.path
|
|
67
|
+
if path is None:
|
|
68
|
+
return current, last_mtime
|
|
69
|
+
try:
|
|
70
|
+
mtime = path.stat().st_mtime
|
|
71
|
+
except OSError:
|
|
72
|
+
return current, last_mtime
|
|
73
|
+
if last_mtime is not None and mtime <= last_mtime:
|
|
74
|
+
return current, last_mtime
|
|
75
|
+
|
|
76
|
+
from coord.config import load as _load_coordinator_config # noqa: PLC0415
|
|
77
|
+
|
|
78
|
+
log = logging.getLogger(log_name)
|
|
79
|
+
try:
|
|
80
|
+
reloaded = _load_coordinator_config(path)
|
|
81
|
+
except Exception as e: # noqa: BLE001 — a tick must never crash the daemon
|
|
82
|
+
# Broad on purpose (#1081 review): load() isn't guaranteed to only raise
|
|
83
|
+
# ConfigError — a TOCTOU race (file deleted/replaced between our stat()
|
|
84
|
+
# and load()'s own read), a permissions change (OSError), a bad-encoding
|
|
85
|
+
# write caught mid-edit (UnicodeDecodeError), or a malformed structure
|
|
86
|
+
# tripping an un-validated code path deeper in the parser (AttributeError/
|
|
87
|
+
# TypeError/KeyError) can all surface here. Swallowing them matches every
|
|
88
|
+
# other tick-loop guard in the callers — an uncaught exception from this
|
|
89
|
+
# helper would otherwise either 500 a /board (or /health) request or,
|
|
90
|
+
# worse, permanently kill a bare `asyncio.create_task(...)` task with no
|
|
91
|
+
# supervisor to restart it.
|
|
92
|
+
log.warning(
|
|
93
|
+
"%s: %s changed on disk but failed to reload (%s: %s); "
|
|
94
|
+
"keeping last-good config until the file is fixed",
|
|
95
|
+
label,
|
|
96
|
+
path,
|
|
97
|
+
type(e).__name__,
|
|
98
|
+
e,
|
|
99
|
+
)
|
|
100
|
+
return current, mtime
|
|
101
|
+
log.info("%s: reloaded %s (on-disk change detected)", label, path)
|
|
102
|
+
return reloaded, mtime
|