code-coordinator 0.5.105__tar.gz → 0.5.107__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.105 → code_coordinator-0.5.107}/PKG-INFO +1 -1
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agent.py +279 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/auto_loop.py +133 -13
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/agent_ops.py +22 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/dispatch.py +16 -6
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/repo.py +7 -4
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/status.py +7 -1
- code_coordinator-0.5.107/coord/config_reload.py +102 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notify.py +24 -2
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/repo_onboard.py +19 -8
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/serve_app.py +13 -58
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/AGENT_OPERATIONS.md +51 -7
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent.py +420 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_auto_loop.py +184 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_repo_2220.py +9 -2
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_repo_onboard_2220.py +9 -2
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_stalled_pipeline.py +162 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.gitignore +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/CLAUDE.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/GOAL.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/LICENSE +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/MANIFEST.in +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/README.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/__init__.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/audit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/block_log.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/board_service.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/brain.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/claim.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/cli.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/client.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/comments.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/config.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dao.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/db.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deps.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/drive.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/events.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/filelock.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/freshness.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/gates.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/goal.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/context.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/models.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/render.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/units.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/hooks.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/interactive.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/models.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/network.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/openapi.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/parentage.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/plans.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/progress.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/release_window.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/reports.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/review.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/smoke.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/split_work.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/state.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/test_author.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/test_report.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/usage.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/install-agent.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/pyproject.toml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/setup.cfg +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/__init__.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/conftest.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_db.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_events.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_init.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_models.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_network.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_session.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_split.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_state.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.105 → code_coordinator-0.5.107}/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} "
|
|
@@ -43,7 +43,7 @@ import httpx
|
|
|
43
43
|
from coord.config import Config
|
|
44
44
|
from coord.dispatch import AGENT_PORT
|
|
45
45
|
from coord import github_ops
|
|
46
|
-
from coord.models import Assignment, Board
|
|
46
|
+
from coord.models import SEALED_PATH_AUTHOR_TYPES, Assignment, Board
|
|
47
47
|
from coord.review import (
|
|
48
48
|
ReviewFindings,
|
|
49
49
|
blocking_findings_confirmed_absent,
|
|
@@ -64,7 +64,16 @@ log = logging.getLogger(__name__)
|
|
|
64
64
|
# ``coord.notify``'s fix-completion detector doesn't hardcode ``"work"`` and
|
|
65
65
|
# silently miss a newer fix-dispatch type — the same class of bug as #1141
|
|
66
66
|
# ("test-author was never added to WORK_LIKE_TYPES").
|
|
67
|
-
|
|
67
|
+
#
|
|
68
|
+
# #2302: "mock-author" (Gate A) is the same class of bug repeating — a
|
|
69
|
+
# request-changes fix for a mock-author row dispatched as plain "work",
|
|
70
|
+
# which trips coord/review.py's sealed-path tamper rule on every round
|
|
71
|
+
# (the fix worker isn't authorized to write tests/acceptance/ms-NN/, but
|
|
72
|
+
# that's exactly where the diff has to land) until max_review_iterations
|
|
73
|
+
# burns out. `_dispatch_fix` derives `fix_type` from
|
|
74
|
+
# ``coord.models.SEALED_PATH_AUTHOR_TYPES`` rather than a hardcoded string
|
|
75
|
+
# so this set — and this one — never drift from it again.
|
|
76
|
+
FIX_DISPATCH_TYPES: frozenset[str] = frozenset({"work"}) | SEALED_PATH_AUTHOR_TYPES
|
|
68
77
|
|
|
69
78
|
|
|
70
79
|
# Every :class:`LoopAction` kind whose production means the in-memory board was
|
|
@@ -816,9 +825,16 @@ def _build_fix_briefing(
|
|
|
816
825
|
instructions instead — "make the acceptance suite pass" is actively
|
|
817
826
|
wrong guidance for an oracle that must stay RED until the real
|
|
818
827
|
implementation lands.
|
|
828
|
+
|
|
829
|
+
#2302: a ``type="mock-author"`` source row (Gate A) gets its own
|
|
830
|
+
variant for the same reason one level up the pipeline — the diff is a
|
|
831
|
+
specification (``contract.md`` + rendered mocks), not an
|
|
832
|
+
implementation, so "run tests, make them pass" is equally wrong there.
|
|
819
833
|
"""
|
|
820
834
|
if work.type == "test-author":
|
|
821
835
|
return _build_test_author_fix_briefing(work, findings, iteration, max_iter)
|
|
836
|
+
if work.type == "mock-author":
|
|
837
|
+
return _build_mock_author_fix_briefing(work, findings, iteration, max_iter)
|
|
822
838
|
|
|
823
839
|
lines: list[str] = [
|
|
824
840
|
f"# Fix assignment (iteration {iteration}/{max_iter}): {work.issue_title}",
|
|
@@ -929,6 +945,93 @@ def _build_test_author_fix_briefing(
|
|
|
929
945
|
return "\n".join(lines)
|
|
930
946
|
|
|
931
947
|
|
|
948
|
+
def _build_mock_author_fix_briefing(
|
|
949
|
+
work: Assignment,
|
|
950
|
+
findings,
|
|
951
|
+
iteration: int,
|
|
952
|
+
max_iter: int,
|
|
953
|
+
) -> str:
|
|
954
|
+
"""Fix briefing for a ``type="mock-author"`` slice (#2302, Gate A).
|
|
955
|
+
|
|
956
|
+
The diff here is a SPECIFICATION — ``contract.md`` plus rendered
|
|
957
|
+
``tests/acceptance/ms-NN/mocks/*`` — not an implementation. There is no
|
|
958
|
+
suite to run, so "run the tests and make them pass" (the generic fix
|
|
959
|
+
instruction) is actively wrong guidance, the same shape #1176 already
|
|
960
|
+
fixed for ``test-author``. Findings on a Gate A review are almost
|
|
961
|
+
always an internal-consistency defect: a mock depicting an end state
|
|
962
|
+
that the contract's own stated rules cannot produce from the narrated
|
|
963
|
+
input sequence — so the contract and the mocks must be reconciled to
|
|
964
|
+
agree with each other in BOTH directions, not just patched locally.
|
|
965
|
+
The dispatcher pairs this briefing with a bare ``type="mock-author"``
|
|
966
|
+
dispatch (see ``_dispatch_fix``) — ``agent.py``'s own
|
|
967
|
+
``elif spec.type == "mock-author"`` branch supplies
|
|
968
|
+
``MOCK_AUTHOR_SYSTEM_PROMPT`` and its deny-list on its own, so no
|
|
969
|
+
explicit ``system_prompt``/``deny_commands`` injection is needed here
|
|
970
|
+
the way ``test-author`` (which has no such branch) requires.
|
|
971
|
+
"""
|
|
972
|
+
lines: list[str] = [
|
|
973
|
+
f"# Gate A fix (iteration {iteration}/{max_iter}): {work.issue_title}",
|
|
974
|
+
"",
|
|
975
|
+
(
|
|
976
|
+
f"You are the independent mock-author fixing review findings "
|
|
977
|
+
f"against the Gate A contract and mocks for issue "
|
|
978
|
+
f"#{work.issue_number}."
|
|
979
|
+
),
|
|
980
|
+
(
|
|
981
|
+
f"Work on branch `{work.branch or '(check your git branches)'}` — "
|
|
982
|
+
"**do not change the branch name**."
|
|
983
|
+
),
|
|
984
|
+
"",
|
|
985
|
+
"## Reviewer findings to address",
|
|
986
|
+
"",
|
|
987
|
+
findings.body.strip(),
|
|
988
|
+
"",
|
|
989
|
+
"## Instructions",
|
|
990
|
+
"",
|
|
991
|
+
(
|
|
992
|
+
"1. Read the reviewer findings above carefully. Your diff is a "
|
|
993
|
+
"SPECIFICATION (`contract.md` + rendered `mocks/*`), not an "
|
|
994
|
+
"implementation — there is no suite to run and nothing to make "
|
|
995
|
+
"pass. Findings on a Gate A review are almost always an "
|
|
996
|
+
"internal-consistency defect: a mock depicting an end state "
|
|
997
|
+
"that the contract's own stated rules cannot produce from the "
|
|
998
|
+
"narrated input sequence."
|
|
999
|
+
),
|
|
1000
|
+
(
|
|
1001
|
+
"2. Fix **every** issue identified by the reviewer so the "
|
|
1002
|
+
"contract and the mocks agree with each other in BOTH "
|
|
1003
|
+
"directions — every rule the contract states must be reachable "
|
|
1004
|
+
"from the mocks' narrated sequence, and every state the mocks "
|
|
1005
|
+
"depict must be producible by the contract's stated rules."
|
|
1006
|
+
),
|
|
1007
|
+
"3. Stay on the **same branch** — push your fixes to the existing branch.",
|
|
1008
|
+
(
|
|
1009
|
+
"4. Do NOT touch any file outside `tests/acceptance/ms-NN/`. "
|
|
1010
|
+
"Touching anything outside that directory is a mandatory "
|
|
1011
|
+
"`request-changes` for this assignment type — you are pinning "
|
|
1012
|
+
"the milestone's contract, not implementing it."
|
|
1013
|
+
),
|
|
1014
|
+
(
|
|
1015
|
+
f"5. This is fix iteration {iteration} of {max_iter} allowed. "
|
|
1016
|
+
"Address all findings completely so the next review can approve."
|
|
1017
|
+
),
|
|
1018
|
+
"",
|
|
1019
|
+
(
|
|
1020
|
+
"STATUS: reading review findings → reconciling contract and mocks "
|
|
1021
|
+
"→ confidence: high"
|
|
1022
|
+
),
|
|
1023
|
+
"",
|
|
1024
|
+
]
|
|
1025
|
+
if work.briefing and work.briefing.strip():
|
|
1026
|
+
lines += [
|
|
1027
|
+
"## Original mock-author briefing",
|
|
1028
|
+
"",
|
|
1029
|
+
work.briefing.strip(),
|
|
1030
|
+
"",
|
|
1031
|
+
]
|
|
1032
|
+
return "\n".join(lines)
|
|
1033
|
+
|
|
1034
|
+
|
|
932
1035
|
def _dispatch_fix(
|
|
933
1036
|
work: Assignment,
|
|
934
1037
|
briefing: str,
|
|
@@ -945,11 +1048,18 @@ def _dispatch_fix(
|
|
|
945
1048
|
Prefers the same machine as the original worker (the branch is already
|
|
946
1049
|
checked out there). Falls back to any capable machine.
|
|
947
1050
|
|
|
948
|
-
#1176: the dispatched type mirrors ``work.type`` for
|
|
949
|
-
(
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
1051
|
+
#1176/#2302: the dispatched type mirrors ``work.type`` for any
|
|
1052
|
+
:data:`coord.models.SEALED_PATH_AUTHOR_TYPES` member (``"test-author"``,
|
|
1053
|
+
``"mock-author"``) — those types are the ones ``coord/review.py``
|
|
1054
|
+
inverts its sealed-path tamper rule for, so a fix that needs to write
|
|
1055
|
+
back into ``tests/acceptance/ms-NN/`` must carry the same type as the
|
|
1056
|
+
row it's fixing or every round trips "TAMPER DETECTED" until the
|
|
1057
|
+
iteration cap burns out. ``test-author`` additionally needs
|
|
1058
|
+
``TEST_AUTHOR_SYSTEM_PROMPT`` + its deny-list injected explicitly since
|
|
1059
|
+
``agent.py`` has no dispatch-table branch for it; ``mock-author``
|
|
1060
|
+
doesn't — ``agent.py``'s own ``elif spec.type == "mock-author"`` branch
|
|
1061
|
+
supplies its system prompt and deny-list unconditionally. Every other
|
|
1062
|
+
source type still gets the long-standing plain ``"work"`` fix.
|
|
953
1063
|
|
|
954
1064
|
Returns the new Assignment (already added to ``board.active``), or None
|
|
955
1065
|
on failure.
|
|
@@ -1016,12 +1126,16 @@ def _dispatch_fix(
|
|
|
1016
1126
|
if repo is None:
|
|
1017
1127
|
return None
|
|
1018
1128
|
|
|
1019
|
-
# #1176: preserve the source row's type for a
|
|
1020
|
-
# dispatching `type="work"`
|
|
1021
|
-
#
|
|
1022
|
-
# `tests/acceptance/**` path it
|
|
1023
|
-
#
|
|
1024
|
-
|
|
1129
|
+
# #1176/#2302: preserve the source row's type for a sealed-path-author
|
|
1130
|
+
# slice fix (test-author, mock-author) — dispatching `type="work"`
|
|
1131
|
+
# sends a plain worker that is forbidden from (and never given the
|
|
1132
|
+
# system prompt authorizing) exactly the `tests/acceptance/**` path it
|
|
1133
|
+
# needs to fix. Derived from SEALED_PATH_AUTHOR_TYPES rather than a
|
|
1134
|
+
# hardcoded string so this stays in sync with that set — see the
|
|
1135
|
+
# FIX_DISPATCH_TYPES comment above for the class of bug that guards
|
|
1136
|
+
# against. Every other source type (including today's "work") keeps
|
|
1137
|
+
# the long-standing "work" fix.
|
|
1138
|
+
fix_type = work.type if work.type in SEALED_PATH_AUTHOR_TYPES else "work"
|
|
1025
1139
|
|
|
1026
1140
|
payload = {
|
|
1027
1141
|
"repo_name": work.repo_name,
|
|
@@ -1054,6 +1168,12 @@ def _dispatch_fix(
|
|
|
1054
1168
|
# stay-RED rules a test-author session needs.
|
|
1055
1169
|
payload["system_prompt"] = TEST_AUTHOR_SYSTEM_PROMPT
|
|
1056
1170
|
payload["deny_commands"] = test_author_deny_commands(config, work.repo_name)
|
|
1171
|
+
# #2302: no analogous branch for `fix_type == "mock-author"` — unlike
|
|
1172
|
+
# test-author, `agent.py`'s `elif spec.type == "mock-author"` branch
|
|
1173
|
+
# already supplies `MOCK_AUTHOR_SYSTEM_PROMPT` and unconditionally
|
|
1174
|
+
# appends `MOCK_AUTHOR_DENY_COMMANDS` regardless of `spec.deny_commands`,
|
|
1175
|
+
# so injecting either here would be redundant with what the agent-side
|
|
1176
|
+
# dispatch table already does purely from `type="mock-author"`.
|
|
1057
1177
|
# Escalated model per bounce iteration (None when pipeline
|
|
1058
1178
|
# .escalate_fix_model is disabled — preserves today's no-model behaviour).
|
|
1059
1179
|
# The board record keeps the alias for legibility; the wire payload is
|
|
@@ -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
|
|