code-coordinator 0.5.46__tar.gz → 0.5.48__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-0.5.48}/CLAUDE.md +2 -1
- {code_coordinator-0.5.46/code_coordinator.egg-info → code_coordinator-0.5.48}/PKG-INFO +1 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.48/code_coordinator.egg-info}/PKG-INFO +1 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/SOURCES.txt +26 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/scm_file_list.json +26 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agent.py +163 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agent_app.py +395 -47
- code_coordinator-0.5.48/coord/agent_update.py +864 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/cli.py +4 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/agent_ops.py +51 -10
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/dispatch.py +51 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/drive.py +50 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/drive_queue.py +34 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/merge.py +18 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/release.py +39 -7
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/status.py +8 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/config.py +340 -4
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/db.py +17 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-release-window.timer +2 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-web-dist-build.service +2 -2
- code_coordinator-0.5.48/coord/deploy/coord-web-dist-build.timer +61 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dispatch.py +37 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/drive.py +142 -7
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/drive_queue.py +219 -12
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/deploy_lane_facts.py +145 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/interactive.py +123 -2
- code_coordinator-0.5.48/coord/notifier/__init__.py +32 -0
- code_coordinator-0.5.48/coord/notifier/baseline.py +329 -0
- code_coordinator-0.5.48/coord/notifier/cli.py +255 -0
- code_coordinator-0.5.48/coord/notifier/collect.py +341 -0
- code_coordinator-0.5.48/coord/notifier/digest.py +171 -0
- code_coordinator-0.5.48/coord/notifier/models.py +185 -0
- code_coordinator-0.5.48/coord/notifier/predicate.py +453 -0
- code_coordinator-0.5.48/coord/notifier/service.py +252 -0
- code_coordinator-0.5.48/coord/notifier/store.py +312 -0
- code_coordinator-0.5.48/coord/notifier/transport.py +196 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/notify.py +14 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/reconcile.py +88 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/release_cordon.py +22 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/release_propagate.py +66 -16
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/release_verify.py +42 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/release_window.py +25 -6
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/reports.py +6 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/serve_app.py +49 -1
- code_coordinator-0.5.48/coord/spend_ceiling.py +291 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/state.py +18 -3
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/usage.py +42 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coordinator.example.yml +130 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-release-window.timer +2 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-web-dist-build.service +2 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-web-dist-build.sh +82 -15
- code_coordinator-0.5.48/deploy/coord-web-dist-build.timer +61 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-web-rollback.sh +5 -5
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/DRIVE_QUEUE.md +45 -0
- code_coordinator-0.5.48/docs/NOTIFIER.md +233 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/conftest.py +49 -0
- code_coordinator-0.5.48/tests/test_agent_idle_restart.py +453 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_update.py +175 -11
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_drive_queue.py +262 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_merge.py +101 -3
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_release_propagate.py +137 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_coord_web_dist.py +103 -4
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_drive.py +380 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_drive_queue.py +370 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_drive_tmux.py +3 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_deploy_lane_facts.py +127 -0
- code_coordinator-0.5.48/tests/test_interactive_token_attribution.py +463 -0
- code_coordinator-0.5.48/tests/test_notifier_baseline.py +201 -0
- code_coordinator-0.5.48/tests/test_notifier_cli.py +198 -0
- code_coordinator-0.5.48/tests/test_notifier_collect.py +243 -0
- code_coordinator-0.5.48/tests/test_notifier_config.py +150 -0
- code_coordinator-0.5.48/tests/test_notifier_drive_seam.py +130 -0
- code_coordinator-0.5.48/tests/test_notifier_isolation.py +250 -0
- code_coordinator-0.5.48/tests/test_notifier_predicate.py +381 -0
- code_coordinator-0.5.48/tests/test_notifier_quiet_hours.py +161 -0
- code_coordinator-0.5.48/tests/test_notifier_service.py +365 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_propagate.py +67 -13
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_verify.py +89 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reports.py +3 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_serve.py +113 -1
- code_coordinator-0.5.48/tests/test_spend_ceiling.py +537 -0
- code_coordinator-0.5.48/tests/test_spend_ceiling_coordinator.py +315 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_usage.py +145 -0
- code_coordinator-0.5.48/tests/test_venv_live_install_2121.py +551 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/drive_queue.rs +31 -1
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/mod.rs +4 -2
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/tests.rs +54 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/types.rs +7 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/tests/fixtures/board_sample.json +2 -0
- code_coordinator-0.5.46/coord/agent_update.py +0 -417
- code_coordinator-0.5.46/coord/deploy/coord-web-dist-build.timer +0 -36
- code_coordinator-0.5.46/deploy/coord-web-dist-build.timer +0 -36
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.gitignore +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/GOAL.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/LICENSE +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/MANIFEST.in +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/README.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/board_service.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/brain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/claim.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/client.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/comments.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dao.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/.gitignore +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/components.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/index.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/sw.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/eslint.config.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/index.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/package-lock.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/package.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/playwright.config.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/postcss.config.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/App.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/api/client.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/api/generated.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/index.css +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/main.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/test-setup.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/tailwind.config.js +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/tsconfig.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/tsconfig.node.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/vite.config.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deps.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/events.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/filelock.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/freshness.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/gates.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/goal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/context.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/models.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/render.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/units.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/hooks.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/models.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/network.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/openapi.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/parentage.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/plans.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/progress.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/review.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/smoke.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/split_work.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/test_author.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/test_report.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/install-agent.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/pyproject.toml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/setup.cfg +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/__init__.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_db.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_events.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_init.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_models.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_network.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_no_direct_gh_calls.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_session.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_split.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_state.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/tests/cli.rs +0 -0
|
@@ -82,7 +82,7 @@ coord merge [--dry-run] [--repo NAME] [--method rebase|squash|merge] [--order ID
|
|
|
82
82
|
coord reconcile-merges # Backfill missing branches + record out-of-band merges (#609/#611)
|
|
83
83
|
coord retry|stop|resume <id> # Recovery; `coord done` ends the session
|
|
84
84
|
```
|
|
85
|
-
Setup / diagnostics (discoverable via `--help`): `coord init`, `coord config`, `coord agent`, `coord serve`, `coord web`, `coord diagnose`, `coord sessions [--remote]`, `coord split
|
|
85
|
+
Setup / diagnostics (discoverable via `--help`): `coord init`, `coord config`, `coord agent`, `coord serve`, `coord web`, `coord diagnose`, `coord sessions [--remote]`, `coord split`, `coord notifier` ([`docs/NOTIFIER.md`](docs/NOTIFIER.md)).
|
|
86
86
|
|
|
87
87
|
## Development
|
|
88
88
|
|
|
@@ -118,6 +118,7 @@ coord assign --dry-run precision claude-coordinator 42
|
|
|
118
118
|
- **Test precedes Review — the pipeline order is `Work → Test → Review → Merge`.** The smoke test runs *before* the PR/review (the natural order: smoke before PR), reversing the #520 "get the review over with first" workaround now that the agent-assisted Testing stage is smooth. This is enforced in two places that must stay in sync: (1) the **displayed** stage order comes from `pipeline.default_gates = ["test","review","merge"]` (`coord/config.py`; an old DB carrying the #520-era `["review","test","merge"]` is migrated in `coord/db.py`); (2) the **headless** auto-loop holds review dispatch until the work has a `passed`/`skipped` test verdict whenever `default_gates` orders test before review — `PipelineConfig.test_precedes_review()` drives `dispatch_pending_reviews` (`coord/review.py`). The explicit `coord review`/`coord pr` paths stay ungated so a human can always force a review. (The merge gate already required a test verdict — `requires_smoke` — so the human test touchpoint just moved earlier, and review cycles are no longer burned on untested code.)
|
|
119
119
|
- **Interactive testing + merge agents drive the Test → Review → Merge handoff (leg 3c / A3, #350/#581/#306/#606).** From a Pipeline row's right-click menu, the TUI routes **board-driven** verdicts (never TTY-scraped, ToS §3.7) along `Work → Test → Review → Merge`: **Start testing** = `coord assign --interactive --smoke-of <work_aid>` (read-only testing agent in the live checkout; records the verdict via `coord test --passed|--fail`); a `passed`/`skipped` test → **pass→review** (launches the interactive review); an approved review → **Start merge** = `--merge-of <work_aid>` (worktrees + proactively rebases onto the default branch #306, resolves mechanical conflicts (semantic with the operator), runs tests, `git push --force-with-lease`, then `coord verify-merge` and — if clean — `coord merge` itself to complete it #606); a `failed` test **or** request-changes review → one-key **`--fix-of`** on the same branch (a test-fail takes the identical action as a request-changes; `--fix-of` accepts a review id **or** a test-failed work id, the #581 front door). The merge agent is still gated on CI/review/smoke (a gate failure is reported, not forced) and `verify-merge` (#604) runs first. Full walkthrough: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
|
|
120
120
|
- **Progress streaming from workers.** Workers emit `STATUS:` and `STUCK:` lines in their logs. The coordinator parses these for real-time progress reporting in `coord status` and the dashboard.
|
|
121
|
+
- **The notifier tells you when NOBODY IS COMING — and nothing else (#1632).** `coord/notifier/` pushes to a self-hosted ntfy on the daemon host (over Tailscale, so no event text leaves the tailnet) when the pipeline **has stopped or is stalled and will not advance without a human**: a halted drive, a gate parked `HUMAN_REQUIRED`, a worker's `STUCK:`, a stall that survived `drive`'s nudge (#1593), a leg running far past comparable work, a fleet CRIT that invalidates in-flight work. It is **not** an error channel and **not** a progress feed — a failed test, a request-changes review and a mechanical merge conflict are all things the auto-loop handles, and pushing them is what trains an operator to mute the channel; in normal operation this fires approximately never. "Far too long" is **learned, never a fixed timeout**: p90 of a `(repo, type, tier)`-stratified population built from the durations milestone #37 already records, with a cold-start state (<5 samples → a generous absolute ceiling, said out loud in the message) so it never fires off a population of one. Quiet hours (22:00–08:00, daemon-local, `notifications.quiet_hours`) are a **deferral window, not a filter** — events are held and delivered as one 08:00 digest, nothing is discarded, and **no severity pierces them**; the only exception is `coord drive --urgent`, which is a deadline rather than a severity and expires with the drive. The whole subsystem is **advisory and isolated** (#1485's lesson): `tick()` never raises, every collector source fails open, state lives in its own `~/.coord/notifier.json`, and an unreachable ntfy server cannot affect dispatch, routing, the board or any verdict. It rides #1616's daemon clock rather than shipping a second one, and reads `drive`'s stall decision rather than defining "stalled" again. Off by default. Full rationale: [`docs/NOTIFIER.md`](docs/NOTIFIER.md).
|
|
121
122
|
- **Failure reassignment.** Failed assignments can be retried on a different machine via `coord retry`. With `concurrency.auto_reassign: true`, reconciliation auto-retries on a different machine.
|
|
122
123
|
- **Dependency freshness checks.** Before dispatching, `coord approve` checks whether upstream repos are up-to-date on the target machine. Stale dependencies trigger warnings or auto-pull with `--auto-pull`.
|
|
123
124
|
|
|
@@ -113,6 +113,7 @@ coord/review.py
|
|
|
113
113
|
coord/scorecard.py
|
|
114
114
|
coord/serve_app.py
|
|
115
115
|
coord/smoke.py
|
|
116
|
+
coord/spend_ceiling.py
|
|
116
117
|
coord/split_work.py
|
|
117
118
|
coord/stage_projection.py
|
|
118
119
|
coord/state.py
|
|
@@ -310,6 +311,16 @@ coord/health/checks/toolchain.py
|
|
|
310
311
|
coord/health/checks/unit_drift.py
|
|
311
312
|
coord/health/checks/unit_enablement.py
|
|
312
313
|
coord/health/checks/worktrees.py
|
|
314
|
+
coord/notifier/__init__.py
|
|
315
|
+
coord/notifier/baseline.py
|
|
316
|
+
coord/notifier/cli.py
|
|
317
|
+
coord/notifier/collect.py
|
|
318
|
+
coord/notifier/digest.py
|
|
319
|
+
coord/notifier/models.py
|
|
320
|
+
coord/notifier/predicate.py
|
|
321
|
+
coord/notifier/service.py
|
|
322
|
+
coord/notifier/store.py
|
|
323
|
+
coord/notifier/transport.py
|
|
313
324
|
coord/providers/__init__.py
|
|
314
325
|
coord/providers/base.py
|
|
315
326
|
coord/providers/claude.py
|
|
@@ -349,6 +360,7 @@ docs/GRAPHIFY_SETUP.md
|
|
|
349
360
|
docs/ISSUE_GUIDANCE.md
|
|
350
361
|
docs/MAC_MINI.md
|
|
351
362
|
docs/MERGE_AUTO_DRAIN_TRUST_BAR.md
|
|
363
|
+
docs/NOTIFIER.md
|
|
352
364
|
docs/OPENCODE_VERIFICATION.md
|
|
353
365
|
docs/OPERATING_GOTCHAS.md
|
|
354
366
|
docs/ORACLE_LOOP.md
|
|
@@ -401,6 +413,7 @@ tests/test_agent_deploy_units_endpoint.py
|
|
|
401
413
|
tests/test_agent_dirty_worktree.py
|
|
402
414
|
tests/test_agent_graph_self_heal.py
|
|
403
415
|
tests/test_agent_health_h3.py
|
|
416
|
+
tests/test_agent_idle_restart.py
|
|
404
417
|
tests/test_agent_push_failure.py
|
|
405
418
|
tests/test_agent_reap.py
|
|
406
419
|
tests/test_agent_repos_and_pull.py
|
|
@@ -568,6 +581,7 @@ tests/test_interactive_briefing_echo.py
|
|
|
568
581
|
tests/test_interactive_prefill_state.py
|
|
569
582
|
tests/test_interactive_session_relaunch.py
|
|
570
583
|
tests/test_interactive_test_verdict_backstop.py
|
|
584
|
+
tests/test_interactive_token_attribution.py
|
|
571
585
|
tests/test_interactive_worktree.py
|
|
572
586
|
tests/test_issue_store_seam.py
|
|
573
587
|
tests/test_liveness_auditor.py
|
|
@@ -590,6 +604,15 @@ tests/test_new_issue_chat.py
|
|
|
590
604
|
tests/test_next_release_tag.py
|
|
591
605
|
tests/test_no_direct_gh_calls.py
|
|
592
606
|
tests/test_node_shim.py
|
|
607
|
+
tests/test_notifier_baseline.py
|
|
608
|
+
tests/test_notifier_cli.py
|
|
609
|
+
tests/test_notifier_collect.py
|
|
610
|
+
tests/test_notifier_config.py
|
|
611
|
+
tests/test_notifier_drive_seam.py
|
|
612
|
+
tests/test_notifier_isolation.py
|
|
613
|
+
tests/test_notifier_predicate.py
|
|
614
|
+
tests/test_notifier_quiet_hours.py
|
|
615
|
+
tests/test_notifier_service.py
|
|
593
616
|
tests/test_notify.py
|
|
594
617
|
tests/test_notify_drain.py
|
|
595
618
|
tests/test_openapi.py
|
|
@@ -652,6 +675,8 @@ tests/test_slice_issue_attribution.py
|
|
|
652
675
|
tests/test_smoke.py
|
|
653
676
|
tests/test_smoke_live_checkout_restore.py
|
|
654
677
|
tests/test_smoke_workflow.py
|
|
678
|
+
tests/test_spend_ceiling.py
|
|
679
|
+
tests/test_spend_ceiling_coordinator.py
|
|
655
680
|
tests/test_split.py
|
|
656
681
|
tests/test_split_work.py
|
|
657
682
|
tests/test_stage_projection.py
|
|
@@ -677,6 +702,7 @@ tests/test_transcript_floor.py
|
|
|
677
702
|
tests/test_usage.py
|
|
678
703
|
tests/test_usage_limits.py
|
|
679
704
|
tests/test_usage_rollup.py
|
|
705
|
+
tests/test_venv_live_install_2121.py
|
|
680
706
|
tests/test_version_single_source.py
|
|
681
707
|
tests/test_watch.py
|
|
682
708
|
tests/test_worker_events.py
|
{code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -251,6 +251,16 @@
|
|
|
251
251
|
"coord/models.py",
|
|
252
252
|
"coord/network.py",
|
|
253
253
|
"coord/new_issue_chat.py",
|
|
254
|
+
"coord/notifier/__init__.py",
|
|
255
|
+
"coord/notifier/baseline.py",
|
|
256
|
+
"coord/notifier/cli.py",
|
|
257
|
+
"coord/notifier/collect.py",
|
|
258
|
+
"coord/notifier/digest.py",
|
|
259
|
+
"coord/notifier/models.py",
|
|
260
|
+
"coord/notifier/predicate.py",
|
|
261
|
+
"coord/notifier/service.py",
|
|
262
|
+
"coord/notifier/store.py",
|
|
263
|
+
"coord/notifier/transport.py",
|
|
254
264
|
"coord/notify.py",
|
|
255
265
|
"coord/openapi.py",
|
|
256
266
|
"coord/overlap_fence.py",
|
|
@@ -281,6 +291,7 @@
|
|
|
281
291
|
"coord/serve_app.py",
|
|
282
292
|
"coord/skills/update-issue/SKILL.md",
|
|
283
293
|
"coord/smoke.py",
|
|
294
|
+
"coord/spend_ceiling.py",
|
|
284
295
|
"coord/split_work.py",
|
|
285
296
|
"coord/stage_projection.py",
|
|
286
297
|
"coord/state.py",
|
|
@@ -327,6 +338,7 @@
|
|
|
327
338
|
"docs/ISSUE_GUIDANCE.md",
|
|
328
339
|
"docs/MAC_MINI.md",
|
|
329
340
|
"docs/MERGE_AUTO_DRAIN_TRUST_BAR.md",
|
|
341
|
+
"docs/NOTIFIER.md",
|
|
330
342
|
"docs/OPENCODE_VERIFICATION.md",
|
|
331
343
|
"docs/OPERATING_GOTCHAS.md",
|
|
332
344
|
"docs/ORACLE_LOOP.md",
|
|
@@ -431,6 +443,7 @@
|
|
|
431
443
|
"tests/test_agent_dirty_worktree.py",
|
|
432
444
|
"tests/test_agent_graph_self_heal.py",
|
|
433
445
|
"tests/test_agent_health_h3.py",
|
|
446
|
+
"tests/test_agent_idle_restart.py",
|
|
434
447
|
"tests/test_agent_push_failure.py",
|
|
435
448
|
"tests/test_agent_reap.py",
|
|
436
449
|
"tests/test_agent_repos_and_pull.py",
|
|
@@ -598,6 +611,7 @@
|
|
|
598
611
|
"tests/test_interactive_prefill_state.py",
|
|
599
612
|
"tests/test_interactive_session_relaunch.py",
|
|
600
613
|
"tests/test_interactive_test_verdict_backstop.py",
|
|
614
|
+
"tests/test_interactive_token_attribution.py",
|
|
601
615
|
"tests/test_interactive_worktree.py",
|
|
602
616
|
"tests/test_issue_store_seam.py",
|
|
603
617
|
"tests/test_liveness_auditor.py",
|
|
@@ -620,6 +634,15 @@
|
|
|
620
634
|
"tests/test_next_release_tag.py",
|
|
621
635
|
"tests/test_no_direct_gh_calls.py",
|
|
622
636
|
"tests/test_node_shim.py",
|
|
637
|
+
"tests/test_notifier_baseline.py",
|
|
638
|
+
"tests/test_notifier_cli.py",
|
|
639
|
+
"tests/test_notifier_collect.py",
|
|
640
|
+
"tests/test_notifier_config.py",
|
|
641
|
+
"tests/test_notifier_drive_seam.py",
|
|
642
|
+
"tests/test_notifier_isolation.py",
|
|
643
|
+
"tests/test_notifier_predicate.py",
|
|
644
|
+
"tests/test_notifier_quiet_hours.py",
|
|
645
|
+
"tests/test_notifier_service.py",
|
|
623
646
|
"tests/test_notify.py",
|
|
624
647
|
"tests/test_notify_drain.py",
|
|
625
648
|
"tests/test_openapi.py",
|
|
@@ -682,6 +705,8 @@
|
|
|
682
705
|
"tests/test_smoke.py",
|
|
683
706
|
"tests/test_smoke_live_checkout_restore.py",
|
|
684
707
|
"tests/test_smoke_workflow.py",
|
|
708
|
+
"tests/test_spend_ceiling.py",
|
|
709
|
+
"tests/test_spend_ceiling_coordinator.py",
|
|
685
710
|
"tests/test_split.py",
|
|
686
711
|
"tests/test_split_work.py",
|
|
687
712
|
"tests/test_stage_projection.py",
|
|
@@ -707,6 +732,7 @@
|
|
|
707
732
|
"tests/test_usage.py",
|
|
708
733
|
"tests/test_usage_limits.py",
|
|
709
734
|
"tests/test_usage_rollup.py",
|
|
735
|
+
"tests/test_venv_live_install_2121.py",
|
|
710
736
|
"tests/test_version_single_source.py",
|
|
711
737
|
"tests/test_watch.py",
|
|
712
738
|
"tests/test_worker_events.py",
|
|
@@ -235,6 +235,15 @@ _PTY_INJECT_RETRY_BACKOFF_S = 0.4
|
|
|
235
235
|
_FIRST_OUTPUT_TIMEOUT = 600.0 # seconds of zero output before the watchdog kills
|
|
236
236
|
NO_FIRST_OUTPUT_EXIT = 124 # exit code reported when the TTFT watchdog fires
|
|
237
237
|
|
|
238
|
+
# #2131: distinct exit code for a leg killed by the per-leg spend ceiling. It
|
|
239
|
+
# must NOT collide with NO_FIRST_OUTPUT_EXIT (or any plausible worker exit
|
|
240
|
+
# code) — `_reap` keys the `spend_ceiling_reason` stamp off it, and that stamp
|
|
241
|
+
# is the ONLY thing that makes a ceiling kill distinguishable from a crash for
|
|
242
|
+
# `coord retry` and the auto-reassign skip. Any non-zero value still lands the
|
|
243
|
+
# assignment on FAILED via the existing reap branch; the value only selects
|
|
244
|
+
# which diagnostic gets attached.
|
|
245
|
+
SPEND_CEILING_EXIT = 125
|
|
246
|
+
|
|
238
247
|
|
|
239
248
|
def _append_log_line(log_path: str, line: str) -> None:
|
|
240
249
|
"""Best-effort append of a single line to the assignment log. Never raises."""
|
|
@@ -344,6 +353,8 @@ def _wait_for_proc_or_result(
|
|
|
344
353
|
grace_after_result: float = _REAP_GRACE_AFTER_RESULT,
|
|
345
354
|
max_wait: float = _REAP_MAX_WAIT,
|
|
346
355
|
first_output_timeout: float = _FIRST_OUTPUT_TIMEOUT,
|
|
356
|
+
cost_ceiling_usd: float | None = None,
|
|
357
|
+
read_cost_usd: "Callable[[], float | None] | None" = None,
|
|
347
358
|
killpg: Callable[[int, int], None] = _killpg_safe,
|
|
348
359
|
log_has_result: Callable[[str], bool] = _log_has_result,
|
|
349
360
|
log_has_output: Callable[[str], bool] = _log_has_output,
|
|
@@ -364,12 +375,44 @@ def _wait_for_proc_or_result(
|
|
|
364
375
|
satisfied permanently — it never re-arms — so a slow-but-emitting (e.g.
|
|
365
376
|
rate-limited) worker is never killed by it. See #299.
|
|
366
377
|
|
|
378
|
+
Per-leg spend ceiling (#2131): when ``cost_ceiling_usd`` is a positive
|
|
379
|
+
number and ``read_cost_usd`` is supplied, the worker's live spend is
|
|
380
|
+
sampled on every poll. At :data:`coord.spend_ceiling.WARN_FRACTION` of
|
|
381
|
+
the ceiling a one-shot ``STATUS:`` warning is written to the worker's own
|
|
382
|
+
log — so a watching operator gets a chance to intervene, and the kill is
|
|
383
|
+
legible after the fact. At or above the ceiling the process group is
|
|
384
|
+
killed and :data:`SPEND_CEILING_EXIT` is returned so ``_reap`` records a
|
|
385
|
+
ceiling kill rather than a generic failure.
|
|
386
|
+
|
|
387
|
+
Three properties of that check matter and are deliberate:
|
|
388
|
+
|
|
389
|
+
* **Fail open.** ``read_cost_usd`` returning ``None`` (unreadable log,
|
|
390
|
+
not stream-json, nothing priceable yet) never kills anything — killing
|
|
391
|
+
real work over a parse failure is worse than the overspend.
|
|
392
|
+
* **Never after the result event.** Once the worker has emitted its final
|
|
393
|
+
``result`` the leg is logically finished and the money is already
|
|
394
|
+
spent; killing then would only mislabel a completed leg as a ceiling
|
|
395
|
+
kill. So the check is skipped once ``result_seen_at`` is set.
|
|
396
|
+
* **SIGKILL, not SIGTERM.** The whole point is to stop spending now; a
|
|
397
|
+
graceful shutdown that keeps talking to the API defeats it. Whatever
|
|
398
|
+
the worker committed is still on disk, and ``_reap``'s existing
|
|
399
|
+
safety-net push still runs afterwards.
|
|
400
|
+
|
|
367
401
|
The keyword-only parameters exist for tests to inject short timeouts and
|
|
368
|
-
mock kill/clock behavior.
|
|
402
|
+
mock kill/clock/cost behavior.
|
|
369
403
|
"""
|
|
370
404
|
start = clock()
|
|
371
405
|
result_seen_at: float | None = None
|
|
372
406
|
output_seen = False
|
|
407
|
+
cost_warned = False
|
|
408
|
+
ceiling_armed = bool(
|
|
409
|
+
cost_ceiling_usd and cost_ceiling_usd > 0 and read_cost_usd is not None
|
|
410
|
+
)
|
|
411
|
+
if ceiling_armed:
|
|
412
|
+
# Hoisted out of the poll loop — this runs every `poll_interval`.
|
|
413
|
+
from coord.spend_ceiling import WARN_FRACTION # noqa: PLC0415
|
|
414
|
+
|
|
415
|
+
warn_at = cost_ceiling_usd * WARN_FRACTION
|
|
373
416
|
|
|
374
417
|
while True:
|
|
375
418
|
try:
|
|
@@ -406,6 +449,37 @@ def _wait_for_proc_or_result(
|
|
|
406
449
|
"# reap: worker emitted result; awaiting clean exit\n",
|
|
407
450
|
)
|
|
408
451
|
|
|
452
|
+
# #2131: per-leg spend ceiling. Only while the leg is still running
|
|
453
|
+
# (see the docstring for why a post-`result` kill is never useful),
|
|
454
|
+
# and only ever acting on a value the meter could actually read.
|
|
455
|
+
if ceiling_armed and result_seen_at is None:
|
|
456
|
+
try:
|
|
457
|
+
spent = read_cost_usd()
|
|
458
|
+
except Exception: # noqa: BLE001 — fail open, never break the reap
|
|
459
|
+
spent = None
|
|
460
|
+
if spent is not None:
|
|
461
|
+
if not cost_warned and spent >= warn_at:
|
|
462
|
+
cost_warned = True
|
|
463
|
+
_append_log_line(
|
|
464
|
+
log_path,
|
|
465
|
+
f"STATUS: spend ${spent:.2f} has passed "
|
|
466
|
+
f"{WARN_FRACTION:.0%} of the ${cost_ceiling_usd:.2f} "
|
|
467
|
+
"per-leg ceiling → the leg will be killed if it "
|
|
468
|
+
"reaches the ceiling → confidence: high (#2131)\n",
|
|
469
|
+
)
|
|
470
|
+
if spent >= cost_ceiling_usd:
|
|
471
|
+
_append_log_line(
|
|
472
|
+
log_path,
|
|
473
|
+
f"# reap: SIGKILL — spend ceiling breached "
|
|
474
|
+
f"(${spent:.2f} of ${cost_ceiling_usd:.2f}) (#2131)\n",
|
|
475
|
+
)
|
|
476
|
+
killpg(proc.pid, signal.SIGKILL)
|
|
477
|
+
try:
|
|
478
|
+
proc.wait(timeout=5)
|
|
479
|
+
except subprocess.TimeoutExpired:
|
|
480
|
+
pass
|
|
481
|
+
return SPEND_CEILING_EXIT
|
|
482
|
+
|
|
409
483
|
if result_seen_at is not None and clock() - result_seen_at >= grace_after_result:
|
|
410
484
|
# Worker logically done but process group still alive — force-kill.
|
|
411
485
|
_append_log_line(
|
|
@@ -517,6 +591,19 @@ class AssignmentSpec:
|
|
|
517
591
|
# :meth:`AgentServer._resolve_provider` for the full resolution chain —
|
|
518
592
|
# this field existing does not, on its own, get honoured anywhere else.
|
|
519
593
|
provider_def: "dict[str, Any] | None" = None
|
|
594
|
+
# #2131: per-leg spend ceiling in USD, resolved coordinator-side from
|
|
595
|
+
# `budget.ceiling_for(type)` (coord/config.py) and carried here rather
|
|
596
|
+
# than read from the agent's own config — a config-free agent
|
|
597
|
+
# (docs/EPHEMERAL_WORKERS.md) has none to read. `None` (the default, and
|
|
598
|
+
# what every agent sees when the coordinator has no `budget:` block)
|
|
599
|
+
# means NO CEILING: the reap's watchdog never samples cost and behaves
|
|
600
|
+
# exactly as it did pre-#2131.
|
|
601
|
+
#
|
|
602
|
+
# `coord/dispatch.py` omits the key entirely when there is no ceiling, so
|
|
603
|
+
# an agent predating this field never sees an unrecognized kwarg (
|
|
604
|
+
# `AssignmentSpec(**body)` in agent_app.py 400s on those) unless the
|
|
605
|
+
# operator has actually configured one.
|
|
606
|
+
cost_ceiling_usd: float | None = None
|
|
520
607
|
|
|
521
608
|
|
|
522
609
|
class _GitError(RuntimeError):
|
|
@@ -2685,6 +2772,21 @@ class AgentAssignment:
|
|
|
2685
2772
|
# instead of leaving it to expand at push time) surfaced only as a line
|
|
2686
2773
|
# in the worker log that nothing downstream ever read.
|
|
2687
2774
|
push_failure_reason: str | None = None
|
|
2775
|
+
# #2131: set when the reap's watchdog killed this leg because its live
|
|
2776
|
+
# spend crossed `spec.cost_ceiling_usd`. Formatted with
|
|
2777
|
+
# `coord.spend_ceiling.format_spend_ceiling_reason` (stable "spend
|
|
2778
|
+
# ceiling — " prefix, recognised by `is_spend_ceiling_reason`). Only ever
|
|
2779
|
+
# set alongside `status == FAILED` (the kill returns the non-zero
|
|
2780
|
+
# `SPEND_CEILING_EXIT`), and `None` on every other outcome.
|
|
2781
|
+
#
|
|
2782
|
+
# This field is the WHOLE POINT of #2131's "not a generic failure"
|
|
2783
|
+
# requirement: the coordinator stamps it onto the board's persisted
|
|
2784
|
+
# `failure_reason` (coord/reconcile.py) so `coord retry` can refuse to
|
|
2785
|
+
# silently re-spend, `auto_reassign` can decline to re-dispatch it, and
|
|
2786
|
+
# the escalation record can name what actually happened. Without it a
|
|
2787
|
+
# ceiling kill is indistinguishable from a crash and the money is spent
|
|
2788
|
+
# again on the next pass.
|
|
2789
|
+
spend_ceiling_reason: str | None = None
|
|
2688
2790
|
|
|
2689
2791
|
def to_dict(self) -> dict:
|
|
2690
2792
|
d = asdict(self)
|
|
@@ -4934,6 +5036,18 @@ class AgentServer:
|
|
|
4934
5036
|
prog = None
|
|
4935
5037
|
if prog:
|
|
4936
5038
|
d["progress"] = prog
|
|
5039
|
+
# #1632: when this worker last SAID anything, as Unix
|
|
5040
|
+
# seconds. The output-silence probe is the one that catches
|
|
5041
|
+
# failures with no symptom except duration, and only this
|
|
5042
|
+
# machine can see its own log file — the coordinator cannot
|
|
5043
|
+
# stat a remote path. A single `stat` on a file that is
|
|
5044
|
+
# already open for append, wrapped so a vanished log can
|
|
5045
|
+
# never break `/status`.
|
|
5046
|
+
if a.log_path:
|
|
5047
|
+
try:
|
|
5048
|
+
d["last_output_at"] = os.path.getmtime(a.log_path)
|
|
5049
|
+
except OSError:
|
|
5050
|
+
pass
|
|
4937
5051
|
# Tail-read stream-json log for live summary fields.
|
|
4938
5052
|
if a.log_path and is_stream_json(a.log_path):
|
|
4939
5053
|
try:
|
|
@@ -6823,6 +6937,25 @@ class AgentServer:
|
|
|
6823
6937
|
else:
|
|
6824
6938
|
_log_has_result_fn = _log_has_result
|
|
6825
6939
|
|
|
6940
|
+
# #2131: arm the per-leg spend ceiling when the coordinator sent one.
|
|
6941
|
+
# The meter is built here (not inside the wait loop) so the same
|
|
6942
|
+
# instance survives the whole run and can be re-read afterwards for
|
|
6943
|
+
# the reason string — it reads the log incrementally, so a full
|
|
6944
|
+
# re-parse never happens on any poll.
|
|
6945
|
+
_cost_ceiling: float | None = None
|
|
6946
|
+
_cost_meter = None
|
|
6947
|
+
if _reap_start is not None:
|
|
6948
|
+
_raw_ceiling = getattr(_reap_start.spec, "cost_ceiling_usd", None)
|
|
6949
|
+
if isinstance(_raw_ceiling, (int, float)) and _raw_ceiling > 0:
|
|
6950
|
+
try:
|
|
6951
|
+
from coord.spend_ceiling import LiveCostMeter # noqa: PLC0415
|
|
6952
|
+
|
|
6953
|
+
_cost_ceiling = float(_raw_ceiling)
|
|
6954
|
+
_cost_meter = LiveCostMeter(log_path)
|
|
6955
|
+
except Exception: # noqa: BLE001 — fail open, never break reap
|
|
6956
|
+
_cost_ceiling = None
|
|
6957
|
+
_cost_meter = None
|
|
6958
|
+
|
|
6826
6959
|
# Use a polling wait that handles claude-cli's well-known habit of
|
|
6827
6960
|
# not exiting after emitting its final result event (a child of the
|
|
6828
6961
|
# process group keeps the session alive). See #228.
|
|
@@ -6830,9 +6963,31 @@ class AgentServer:
|
|
|
6830
6963
|
proc, log_path,
|
|
6831
6964
|
first_output_timeout=self.first_output_timeout,
|
|
6832
6965
|
log_has_result=_log_has_result_fn,
|
|
6966
|
+
cost_ceiling_usd=_cost_ceiling,
|
|
6967
|
+
read_cost_usd=_cost_meter.read if _cost_meter is not None else None,
|
|
6833
6968
|
)
|
|
6834
6969
|
log_fh.close()
|
|
6835
6970
|
|
|
6971
|
+
# #2131: turn the ceiling kill into the stable, greppable diagnostic
|
|
6972
|
+
# every downstream consumer keys off. Uses the meter's LAST observed
|
|
6973
|
+
# value rather than re-reading, so the number in the reason is
|
|
6974
|
+
# exactly the one the kill decision was made on.
|
|
6975
|
+
_spend_ceiling_reason: str | None = None
|
|
6976
|
+
if exit_code == SPEND_CEILING_EXIT and _cost_ceiling is not None:
|
|
6977
|
+
try:
|
|
6978
|
+
from coord.spend_ceiling import ( # noqa: PLC0415
|
|
6979
|
+
format_spend_ceiling_reason,
|
|
6980
|
+
)
|
|
6981
|
+
|
|
6982
|
+
_observed = (_cost_meter.last if _cost_meter is not None else None)
|
|
6983
|
+
_spend_ceiling_reason = format_spend_ceiling_reason(
|
|
6984
|
+
_observed if _observed is not None else _cost_ceiling,
|
|
6985
|
+
_cost_ceiling,
|
|
6986
|
+
getattr(_reap_start.spec, "type", None) if _reap_start else None,
|
|
6987
|
+
)
|
|
6988
|
+
except Exception: # noqa: BLE001 — best-effort, never break reap
|
|
6989
|
+
_spend_ceiling_reason = None
|
|
6990
|
+
|
|
6836
6991
|
# #1461: detect a usage-limit kill from the tail of the transcript.
|
|
6837
6992
|
# Done HERE — immediately after the worker's own process has exited
|
|
6838
6993
|
# and BEFORE any coordinator bookkeeping (push attempts, advisory
|
|
@@ -7103,6 +7258,13 @@ class AgentServer:
|
|
|
7103
7258
|
# checked independently of which branch set FAILED.
|
|
7104
7259
|
if _result_is_error and assignment.status == FAILED:
|
|
7105
7260
|
assignment.api_error_reason = _api_error_reason
|
|
7261
|
+
# #2131: only ever attaches to a FAILED transition —
|
|
7262
|
+
# `SPEND_CEILING_EXIT` is non-zero, so the `else` above has
|
|
7263
|
+
# already set FAILED whenever `_spend_ceiling_reason` is set.
|
|
7264
|
+
# Guarded anyway so a `POST /cancel` that raced the kill (and
|
|
7265
|
+
# set CANCELLED before this block ran) is never relabelled.
|
|
7266
|
+
if _spend_ceiling_reason is not None and assignment.status == FAILED:
|
|
7267
|
+
assignment.spend_ceiling_reason = _spend_ceiling_reason
|
|
7106
7268
|
self._processes.pop(assignment_id, None)
|
|
7107
7269
|
|
|
7108
7270
|
# #315/#324: parse the log for the worker's claude session_id (from the
|