code-coordinator 0.5.128__tar.gz → 0.5.129__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.128 → code_coordinator-0.5.129}/PKG-INFO +1 -1
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/milestone.py +99 -57
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/milestone_dispatch.py +75 -1
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/serve_app.py +5 -2
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/ARCHITECTURE.md +1 -1
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_dispatch.py +81 -38
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_dispatch.py +41 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.gitignore +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/CLAUDE.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/GOAL.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/LICENSE +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/MANIFEST.in +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/README.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/__init__.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agent.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/audit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/block_log.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/board_service.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/brain.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/claim.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/cli.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/client.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/comments.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/config.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dao.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/db.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deps.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/drive.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/events.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/filelock.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/freshness.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/gates.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/goal.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/context.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/models.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/render.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/units.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/hooks.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/interactive.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/models.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/network.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notify.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/openapi.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/parentage.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/plans.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/progress.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/release_window.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/reports.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/review.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/smoke.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/split_work.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/state.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/test_author.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/test_report.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/usage.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/install-agent.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/pyproject.toml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/setup.cfg +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/__init__.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/conftest.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_db.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_events.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_init.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_models.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_network.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_session.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_split.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_state.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
|
|
4
4
|
Thin CLI glue around ``coord/milestone_order.py`` (the pure DAG/frontier
|
|
5
5
|
parser) and ``coord/milestone_dispatch.py`` (Phase 1's machine-picking +
|
|
6
|
-
dispatch
|
|
7
|
-
terminal state from GitHub via
|
|
8
|
-
fetch_milestone_context`` (shared by both
|
|
9
|
-
inputs), then hands that data to the pure
|
|
6
|
+
dispatch, and #2335's work-order -> drive-queue translation): fetches the
|
|
7
|
+
tracking issue + milestone membership + issue terminal state from GitHub via
|
|
8
|
+
``coord.milestone_dispatch.fetch_milestone_context`` (shared by both
|
|
9
|
+
subcommands so they see identical inputs), then hands that data to the pure
|
|
10
|
+
functions and prints the result.
|
|
10
11
|
"""
|
|
11
12
|
|
|
12
13
|
from __future__ import annotations
|
|
@@ -21,7 +22,6 @@ import httpx
|
|
|
21
22
|
from coord.commands._common import _CONFIG_OPTION, _load_config
|
|
22
23
|
from coord.milestone_dispatch import (
|
|
23
24
|
DispatchOutcome,
|
|
24
|
-
MachinePick,
|
|
25
25
|
MilestoneDispatchError,
|
|
26
26
|
dispatch_entry,
|
|
27
27
|
fetch_milestone_context,
|
|
@@ -29,6 +29,7 @@ from coord.milestone_dispatch import (
|
|
|
29
29
|
is_milestone_complete,
|
|
30
30
|
pick_machine,
|
|
31
31
|
plan_dispatch,
|
|
32
|
+
plan_queue,
|
|
32
33
|
)
|
|
33
34
|
from coord.milestone_order import (
|
|
34
35
|
TRACKING_ISSUE_LABEL,
|
|
@@ -859,11 +860,6 @@ def milestone_order_cmd(repo: str, tracking_issue: int, config_path: Path) -> No
|
|
|
859
860
|
click.echo(f" #{b.issue_number}: {b.reason}")
|
|
860
861
|
|
|
861
862
|
|
|
862
|
-
def _echo_pick(pick: MachinePick) -> None:
|
|
863
|
-
suffix = f" (group {pick.entry.group})" if pick.entry.group else ""
|
|
864
|
-
click.echo(f" #{pick.entry.issue_number} -> {pick.machine.name}{suffix}")
|
|
865
|
-
|
|
866
|
-
|
|
867
863
|
def _echo_outcome(outcome: DispatchOutcome) -> None:
|
|
868
864
|
if outcome.ok:
|
|
869
865
|
click.echo(
|
|
@@ -883,13 +879,18 @@ def _echo_outcome(outcome: DispatchOutcome) -> None:
|
|
|
883
879
|
@milestone_group.command(
|
|
884
880
|
"dispatch",
|
|
885
881
|
help=(
|
|
886
|
-
"Promote a milestone into the pipeline:
|
|
887
|
-
"
|
|
888
|
-
"
|
|
889
|
-
"
|
|
890
|
-
"
|
|
891
|
-
"
|
|
892
|
-
"
|
|
882
|
+
"Promote a milestone into the pipeline: derive the dependency order "
|
|
883
|
+
"from the `## Work order` DAG and queue every still-open issue into "
|
|
884
|
+
"the drive-queue (`coord drive-queue add --after ...`) in that order "
|
|
885
|
+
"(#2335) — the DQ-4 tick then launches each issue as its pre-reqs "
|
|
886
|
+
"land, with #2247 file-overlap prediction, durable board-backed "
|
|
887
|
+
"state, and `coord drive-queue list/status` observability. `--next` "
|
|
888
|
+
"keeps the lighter direct single-dispatch path. REPO is the local "
|
|
889
|
+
"repo name from coordinator.yml; TRACKING_ISSUE is the GH issue "
|
|
890
|
+
"number of the tracking issue (its body holds the `## Work order` "
|
|
891
|
+
"block). This is the single explicit approval for the whole declared "
|
|
892
|
+
"work order — it does not expand scope beyond what `## Work order` "
|
|
893
|
+
"lists."
|
|
893
894
|
),
|
|
894
895
|
)
|
|
895
896
|
@click.argument("repo")
|
|
@@ -902,8 +903,9 @@ def _echo_outcome(outcome: DispatchOutcome) -> None:
|
|
|
902
903
|
"--next", "next_", is_flag=True,
|
|
903
904
|
help=(
|
|
904
905
|
"Single-pick mode: show up to 3 ready-frontier items and dispatch "
|
|
905
|
-
"only the one you choose
|
|
906
|
-
"
|
|
906
|
+
"only the one you choose — directly, not via the drive-queue. "
|
|
907
|
+
"Lighter-weight than bulk mode's whole-DAG drive-queue enqueue "
|
|
908
|
+
"(#2335)."
|
|
907
909
|
),
|
|
908
910
|
)
|
|
909
911
|
@click.option(
|
|
@@ -1003,14 +1005,15 @@ def milestone_dispatch_cmd(
|
|
|
1003
1005
|
click.echo(f"#{tracking_issue}: no `## Work order` block found")
|
|
1004
1006
|
return
|
|
1005
1007
|
|
|
1006
|
-
board = board_service.read_board()
|
|
1007
|
-
plan = plan_dispatch(ctx.work_order, board, cfg, repo_entry, ctx.terminal_issues)
|
|
1008
|
-
|
|
1009
1008
|
click.echo(
|
|
1010
1009
|
f"Work order for #{tracking_issue} (milestone #{ctx.milestone_number}):"
|
|
1011
1010
|
)
|
|
1012
1011
|
|
|
1013
1012
|
if next_:
|
|
1013
|
+
board = board_service.read_board()
|
|
1014
|
+
plan = plan_dispatch(
|
|
1015
|
+
ctx.work_order, board, cfg, repo_entry, ctx.terminal_issues
|
|
1016
|
+
)
|
|
1014
1017
|
if not plan.to_dispatch:
|
|
1015
1018
|
click.echo("No ready frontier item can dispatch right now.")
|
|
1016
1019
|
if plan.skipped:
|
|
@@ -1075,54 +1078,93 @@ def milestone_dispatch_cmd(
|
|
|
1075
1078
|
sys.exit(1)
|
|
1076
1079
|
return
|
|
1077
1080
|
|
|
1078
|
-
# Bulk mode:
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1081
|
+
# Bulk mode (#2335): queue the whole declared work order into the
|
|
1082
|
+
# drive-queue rather than dispatching the ready frontier directly. Before
|
|
1083
|
+
# #2335 this path called `dispatch_entry` per frontier pick and registered
|
|
1084
|
+
# the milestone for daemon auto-drain — bypassing the drive-queue
|
|
1085
|
+
# entirely: no #2247 overlap prediction, no durable queue entry surviving
|
|
1086
|
+
# a coordinator restart, nothing in `coord drive-queue list/status`. The
|
|
1087
|
+
# queue's `after=` edges now carry the DAG, so the DQ-4 tick launches each
|
|
1088
|
+
# issue as its pre-reqs land; that also makes `register_milestone_drain`
|
|
1089
|
+
# redundant here (the queue IS the durable drain, and registering would
|
|
1090
|
+
# have the daemon's direct-dispatch drain racing it).
|
|
1091
|
+
queue_plan = plan_queue(ctx.work_order, ctx.terminal_issues, repo_entry.name)
|
|
1092
|
+
|
|
1093
|
+
if not queue_plan:
|
|
1094
|
+
click.echo("Nothing to queue — every work-order node is already closed.")
|
|
1095
|
+
return
|
|
1091
1096
|
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
+
click.echo("Will queue (drive-queue), in dependency order:")
|
|
1098
|
+
for qe in queue_plan:
|
|
1099
|
+
bits = []
|
|
1100
|
+
if qe.group:
|
|
1101
|
+
bits.append(f"group {qe.group}")
|
|
1102
|
+
if qe.after:
|
|
1103
|
+
bits.append("after " + ", ".join(qe.after))
|
|
1104
|
+
suffix = f" ({'; '.join(bits)})" if bits else ""
|
|
1105
|
+
click.echo(f" #{qe.issue_number}{suffix}")
|
|
1097
1106
|
|
|
1098
1107
|
if dry_run:
|
|
1099
1108
|
click.echo()
|
|
1100
|
-
click.echo("(dry run —
|
|
1109
|
+
click.echo("(dry run — nothing queued)")
|
|
1101
1110
|
return
|
|
1102
1111
|
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1112
|
+
# Reuse `coord drive-queue add`'s own helpers so a milestone enqueue is
|
|
1113
|
+
# byte-identical to N manual `add` calls: same pre-write validation, same
|
|
1114
|
+
# #2247 overlap prediction (auto-`after` edges recorded to the audit log),
|
|
1115
|
+
# same upsert semantics for an issue already queued.
|
|
1116
|
+
from coord.commands.drive_queue import ( # noqa: PLC0415
|
|
1117
|
+
_applicable_auto_after,
|
|
1118
|
+
_predict_overlap,
|
|
1119
|
+
_record_overlap_prediction,
|
|
1120
|
+
)
|
|
1121
|
+
from coord.drive_queue import ( # noqa: PLC0415
|
|
1122
|
+
QueueError,
|
|
1123
|
+
entries_from_rows,
|
|
1124
|
+
entry_key,
|
|
1125
|
+
validate_enqueue,
|
|
1126
|
+
)
|
|
1127
|
+
from coord.state import enqueue_drive_queue, list_drive_queue # noqa: PLC0415
|
|
1107
1128
|
|
|
1108
1129
|
click.echo()
|
|
1109
1130
|
failures = 0
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1131
|
+
queued = 0
|
|
1132
|
+
for qe in queue_plan:
|
|
1133
|
+
# Re-read per entry so each add validates (and overlap-predicts)
|
|
1134
|
+
# against the queue as its just-added siblings left it.
|
|
1135
|
+
existing = entries_from_rows(list_drive_queue())
|
|
1136
|
+
after = list(qe.after)
|
|
1137
|
+
key = entry_key(repo_entry.name, qe.issue_number)
|
|
1138
|
+
try:
|
|
1139
|
+
validate_enqueue(existing, repo_entry.name, qe.issue_number, after)
|
|
1140
|
+
except QueueError as exc:
|
|
1141
|
+
click.echo(f" {key}: not queued: {exc}", err=True)
|
|
1114
1142
|
failures += 1
|
|
1143
|
+
continue
|
|
1144
|
+
prediction = _predict_overlap(
|
|
1145
|
+
config_path, repo_entry.name, qe.issue_number, existing
|
|
1146
|
+
)
|
|
1147
|
+
auto_after = _applicable_auto_after(
|
|
1148
|
+
existing, repo_entry.name, qe.issue_number, after, prediction
|
|
1149
|
+
)
|
|
1150
|
+
after = [*after, *auto_after]
|
|
1151
|
+
enqueue_drive_queue(repo_entry.name, qe.issue_number, after=after)
|
|
1152
|
+
if auto_after:
|
|
1153
|
+
_record_overlap_prediction(
|
|
1154
|
+
repo_entry.name, qe.issue_number, prediction, auto_after
|
|
1155
|
+
)
|
|
1156
|
+
suffix = f" after {', '.join(after)}" if after else ""
|
|
1157
|
+
overlap_note = f"\n {prediction.reason}" if auto_after else ""
|
|
1158
|
+
click.echo(f" queued {key}{suffix}{overlap_note}")
|
|
1159
|
+
queued += 1
|
|
1115
1160
|
|
|
1116
|
-
if
|
|
1117
|
-
from coord.state import register_milestone_drain
|
|
1118
|
-
|
|
1119
|
-
register_milestone_drain(repo_name=repo_entry.name, tracking_issue=tracking_issue)
|
|
1161
|
+
if queued:
|
|
1120
1162
|
click.echo()
|
|
1121
1163
|
click.echo(
|
|
1122
|
-
f"
|
|
1123
|
-
"
|
|
1124
|
-
"
|
|
1125
|
-
"
|
|
1164
|
+
f"{queued} issue(s) queued — `coord drive-queue tick` (the DQ-4 "
|
|
1165
|
+
"timer, or run it manually) launches them in dependency order; "
|
|
1166
|
+
"`coord drive-queue list` shows the queue. Entries are durable "
|
|
1167
|
+
"across coordinator restarts."
|
|
1126
1168
|
)
|
|
1127
1169
|
|
|
1128
1170
|
if failures:
|
|
@@ -16,7 +16,10 @@ not an LLM judgment call like ``coord.brain.propose``.
|
|
|
16
16
|
Three call sites share this module:
|
|
17
17
|
|
|
18
18
|
- ``coord milestone dispatch`` (``coord/commands/milestone.py``) — the
|
|
19
|
-
|
|
19
|
+
``--next`` single-pick still dispatches directly through
|
|
20
|
+
:func:`plan_dispatch`/:func:`dispatch_entry`; bulk mode instead derives
|
|
21
|
+
drive-queue enqueues from the work order via :func:`plan_queue` (#2335),
|
|
22
|
+
so the DQ-4 tick owns the actual launches.
|
|
20
23
|
- The daemon's auto-drain tick (``coord.serve_app._milestone_drain_tick``,
|
|
21
24
|
opt-in via ``coordinator.yml`` ``milestone.auto_dispatch``) — re-runs the
|
|
22
25
|
same fetch → plan → dispatch sequence for milestones registered via a
|
|
@@ -38,6 +41,7 @@ from coord.milestone_order import (
|
|
|
38
41
|
FrontierEntry,
|
|
39
42
|
WorkOrder,
|
|
40
43
|
WorkOrderError,
|
|
44
|
+
WorkOrderNode,
|
|
41
45
|
parse_work_order,
|
|
42
46
|
ready_frontier,
|
|
43
47
|
validate_milestone_membership,
|
|
@@ -64,6 +68,8 @@ __all__ = [
|
|
|
64
68
|
"NoMachineAvailable",
|
|
65
69
|
"MilestonePlan",
|
|
66
70
|
"plan_dispatch",
|
|
71
|
+
"QueuePlanEntry",
|
|
72
|
+
"plan_queue",
|
|
67
73
|
"DispatchOutcome",
|
|
68
74
|
"dispatch_entry",
|
|
69
75
|
"is_milestone_complete",
|
|
@@ -684,6 +690,74 @@ def plan_dispatch(
|
|
|
684
690
|
)
|
|
685
691
|
|
|
686
692
|
|
|
693
|
+
@dataclass(frozen=True)
|
|
694
|
+
class QueuePlanEntry:
|
|
695
|
+
"""One drive-queue enqueue derived from a work-order node (#2335)."""
|
|
696
|
+
|
|
697
|
+
issue_number: int
|
|
698
|
+
#: Fully-qualified pre-req keys (``"repo#N"``) for the drive-queue's
|
|
699
|
+
#: ``after=`` edge list — the node's declared ``{after: #N}`` targets,
|
|
700
|
+
#: minus any that are already terminal (closed issues never enter the
|
|
701
|
+
#: queue, so an edge at one would read as unsatisfiable to the tick's
|
|
702
|
+
#: ``_resolve_prereqs`` rather than as "already done").
|
|
703
|
+
after: tuple[str, ...] = ()
|
|
704
|
+
group: str | None = None
|
|
705
|
+
|
|
706
|
+
|
|
707
|
+
def plan_queue(
|
|
708
|
+
work_order: WorkOrder,
|
|
709
|
+
terminal_issues: frozenset[int] | set[int],
|
|
710
|
+
repo_name: str,
|
|
711
|
+
) -> tuple[QueuePlanEntry, ...]:
|
|
712
|
+
"""Translate the work order's DAG into drive-queue enqueues (#2335).
|
|
713
|
+
|
|
714
|
+
Pure — no GitHub, no board, no side effects. One entry per non-terminal
|
|
715
|
+
node, in dependency order: a stable topological sort seeded by declared
|
|
716
|
+
order, so independent nodes keep the operator's declared sequence while a
|
|
717
|
+
node declared *before* its own pre-req still queues after it (queue
|
|
718
|
+
position is the tick's tie-break among eligible entries; the ``after``
|
|
719
|
+
edges are what actually gate launches).
|
|
720
|
+
|
|
721
|
+
Each entry's ``after`` carries the node's declared ``{after: #N}`` edges
|
|
722
|
+
as fully-qualified ``repo#N`` keys — the same format ``coord drive-queue
|
|
723
|
+
add --after`` parses — filtered to pre-reqs that are still open.
|
|
724
|
+
:func:`~coord.milestone_order.parse_work_order` already refused cycles,
|
|
725
|
+
self-edges, and edges to undeclared nodes, so the sort always terminates;
|
|
726
|
+
the defensive tail below only fires on inputs constructed outside it.
|
|
727
|
+
"""
|
|
728
|
+
from coord.drive_queue import entry_key # noqa: PLC0415
|
|
729
|
+
|
|
730
|
+
terminal = set(terminal_issues)
|
|
731
|
+
remaining: dict[int, WorkOrderNode] = {
|
|
732
|
+
n.issue_number: n for n in work_order.nodes if n.issue_number not in terminal
|
|
733
|
+
}
|
|
734
|
+
open_set = set(remaining)
|
|
735
|
+
placed: set[int] = set()
|
|
736
|
+
ordered: list[WorkOrderNode] = []
|
|
737
|
+
while remaining:
|
|
738
|
+
progressed = False
|
|
739
|
+
for number, node in list(remaining.items()):
|
|
740
|
+
if any(d in open_set and d not in placed for d in node.after):
|
|
741
|
+
continue
|
|
742
|
+
ordered.append(node)
|
|
743
|
+
placed.add(number)
|
|
744
|
+
del remaining[number]
|
|
745
|
+
progressed = True
|
|
746
|
+
if not progressed: # cycle — unreachable via parse_work_order; see above
|
|
747
|
+
ordered.extend(remaining.values())
|
|
748
|
+
break
|
|
749
|
+
return tuple(
|
|
750
|
+
QueuePlanEntry(
|
|
751
|
+
issue_number=n.issue_number,
|
|
752
|
+
after=tuple(
|
|
753
|
+
entry_key(repo_name, d) for d in n.after if d not in terminal
|
|
754
|
+
),
|
|
755
|
+
group=n.group,
|
|
756
|
+
)
|
|
757
|
+
for n in ordered
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
|
|
687
761
|
@dataclass(frozen=True)
|
|
688
762
|
class DispatchOutcome:
|
|
689
763
|
"""The result of one :func:`dispatch_entry` call."""
|
|
@@ -1283,8 +1283,11 @@ def _milestone_drain_tick(config: Config) -> list:
|
|
|
1283
1283
|
|
|
1284
1284
|
Called by ``_tick_loop`` when ``milestone.auto_dispatch: true`` is set in
|
|
1285
1285
|
``coordinator.yml`` (default-off). For each ``(repo_name, tracking_issue)``
|
|
1286
|
-
registered via
|
|
1287
|
-
|
|
1286
|
+
registered via ``coord.state.register_milestone_drain`` (historically the
|
|
1287
|
+
non-dry-run ``coord milestone dispatch`` bulk path — since #2335 that
|
|
1288
|
+
path enqueues the work order into the drive-queue instead and registers
|
|
1289
|
+
nothing, so only pre-#2335 registrations feed this tick), re-fetches the
|
|
1290
|
+
tracking issue, recomputes the
|
|
1288
1291
|
ready frontier (:func:`coord.milestone_dispatch.plan_dispatch`), and
|
|
1289
1292
|
dispatches any newly-unblocked entries — the same mechanism a manual
|
|
1290
1293
|
``coord milestone dispatch`` uses, so a fix that lands and merges for one
|
|
@@ -167,7 +167,7 @@ The auto-loop above sequences a *single* issue. For work that spans many issues,
|
|
|
167
167
|
|
|
168
168
|
Layering is deliberate: `evaluate_gate(gate, probes)` is **pure** (gate name + a `GateProbes` value in, one `GateStep` out — no board, no GitHub, no clock), so every edge in the machine is decided in exactly one place and any edge is testable without I/O; `probe_milestone()` is the I/O half and reuses the *existing* readers (`milestone_dispatch.gate_a_status`, `gate_b.latest_gate_b_verdict`) so the gate walk and the manual CLI can never disagree about whether a gate is satisfied. `work` is the only state with a side effect, and it delegates to `plan_dispatch` + `dispatch_entry` rather than adding a second dispatch path. Every other edge is currently an explicit, logged **hold** — the machine reports why it cannot advance and stays put. There is no silent fall-through anywhere in the module; that is the failure mode that produced the 240-minute advisory spin in the per-issue driver.
|
|
169
169
|
|
|
170
|
-
**`drive` vs. `milestone.auto_dispatch` — mutually exclusive per milestone, gate driving wins.** `milestone.auto_dispatch` gates the *legacy standalone drain* (`_milestone_drain_tick`): a milestone registered by `coord milestone dispatch` whose frontier the daemon re-drains with no gate walk around it. A milestone with a gate record is driven by `_milestone_gate_tick` instead, which owns the drain as its `work` state — so `_milestone_drain_tick` **skips** any `(repo_name, tracking_issue)` that has a gate record. Without that exclusion a milestone parked at Gate A could still have its frontier dispatched by the independently-gated drain path. Gate driving is consequently its own per-milestone opt-in (`coord milestone drive`) and `_milestone_gate_tick` is *not* behind the global flag — hiding it there would make `drive` silently no-op.
|
|
170
|
+
**`drive` vs. `milestone.auto_dispatch` — mutually exclusive per milestone, gate driving wins.** `milestone.auto_dispatch` gates the *legacy standalone drain* (`_milestone_drain_tick`): a milestone registered by a pre-#2335 `coord milestone dispatch` whose frontier the daemon re-drains with no gate walk around it. (Since #2335 the bulk `coord milestone dispatch` path enqueues the whole `## Work order` DAG into the drive-queue — `after=` edges carry the dependencies, the DQ-4 tick launches, and nothing new registers for this drain.) A milestone with a gate record is driven by `_milestone_gate_tick` instead, which owns the drain as its `work` state — so `_milestone_drain_tick` **skips** any `(repo_name, tracking_issue)` that has a gate record. Without that exclusion a milestone parked at Gate A could still have its frontier dispatched by the independently-gated drain path. Gate driving is consequently its own per-milestone opt-in (`coord milestone drive`) and `_milestone_gate_tick` is *not* behind the global flag — hiding it there would make `drive` silently no-op.
|
|
171
171
|
|
|
172
172
|
**Exactly one overseer, structurally (#1930).** The gate tick is the sole owner of a gate-controlled milestone's `work` drain. `coord milestone drive` only ever writes/re-persists the `GateRecord` — it never calls `apply_step` or dispatches, so running it twice (any operator, any machine) is inert, not a race. `coord milestone dispatch`, the manual non-gate CLI, now refuses outright against a milestone with a gate record — before #1930 it had no way to know one existed and would dispatch the same frontier the gate tick's `work` state owns, the same "two gates disagreeing about whether work may start" shape #1870 fixed for the drive queue, reached from an operator's keyboard instead of a second host's timer.
|
|
173
173
|
|
|
@@ -104,8 +104,10 @@ class TestMilestoneDispatchValidation:
|
|
|
104
104
|
|
|
105
105
|
|
|
106
106
|
class TestMilestoneDispatchDryRun:
|
|
107
|
-
def
|
|
108
|
-
"""#
|
|
107
|
+
def test_dry_run_shows_queue_plan_with_after_edges(self, config_file: Path) -> None:
|
|
108
|
+
"""#2335: bulk dry-run previews the drive-queue enqueue plan — the
|
|
109
|
+
whole DAG, with the gated node's `after` edges spelled out — and
|
|
110
|
+
writes/dispatches nothing."""
|
|
109
111
|
open_issues = [
|
|
110
112
|
{"number": 762, "milestone": {"number": 9}},
|
|
111
113
|
{"number": 763, "milestone": {"number": 9}},
|
|
@@ -122,17 +124,18 @@ class TestMilestoneDispatchDryRun:
|
|
|
122
124
|
assert result.exit_code == 0, result.output
|
|
123
125
|
disp.assert_not_called()
|
|
124
126
|
|
|
125
|
-
|
|
126
|
-
assert "#762" in
|
|
127
|
-
assert "#763" in
|
|
128
|
-
|
|
129
|
-
assert "#765" in waiting_section
|
|
130
|
-
assert "waiting on #762, #763" in waiting_section
|
|
127
|
+
plan_section = result.output.split("Will queue (drive-queue), in dependency order:")[1]
|
|
128
|
+
assert "#762" in plan_section
|
|
129
|
+
assert "#763" in plan_section
|
|
130
|
+
assert "#765 (after api#762, api#763)" in plan_section
|
|
131
131
|
assert "dry run" in result.output
|
|
132
|
+
# Nothing written — the dry run leaves the queue untouched.
|
|
133
|
+
assert state_mod.list_drive_queue() == []
|
|
132
134
|
|
|
133
|
-
def
|
|
134
|
-
"""#
|
|
135
|
-
|
|
135
|
+
def test_terminal_prereqs_are_dropped_from_after_edges(self, config_file: Path) -> None:
|
|
136
|
+
"""#2335: #762/#763 already closed -> only #765 queues, with no
|
|
137
|
+
`after` edges (a closed issue never enters the queue, so an edge at
|
|
138
|
+
it would read as unsatisfiable to the tick)."""
|
|
136
139
|
open_issues = [{"number": 765, "milestone": {"number": 9}}]
|
|
137
140
|
|
|
138
141
|
def get_issue(repo, number):
|
|
@@ -149,9 +152,10 @@ class TestMilestoneDispatchDryRun:
|
|
|
149
152
|
assert result.exit_code == 0, result.output
|
|
150
153
|
disp.assert_not_called()
|
|
151
154
|
|
|
152
|
-
|
|
153
|
-
assert "#765" in
|
|
154
|
-
assert "
|
|
155
|
+
plan_section = result.output.split("Will queue (drive-queue), in dependency order:")[1]
|
|
156
|
+
assert "#765" in plan_section
|
|
157
|
+
assert "after" not in plan_section
|
|
158
|
+
assert "#762" not in plan_section
|
|
155
159
|
|
|
156
160
|
def test_no_work_order_block_reports_and_exits_zero(self, config_file: Path) -> None:
|
|
157
161
|
def get_issue_no_block(repo, number):
|
|
@@ -170,7 +174,12 @@ class TestMilestoneDispatchDryRun:
|
|
|
170
174
|
|
|
171
175
|
|
|
172
176
|
class TestMilestoneDispatchBulk:
|
|
173
|
-
def
|
|
177
|
+
def test_enqueues_whole_dag_into_drive_queue(self, config_file: Path) -> None:
|
|
178
|
+
"""#2335: bulk mode queues every open work-order node into the
|
|
179
|
+
drive-queue with `after=` edges carrying the DAG — it never calls
|
|
180
|
+
`coord.dispatch.dispatch` directly, and it no longer registers the
|
|
181
|
+
milestone for the daemon's direct-dispatch auto-drain (the queue IS
|
|
182
|
+
the durable drain)."""
|
|
174
183
|
open_issues = [
|
|
175
184
|
{"number": 762, "milestone": {"number": 9}},
|
|
176
185
|
{"number": 763, "milestone": {"number": 9}},
|
|
@@ -179,36 +188,69 @@ class TestMilestoneDispatchBulk:
|
|
|
179
188
|
with patch("coord.github_ops.get_issue", side_effect=_get_issue), \
|
|
180
189
|
patch("coord.github_ops.get_open_issues", return_value=open_issues), \
|
|
181
190
|
patch("coord.board_service.read_board", return_value=Board()), \
|
|
182
|
-
patch("coord.dispatch.dispatch"
|
|
183
|
-
patch("coord.github_ops.post_issue_comment"), \
|
|
184
|
-
patch("coord.github_ops.check_branch_exists", return_value=False):
|
|
191
|
+
patch("coord.dispatch.dispatch") as disp:
|
|
185
192
|
result = CliRunner().invoke(
|
|
186
193
|
main,
|
|
187
194
|
["milestone", "dispatch", "api", "100", "--config", str(config_file)],
|
|
188
195
|
)
|
|
189
196
|
assert result.exit_code == 0, result.output
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
197
|
+
disp.assert_not_called()
|
|
198
|
+
|
|
199
|
+
rows = state_mod.list_drive_queue()
|
|
200
|
+
assert [(r["repo_name"], r["issue_number"]) for r in rows] == [
|
|
201
|
+
("api", 762), ("api", 763), ("api", 765),
|
|
202
|
+
]
|
|
203
|
+
by_issue = {r["issue_number"]: r for r in rows}
|
|
204
|
+
assert by_issue[762]["after_json"] == []
|
|
205
|
+
assert by_issue[763]["after_json"] == []
|
|
206
|
+
assert by_issue[765]["after_json"] == ["api#762", "api#763"]
|
|
207
|
+
|
|
208
|
+
assert "queued api#762" in result.output
|
|
209
|
+
assert "queued api#765 after api#762, api#763" in result.output
|
|
210
|
+
assert "3 issue(s) queued" in result.output
|
|
211
|
+
assert "coord drive-queue tick" in result.output
|
|
212
|
+
|
|
213
|
+
# No direct dispatch happened, so nothing was recorded as dispatched
|
|
214
|
+
# and no daemon auto-drain registration is needed or wanted.
|
|
215
|
+
assert state_mod.load_dispatched() == []
|
|
216
|
+
assert state_mod.list_milestone_drains() == []
|
|
217
|
+
assert "registered for daemon auto-drain" not in result.output
|
|
193
218
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
219
|
+
def test_dependent_declared_first_still_queues_after_its_prereq(
|
|
220
|
+
self, config_file: Path
|
|
221
|
+
) -> None:
|
|
222
|
+
"""#2335: declared order is not necessarily topological — a node
|
|
223
|
+
declared before its own pre-req still queues after it, so queue
|
|
224
|
+
positions read in dependency order."""
|
|
225
|
+
body = "## Work order\n- [ ] #765 {after: #762}\n- [ ] #762\n"
|
|
226
|
+
open_issues = [
|
|
227
|
+
{"number": 762, "milestone": {"number": 9}},
|
|
228
|
+
{"number": 765, "milestone": {"number": 9}},
|
|
229
|
+
]
|
|
197
230
|
|
|
198
|
-
|
|
199
|
-
|
|
231
|
+
def get_issue(repo, number):
|
|
232
|
+
return _get_issue(repo, number, bodies={100: body})
|
|
233
|
+
|
|
234
|
+
with patch("coord.github_ops.get_issue", side_effect=get_issue), \
|
|
235
|
+
patch("coord.github_ops.get_open_issues", return_value=open_issues), \
|
|
236
|
+
patch("coord.board_service.read_board", return_value=Board()), \
|
|
237
|
+
patch("coord.dispatch.dispatch") as disp:
|
|
238
|
+
result = CliRunner().invoke(
|
|
239
|
+
main,
|
|
240
|
+
["milestone", "dispatch", "api", "100", "--config", str(config_file)],
|
|
241
|
+
)
|
|
242
|
+
assert result.exit_code == 0, result.output
|
|
243
|
+
disp.assert_not_called()
|
|
200
244
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
assert drains == [{"repo_name": "api", "tracking_issue": 100}]
|
|
205
|
-
assert "registered for daemon auto-drain" in result.output
|
|
245
|
+
rows = state_mod.list_drive_queue()
|
|
246
|
+
assert [r["issue_number"] for r in rows] == [762, 765]
|
|
247
|
+
assert rows[1]["after_json"] == ["api#762"]
|
|
206
248
|
|
|
207
|
-
def
|
|
249
|
+
def test_already_complete_milestone_queues_nothing_and_does_not_register(
|
|
208
250
|
self, config_file: Path
|
|
209
251
|
) -> None:
|
|
210
|
-
"""Every node already terminal at fetch time ->
|
|
211
|
-
nothing dispatched, no daemon auto-drain registration
|
|
252
|
+
"""Every node already terminal at fetch time -> nothing to queue,
|
|
253
|
+
nothing dispatched, no daemon auto-drain registration."""
|
|
212
254
|
body = "## Work order\n- [ ] #762\n"
|
|
213
255
|
open_issues: list[dict] = []
|
|
214
256
|
|
|
@@ -225,7 +267,8 @@ class TestMilestoneDispatchBulk:
|
|
|
225
267
|
)
|
|
226
268
|
assert result.exit_code == 0, result.output
|
|
227
269
|
disp.assert_not_called()
|
|
228
|
-
assert "Nothing to
|
|
270
|
+
assert "Nothing to queue" in result.output
|
|
271
|
+
assert state_mod.list_drive_queue() == []
|
|
229
272
|
assert state_mod.list_milestone_drains() == []
|
|
230
273
|
|
|
231
274
|
|
|
@@ -429,9 +472,9 @@ class TestMilestoneDispatchGateA:
|
|
|
429
472
|
)
|
|
430
473
|
assert result.exit_code == 0, result.output
|
|
431
474
|
assert "Gate A" not in result.output
|
|
432
|
-
|
|
433
|
-
assert "#762" in
|
|
434
|
-
assert "#763" in
|
|
475
|
+
plan_section = result.output.split("Will queue (drive-queue), in dependency order:")[1]
|
|
476
|
+
assert "#762" in plan_section
|
|
477
|
+
assert "#763" in plan_section
|
|
435
478
|
|
|
436
479
|
def test_repo_without_acceptance_driver_is_unaffected(self, config_file: Path) -> None:
|
|
437
480
|
"""No `acceptance.drivers` entry for this repo -> Gate A is a no-op,
|
|
@@ -27,6 +27,7 @@ from coord.milestone_dispatch import (
|
|
|
27
27
|
issue_oracle_ready,
|
|
28
28
|
pick_machine,
|
|
29
29
|
plan_dispatch,
|
|
30
|
+
plan_queue,
|
|
30
31
|
)
|
|
31
32
|
from coord.milestone_order import WorkOrder, WorkOrderNode
|
|
32
33
|
from coord.models import Assignment, Board, Machine, Repo
|
|
@@ -168,6 +169,46 @@ class TestPlanDispatch:
|
|
|
168
169
|
assert plan.waiting == ()
|
|
169
170
|
|
|
170
171
|
|
|
172
|
+
# ── plan_queue (#2335) ───────────────────────────────────────────────────────
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class TestPlanQueue:
|
|
176
|
+
def test_whole_dag_in_declared_order_with_qualified_after_keys(self) -> None:
|
|
177
|
+
plan = plan_queue(WORK_ORDER, terminal_issues=set(), repo_name="api")
|
|
178
|
+
assert [q.issue_number for q in plan] == [762, 763, 765]
|
|
179
|
+
assert plan[0].after == ()
|
|
180
|
+
assert plan[0].group == "A"
|
|
181
|
+
assert plan[1].after == ()
|
|
182
|
+
assert plan[2].after == ("api#762", "api#763")
|
|
183
|
+
assert plan[2].group is None
|
|
184
|
+
|
|
185
|
+
def test_terminal_nodes_are_dropped_and_their_edges_filtered(self) -> None:
|
|
186
|
+
plan = plan_queue(WORK_ORDER, terminal_issues={762}, repo_name="api")
|
|
187
|
+
assert [q.issue_number for q in plan] == [763, 765]
|
|
188
|
+
# The closed pre-req never enters the queue, so its edge is dropped;
|
|
189
|
+
# the still-open one is kept.
|
|
190
|
+
assert plan[1].after == ("api#763",)
|
|
191
|
+
|
|
192
|
+
def test_all_terminal_yields_empty_plan(self) -> None:
|
|
193
|
+
plan = plan_queue(WORK_ORDER, terminal_issues={762, 763, 765}, repo_name="api")
|
|
194
|
+
assert plan == ()
|
|
195
|
+
|
|
196
|
+
def test_dependent_declared_before_prereq_sorts_topologically(self) -> None:
|
|
197
|
+
order = WorkOrder(
|
|
198
|
+
nodes=(WorkOrderNode(765, after=(762,)), WorkOrderNode(762))
|
|
199
|
+
)
|
|
200
|
+
plan = plan_queue(order, terminal_issues=set(), repo_name="api")
|
|
201
|
+
assert [q.issue_number for q in plan] == [762, 765]
|
|
202
|
+
assert plan[1].after == ("api#762",)
|
|
203
|
+
|
|
204
|
+
def test_independent_nodes_keep_declared_order(self) -> None:
|
|
205
|
+
order = WorkOrder(
|
|
206
|
+
nodes=(WorkOrderNode(3), WorkOrderNode(1), WorkOrderNode(2))
|
|
207
|
+
)
|
|
208
|
+
plan = plan_queue(order, terminal_issues=set(), repo_name="api")
|
|
209
|
+
assert [q.issue_number for q in plan] == [3, 1, 2]
|
|
210
|
+
|
|
211
|
+
|
|
171
212
|
# ── is_milestone_complete ────────────────────────────────────────────────────
|
|
172
213
|
|
|
173
214
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|