code-coordinator 0.5.46__tar.gz → 0.5.47__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.46/code_coordinator.egg-info → code_coordinator-0.5.47}/PKG-INFO +1 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.47/code_coordinator.egg-info}/PKG-INFO +1 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/drive_queue.py +34 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/db.py +17 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/drive_queue.py +13 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/reports.py +6 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/state.py +18 -3
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/DRIVE_QUEUE.md +8 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_drive_queue.py +92 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reports.py +3 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_serve.py +78 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/drive_queue.rs +31 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/mod.rs +4 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/tests.rs +54 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/types.rs +7 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/tests/fixtures/board_sample.json +2 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.gitignore +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/CLAUDE.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/GOAL.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/LICENSE +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/MANIFEST.in +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/README.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agent.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/board_service.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/brain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/claim.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/cli.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/client.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/comments.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/config.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dao.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deps.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/drive.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/events.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/filelock.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/freshness.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/gates.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/goal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/context.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/models.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/render.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/units.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/hooks.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/interactive.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/models.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/network.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/notify.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/openapi.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/parentage.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/plans.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/progress.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/release_window.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/review.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/smoke.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/split_work.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/test_author.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/test_report.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/usage.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/install-agent.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/pyproject.toml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/setup.cfg +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/conftest.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_db.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_events.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_init.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_models.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_network.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_session.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_split.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/tests/cli.rs +0 -0
|
@@ -264,6 +264,7 @@ def drive_queue_list(repo: str | None, output_json: bool, config_path: Path) ->
|
|
|
264
264
|
if not rows:
|
|
265
265
|
click.echo("(drive queue is empty)")
|
|
266
266
|
return
|
|
267
|
+
now = time.time()
|
|
267
268
|
for entry in entries_from_rows(rows):
|
|
268
269
|
bits = [f"{entry.position:>2} {entry.key:<28} {entry.state}"]
|
|
269
270
|
if entry.machine:
|
|
@@ -278,11 +279,43 @@ def drive_queue_list(repo: str | None, output_json: bool, config_path: Path) ->
|
|
|
278
279
|
bits.append(f"hold={entry.hold_state or 'armed'}")
|
|
279
280
|
click.echo(" ".join(bits))
|
|
280
281
|
if entry.last_reason:
|
|
281
|
-
click.echo(f" last: {entry.last_reason}")
|
|
282
|
+
click.echo(f" last{_reason_age_suffix(entry, now)}: {entry.last_reason}")
|
|
282
283
|
for line in _hold_lines(entry):
|
|
283
284
|
click.echo(line)
|
|
284
285
|
|
|
285
286
|
|
|
287
|
+
def _reason_age_suffix(entry: QueueEntry, now: float) -> str:
|
|
288
|
+
"""`` (3h ago)`` / `` (42s ago)``, or ``''`` when the age is unknown.
|
|
289
|
+
|
|
290
|
+
#2133: a `last_reason` is a snapshot taken the instant the tick (or a
|
|
291
|
+
guard) wrote it — never re-validated — so displaying it bare lets an
|
|
292
|
+
hours-old, no-longer-true observation read as current state (that
|
|
293
|
+
misdirected a live diagnosis on #2104: `checks_failed` was still shown
|
|
294
|
+
~3 hours after the named checks had gone green, while the actual
|
|
295
|
+
blocker — a later `request-changes` review — was nowhere in the
|
|
296
|
+
output). Stamping the age doesn't make the reason current, but it stops
|
|
297
|
+
it from being silently *mistaken* for current, which is the whole
|
|
298
|
+
defect. Empty for `entry.reason_at is None` — a row predating #2133's
|
|
299
|
+
migration, or an entry whose `last_reason` was never written through
|
|
300
|
+
`update_drive_queue_entry` (e.g. hand-built in a test) — rather than
|
|
301
|
+
guessing an age it doesn't have.
|
|
302
|
+
"""
|
|
303
|
+
if entry.reason_at is None:
|
|
304
|
+
return ""
|
|
305
|
+
return f" ({_age_str(max(0.0, now - entry.reason_at))} ago)"
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def _age_str(delta_seconds: float) -> str:
|
|
309
|
+
"""``42s`` / ``3h`` / ``5d`` — coarse, single-unit, matches #2133's ask."""
|
|
310
|
+
if delta_seconds < 60:
|
|
311
|
+
return f"{int(delta_seconds)}s"
|
|
312
|
+
if delta_seconds < 3600:
|
|
313
|
+
return f"{int(delta_seconds // 60)}m"
|
|
314
|
+
if delta_seconds < 86400:
|
|
315
|
+
return f"{int(delta_seconds // 3600)}h"
|
|
316
|
+
return f"{int(delta_seconds // 86400)}d"
|
|
317
|
+
|
|
318
|
+
|
|
286
319
|
def _hold_lines(entry: QueueEntry) -> list[str]:
|
|
287
320
|
"""The gate's rendering for `list` / `status`, or `[]` when there is none.
|
|
288
321
|
|
|
@@ -379,6 +379,18 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
|
|
|
379
379
|
attempts INTEGER NOT NULL DEFAULT 0,
|
|
380
380
|
deferrals INTEGER NOT NULL DEFAULT 0,
|
|
381
381
|
last_reason TEXT NOT NULL DEFAULT '',
|
|
382
|
+
-- #2133: wall-clock time `last_reason` was last WRITTEN, stamped
|
|
383
|
+
-- by `coord.state._update_drive_queue_entry_local` every time a
|
|
384
|
+
-- `last_reason` update lands (never by a caller — it is not in
|
|
385
|
+
-- `_DRIVE_QUEUE_UPDATABLE`). `last_reason` is a point-in-time
|
|
386
|
+
-- observation, not a live probe; without this a `blocked` entry's
|
|
387
|
+
-- displayed text ages silently and a stale-but-plausible reason
|
|
388
|
+
-- reads as current state (2026-08-11's #2104 incident: a 3-hour-
|
|
389
|
+
-- stale `checks_failed` outlived the CI failure it named while
|
|
390
|
+
-- the real, later blocker — a request-changes review — went
|
|
391
|
+
-- unmentioned). NULL for a row written before this migration or
|
|
392
|
+
-- for a fresh row whose `last_reason` is still the '' default.
|
|
393
|
+
reason_at REAL,
|
|
382
394
|
session_name TEXT,
|
|
383
395
|
launched_at REAL,
|
|
384
396
|
enqueued_at REAL NOT NULL,
|
|
@@ -693,6 +705,11 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
|
|
|
693
705
|
# "agent".
|
|
694
706
|
"ALTER TABLE assignments ADD COLUMN verdict_source TEXT",
|
|
695
707
|
"ALTER TABLE assignments ADD COLUMN verdict_source_reason TEXT",
|
|
708
|
+
# #2133: see the CREATE TABLE comment above — capture time of
|
|
709
|
+
# `drive_queue.last_reason`, so a `blocked` entry's displayed reason
|
|
710
|
+
# carries its age instead of rendering a stale snapshot as current
|
|
711
|
+
# state. NULL for every row predating this migration.
|
|
712
|
+
"ALTER TABLE drive_queue ADD COLUMN reason_at REAL",
|
|
696
713
|
]
|
|
697
714
|
for sql in migrations:
|
|
698
715
|
try:
|
|
@@ -321,6 +321,14 @@ class QueueEntry:
|
|
|
321
321
|
attempts: int = 0
|
|
322
322
|
deferrals: int = 0
|
|
323
323
|
last_reason: str = ""
|
|
324
|
+
# #2133: wall-clock capture time of `last_reason`, stamped by
|
|
325
|
+
# `coord.state._update_drive_queue_entry_local` every time `last_reason`
|
|
326
|
+
# is written. `None` for a row predating the migration or whose
|
|
327
|
+
# `last_reason` is still the '' default — never treated as "just now".
|
|
328
|
+
# A rendering that shows `last_reason` without also showing (or at least
|
|
329
|
+
# consulting) this is exactly the bug #2133 closes: a point-in-time
|
|
330
|
+
# observation displayed as if it were current state.
|
|
331
|
+
reason_at: float | None = None
|
|
324
332
|
session_name: str = ""
|
|
325
333
|
launched_at: float | None = None
|
|
326
334
|
# #1870: the short hostname of the machine whose tick launched THIS
|
|
@@ -382,6 +390,11 @@ class QueueEntry:
|
|
|
382
390
|
attempts=int(row.get("attempts") or 0),
|
|
383
391
|
deferrals=int(row.get("deferrals") or 0),
|
|
384
392
|
last_reason=str(row.get("last_reason") or ""),
|
|
393
|
+
reason_at=(
|
|
394
|
+
None
|
|
395
|
+
if row.get("reason_at") is None
|
|
396
|
+
else float(row.get("reason_at"))
|
|
397
|
+
),
|
|
385
398
|
session_name=str(row.get("session_name") or ""),
|
|
386
399
|
launched_at=None if launched_at is None else float(launched_at),
|
|
387
400
|
launch_host=str(row.get("launch_host") or ""),
|
|
@@ -814,6 +814,7 @@ DRIVE_QUEUE_STATUS_COLUMNS = [
|
|
|
814
814
|
"attempts",
|
|
815
815
|
"deferrals",
|
|
816
816
|
"last_reason",
|
|
817
|
+
"reason_at",
|
|
817
818
|
"enqueued_at",
|
|
818
819
|
"launched_at",
|
|
819
820
|
"hold_state",
|
|
@@ -831,6 +832,10 @@ DRIVE_QUEUE_STATUS_COLUMN_META = [
|
|
|
831
832
|
ColumnMeta(id="attempts", label="Attempts", kind="int", align="right"),
|
|
832
833
|
ColumnMeta(id="deferrals", label="Deferrals", kind="int", align="right"),
|
|
833
834
|
ColumnMeta(id="last_reason", label="Last Reason", kind="text", weight=3.0),
|
|
835
|
+
# #2133: capture time of `last_reason` — a client renders it as an age
|
|
836
|
+
# next to the reason so a stale snapshot never reads as current state.
|
|
837
|
+
# `None`/absent for a row predating the migration.
|
|
838
|
+
ColumnMeta(id="reason_at", label="Reason At", kind="timestamp"),
|
|
834
839
|
ColumnMeta(id="enqueued_at", label="Enqueued", kind="timestamp"),
|
|
835
840
|
ColumnMeta(id="launched_at", label="Launched", kind="timestamp"),
|
|
836
841
|
ColumnMeta(id="hold_state", label="Hold", kind="enum"),
|
|
@@ -876,6 +881,7 @@ def fold_drive_queue_status(
|
|
|
876
881
|
"attempts": int(entry.get("attempts") or 0),
|
|
877
882
|
"deferrals": int(entry.get("deferrals") or 0),
|
|
878
883
|
"last_reason": entry.get("last_reason") or "",
|
|
884
|
+
"reason_at": entry.get("reason_at"),
|
|
879
885
|
"enqueued_at": entry.get("enqueued_at"),
|
|
880
886
|
"launched_at": entry.get("launched_at"),
|
|
881
887
|
"hold_state": entry.get("hold_state") or "",
|
|
@@ -5096,8 +5096,9 @@ def _list_drive_escalations_local(repo_name: str | None = None) -> list[dict]:
|
|
|
5096
5096
|
|
|
5097
5097
|
_DRIVE_QUEUE_COLUMNS = (
|
|
5098
5098
|
"id, repo_name, issue_number, position, machine, after_json, state, "
|
|
5099
|
-
"attempts, deferrals, last_reason, session_name, launched_at,
|
|
5100
|
-
"hold_after, hold_reason, resume_when, hold_state,
|
|
5099
|
+
"attempts, deferrals, last_reason, reason_at, session_name, launched_at, "
|
|
5100
|
+
"enqueued_at, hold_after, hold_reason, resume_when, hold_state, "
|
|
5101
|
+
"hold_probes, launch_host"
|
|
5101
5102
|
)
|
|
5102
5103
|
|
|
5103
5104
|
# Fields `update_drive_queue_entry` may write. Deliberately excludes the
|
|
@@ -5338,7 +5339,10 @@ def update_drive_queue_entry(repo_name: str, issue_number: int, **fields) -> boo
|
|
|
5338
5339
|
Accepts any of ``state`` / ``attempts`` / ``deferrals`` / ``last_reason`` /
|
|
5339
5340
|
``session_name`` / ``launched_at`` / ``launch_host``; anything else raises
|
|
5340
5341
|
``ValueError`` (the queue's order is owned by ``enqueue``/``move``, not by
|
|
5341
|
-
a tick).
|
|
5342
|
+
a tick). A ``last_reason`` update is stamped with its capture time
|
|
5343
|
+
(``reason_at``, #2133) by ``_update_drive_queue_entry_local`` — the one
|
|
5344
|
+
function both this local path and the daemon's ``/drive-queue`` handler
|
|
5345
|
+
call, so no caller can write a reason without also dating it.
|
|
5342
5346
|
|
|
5343
5347
|
Routes to the daemon when ``board_service`` is set. Returns whether a row
|
|
5344
5348
|
was actually updated.
|
|
@@ -5370,6 +5374,17 @@ def _update_drive_queue_entry_local(
|
|
|
5370
5374
|
raise ValueError(f"not updatable on drive_queue: {sorted(unknown)}")
|
|
5371
5375
|
if not fields:
|
|
5372
5376
|
return False
|
|
5377
|
+
if "last_reason" in fields:
|
|
5378
|
+
# #2133: `last_reason` is a point-in-time observation (the tick's
|
|
5379
|
+
# gate reading at the moment it wrote it), not a live probe. Without
|
|
5380
|
+
# a capture timestamp a `blocked` entry's displayed reason ages
|
|
5381
|
+
# silently and a stale-but-plausible reason reads as current state
|
|
5382
|
+
# — see coord/db.py's CREATE TABLE comment for the incident this
|
|
5383
|
+
# closes. Stamped here, the single choke point every `last_reason`
|
|
5384
|
+
# write passes through (both the no-daemon local path and the
|
|
5385
|
+
# daemon's `/drive-queue` update handler call this same function),
|
|
5386
|
+
# so no caller can set one without the other.
|
|
5387
|
+
fields = {**fields, "reason_at": time.time()}
|
|
5373
5388
|
conn = get_connection()
|
|
5374
5389
|
assignments = ", ".join(f"{name} = ?" for name in fields)
|
|
5375
5390
|
cur = conn.execute(
|
|
@@ -289,6 +289,14 @@ coord drive-queue remove REPO ISSUE && coord drive-queue add REPO ISSUE
|
|
|
289
289
|
|
|
290
290
|
or, from the TUI overlay, select the blocked entry and press `u`.
|
|
291
291
|
|
|
292
|
+
`last_reason` is a **snapshot**, taken the instant it was written and never
|
|
293
|
+
re-validated (#2133) — the condition it names can resolve minutes or hours
|
|
294
|
+
later while the text stays exactly as first written. `coord drive-queue
|
|
295
|
+
list` shows its age next to it (`last (3h ago): checks_failed …`) precisely
|
|
296
|
+
so it never reads as a live diagnosis; treat the reason as history and go
|
|
297
|
+
check the board/CI/review state for what is *actually* blocking now,
|
|
298
|
+
especially once the age climbs past a few minutes.
|
|
299
|
+
|
|
292
300
|
### 4a. Blocked *without* spending an attempt — permanent causes
|
|
293
301
|
|
|
294
302
|
Two `blocked` reasons are **not** "died `attempts` times". They block on the
|
|
@@ -260,6 +260,98 @@ def test_list_json_emits_the_raw_rows(cli):
|
|
|
260
260
|
assert rows[0]["after_json"] == [] # a real list on the wire, never a string
|
|
261
261
|
|
|
262
262
|
|
|
263
|
+
# ── #2133: `last_reason` is a snapshot, never re-validated — its rendering
|
|
264
|
+
# must carry its own age so it can never be mistaken for a current diagnosis.
|
|
265
|
+
# Reproduces the shape of the #2104 incident: a `blocked` entry's reason was
|
|
266
|
+
# captured once and then read, ~3 hours later, as if it still described the
|
|
267
|
+
# present.
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def _backdate_reason(coord_db, issue: int, seconds: float) -> None:
|
|
271
|
+
"""Age a queued entry's `reason_at` by *seconds* directly in SQLite —
|
|
272
|
+
simulating a `last_reason` snapshot captured that long ago. Bypasses
|
|
273
|
+
`update_drive_queue_entry` (which always stamps "now") on purpose: this
|
|
274
|
+
is standing in for the wall-clock time that has genuinely elapsed since
|
|
275
|
+
a real tick wrote the reason, exactly as `_backdate` does for
|
|
276
|
+
`launched_at` above.
|
|
277
|
+
"""
|
|
278
|
+
coord_db.execute(
|
|
279
|
+
"UPDATE drive_queue SET reason_at = ? WHERE repo_name = ? AND issue_number = ?",
|
|
280
|
+
(time.time() - seconds, REPO, issue),
|
|
281
|
+
)
|
|
282
|
+
coord_db.commit()
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def test_list_shows_no_age_for_a_freshly_written_reason(cli):
|
|
286
|
+
cli("add", REPO, "1650")
|
|
287
|
+
state._update_drive_queue_entry_local(
|
|
288
|
+
REPO, 1650, state="blocked", last_reason="checks_failed: test (3.12)"
|
|
289
|
+
)
|
|
290
|
+
result = cli("list")
|
|
291
|
+
assert result.exit_code == 0, result.output
|
|
292
|
+
assert "checks_failed: test (3.12)" in result.output
|
|
293
|
+
assert "0s ago" in result.output, (
|
|
294
|
+
"a reason written this instant must still carry SOME age marker — "
|
|
295
|
+
"the point is that a reader never has to guess whether an age is "
|
|
296
|
+
"being shown at all:\n" + result.output
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def test_list_ages_a_stale_park_reason_instead_of_showing_it_bare(cli, coord_db):
|
|
301
|
+
"""The #2104 reproduction: a `blocked` reason captured hours ago must
|
|
302
|
+
read as history, not as a live diagnosis of the current blocker."""
|
|
303
|
+
cli("add", REPO, "1650")
|
|
304
|
+
state._update_drive_queue_entry_local(
|
|
305
|
+
REPO, 1650, state="blocked", last_reason="checks_failed: test (3.12)"
|
|
306
|
+
)
|
|
307
|
+
_backdate_reason(coord_db, 1650, 3 * 3600 + 60) # ~3h ago, clear of rounding
|
|
308
|
+
|
|
309
|
+
result = cli("list")
|
|
310
|
+
assert result.exit_code == 0, result.output
|
|
311
|
+
assert "checks_failed: test (3.12)" in result.output, (
|
|
312
|
+
"the reason text itself must still be legible:\n" + result.output
|
|
313
|
+
)
|
|
314
|
+
assert "(3h ago)" in result.output, (
|
|
315
|
+
"#2133: a stale `last_reason` rendered without its age is exactly "
|
|
316
|
+
"the trap that misdirected the #2104 diagnosis — the queue text "
|
|
317
|
+
"pointed at CI while the real, later blocker (a review verdict) "
|
|
318
|
+
"went unmentioned:\n" + result.output
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def test_list_json_carries_reason_at_for_a_client_to_render_its_own_age(cli, coord_db):
|
|
323
|
+
cli("add", REPO, "1650")
|
|
324
|
+
state._update_drive_queue_entry_local(
|
|
325
|
+
REPO, 1650, state="blocked", last_reason="checks_failed"
|
|
326
|
+
)
|
|
327
|
+
_backdate_reason(coord_db, 1650, 90.0)
|
|
328
|
+
|
|
329
|
+
rows = json.loads(cli("list", "--json").output)
|
|
330
|
+
assert rows[0]["last_reason"] == "checks_failed"
|
|
331
|
+
assert rows[0]["reason_at"] == pytest.approx(time.time() - 90.0, abs=5.0)
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def test_list_omits_age_for_a_reason_with_no_capture_time(cli, coord_db):
|
|
335
|
+
"""A row predating #2133's migration (or written straight to the table by
|
|
336
|
+
hand) has `reason_at IS NULL` — the renderer must not fabricate an age
|
|
337
|
+
for it, just show the bare reason exactly as it always has."""
|
|
338
|
+
cli("add", REPO, "1650")
|
|
339
|
+
coord_db.execute(
|
|
340
|
+
"UPDATE drive_queue SET state = 'blocked', last_reason = 'legacy reason', "
|
|
341
|
+
"reason_at = NULL WHERE repo_name = ? AND issue_number = ?",
|
|
342
|
+
(REPO, 1650),
|
|
343
|
+
)
|
|
344
|
+
coord_db.commit()
|
|
345
|
+
|
|
346
|
+
result = cli("list")
|
|
347
|
+
assert result.exit_code == 0, result.output
|
|
348
|
+
assert "legacy reason" in result.output
|
|
349
|
+
assert "ago" not in result.output, (
|
|
350
|
+
"no `reason_at` means no age can be computed — inventing one would "
|
|
351
|
+
"be worse than showing nothing:\n" + result.output
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
|
|
263
355
|
# ── remove / move ────────────────────────────────────────────────────────────
|
|
264
356
|
|
|
265
357
|
|
|
@@ -643,6 +643,7 @@ def _dq_row(
|
|
|
643
643
|
attempts: int = 0,
|
|
644
644
|
deferrals: int = 0,
|
|
645
645
|
last_reason: str = "",
|
|
646
|
+
reason_at: float | None = None,
|
|
646
647
|
session_name: str = "",
|
|
647
648
|
launched_at: float | None = None,
|
|
648
649
|
enqueued_at: float = 100.0,
|
|
@@ -664,6 +665,7 @@ def _dq_row(
|
|
|
664
665
|
"attempts": attempts,
|
|
665
666
|
"deferrals": deferrals,
|
|
666
667
|
"last_reason": last_reason,
|
|
668
|
+
"reason_at": reason_at,
|
|
667
669
|
"session_name": session_name,
|
|
668
670
|
"launched_at": launched_at,
|
|
669
671
|
"enqueued_at": enqueued_at,
|
|
@@ -695,7 +697,7 @@ class TestFoldDriveQueueStatus:
|
|
|
695
697
|
assert [m.id for m in result.column_meta] == result.columns
|
|
696
698
|
assert result.columns == [
|
|
697
699
|
"position", "repo", "issue", "title", "state", "machine",
|
|
698
|
-
"attempts", "deferrals", "last_reason", "enqueued_at",
|
|
700
|
+
"attempts", "deferrals", "last_reason", "reason_at", "enqueued_at",
|
|
699
701
|
"launched_at", "hold_state", "after",
|
|
700
702
|
]
|
|
701
703
|
|
|
@@ -3150,6 +3150,84 @@ def test_drive_queue_local_rejects_non_updatable_field(coord_db):
|
|
|
3150
3150
|
state._update_drive_queue_entry_local("api", 7, machine="laptop")
|
|
3151
3151
|
|
|
3152
3152
|
|
|
3153
|
+
def test_drive_queue_local_stamps_reason_at_when_last_reason_is_written(coord_db):
|
|
3154
|
+
"""#2133: `last_reason` is a point-in-time observation, so every write to
|
|
3155
|
+
it is dated — the queue's ONE choke point for both the no-daemon local
|
|
3156
|
+
path and the daemon's `/drive-queue` update handler
|
|
3157
|
+
(`serve_app.post_drive_queue` calls this exact function), so no caller
|
|
3158
|
+
can set a reason without also dating it.
|
|
3159
|
+
"""
|
|
3160
|
+
import time as _time
|
|
3161
|
+
|
|
3162
|
+
from coord import state
|
|
3163
|
+
|
|
3164
|
+
state._enqueue_drive_queue_local("api", 7)
|
|
3165
|
+
assert state._get_drive_queue_entry_local("api", 7)["reason_at"] is None
|
|
3166
|
+
|
|
3167
|
+
before = _time.time()
|
|
3168
|
+
assert state._update_drive_queue_entry_local(
|
|
3169
|
+
"api", 7, state="blocked", last_reason="checks_failed"
|
|
3170
|
+
)
|
|
3171
|
+
after = _time.time()
|
|
3172
|
+
entry = state._get_drive_queue_entry_local("api", 7)
|
|
3173
|
+
assert entry["reason_at"] is not None
|
|
3174
|
+
assert before <= entry["reason_at"] <= after
|
|
3175
|
+
first_stamp = entry["reason_at"]
|
|
3176
|
+
|
|
3177
|
+
# A write that never touches `last_reason` must not re-date it — the
|
|
3178
|
+
# timestamp names when the REASON was captured, not when the row last
|
|
3179
|
+
# changed for any reason.
|
|
3180
|
+
assert state._update_drive_queue_entry_local("api", 7, attempts=1)
|
|
3181
|
+
entry = state._get_drive_queue_entry_local("api", 7)
|
|
3182
|
+
assert entry["reason_at"] == first_stamp
|
|
3183
|
+
assert entry["last_reason"] == "checks_failed"
|
|
3184
|
+
|
|
3185
|
+
# Re-writing `last_reason` — even to the identical text — re-dates it: a
|
|
3186
|
+
# fresh observation of the same condition is still a fresh observation.
|
|
3187
|
+
_time.sleep(0.01)
|
|
3188
|
+
assert state._update_drive_queue_entry_local(
|
|
3189
|
+
"api", 7, last_reason="checks_failed"
|
|
3190
|
+
)
|
|
3191
|
+
entry = state._get_drive_queue_entry_local("api", 7)
|
|
3192
|
+
assert entry["reason_at"] > first_stamp
|
|
3193
|
+
|
|
3194
|
+
|
|
3195
|
+
def test_drive_queue_daemon_update_handler_also_stamps_reason_at(
|
|
3196
|
+
tmp_path: Path, valid_config_path: Path, rw_db,
|
|
3197
|
+
):
|
|
3198
|
+
"""The daemon's `/drive-queue` update action must date `last_reason` the
|
|
3199
|
+
same way the local (no-daemon) path does — #2133's fix has to hold for a
|
|
3200
|
+
thin client too, not just a standalone `coord` invocation. Mirrors
|
|
3201
|
+
`test_board_projection_carries_drive_queue`'s use of `rw_db` (a
|
|
3202
|
+
thread-safe file-backed override `TestClient`'s worker thread can
|
|
3203
|
+
actually see) rather than the autouse `:memory:` `coord_db`.
|
|
3204
|
+
"""
|
|
3205
|
+
import time as _time
|
|
3206
|
+
|
|
3207
|
+
from coord import state
|
|
3208
|
+
|
|
3209
|
+
db_path = tmp_path / "rw.db"
|
|
3210
|
+
app = build_app(SqliteStore(db_path), load_config(valid_config_path))
|
|
3211
|
+
with TestClient(app) as cli:
|
|
3212
|
+
cli.post(
|
|
3213
|
+
"/drive-queue",
|
|
3214
|
+
json={"action": "enqueue", "repo_name": "api", "issue_number": 7},
|
|
3215
|
+
)
|
|
3216
|
+
resp = cli.post(
|
|
3217
|
+
"/drive-queue",
|
|
3218
|
+
json={
|
|
3219
|
+
"action": "update",
|
|
3220
|
+
"repo_name": "api",
|
|
3221
|
+
"issue_number": 7,
|
|
3222
|
+
"fields": {"state": "blocked", "last_reason": "checks_failed"},
|
|
3223
|
+
},
|
|
3224
|
+
)
|
|
3225
|
+
assert resp.status_code == 200, resp.text
|
|
3226
|
+
entry = state._get_drive_queue_entry_local("api", 7)
|
|
3227
|
+
assert entry["reason_at"] is not None
|
|
3228
|
+
assert entry["reason_at"] <= _time.time()
|
|
3229
|
+
|
|
3230
|
+
|
|
3153
3231
|
def test_drive_queue_local_move_clamps_out_of_range(coord_db):
|
|
3154
3232
|
from coord import state
|
|
3155
3233
|
|
|
@@ -879,7 +879,7 @@ impl CoordApp {
|
|
|
879
879
|
.join(", "),
|
|
880
880
|
),
|
|
881
881
|
queue_hold_cell(e),
|
|
882
|
-
or_dash(e
|
|
882
|
+
or_dash(queue_reason_cell(e)),
|
|
883
883
|
],
|
|
884
884
|
}
|
|
885
885
|
}
|
|
@@ -1878,6 +1878,36 @@ fn queue_hold_cell(e: &BoardDriveQueueEntry) -> String {
|
|
|
1878
1878
|
}
|
|
1879
1879
|
}
|
|
1880
1880
|
|
|
1881
|
+
/// The `Reason` cell for one entry — `last_reason` age-stamped with
|
|
1882
|
+
/// `reason_at` (#2133).
|
|
1883
|
+
///
|
|
1884
|
+
/// `last_reason` is a snapshot the tick (or a guard) wrote the instant it
|
|
1885
|
+
/// observed the condition, never re-validated afterwards. Rendering it bare
|
|
1886
|
+
/// lets an hours-old, no-longer-true observation read as a live diagnosis —
|
|
1887
|
+
/// the #2104 incident this closes: `checks_failed` was still shown roughly
|
|
1888
|
+
/// three hours after the named checks had gone green, while the actual
|
|
1889
|
+
/// blocker (a later `request-changes` review) was nowhere in the panel.
|
|
1890
|
+
/// Appending the age doesn't make the reason current, but it stops it from
|
|
1891
|
+
/// being silently mistaken for current. No suffix when `reason_at` is
|
|
1892
|
+
/// `None` — a row predating #2133's migration, or built without going
|
|
1893
|
+
/// through `update_drive_queue_entry` — rather than guessing an age it
|
|
1894
|
+
/// doesn't have.
|
|
1895
|
+
fn queue_reason_cell(e: &BoardDriveQueueEntry) -> String {
|
|
1896
|
+
if e.last_reason.is_empty() {
|
|
1897
|
+
return String::new();
|
|
1898
|
+
}
|
|
1899
|
+
let now = std::time::SystemTime::now()
|
|
1900
|
+
.duration_since(std::time::UNIX_EPOCH)
|
|
1901
|
+
.unwrap_or_default()
|
|
1902
|
+
.as_secs_f64();
|
|
1903
|
+
let age = format_age(e.reason_at, now);
|
|
1904
|
+
if age.is_empty() {
|
|
1905
|
+
e.last_reason.clone()
|
|
1906
|
+
} else {
|
|
1907
|
+
format!("{} ({})", e.last_reason, age)
|
|
1908
|
+
}
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1881
1911
|
/// Order two Queue rows by `col`.
|
|
1882
1912
|
///
|
|
1883
1913
|
/// Numeric for the two numeric columns, case-insensitive text otherwise.
|
|
@@ -1069,10 +1069,12 @@ pub(crate) struct ContextMenuState {
|
|
|
1069
1069
|
|
|
1070
1070
|
/// Format a Unix timestamp as a human-readable "X ago" string relative to `now`.
|
|
1071
1071
|
///
|
|
1072
|
-
/// Used in the Merge Queue panel (#777) to show `enqueued_at` and `last_attempt
|
|
1072
|
+
/// Used in the Merge Queue panel (#777) to show `enqueued_at` and `last_attempt`,
|
|
1073
|
+
/// and (#2133) in the Queue panel to age-stamp a drive-queue entry's
|
|
1074
|
+
/// `last_reason` so a snapshot taken hours ago never renders as current state.
|
|
1073
1075
|
/// Returns `""` for `None` timestamps. Precision caps at minutes for < 1h,
|
|
1074
1076
|
/// hours for < 24h, days otherwise — keeps panel rows terse.
|
|
1075
|
-
fn format_age(ts: Option<f64>, now: f64) -> String {
|
|
1077
|
+
pub(crate) fn format_age(ts: Option<f64>, now: f64) -> String {
|
|
1076
1078
|
let ts = match ts {
|
|
1077
1079
|
Some(t) if t > 0.0 => t,
|
|
1078
1080
|
_ => return String::new(),
|
|
@@ -44200,6 +44200,60 @@ Milestone tracking issue.
|
|
|
44200
44200
|
);
|
|
44201
44201
|
}
|
|
44202
44202
|
|
|
44203
|
+
/// #2133: `last_reason` is a snapshot taken the instant it was written,
|
|
44204
|
+
/// never re-validated — the #2104 incident it names is a `checks_failed`
|
|
44205
|
+
/// reason that outlived the CI failure it described by ~3 hours while
|
|
44206
|
+
/// the real, later blocker went unmentioned. The Queue panel must show
|
|
44207
|
+
/// the reason's age so it can never read as a live diagnosis.
|
|
44208
|
+
#[test]
|
|
44209
|
+
fn tuidriver_queue_panel_age_stamps_a_stale_reason() {
|
|
44210
|
+
let now = std::time::SystemTime::now()
|
|
44211
|
+
.duration_since(std::time::UNIX_EPOCH)
|
|
44212
|
+
.unwrap_or_default()
|
|
44213
|
+
.as_secs_f64();
|
|
44214
|
+
// 3h + 60s ago: comfortably inside the "3h ago" bucket
|
|
44215
|
+
// (`format_age` truncates to whole hours) with slack on both sides
|
|
44216
|
+
// so a few milliseconds of test execution can never flip the digit.
|
|
44217
|
+
let reason_at = now - (3.0 * 3600.0 + 60.0);
|
|
44218
|
+
let fixture = format!(
|
|
44219
|
+
r#"[
|
|
44220
|
+
{{"repo_name": "myrepo", "issue_number": 703, "position": 0,
|
|
44221
|
+
"state": "blocked", "attempts": 9,
|
|
44222
|
+
"last_reason": "checks_failed: test (3.12)",
|
|
44223
|
+
"reason_at": {reason_at}}}
|
|
44224
|
+
]"#
|
|
44225
|
+
);
|
|
44226
|
+
let driver = queue_driver(&fixture, 200, 30);
|
|
44227
|
+
let screen = driver.screen();
|
|
44228
|
+
assert!(
|
|
44229
|
+
screen.contains("checks_failed: test (3.12)"),
|
|
44230
|
+
"the reason text itself must still be legible:\n{screen}"
|
|
44231
|
+
);
|
|
44232
|
+
assert!(
|
|
44233
|
+
screen.contains("(3h ago)"),
|
|
44234
|
+
"#2133: a stale `last_reason` must carry its age so it is never \
|
|
44235
|
+
mistaken for a current diagnosis:\n{screen}"
|
|
44236
|
+
);
|
|
44237
|
+
}
|
|
44238
|
+
|
|
44239
|
+
/// A `reason_at`-less row (predates #2133's migration, or a fixture that
|
|
44240
|
+
/// never set it) renders the bare reason — no fabricated age, and no
|
|
44241
|
+
/// crash on the missing field.
|
|
44242
|
+
#[test]
|
|
44243
|
+
fn tuidriver_queue_panel_omits_age_when_reason_at_is_unknown() {
|
|
44244
|
+
let driver = queue_driver(queue_fixture_json(), 160, 30);
|
|
44245
|
+
let screen = driver.screen();
|
|
44246
|
+
assert!(
|
|
44247
|
+
screen.contains("REASON-BLOCKED"),
|
|
44248
|
+
"the reason still renders on its own:\n{screen}"
|
|
44249
|
+
);
|
|
44250
|
+
assert!(
|
|
44251
|
+
!screen.contains("REASON-BLOCKED ("),
|
|
44252
|
+
"#2133: no `reason_at` means no age can be computed — the cell \
|
|
44253
|
+
must not invent one:\n{screen}"
|
|
44254
|
+
);
|
|
44255
|
+
}
|
|
44256
|
+
|
|
44203
44257
|
#[test]
|
|
44204
44258
|
fn tuidriver_queue_panel_states_are_visually_distinguishable() {
|
|
44205
44259
|
// Colour is asserted at the model layer (the screen dump is plain
|
|
@@ -863,6 +863,13 @@ pub(crate) struct BoardDriveQueueEntry {
|
|
|
863
863
|
pub(crate) deferrals: i64,
|
|
864
864
|
#[serde(default)]
|
|
865
865
|
pub(crate) last_reason: String,
|
|
866
|
+
/// #2133: capture time of `last_reason` — `last_reason` is a
|
|
867
|
+
/// point-in-time observation, never re-validated, so the Queue panel
|
|
868
|
+
/// age-stamps it (`queue_row`) rather than rendering it bare as if it
|
|
869
|
+
/// were current state. `None` for a row predating the migration or one
|
|
870
|
+
/// whose `last_reason` is still the `""` default.
|
|
871
|
+
#[serde(default)]
|
|
872
|
+
pub(crate) reason_at: Option<f64>,
|
|
866
873
|
#[allow(dead_code)] // wire parity; the Queue panel shows `state`, not the clock
|
|
867
874
|
#[serde(default)]
|
|
868
875
|
pub(crate) launched_at: Option<f64>,
|
|
@@ -236,6 +236,7 @@
|
|
|
236
236
|
"launched_at": null,
|
|
237
237
|
"machine": null,
|
|
238
238
|
"position": 0,
|
|
239
|
+
"reason_at": null,
|
|
239
240
|
"repo_name": "claude-coordinator",
|
|
240
241
|
"resume_when": "",
|
|
241
242
|
"session_name": null,
|
|
@@ -259,6 +260,7 @@
|
|
|
259
260
|
"launched_at": null,
|
|
260
261
|
"machine": "dellserver",
|
|
261
262
|
"position": 1,
|
|
263
|
+
"reason_at": null,
|
|
262
264
|
"repo_name": "claude-coordinator",
|
|
263
265
|
"resume_when": "",
|
|
264
266
|
"session_name": null,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|