code-coordinator 0.5.125__tar.gz → 0.5.126__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.125 → code_coordinator-0.5.126}/PKG-INFO +1 -1
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/block_log.py +104 -1
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/drive_queue.py +256 -1
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/drive_queue.py +97 -2
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/merge_queue.py +36 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_block_log.py +50 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_drive_queue.py +151 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_drive_queue.py +115 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_merge_queue.py +57 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_thin_client_board_audit.py +14 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.gitignore +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/CLAUDE.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/GOAL.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/LICENSE +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/MANIFEST.in +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/README.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/__init__.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agent.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/audit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/board_service.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/brain.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/claim.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/cli.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/client.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/comments.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/config.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dao.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/db.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deps.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/drive.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/events.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/filelock.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/freshness.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/gates.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/goal.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/context.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/models.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/render.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/units.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/hooks.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/interactive.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/models.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/network.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notify.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/openapi.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/parentage.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/plans.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/progress.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/release_window.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/reports.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/review.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/smoke.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/split_work.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/state.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/test_author.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/test_report.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/usage.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/install-agent.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/pyproject.toml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/setup.cfg +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/__init__.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/conftest.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_db.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_events.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_init.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_models.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_network.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_session.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_split.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_state.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -70,7 +70,9 @@ from typing import Any
|
|
|
70
70
|
|
|
71
71
|
from coord.drive_queue import (
|
|
72
72
|
STATE_BLOCKED,
|
|
73
|
+
STATE_DONE,
|
|
73
74
|
STATE_PARKED,
|
|
75
|
+
STATE_WAITING,
|
|
74
76
|
QueueEntry,
|
|
75
77
|
TickPlan,
|
|
76
78
|
)
|
|
@@ -107,6 +109,8 @@ __all__ = [
|
|
|
107
109
|
"episodes",
|
|
108
110
|
"is_by_design",
|
|
109
111
|
"log_location",
|
|
112
|
+
"merge_only_event",
|
|
113
|
+
"merge_only_fallback_event",
|
|
110
114
|
"operator_resolution_event",
|
|
111
115
|
"plan_events",
|
|
112
116
|
"read_events",
|
|
@@ -221,6 +225,20 @@ _LANDED_CAUSE = (
|
|
|
221
225
|
"already-landed — the work merged or closed while the entry sat in this "
|
|
222
226
|
"state, so the stated reason had outlived the thing it described"
|
|
223
227
|
)
|
|
228
|
+
#: #2350: distinct from `_LANDED_CAUSE` on purpose — that one means "the entry
|
|
229
|
+
#: sat here and something ELSE finished it while nobody was looking" (a human,
|
|
230
|
+
#: an unrelated branch merge, `coord reconcile-merges`); this one means the
|
|
231
|
+
#: QUEUE ITSELF, this same tick, ran `coord merge --only` and landed it —
|
|
232
|
+
#: see `coord.commands.drive_queue._run_merge_only_candidates`'s success
|
|
233
|
+
#: branch, the ONLY writer of the `outcome == "merged"` `_resolve_record`
|
|
234
|
+
#: reads to pick this cause. Conflating the two into one `auto-released`-style
|
|
235
|
+
#: bucket is exactly what #2350 was written to stop: #2235's corpus needs to
|
|
236
|
+
#: tell "the mechanism did this" apart from "the state flipped and something
|
|
237
|
+
#: unrelated did it".
|
|
238
|
+
_AUTO_MERGED_CAUSE = (
|
|
239
|
+
"auto-merged — the queue completed the merge directly from the tick "
|
|
240
|
+
"(#2350), Test/Review already satisfied; Merge was the only gate left"
|
|
241
|
+
)
|
|
224
242
|
_OPERATOR_CAUSE = (
|
|
225
243
|
"operator-intervened — no automatic release fired; a human cleared it by "
|
|
226
244
|
"hand, and what they actually fixed is NOT recorded here"
|
|
@@ -405,7 +423,17 @@ def _resolve_record(
|
|
|
405
423
|
now: float,
|
|
406
424
|
outcome: str,
|
|
407
425
|
) -> dict[str, Any]:
|
|
408
|
-
if outcome == "
|
|
426
|
+
if outcome == "merged":
|
|
427
|
+
# #2350: checked BEFORE the "done" branch below — a successful
|
|
428
|
+
# Merge-only fast-path attempt also lands `new_state == "done"` (it
|
|
429
|
+
# skips the `waiting`/relaunch cycle entirely), so without this
|
|
430
|
+
# ordering the generic landed check would win the match and this
|
|
431
|
+
# episode would be indistinguishable from "something else merged it
|
|
432
|
+
# while it sat here" — exactly the conflation #2350 exists to split
|
|
433
|
+
# out of #2230's `auto-released`/#2055's `already-landed`.
|
|
434
|
+
true_cause, human = _AUTO_MERGED_CAUSE, False
|
|
435
|
+
resolution = "auto_merged"
|
|
436
|
+
elif outcome == "done" or new_state == "done":
|
|
409
437
|
true_cause, human = _LANDED_CAUSE, False
|
|
410
438
|
resolution = "landed"
|
|
411
439
|
elif outcome == "resumed":
|
|
@@ -471,6 +499,81 @@ def enter_event(
|
|
|
471
499
|
return record
|
|
472
500
|
|
|
473
501
|
|
|
502
|
+
def merge_only_event(
|
|
503
|
+
entry: QueueEntry,
|
|
504
|
+
*,
|
|
505
|
+
host: str = "",
|
|
506
|
+
now: float | None = None,
|
|
507
|
+
) -> dict[str, Any]:
|
|
508
|
+
"""The ``resolve`` record for #2350's Merge-only fast path.
|
|
509
|
+
|
|
510
|
+
The other caller-constructed record besides :func:`enter_event`, and for
|
|
511
|
+
the identical structural reason: the transition happens OUTSIDE
|
|
512
|
+
:func:`plan_events`'s view. A `merge_only` :class:`~coord.drive_queue.
|
|
513
|
+
Reconcile` deliberately writes no `state` (see its docstring), so
|
|
514
|
+
`plan.writes()` never carries the `parked`/`blocked` → `done` move this
|
|
515
|
+
function records — it only happens once the shell's own live
|
|
516
|
+
``coord merge --only`` attempt reports success, strictly after
|
|
517
|
+
``_apply_writes`` has already run for the rest of the tick. *entry* is
|
|
518
|
+
the PRE-tick snapshot (its ``state`` is still `parked`/`blocked`); the
|
|
519
|
+
entry has already landed by the time this is called, so `new_state` is
|
|
520
|
+
unconditionally :data:`~coord.drive_queue.STATE_DONE`.
|
|
521
|
+
"""
|
|
522
|
+
stamp = time.time() if now is None else now
|
|
523
|
+
record = _resolve_record(
|
|
524
|
+
entry.key,
|
|
525
|
+
entry.state,
|
|
526
|
+
STATE_DONE,
|
|
527
|
+
"",
|
|
528
|
+
entry,
|
|
529
|
+
host=host,
|
|
530
|
+
now=stamp,
|
|
531
|
+
outcome="merged",
|
|
532
|
+
)
|
|
533
|
+
record["source"] = "tick"
|
|
534
|
+
return record
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
def merge_only_fallback_event(
|
|
538
|
+
entry: QueueEntry,
|
|
539
|
+
*,
|
|
540
|
+
reason: str,
|
|
541
|
+
host: str = "",
|
|
542
|
+
now: float | None = None,
|
|
543
|
+
) -> dict[str, Any]:
|
|
544
|
+
"""The ``resolve`` record for #2350's Merge-only fast path RACE case:
|
|
545
|
+
the live gate read clear enough to attempt a direct merge, but the
|
|
546
|
+
attempt itself did not confirm a landed merge, so
|
|
547
|
+
``coord.commands.drive_queue._run_merge_only_candidates`` falls back to
|
|
548
|
+
exactly the pre-#2350 ``resumed`` shape (``STATE_WAITING``) — OUTSIDE
|
|
549
|
+
``plan.writes()``, the same reason :func:`merge_only_event` exists for
|
|
550
|
+
the success case: without this, the episode :func:`plan_events` already
|
|
551
|
+
opened for *entry* would never see a matching close, and
|
|
552
|
+
``coord drive-queue block-log`` would show it stuck ``(unresolved)``
|
|
553
|
+
forever even though the entry plainly left `parked`/`blocked` this tick.
|
|
554
|
+
|
|
555
|
+
Classified as an ordinary ``resumed`` outcome — not a new #2350 cause —
|
|
556
|
+
on purpose: unlike the success case, this genuinely IS "state flipped,
|
|
557
|
+
cause a plain gate re-clear" (:func:`_resume_cause`'s fallback,
|
|
558
|
+
``auto-released``), the same honest non-answer a bare board-signal
|
|
559
|
+
resume already gets. #2350's distinct cause is reserved for the tick
|
|
560
|
+
actually landing the merge itself.
|
|
561
|
+
"""
|
|
562
|
+
stamp = time.time() if now is None else now
|
|
563
|
+
record = _resolve_record(
|
|
564
|
+
entry.key,
|
|
565
|
+
entry.state,
|
|
566
|
+
STATE_WAITING,
|
|
567
|
+
reason,
|
|
568
|
+
entry,
|
|
569
|
+
host=host,
|
|
570
|
+
now=stamp,
|
|
571
|
+
outcome="resumed",
|
|
572
|
+
)
|
|
573
|
+
record["source"] = "tick"
|
|
574
|
+
return record
|
|
575
|
+
|
|
576
|
+
|
|
474
577
|
def operator_resolution_event(
|
|
475
578
|
entry: QueueEntry,
|
|
476
579
|
*,
|
|
@@ -53,6 +53,7 @@ from coord.drive_queue import (
|
|
|
53
53
|
QUEUE_ALERT_STAGE,
|
|
54
54
|
RESUME_PROBE_TIMEOUT_SECONDS,
|
|
55
55
|
STATE_BLOCKED,
|
|
56
|
+
STATE_DONE,
|
|
56
57
|
STATE_FAILED,
|
|
57
58
|
STATE_PARKED,
|
|
58
59
|
STATE_RUNNING,
|
|
@@ -98,6 +99,33 @@ from coord.overlap_predict import (
|
|
|
98
99
|
# budget.
|
|
99
100
|
_LAUNCH_TIMEOUT_SECONDS = 120.0
|
|
100
101
|
|
|
102
|
+
# Wall-clock ceiling for the tick's own `coord merge --only` attempt
|
|
103
|
+
# (#2350's fast path, `_run_merge_only_candidates`). Deliberately its OWN
|
|
104
|
+
# constant, not a reuse of `_LAUNCH_TIMEOUT_SECONDS` above: that one is
|
|
105
|
+
# scoped to a `coord drive --tmux` launch, which only ever blocks on #1606's
|
|
106
|
+
# bounded liveness check, so 120s is already generous there. `coord merge
|
|
107
|
+
# --only` is a different animal — elsewhere in the codebase
|
|
108
|
+
# (`Driver._spawn` in `coord/drive.py`) the SAME subcommand runs under NO
|
|
109
|
+
# subprocess timeout at all, nested inside up to a 1800s merge-lock
|
|
110
|
+
# acquisition, i.e. the existing precedent treats its runtime as
|
|
111
|
+
# unbounded/long, not launch-fast. This call site does still want a
|
|
112
|
+
# backstop — unlike `_spawn`'s fire-and-forget, this one runs synchronously
|
|
113
|
+
# inside `drive_queue_tick`, in a loop over every `merge_only` candidate
|
|
114
|
+
# this tick found (typically 0-2, see `_fetch_merge_only_ready`, but not
|
|
115
|
+
# hard-capped), and a wedge here stalls the whole tick — so it gets a wider
|
|
116
|
+
# ceiling than the launch check instead of no ceiling at all, without going
|
|
117
|
+
# fully unbounded: `coord-drive-queue.service` (the deployed timer unit)
|
|
118
|
+
# gives the ENTIRE `coord drive-queue tick` invocation only 300s
|
|
119
|
+
# (`TimeoutStartSec`) before systemd kills it outright, which is a harder
|
|
120
|
+
# and less graceful stop than this subprocess's own SIGKILL. 240s leaves
|
|
121
|
+
# room for one slow `gh pr merge`/git round trip on a bad network day
|
|
122
|
+
# without letting a single candidate alone consume the whole tick's outer
|
|
123
|
+
# budget (this PR's invocation never passes `--revalidate`, so
|
|
124
|
+
# `wait_for_ci_settle`'s up to 360s doesn't even apply today, but the argv
|
|
125
|
+
# could grow that flag later — revisit this ceiling together with
|
|
126
|
+
# `coord-drive-queue.service`'s `TimeoutStartSec` if it does).
|
|
127
|
+
_MERGE_ONLY_TIMEOUT_SECONDS = 240.0
|
|
128
|
+
|
|
101
129
|
# Counts are rendered in pipeline order, not alphabetically, so
|
|
102
130
|
# `coord drive-queue status` reads as "1 running · 1 waiting". `parked`
|
|
103
131
|
# (#1891) sits between `waiting` and `blocked` — closer to "nothing wrong"
|
|
@@ -2037,6 +2065,82 @@ def _fetch_live_blocked_gate(
|
|
|
2037
2065
|
return overrides
|
|
2038
2066
|
|
|
2039
2067
|
|
|
2068
|
+
def _fetch_merge_only_ready(
|
|
2069
|
+
entries: list,
|
|
2070
|
+
live_ci_gate: Mapping[str, bool],
|
|
2071
|
+
live_blocked_gate: Mapping[str, bool],
|
|
2072
|
+
) -> dict[str, bool]:
|
|
2073
|
+
"""``{entry_key: True}`` for #2350's Merge-only fast path: every entry
|
|
2074
|
+
THIS tick's live gate re-check just found clear — a `parked` entry with
|
|
2075
|
+
``live_ci_gate[key] is False``, a `blocked` one with
|
|
2076
|
+
``live_blocked_gate[key] is False`` — whose board-recorded pipeline
|
|
2077
|
+
state ALSO shows Test already `passed` and Review already `approve`,
|
|
2078
|
+
meaning Merge was the only gate that was ever still shut.
|
|
2079
|
+
|
|
2080
|
+
Scoped to exactly the entries about to reconcile `resumed` this tick —
|
|
2081
|
+
typically 0-2, the same bound :func:`_fetch_live_ci_gate`/
|
|
2082
|
+
:func:`_fetch_live_blocked_gate` already keep — so this never re-derives
|
|
2083
|
+
a gate reading of its own (that authority stays with *live_ci_gate*/
|
|
2084
|
+
*live_blocked_gate*, computed moments earlier in the same tick): it only
|
|
2085
|
+
adds two board-only reads (:func:`coord.merge_queue.has_approved_review`,
|
|
2086
|
+
:func:`coord.merge_queue.has_passed_test`) against the SAME local board
|
|
2087
|
+
those callers already loaded. Almost always cheap and I/O-free — but not
|
|
2088
|
+
unconditionally: ``has_approved_review`` can fall through to
|
|
2089
|
+
``scan_approved_reviews``'s ``_backfill_branch_patch_id``, which does a
|
|
2090
|
+
live ``gh api compare`` round trip via *_gh_ops* when a stale-SHA review
|
|
2091
|
+
needs its patch-id computed on demand. That path is exception-guarded
|
|
2092
|
+
below and fails closed to the pre-#2350 `resumed` path like everything
|
|
2093
|
+
else here, so it is not unsafe — just not the zero-I/O read the rest of
|
|
2094
|
+
this docstring describes.
|
|
2095
|
+
|
|
2096
|
+
Takes no *config_path*, unlike both siblings: neither board-only read
|
|
2097
|
+
needs a :class:`~coord.config.Config` (no ``ci_store``, no live gate
|
|
2098
|
+
re-derivation), so there is nothing to load here.
|
|
2099
|
+
|
|
2100
|
+
Same fail-open-per-entry, fail-closed-overall contract as its siblings:
|
|
2101
|
+
a key ABSENT from the result (no queue row, an unreadable board or
|
|
2102
|
+
merge queue, any exception) simply takes the pre-#2350 `resumed` path —
|
|
2103
|
+
never a wrongly skipped relaunch.
|
|
2104
|
+
"""
|
|
2105
|
+
targets = [
|
|
2106
|
+
e for e in entries
|
|
2107
|
+
if (e.state == STATE_PARKED and live_ci_gate.get(e.key) is False)
|
|
2108
|
+
or (e.state == STATE_BLOCKED and live_blocked_gate.get(e.key) is False)
|
|
2109
|
+
]
|
|
2110
|
+
if not targets:
|
|
2111
|
+
return {}
|
|
2112
|
+
|
|
2113
|
+
from coord.board_service import resolve as resolve_board_service # noqa: PLC0415
|
|
2114
|
+
|
|
2115
|
+
if resolve_board_service() is not None:
|
|
2116
|
+
return {}
|
|
2117
|
+
|
|
2118
|
+
try:
|
|
2119
|
+
from coord import github_ops as _gh_ops # noqa: PLC0415
|
|
2120
|
+
from coord import merge_queue as _mq # noqa: PLC0415
|
|
2121
|
+
from coord.state import load_board as _load_board # noqa: PLC0415
|
|
2122
|
+
|
|
2123
|
+
board = _load_board()
|
|
2124
|
+
queue_by_key = {
|
|
2125
|
+
entry_key(q.repo_name, q.issue_number): q for q in _mq.load_queue()
|
|
2126
|
+
}
|
|
2127
|
+
except Exception: # noqa: BLE001 — see the fail-soft note above
|
|
2128
|
+
return {}
|
|
2129
|
+
|
|
2130
|
+
ready: dict[str, bool] = {}
|
|
2131
|
+
for e in targets:
|
|
2132
|
+
q = queue_by_key.get(e.key)
|
|
2133
|
+
if q is None:
|
|
2134
|
+
continue
|
|
2135
|
+
try:
|
|
2136
|
+
ready[e.key] = _mq.has_approved_review(
|
|
2137
|
+
q, board, _gh_ops
|
|
2138
|
+
) and _mq.has_passed_test(q, board)
|
|
2139
|
+
except Exception: # noqa: BLE001 — leave this one entry to the ordinary path
|
|
2140
|
+
continue
|
|
2141
|
+
return ready
|
|
2142
|
+
|
|
2143
|
+
|
|
2040
2144
|
def _launch_argv(entry: QueueEntry, config_path: Path | None) -> list[str]:
|
|
2041
2145
|
"""The ``coord drive --tmux`` argv for *entry*.
|
|
2042
2146
|
|
|
@@ -2068,6 +2172,136 @@ def _launch_argv(entry: QueueEntry, config_path: Path | None) -> list[str]:
|
|
|
2068
2172
|
return argv
|
|
2069
2173
|
|
|
2070
2174
|
|
|
2175
|
+
def _merge_only_argv(entry: QueueEntry, config_path: Path | None) -> list[str]:
|
|
2176
|
+
"""The ``coord merge --only <repo>#<issue>`` argv for *entry* (#2350).
|
|
2177
|
+
|
|
2178
|
+
Mirrors :func:`_launch_argv`'s exact shape — same ``coord_argv()`` base,
|
|
2179
|
+
same ``--config`` passthrough — for the direct-merge fast path instead
|
|
2180
|
+
of a fresh drive session. ``--only`` accepts the durable ``repo#issue``
|
|
2181
|
+
form (#1477), which is exactly ``entry.key``, so no assignment_id lookup
|
|
2182
|
+
is needed here.
|
|
2183
|
+
"""
|
|
2184
|
+
from coord.drive import coord_argv # noqa: PLC0415
|
|
2185
|
+
|
|
2186
|
+
argv = coord_argv() + ["merge", "--only", entry.key]
|
|
2187
|
+
if config_path:
|
|
2188
|
+
argv += ["--config", str(config_path)]
|
|
2189
|
+
return argv
|
|
2190
|
+
|
|
2191
|
+
|
|
2192
|
+
def _merge_only_landed(entry: QueueEntry) -> bool:
|
|
2193
|
+
"""Did *entry* actually MERGE, per the merge-queue's own row — the one
|
|
2194
|
+
ground truth ``coord merge --only``'s exit code alone cannot supply.
|
|
2195
|
+
|
|
2196
|
+
#2350: a ``--only`` run against an already-PENDING entry exits 0
|
|
2197
|
+
whether the attempt landed it, left it blocked on a gate, or routed it
|
|
2198
|
+
into a conflict-fix — see ``coord.commands.merge``'s ``--only`` handler,
|
|
2199
|
+
which prints a summary and returns unconditionally once ``process()``
|
|
2200
|
+
has run. Exit code alone is therefore not evidence of a landed merge;
|
|
2201
|
+
the queue row's own resulting state is.
|
|
2202
|
+
"""
|
|
2203
|
+
from coord import merge_queue as _mq # noqa: PLC0415
|
|
2204
|
+
|
|
2205
|
+
try:
|
|
2206
|
+
rows = _mq.load_queue()
|
|
2207
|
+
except Exception: # noqa: BLE001 — unreadable queue is not proof of a landed merge
|
|
2208
|
+
return False
|
|
2209
|
+
for q in rows:
|
|
2210
|
+
if entry_key(q.repo_name, q.issue_number) == entry.key:
|
|
2211
|
+
return q.state == _mq.MERGED
|
|
2212
|
+
return False
|
|
2213
|
+
|
|
2214
|
+
|
|
2215
|
+
def _run_merge_only_candidates(plan: TickPlan, config_path: Path | None) -> None:
|
|
2216
|
+
"""#2350: attempt ``coord merge --only`` directly, THIS tick, for every
|
|
2217
|
+
entry :func:`coord.drive_queue.plan_tick` marked ``merge_only`` — no
|
|
2218
|
+
relaunch, no capacity slot spent. Called AFTER ``_apply_writes(plan)``,
|
|
2219
|
+
same posture as the launch subprocess below it: the entry's real next
|
|
2220
|
+
state is decided from the live outcome of THIS attempt, not from
|
|
2221
|
+
anything ``plan_tick`` could have known when it returned — see
|
|
2222
|
+
:class:`~coord.drive_queue.Reconcile`'s ``merge_only`` outcome for why
|
|
2223
|
+
that Reconcile itself writes nothing.
|
|
2224
|
+
|
|
2225
|
+
On success (the queue's own row now reads ``MERGED`` — see
|
|
2226
|
+
:func:`_merge_only_landed`): writes ``STATE_DONE`` directly, skipping
|
|
2227
|
+
the ``waiting``/relaunch cycle a NEXT tick's ordinary ``landed``
|
|
2228
|
+
re-check would otherwise need, and records a distinct #2350 block-log
|
|
2229
|
+
``resolve`` (:func:`coord.block_log.merge_only_event`) so #2235's corpus
|
|
2230
|
+
can tell "the queue itself finished this" apart from "the state flipped
|
|
2231
|
+
and something else finished it" (``already-landed``/``auto-released``).
|
|
2232
|
+
|
|
2233
|
+
On failure (the gate flipped shut again between the read and the
|
|
2234
|
+
attempt — a genuine race, not the common case; or the attempt itself hit
|
|
2235
|
+
something a single bounded try cannot resolve): falls back to EXACTLY
|
|
2236
|
+
the pre-#2350 ``resumed`` shape — ``STATE_WAITING``, ``attempts`` reset
|
|
2237
|
+
to 0, ``resumes`` bumped for a ``blocked``-origin entry (mirroring
|
|
2238
|
+
``_reconcile_blocked``'s own formula, so the #2230 oscillation ceiling
|
|
2239
|
+
still sees every chance this entry got, fast-path or not) — never worse
|
|
2240
|
+
than the status quo, and never a `coord drive --tmux` launch attempt
|
|
2241
|
+
spent retrying a race this bounded attempt already ruled out.
|
|
2242
|
+
"""
|
|
2243
|
+
if not plan.merge_only:
|
|
2244
|
+
return
|
|
2245
|
+
|
|
2246
|
+
from coord.block_log import merge_only_event, merge_only_fallback_event # noqa: PLC0415
|
|
2247
|
+
from coord.state import update_drive_queue_entry # noqa: PLC0415
|
|
2248
|
+
|
|
2249
|
+
for target in plan.merge_only:
|
|
2250
|
+
argv = _merge_only_argv(target, config_path)
|
|
2251
|
+
try:
|
|
2252
|
+
result = subprocess.run( # noqa: S603 — argv built from coord_argv + typed row
|
|
2253
|
+
argv,
|
|
2254
|
+
capture_output=True,
|
|
2255
|
+
text=True,
|
|
2256
|
+
timeout=_MERGE_ONLY_TIMEOUT_SECONDS,
|
|
2257
|
+
)
|
|
2258
|
+
returncode = result.returncode
|
|
2259
|
+
detail = (result.stderr or result.stdout or "").strip().splitlines()
|
|
2260
|
+
message = detail[-1] if detail else ""
|
|
2261
|
+
except (subprocess.SubprocessError, OSError) as exc:
|
|
2262
|
+
returncode, message = 1, str(exc)
|
|
2263
|
+
|
|
2264
|
+
if returncode == 0 and _merge_only_landed(target):
|
|
2265
|
+
update_drive_queue_entry(
|
|
2266
|
+
target.repo,
|
|
2267
|
+
target.issue,
|
|
2268
|
+
state=STATE_DONE,
|
|
2269
|
+
last_reason=(
|
|
2270
|
+
"merged directly from the tick — Test/Review were "
|
|
2271
|
+
"already satisfied, Merge was the only gate left (#2350)"
|
|
2272
|
+
),
|
|
2273
|
+
session_name=None,
|
|
2274
|
+
)
|
|
2275
|
+
_record_block_log([merge_only_event(target, host=_local_host_id())])
|
|
2276
|
+
click.echo(f"merge-only: {target.key} merged directly from the tick")
|
|
2277
|
+
continue
|
|
2278
|
+
|
|
2279
|
+
# #2350: the race case — fall back to exactly today's `resumed`
|
|
2280
|
+
# shape, never a consumed drive-queue attempt (this was never a
|
|
2281
|
+
# `coord drive --tmux` launch).
|
|
2282
|
+
reason = f"merge-only attempt for {target.key} did not land it this tick"
|
|
2283
|
+
if message:
|
|
2284
|
+
reason += f" ({message})"
|
|
2285
|
+
reason += " — falling back to an ordinary relaunch (#2350)"
|
|
2286
|
+
updates: dict[str, Any] = {
|
|
2287
|
+
"state": STATE_WAITING,
|
|
2288
|
+
"attempts": 0,
|
|
2289
|
+
"last_reason": reason,
|
|
2290
|
+
}
|
|
2291
|
+
if target.state == STATE_BLOCKED:
|
|
2292
|
+
updates["resumes"] = target.resumes + 1
|
|
2293
|
+
update_drive_queue_entry(target.repo, target.issue, **updates)
|
|
2294
|
+
# #2350: this write bypassed `plan.writes()` entirely, so the
|
|
2295
|
+
# `plan_events` call below (keyed off the ORIGINAL plan) can never
|
|
2296
|
+
# see it — without recording it here, the episode `plan_events`
|
|
2297
|
+
# already opened for `target` when it first went `parked`/`blocked`
|
|
2298
|
+
# would never see a matching close.
|
|
2299
|
+
_record_block_log(
|
|
2300
|
+
[merge_only_fallback_event(target, reason=reason, host=_local_host_id())]
|
|
2301
|
+
)
|
|
2302
|
+
click.echo(f"merge-only: {reason}")
|
|
2303
|
+
|
|
2304
|
+
|
|
2071
2305
|
def _run_resume_probe(entry: QueueEntry) -> ProbeResult:
|
|
2072
2306
|
"""Run one entry's ``--resume-when`` probe with a hard timeout.
|
|
2073
2307
|
|
|
@@ -2219,7 +2453,8 @@ def _requeue_command(entry: QueueEntry | None, key: str) -> str:
|
|
|
2219
2453
|
"Update the queue's view of reality and launch nothing (#2110). "
|
|
2220
2454
|
"Every `running` entry is still checked against the board "
|
|
2221
2455
|
"(done/blocked/parked/retry, exactly as a normal tick would), but no "
|
|
2222
|
-
"new `coord drive` is ever started this run
|
|
2456
|
+
"new `coord drive` is ever started this run, and no `coord merge "
|
|
2457
|
+
"--only` fast-path attempt (#2350) runs either — equivalent to "
|
|
2223
2458
|
"`--max-parallel 0`. This is the missing primitive for the "
|
|
2224
2459
|
"stop-the-timer-to-roll-the-fleet sequence: with the timer stopped, "
|
|
2225
2460
|
"nothing reconciles a finished drive's `running` row, and that stale "
|
|
@@ -2367,6 +2602,15 @@ def drive_queue_tick(
|
|
|
2367
2602
|
# landable for most of that window, and nothing ever looked again).
|
|
2368
2603
|
live_blocked_gate = _fetch_live_blocked_gate(entries, config_path)
|
|
2369
2604
|
|
|
2605
|
+
# #2350: for every entry the two live re-checks above just found
|
|
2606
|
+
# clear, also confirm — from the board's own recorded Test/Review
|
|
2607
|
+
# verdicts — that Merge was the only gate ever still shut, so
|
|
2608
|
+
# `plan_tick` can attempt it directly this tick instead of spending
|
|
2609
|
+
# a relaunch. See `_fetch_merge_only_ready`'s docstring.
|
|
2610
|
+
merge_only_ready = _fetch_merge_only_ready(
|
|
2611
|
+
entries, live_ci_gate, live_blocked_gate
|
|
2612
|
+
)
|
|
2613
|
+
|
|
2370
2614
|
# #2101: release cordons. THIS is the hole the issue names — the
|
|
2371
2615
|
# queue's launcher had zero pause awareness (`coord/drive.py` checks
|
|
2372
2616
|
# pause only when routing a *worker*), so a cordoned host kept getting
|
|
@@ -2409,6 +2653,7 @@ def drive_queue_tick(
|
|
|
2409
2653
|
live_ci_gate_reason=live_ci_gate_reason,
|
|
2410
2654
|
live_blocked_gate=live_blocked_gate,
|
|
2411
2655
|
editable_drift=editable_drift,
|
|
2656
|
+
merge_only_ready=merge_only_ready,
|
|
2412
2657
|
)
|
|
2413
2658
|
|
|
2414
2659
|
if reconcile_only:
|
|
@@ -2427,6 +2672,16 @@ def drive_queue_tick(
|
|
|
2427
2672
|
|
|
2428
2673
|
_apply_writes(plan)
|
|
2429
2674
|
|
|
2675
|
+
# #2350: attempt the direct merges `plan_tick` marked `merge_only`,
|
|
2676
|
+
# right after the rest of the plan's writes have landed. Skipped
|
|
2677
|
+
# under `--reconcile-only` (also forced by `--max-parallel 0`, see
|
|
2678
|
+
# `effective_capacity` above) — that mode's whole contract is
|
|
2679
|
+
# "update queue state, launch nothing", and a live `coord merge
|
|
2680
|
+
# --only` attempt is exactly the external action it promises not to
|
|
2681
|
+
# take, same posture as the launch subprocess further down.
|
|
2682
|
+
if not reconcile_only:
|
|
2683
|
+
_run_merge_only_candidates(plan, config_path)
|
|
2684
|
+
|
|
2430
2685
|
# #2235 Phase 0: record every entry this tick moved INTO or OUT OF
|
|
2431
2686
|
# `blocked`/`parked`, with the reason the queue stated and — for a
|
|
2432
2687
|
# release — what the release itself reveals about the true cause.
|
|
@@ -1088,10 +1088,23 @@ class Reconcile:
|
|
|
1088
1088
|
startup grace window. Costs one attempt.
|
|
1089
1089
|
* ``exhausted`` — as ``retry``, but out of attempts; pairs with a
|
|
1090
1090
|
:class:`Blocked`.
|
|
1091
|
+
* ``merge_only`` — #2350: a ``parked``/``blocked`` entry whose live gate
|
|
1092
|
+
re-check reads clear AND whose board-recorded Test/Review verdicts
|
|
1093
|
+
already show Merge is the only remaining gate (*merge_only_ready*).
|
|
1094
|
+
Writes NO state here — unlike ``resumed``, this does not fall through
|
|
1095
|
+
to step 4's launch walk at all. The key is instead carried on
|
|
1096
|
+
:attr:`TickPlan.merge_only` for the shell to attempt a direct
|
|
1097
|
+
``coord merge --only`` from THIS tick, no relaunch, no capacity slot
|
|
1098
|
+
spent. The shell decides the entry's real next state from the live
|
|
1099
|
+
outcome of that attempt (straight to ``done`` on success; falls back
|
|
1100
|
+
to exactly today's ``resumed``-shaped ``STATE_WAITING`` on failure —
|
|
1101
|
+
see :func:`coord.commands.drive_queue._run_merge_only_candidates`),
|
|
1102
|
+
which is why this Reconcile's own ``updates`` stays empty: neither
|
|
1103
|
+
outcome is knowable at the moment :func:`plan_tick` returns.
|
|
1091
1104
|
"""
|
|
1092
1105
|
|
|
1093
1106
|
key: str
|
|
1094
|
-
outcome: str # alive | starting | held | unknown | done | refused | parked | retry | exhausted
|
|
1107
|
+
outcome: str # alive | starting | held | unknown | done | refused | parked | retry | exhausted | merge_only
|
|
1095
1108
|
reason: str
|
|
1096
1109
|
occupies: bool = False
|
|
1097
1110
|
updates: Mapping[str, Any] = field(default_factory=dict)
|
|
@@ -1243,6 +1256,11 @@ class TickPlan:
|
|
|
1243
1256
|
|
|
1244
1257
|
reconciles: tuple[Reconcile, ...] = ()
|
|
1245
1258
|
launch: QueueEntry | None = None
|
|
1259
|
+
# #2350: entries the walk above marked ``merge_only`` — the shell attempts
|
|
1260
|
+
# `coord merge --only` for each directly, no relaunch, no capacity spent.
|
|
1261
|
+
# Unlike `launch` (one slot, one entry), every eligible entry gets one:
|
|
1262
|
+
# nothing here competes for capacity, so there is nothing to ration.
|
|
1263
|
+
merge_only: tuple[QueueEntry, ...] = ()
|
|
1246
1264
|
blocked: tuple[Blocked, ...] = ()
|
|
1247
1265
|
deferrals: tuple[Deferral, ...] = ()
|
|
1248
1266
|
holds: tuple[Hold, ...] = ()
|
|
@@ -2226,6 +2244,7 @@ def _reconcile_blocked(
|
|
|
2226
2244
|
entry: QueueEntry,
|
|
2227
2245
|
facts: IssueFacts,
|
|
2228
2246
|
live_blocked_gate: Mapping[str, bool] | None,
|
|
2247
|
+
merge_only_ready: Mapping[str, bool] | None = None,
|
|
2229
2248
|
) -> Reconcile | None:
|
|
2230
2249
|
"""Re-examine ONE `blocked` entry against the current gate reading.
|
|
2231
2250
|
|
|
@@ -2252,6 +2271,17 @@ def _reconcile_blocked(
|
|
|
2252
2271
|
issue's explicit ask), which is also what feeds the oscillation signal
|
|
2253
2272
|
into `coord drive-queue list`/`status` without inventing a second alert
|
|
2254
2273
|
channel for it.
|
|
2274
|
+
|
|
2275
|
+
*merge_only_ready* (#2350) is consulted only once a confirmed-clear
|
|
2276
|
+
reading has already survived the oscillation-ceiling check above — the
|
|
2277
|
+
ceiling's "stop giving this entry more chances" verdict applies whether
|
|
2278
|
+
the next chance would have been a relaunch or a direct merge attempt.
|
|
2279
|
+
A ``True`` entry there means Merge is the ONLY gate left (the board's
|
|
2280
|
+
own recorded Test/Review verdicts already show `passed`/`approve` — see
|
|
2281
|
+
:func:`coord.commands.drive_queue._fetch_merge_only_ready`), so this
|
|
2282
|
+
returns a ``merge_only`` :class:`Reconcile` instead of the ordinary
|
|
2283
|
+
``resumed`` one below — see that outcome's docstring on :class:`Reconcile`
|
|
2284
|
+
for why it writes no state here.
|
|
2255
2285
|
"""
|
|
2256
2286
|
if is_permanent_block_reason(entry.last_reason):
|
|
2257
2287
|
return None
|
|
@@ -2276,6 +2306,16 @@ def _reconcile_blocked(
|
|
|
2276
2306
|
updates={"last_reason": reason},
|
|
2277
2307
|
)
|
|
2278
2308
|
|
|
2309
|
+
if (merge_only_ready or {}).get(entry.key):
|
|
2310
|
+
reason = (
|
|
2311
|
+
f"{entry.key}'s merge gate reads clear now "
|
|
2312
|
+
f"({facts.merge_gate_reason or facts.merge_ci_pending_reason or 'no gate objection'}) "
|
|
2313
|
+
"and the board already shows Test passed and Review approved — "
|
|
2314
|
+
"attempting `coord merge --only` directly from this tick instead "
|
|
2315
|
+
"of relaunching a fresh drive session (#2350)"
|
|
2316
|
+
)
|
|
2317
|
+
return Reconcile(entry.key, "merge_only", reason, occupies=False)
|
|
2318
|
+
|
|
2279
2319
|
reason = (
|
|
2280
2320
|
f"{entry.key}'s merge gate reads clear now "
|
|
2281
2321
|
f"({facts.merge_gate_reason or facts.merge_ci_pending_reason or 'no gate objection'}) "
|
|
@@ -2556,6 +2596,7 @@ def plan_tick(
|
|
|
2556
2596
|
live_ci_gate_reason: Mapping[str, str] | None = None,
|
|
2557
2597
|
live_blocked_gate: Mapping[str, bool] | None = None,
|
|
2558
2598
|
editable_drift: tuple[str, str] | None = None,
|
|
2599
|
+
merge_only_ready: Mapping[str, bool] | None = None,
|
|
2559
2600
|
) -> TickPlan:
|
|
2560
2601
|
"""Decide one tick. Pure; the caller executes the returned plan.
|
|
2561
2602
|
|
|
@@ -2686,6 +2727,22 @@ def plan_tick(
|
|
|
2686
2727
|
beats the cached board's `IssueFacts.merge_gate_status`; absent falls
|
|
2687
2728
|
through to it. See :func:`_blocked_gate_reading`.
|
|
2688
2729
|
|
|
2730
|
+
*merge_only_ready* (#2350) maps a key to whether — GIVEN this SAME tick
|
|
2731
|
+
already found its live gate clear (*live_ci_gate* reading `False` for a
|
|
2732
|
+
`parked` entry, *live_blocked_gate* reading `False` for a `blocked` one)
|
|
2733
|
+
— the board's own recorded pipeline state ALSO shows Test `passed` and
|
|
2734
|
+
Review `approve` already, i.e. Merge is the only gate that was ever
|
|
2735
|
+
still shut. `True` there swaps what would have been today's `resumed`
|
|
2736
|
+
reconcile (write `STATE_WAITING`, compete for next tick's launch slot)
|
|
2737
|
+
for a `merge_only` one instead (write nothing; the shell attempts
|
|
2738
|
+
`coord merge --only` directly, this tick, no relaunch, no capacity
|
|
2739
|
+
spent) — see :class:`Reconcile`'s `merge_only` outcome and
|
|
2740
|
+
:func:`coord.commands.drive_queue._fetch_merge_only_ready` for how the
|
|
2741
|
+
shell computes it. A key ABSENT or `False` changes nothing: the entry
|
|
2742
|
+
takes exactly the pre-#2350 `resumed` path, so an unreadable board, a
|
|
2743
|
+
missing PR, or Test/Review genuinely not both satisfied yet all degrade
|
|
2744
|
+
to today's behaviour, never to a wrongly-skipped relaunch.
|
|
2745
|
+
|
|
2689
2746
|
The algorithm, from #1754, plus #1757's step 2, #1891's step 1b, #2055's
|
|
2690
2747
|
extension of it, and #2230's further extension for `blocked`:
|
|
2691
2748
|
|
|
@@ -2787,6 +2844,9 @@ def plan_tick(
|
|
|
2787
2844
|
reconciles: list[Reconcile] = []
|
|
2788
2845
|
blocked: list[Blocked] = []
|
|
2789
2846
|
deferrals: list[Deferral] = []
|
|
2847
|
+
# #2350: entries this tick decided to attempt `coord merge --only` on
|
|
2848
|
+
# directly rather than relaunch — see `Reconcile`'s `merge_only` outcome.
|
|
2849
|
+
merge_only_candidates: list[QueueEntry] = []
|
|
2790
2850
|
occupied = 0
|
|
2791
2851
|
# #1972: the same count, keyed by repo. Populated from the SAME
|
|
2792
2852
|
# `reconcile.occupies` verdict as `occupied` above — one source of truth, so
|
|
@@ -2890,9 +2950,16 @@ def plan_tick(
|
|
|
2890
2950
|
# gave-up entry via the CI-pending resume was explicitly not the
|
|
2891
2951
|
# #2055 fix and is not this one either; see
|
|
2892
2952
|
# :func:`_reconcile_blocked` for the full decision.
|
|
2893
|
-
blocked_reconcile = _reconcile_blocked(
|
|
2953
|
+
blocked_reconcile = _reconcile_blocked(
|
|
2954
|
+
entry, facts, live_blocked_gate, merge_only_ready
|
|
2955
|
+
)
|
|
2894
2956
|
if blocked_reconcile is not None:
|
|
2895
2957
|
reconciles.append(blocked_reconcile)
|
|
2958
|
+
if blocked_reconcile.outcome == "merge_only":
|
|
2959
|
+
# #2350: no state write — the shell decides the entry's
|
|
2960
|
+
# real next state from the live merge attempt's outcome.
|
|
2961
|
+
merge_only_candidates.append(entry)
|
|
2962
|
+
continue
|
|
2896
2963
|
new_state = blocked_reconcile.updates.get("state")
|
|
2897
2964
|
if new_state:
|
|
2898
2965
|
states[entry.key] = str(new_state)
|
|
@@ -2954,6 +3021,24 @@ def plan_tick(
|
|
|
2954
3021
|
)
|
|
2955
3022
|
)
|
|
2956
3023
|
continue
|
|
3024
|
+
if (merge_only_ready or {}).get(entry.key):
|
|
3025
|
+
# #2350: Merge is the only gate left — the board already
|
|
3026
|
+
# shows Test passed and Review approved. Attempt the merge
|
|
3027
|
+
# directly this tick instead of paying for a relaunch; see
|
|
3028
|
+
# `Reconcile`'s `merge_only` outcome for why no state is
|
|
3029
|
+
# written here.
|
|
3030
|
+
reason = (
|
|
3031
|
+
f"live re-check of {entry.key}'s gate this tick reads "
|
|
3032
|
+
"READY (coord merge --plan agrees) and the board already "
|
|
3033
|
+
"shows Test passed and Review approved — attempting "
|
|
3034
|
+
"`coord merge --only` directly from this tick instead of "
|
|
3035
|
+
"relaunching a fresh drive session (#2350)"
|
|
3036
|
+
)
|
|
3037
|
+
reconciles.append(
|
|
3038
|
+
Reconcile(entry.key, "merge_only", reason, occupies=False)
|
|
3039
|
+
)
|
|
3040
|
+
merge_only_candidates.append(entry)
|
|
3041
|
+
continue
|
|
2957
3042
|
reason = (
|
|
2958
3043
|
f"live re-check of {entry.key}'s gate this tick reads READY "
|
|
2959
3044
|
"(coord merge --plan agrees) — resuming from parked without "
|
|
@@ -3099,6 +3184,11 @@ def plan_tick(
|
|
|
3099
3184
|
# report the reading that `occupied` was taken from.
|
|
3100
3185
|
"repo_occupied": dict(repo_occupied),
|
|
3101
3186
|
"repo_capacity": repo_capacity,
|
|
3187
|
+
# #2350: fixed by the time reconciliation (steps 1/1b) finishes —
|
|
3188
|
+
# nothing below this point (holds, capacity, the launch walk) ever
|
|
3189
|
+
# adds to it — so, unlike `reconciles`, every return site can share
|
|
3190
|
+
# this one tuple via `**plan_base` instead of re-taking it fresh.
|
|
3191
|
+
"merge_only": tuple(merge_only_candidates),
|
|
3102
3192
|
}
|
|
3103
3193
|
|
|
3104
3194
|
# #2186: every currently-closed gate, keyed by the entry it was declared
|
|
@@ -3535,6 +3625,11 @@ def render_plan(plan: TickPlan, *, dry_run: bool = False) -> list[str]:
|
|
|
3535
3625
|
)
|
|
3536
3626
|
for item in plan.reconciles:
|
|
3537
3627
|
lines.append(f" reconcile {item.key}: {item.outcome} — {item.reason}")
|
|
3628
|
+
# #2350: printed right after the reconciles, same reasoning as the hold
|
|
3629
|
+
# line below — "merge_only" and "attempting the merge directly" are one
|
|
3630
|
+
# thought, not two lines an operator has to correlate by key.
|
|
3631
|
+
for item in plan.merge_only:
|
|
3632
|
+
lines.append(f" {prefix}merge --only {item.key}")
|
|
3538
3633
|
# #1757: the gate line goes directly under its reconcile, because "1753
|
|
3539
3634
|
# done" immediately followed by "and therefore nothing launches" is the
|
|
3540
3635
|
# sentence an operator reading a timer log needs to read as one thought.
|