code-coordinator 0.5.290__tar.gz → 0.5.292__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.290 → code_coordinator-0.5.292}/.github/workflows/test.yml +36 -10
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/PKG-INFO +1 -1
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/code_coordinator.egg-info/SOURCES.txt +3 -1
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/code_coordinator.egg-info/scm_file_list.json +3 -1
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/board_schema.py +6 -4
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/board_wire.py +2 -1
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/client.py +15 -1
- code_coordinator-0.5.292/coord/deprecation_telemetry.py +102 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/reports.py +194 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/serve_app.py +54 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/usage.py +3 -3
- code_coordinator-0.5.292/docs/ADR_COORD_TUI_CI.md +217 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/codegen.py +124 -45
- code_coordinator-0.5.292/tests/test_board_fixture.py +82 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_board_wire.py +2 -1
- code_coordinator-0.5.292/tests/test_deprecation_telemetry.py +224 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_dist_name.py +33 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_generated_rust_fixture.py +78 -63
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reports.py +160 -7
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_sqlite_connect_ratchet.py +13 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/data.rs +10 -1
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/types/generated.rs +12 -8
- code_coordinator-0.5.290/coord/board_bool_guard.py +0 -83
- code_coordinator-0.5.290/tests/test_board_fixture.py +0 -172
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/.gitignore +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/CLAUDE.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/GOAL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/LICENSE +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/MANIFEST.in +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/README.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/__init__.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/agent.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/audit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/block_log.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/board_service.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/brain.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/claim.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/cli.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/comments.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/config.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/dao.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/db.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/deps.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/drive.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/events.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/filelock.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/freshness.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/gates.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/goal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/context.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/models.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/render.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/health/units.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/hooks.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/interactive.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/models.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/network.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/notify.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/openapi.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/parentage.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/plans.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/progress.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/release_window.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/review.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/self_health.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/smoke.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/split_work.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/sql.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/state.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/test_author.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/test_report.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/install-agent.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/pyproject.toml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/setup.cfg +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/__init__.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/backends.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/conftest.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_config.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_db.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_events.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_init.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_models.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_network.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_review.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_session.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_split.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_state.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tests/write_parity.py +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.290 → code_coordinator-0.5.292}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -31,6 +31,17 @@ jobs:
|
|
|
31
31
|
# testpaths=["tests"]) was the one accidental gap. (ms-51 — Playwright,
|
|
32
32
|
# never .py either — left this repo entirely with the webapp, #2009.)
|
|
33
33
|
- run: pytest --ignore=tests/acceptance
|
|
34
|
+
# #2897: the Rust drift gate `tests/test_generated_rust_fixture.py`
|
|
35
|
+
# no longer byte-compares the committed `tui/src/app/types/generated.rs`
|
|
36
|
+
# (see docs/ADR_COORD_TUI_CI.md and the header comment further down
|
|
37
|
+
# this file) — this explicit step stands in for that comparison while
|
|
38
|
+
# `tui/` still lives here. `$COORD_TUI_SRC=.` names this checkout as
|
|
39
|
+
# the coord-tui root (`RUST_OUTPUT_RELPATH` keeps the `tui/` prefix for
|
|
40
|
+
# exactly this reason). One matrix leg only: the generator's output
|
|
41
|
+
# depends on `coord.serve_app.openapi_spec()`, not the Python version.
|
|
42
|
+
- name: python scripts/codegen.py --rust --check
|
|
43
|
+
if: matrix.python-version == '3.12'
|
|
44
|
+
run: COORD_TUI_SRC=. python scripts/codegen.py --rust --check
|
|
34
45
|
# #2180: the cli-pytest sealed route (acceptance.drivers routes
|
|
35
46
|
# "coord/**" -> cli-pytest -> tests/acceptance/ms-37) run through the
|
|
36
47
|
# #2164 CI wrapper instead of a raw `pytest tests/acceptance` call, so
|
|
@@ -310,16 +321,31 @@ jobs:
|
|
|
310
321
|
# for it to run against, and a job that installs Node to build nothing is
|
|
311
322
|
# how the previous `acceptance`-on-every-push waste (#2389) started.
|
|
312
323
|
#
|
|
313
|
-
# #1941: `scripts/codegen.py` also generates coord-tui's RUST wire
|
|
314
|
-
# (`--rust`)
|
|
315
|
-
#
|
|
316
|
-
#
|
|
317
|
-
#
|
|
318
|
-
#
|
|
319
|
-
#
|
|
320
|
-
#
|
|
321
|
-
#
|
|
322
|
-
#
|
|
324
|
+
# #1941/#2897: `scripts/codegen.py` also generates coord-tui's RUST wire
|
|
325
|
+
# types (`--rust`). #2897 gave that half the SAME cross-repo shape as the
|
|
326
|
+
# TS half above (`--out PATH` / `$COORD_TUI_SRC`, no fallback default,
|
|
327
|
+
# docs/ADR_COORD_TUI_CI.md) — but `tui/` has not actually moved out of
|
|
328
|
+
# this repo yet, so unlike the TS byte-comparison (which is now
|
|
329
|
+
# exclusively `coord-web`'s CI job), the Rust byte-comparison has nowhere
|
|
330
|
+
# else to run yet and stays HERE, as an explicit step below rather than a
|
|
331
|
+
# pytest test:
|
|
332
|
+
#
|
|
333
|
+
# COORD_TUI_SRC=. python scripts/codegen.py --rust --check
|
|
334
|
+
#
|
|
335
|
+
# `tests/test_generated_rust_fixture.py` itself is narrowed to what one
|
|
336
|
+
# checkout can prove — the generator runs and covers every schema — same
|
|
337
|
+
# as `tests/test_generated_types_fixture.py`; it no longer byte-compares
|
|
338
|
+
# the committed `tui/src/app/types/generated.rs`. The day coord-tui gets
|
|
339
|
+
# its own checkout + CI, delete the step below (its replacement lives in
|
|
340
|
+
# that CI, installing `code-coordinator[server]` from PyPI exactly as
|
|
341
|
+
# `coord-web`'s does) — no pytest file to un-narrow.
|
|
342
|
+
#
|
|
343
|
+
# The consumer-side INTEGER-backed-bool text-scraping guard
|
|
344
|
+
# (`coord/board_bool_guard.py`) that used to also read Rust source text
|
|
345
|
+
# here is RETIRED as of #2897, not moved — see docs/ADR_COORD_TUI_CI.md:
|
|
346
|
+
# #2895 (Phase 1 of #2894) deleted coord-tui's last direct SQL reader, so
|
|
347
|
+
# `tests/test_board_schema.py`'s DTO-level assertions are now the sole
|
|
348
|
+
# guard against that class.
|
|
323
349
|
|
|
324
350
|
# #2886: a real Postgres 16 service, so `coord/sql.py`'s Postgres branches
|
|
325
351
|
# (paramstyle translation, upsert idioms, `information_schema`
|
|
@@ -39,7 +39,6 @@ coord/approved_work.py
|
|
|
39
39
|
coord/audit.py
|
|
40
40
|
coord/auto_loop.py
|
|
41
41
|
coord/block_log.py
|
|
42
|
-
coord/board_bool_guard.py
|
|
43
42
|
coord/board_schema.py
|
|
44
43
|
coord/board_service.py
|
|
45
44
|
coord/board_wire.py
|
|
@@ -65,6 +64,7 @@ coord/dead_end.py
|
|
|
65
64
|
coord/decomposition_chat.py
|
|
66
65
|
coord/deploy_manifest.py
|
|
67
66
|
coord/deploy_units.py
|
|
67
|
+
coord/deprecation_telemetry.py
|
|
68
68
|
coord/deps.py
|
|
69
69
|
coord/diagnose.py
|
|
70
70
|
coord/dispatch.py
|
|
@@ -296,6 +296,7 @@ deploy/coord-web-dist-build.timer
|
|
|
296
296
|
deploy/coord-web-rollback.sh
|
|
297
297
|
deploy/coord-web.service
|
|
298
298
|
deploy/node-shim.sh
|
|
299
|
+
docs/ADR_COORD_TUI_CI.md
|
|
299
300
|
docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md
|
|
300
301
|
docs/ADR_COORD_WEB_CI.md
|
|
301
302
|
docs/ADR_COORD_WEB_DIST.md
|
|
@@ -527,6 +528,7 @@ tests/test_deploy_manifest.py
|
|
|
527
528
|
tests/test_deploy_notify_unit.py
|
|
528
529
|
tests/test_deploy_units_lane.py
|
|
529
530
|
tests/test_deploy_web_unit.py
|
|
531
|
+
tests/test_deprecation_telemetry.py
|
|
530
532
|
tests/test_deps.py
|
|
531
533
|
tests/test_diagnose.py
|
|
532
534
|
tests/test_dispatch.py
|
{code_coordinator-0.5.290 → code_coordinator-0.5.292}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -33,7 +33,6 @@
|
|
|
33
33
|
"coord/audit.py",
|
|
34
34
|
"coord/auto_loop.py",
|
|
35
35
|
"coord/block_log.py",
|
|
36
|
-
"coord/board_bool_guard.py",
|
|
37
36
|
"coord/board_schema.py",
|
|
38
37
|
"coord/board_service.py",
|
|
39
38
|
"coord/board_wire.py",
|
|
@@ -117,6 +116,7 @@
|
|
|
117
116
|
"coord/deploy/coord-web.service",
|
|
118
117
|
"coord/deploy_manifest.py",
|
|
119
118
|
"coord/deploy_units.py",
|
|
119
|
+
"coord/deprecation_telemetry.py",
|
|
120
120
|
"coord/deps.py",
|
|
121
121
|
"coord/diagnose.py",
|
|
122
122
|
"coord/dispatch.py",
|
|
@@ -288,6 +288,7 @@
|
|
|
288
288
|
"deploy/coord-web-rollback.sh",
|
|
289
289
|
"deploy/coord-web.service",
|
|
290
290
|
"deploy/node-shim.sh",
|
|
291
|
+
"docs/ADR_COORD_TUI_CI.md",
|
|
291
292
|
"docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md",
|
|
292
293
|
"docs/ADR_COORD_WEB_CI.md",
|
|
293
294
|
"docs/ADR_COORD_WEB_DIST.md",
|
|
@@ -553,6 +554,7 @@
|
|
|
553
554
|
"tests/test_deploy_notify_unit.py",
|
|
554
555
|
"tests/test_deploy_units_lane.py",
|
|
555
556
|
"tests/test_deploy_web_unit.py",
|
|
557
|
+
"tests/test_deprecation_telemetry.py",
|
|
556
558
|
"tests/test_deps.py",
|
|
557
559
|
"tests/test_diagnose.py",
|
|
558
560
|
"tests/test_dispatch.py",
|
|
@@ -287,10 +287,12 @@ BOARD_PROJECTIONS: dict[str, type] = {
|
|
|
287
287
|
#: therefore ship as ``0``/``1``. Their DTO fields are annotated ``int`` on
|
|
288
288
|
#: purpose; ``tests/test_board_schema.py`` asserts the generated JSON Schema
|
|
289
289
|
#: types them ``integer`` and never ``boolean``, so the wire shape survives a
|
|
290
|
-
#: storage-engine swap (Postgres would make these real ``BOOLEAN``s). This
|
|
291
|
-
#: the DTO-level counterpart of ``coord/board_bool_guard.py``'s consumer-
|
|
292
|
-
#: check against the real Rust wire structs (``tui/src/app/types.rs``
|
|
293
|
-
#:
|
|
290
|
+
#: storage-engine swap (Postgres would make these real ``BOOLEAN``s). This
|
|
291
|
+
#: WAS the DTO-level counterpart of ``coord/board_bool_guard.py``'s consumer-
|
|
292
|
+
#: side check against the real Rust wire structs (``tui/src/app/types.rs``
|
|
293
|
+
#: and its generated ``types/generated.rs`` sibling, #1941); that
|
|
294
|
+
#: text-scraping check is retired as of #2897 (docs/ADR_COORD_TUI_CI.md) —
|
|
295
|
+
#: this assertion is now the sole remaining guard.
|
|
294
296
|
INTEGER_BACKED_BOOLEANS: frozenset[str] = frozenset(
|
|
295
297
|
{"is_interactive", "review_scoped", "hold_after", "no_acceptance"}
|
|
296
298
|
)
|
|
@@ -113,7 +113,8 @@ TRUNCATION_NOTICE = "\n… [truncated on the /board wire — full text: detail e
|
|
|
113
113
|
# two: `coord/**` and `tui/**`). Lines carrying it survive the body cut; see
|
|
114
114
|
# `_machine_readable_residue`. Kept in sync with the Rust side by
|
|
115
115
|
# tests/test_board_wire.py::test_allowed_glob_marker_matches_the_rust_parser,
|
|
116
|
-
# the same cross-language
|
|
116
|
+
# the same cross-language-guard posture the now-retired coord/board_bool_
|
|
117
|
+
# guard.py used (#2897, docs/ADR_COORD_TUI_CI.md).
|
|
117
118
|
#
|
|
118
119
|
# Measured cost of the retention: ZERO on today's live board — 0 of 781
|
|
119
120
|
# issue bodies carry the marker (the house `## Files` convention is a bare
|
|
@@ -27,6 +27,7 @@ from typing import Any
|
|
|
27
27
|
|
|
28
28
|
import httpx
|
|
29
29
|
|
|
30
|
+
from coord import __version__
|
|
30
31
|
from coord._board_mapping import assemble_board, infer_review_state
|
|
31
32
|
from coord.models import Board
|
|
32
33
|
|
|
@@ -69,7 +70,20 @@ def resolve_board_service(
|
|
|
69
70
|
|
|
70
71
|
|
|
71
72
|
def _headers(svc: ServiceConfig) -> dict[str, str]:
|
|
72
|
-
|
|
73
|
+
# #1945: every request identifies itself as this package + its running
|
|
74
|
+
# version, whether it's the interactive `coord` CLI, an agent's own
|
|
75
|
+
# pinned `~/.coord-venv`, or the drive-queue runner -- all three are
|
|
76
|
+
# literally this same Python package, just invoked from a different
|
|
77
|
+
# entry point, so there is no finer-grained identity to report short of
|
|
78
|
+
# a caller passing one explicitly (none does today). This is what lets
|
|
79
|
+
# the daemon's deprecated-RPC-route telemetry (coord.deprecation_telemetry)
|
|
80
|
+
# name which client + version is still calling a route marked deprecated
|
|
81
|
+
# in the OpenAPI spec, instead of an unattributed hit that nobody can
|
|
82
|
+
# act on.
|
|
83
|
+
headers = {"X-Coord-Client": "coord-py", "X-Coord-Client-Version": __version__}
|
|
84
|
+
if svc.token:
|
|
85
|
+
headers["Authorization"] = f"Bearer {svc.token}"
|
|
86
|
+
return headers
|
|
73
87
|
|
|
74
88
|
|
|
75
89
|
def fetch_board_payload(svc: ServiceConfig, *, timeout: float = _DEFAULT_TIMEOUT) -> dict:
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""Deprecation-call telemetry for RPC routes (#1945, Phase B of milestone #60).
|
|
2
|
+
|
|
3
|
+
#1944 stamped ``deprecated: true`` on every RPC route a resource-shaped
|
|
4
|
+
route now supersedes (``coord.serve_app.RPC_SUPERSEDED_BY_RESOURCE``) — but
|
|
5
|
+
that is a documentation signal only. Nobody can safely retire one of those
|
|
6
|
+
routes on "we think everyone upgraded": this repo has already found a
|
|
7
|
+
`coord-serve` unit 591 hours stale and a pinned CLI three releases behind
|
|
8
|
+
while driving. Retirement needs a number, not a belief.
|
|
9
|
+
|
|
10
|
+
This module is the write side of that number: :func:`record_deprecated_rpc_call`
|
|
11
|
+
is the single choke point the daemon's ``_DeprecatedRouteTelemetryMiddleware``
|
|
12
|
+
(``coord/serve_app.py``) calls on every request whose path is a deprecated
|
|
13
|
+
RPC route, best-effort and after the fact — capture must never raise into,
|
|
14
|
+
or delay, the request that triggered it. The read side (per-route last
|
|
15
|
+
call / calling clients / versions) is ``coord.reports``' ``deprecated-routes``
|
|
16
|
+
report, folded over the audit rows this writes.
|
|
17
|
+
|
|
18
|
+
Client identity travels over two request headers a calling client sets
|
|
19
|
+
(:data:`CLIENT_HEADER` / :data:`CLIENT_VERSION_HEADER`); a client that
|
|
20
|
+
predates this issue sends neither, and that is recorded as
|
|
21
|
+
:data:`UNKNOWN_CLIENT` rather than dropped — an unattributed call must still
|
|
22
|
+
count against retirement (#1945 acceptance), not vanish from the count.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import logging
|
|
28
|
+
|
|
29
|
+
_log = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
__all__ = [
|
|
32
|
+
"CATEGORY",
|
|
33
|
+
"EVENT_TYPE",
|
|
34
|
+
"CLIENT_HEADER",
|
|
35
|
+
"CLIENT_VERSION_HEADER",
|
|
36
|
+
"UNKNOWN_CLIENT",
|
|
37
|
+
"record_deprecated_rpc_call",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
# `coord.audit.query_audit_log(category=...)` filter value — also the value
|
|
41
|
+
# `coord.reports.fold_deprecated_routes` filters on when reading these rows
|
|
42
|
+
# back out. One literal, shared by both ends via this module.
|
|
43
|
+
CATEGORY = "deprecation"
|
|
44
|
+
EVENT_TYPE = "deprecated_rpc_call"
|
|
45
|
+
|
|
46
|
+
# Header names a calling client sets its identity/version on. Starlette's
|
|
47
|
+
# `Request.headers` is case-insensitive, so the exact case here is cosmetic
|
|
48
|
+
# (chosen to match the existing `X-Coord-Schema` convention, #1943).
|
|
49
|
+
CLIENT_HEADER = "X-Coord-Client"
|
|
50
|
+
CLIENT_VERSION_HEADER = "X-Coord-Client-Version"
|
|
51
|
+
|
|
52
|
+
# What an absent/blank client identity or version is recorded as. Never
|
|
53
|
+
# dropped — an unattributed caller is exactly the caller retirement needs to
|
|
54
|
+
# know about most.
|
|
55
|
+
UNKNOWN_CLIENT = "unknown"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _clean(value: str | None) -> str:
|
|
59
|
+
return (value or "").strip() or UNKNOWN_CLIENT
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def record_deprecated_rpc_call(
|
|
63
|
+
route: str,
|
|
64
|
+
*,
|
|
65
|
+
client: str | None,
|
|
66
|
+
client_version: str | None,
|
|
67
|
+
ts: float | None = None,
|
|
68
|
+
) -> None:
|
|
69
|
+
"""Best-effort record of one call to deprecated RPC *route*.
|
|
70
|
+
|
|
71
|
+
Wraps :func:`coord.audit.record_audit` — itself already best-effort and
|
|
72
|
+
non-raising — in its own ``try/except`` so a broken import, a bad
|
|
73
|
+
argument type from a caller, or a DB error can never turn this
|
|
74
|
+
observability hook into a failed or delayed request. This is the ONLY
|
|
75
|
+
posture that satisfies #1945's "must never raise or delay a request":
|
|
76
|
+
the caller (the daemon's request-handling middleware) gets control back
|
|
77
|
+
unconditionally, whether or not the write actually landed.
|
|
78
|
+
|
|
79
|
+
``client``/``client_version`` missing or blank are recorded as the
|
|
80
|
+
literal string :data:`UNKNOWN_CLIENT` — never dropped, per #1945's
|
|
81
|
+
acceptance bar ("an unattributed call must still block retirement").
|
|
82
|
+
"""
|
|
83
|
+
try:
|
|
84
|
+
from coord.audit import record_audit # noqa: PLC0415
|
|
85
|
+
|
|
86
|
+
actor = _clean(client)
|
|
87
|
+
version = _clean(client_version)
|
|
88
|
+
record_audit(
|
|
89
|
+
tier="operational",
|
|
90
|
+
category=CATEGORY,
|
|
91
|
+
event_type=EVENT_TYPE,
|
|
92
|
+
actor=actor,
|
|
93
|
+
summary=f"deprecated RPC call: {route} (client={actor}@{version})",
|
|
94
|
+
ts=ts,
|
|
95
|
+
details={"route": route, "client": actor, "client_version": version},
|
|
96
|
+
)
|
|
97
|
+
except Exception: # noqa: BLE001 — telemetry must never break the caller
|
|
98
|
+
_log.debug(
|
|
99
|
+
"record_deprecated_rpc_call: best-effort write failed for %s",
|
|
100
|
+
route,
|
|
101
|
+
exc_info=True,
|
|
102
|
+
)
|
|
@@ -3366,6 +3366,183 @@ def run_trend(
|
|
|
3366
3366
|
)
|
|
3367
3367
|
|
|
3368
3368
|
|
|
3369
|
+
# ── deprecated-routes: evidence for RPC retirement (#1945) ────────────────
|
|
3370
|
+
#
|
|
3371
|
+
# A live snapshot, same posture as `drive-queue-status`: no window, no
|
|
3372
|
+
# `repo` param — a deprecated *route* is not scoped to one repo the way an
|
|
3373
|
+
# issue is. Folds `coord.deprecation_telemetry`'s audit rows (category
|
|
3374
|
+
# "deprecation", written by the daemon's `_DeprecatedRouteTelemetryMiddleware`
|
|
3375
|
+
# on every call to a route in `coord.serve_app.RPC_SUPERSEDED_BY_RESOURCE`)
|
|
3376
|
+
# into one row per deprecated route: last call, distinct calling
|
|
3377
|
+
# client+version pairs, and a total count.
|
|
3378
|
+
#
|
|
3379
|
+
# The one thing this report exists to get right that a log grep would not:
|
|
3380
|
+
# telling "zero calls" (a real, actionable signal — safe to consider for
|
|
3381
|
+
# retirement) apart from "no data collected" (telemetry not running for
|
|
3382
|
+
# THIS route or ANY route — an old daemon build, `audit.level: business`
|
|
3383
|
+
# dropping the operational-tier rows, or the audit table's own retention
|
|
3384
|
+
# trim — which must never be read as "safe"). The distinction is made at
|
|
3385
|
+
# the corpus level: if literally zero deprecation-category rows exist
|
|
3386
|
+
# anywhere (any route), collection cannot be confirmed live, so EVERY route
|
|
3387
|
+
# reads `no_data` rather than the misleadingly reassuring `zero_calls`.
|
|
3388
|
+
|
|
3389
|
+
DEPRECATED_ROUTES_COLUMNS = [
|
|
3390
|
+
"route",
|
|
3391
|
+
"replacement",
|
|
3392
|
+
"status",
|
|
3393
|
+
"last_call",
|
|
3394
|
+
"call_count",
|
|
3395
|
+
"clients",
|
|
3396
|
+
]
|
|
3397
|
+
|
|
3398
|
+
# One entry per DEPRECATED_ROUTES_COLUMNS entry, same order (#1760).
|
|
3399
|
+
DEPRECATED_ROUTES_COLUMN_META = [
|
|
3400
|
+
ColumnMeta(id="route", label="Route", kind="text", weight=1.5),
|
|
3401
|
+
ColumnMeta(id="replacement", label="Replacement", kind="text", weight=2.5),
|
|
3402
|
+
ColumnMeta(id="status", label="Status", kind="enum"),
|
|
3403
|
+
ColumnMeta(id="last_call", label="Last Call", kind="timestamp"),
|
|
3404
|
+
ColumnMeta(id="call_count", label="Calls", kind="int", align="right"),
|
|
3405
|
+
ColumnMeta(id="clients", label="Clients", kind="list"),
|
|
3406
|
+
]
|
|
3407
|
+
|
|
3408
|
+
# `status` values. `no_data` and `zero_calls` are BOTH "nothing seen for
|
|
3409
|
+
# this route" — they differ only in whether that absence is trustworthy —
|
|
3410
|
+
# so a client rendering this column must not collapse them to one meaning.
|
|
3411
|
+
DEPRECATED_ROUTE_NO_DATA = "no_data"
|
|
3412
|
+
DEPRECATED_ROUTE_ZERO_CALLS = "zero_calls"
|
|
3413
|
+
DEPRECATED_ROUTE_IN_USE = "in_use"
|
|
3414
|
+
|
|
3415
|
+
|
|
3416
|
+
def fold_deprecated_routes(
|
|
3417
|
+
entries: Iterable[Mapping[str, Any]],
|
|
3418
|
+
generated_at: float,
|
|
3419
|
+
*,
|
|
3420
|
+
routes: Mapping[str, str] | None = None,
|
|
3421
|
+
) -> ReportResult:
|
|
3422
|
+
"""Fold already-fetched deprecation-telemetry audit rows into a
|
|
3423
|
+
per-route snapshot. **Pure** — no DB, no daemon, no clock.
|
|
3424
|
+
|
|
3425
|
+
``entries`` is whatever ``coord.audit.query_audit_log(category=
|
|
3426
|
+
"deprecation")`` (paginated by the caller — see :func:`run_deprecated_routes`)
|
|
3427
|
+
returned, newest-first. ``routes`` defaults to
|
|
3428
|
+
``coord.serve_app.RPC_SUPERSEDED_BY_RESOURCE`` so the set of routes this
|
|
3429
|
+
report covers can never drift from the set the daemon actually stamps
|
|
3430
|
+
``deprecated: true`` on in the served OpenAPI spec (#1944) — there is
|
|
3431
|
+
exactly one source of truth for "which routes are deprecated", and this
|
|
3432
|
+
report reads it rather than redeclaring it (the ``routes=`` override
|
|
3433
|
+
exists purely so this stays a pure function a test can call without
|
|
3434
|
+
importing the daemon module).
|
|
3435
|
+
"""
|
|
3436
|
+
if routes is None:
|
|
3437
|
+
from coord.serve_app import RPC_SUPERSEDED_BY_RESOURCE # noqa: PLC0415
|
|
3438
|
+
|
|
3439
|
+
routes = RPC_SUPERSEDED_BY_RESOURCE
|
|
3440
|
+
|
|
3441
|
+
entries = list(entries)
|
|
3442
|
+
any_data = bool(entries)
|
|
3443
|
+
|
|
3444
|
+
by_route: dict[str, list[Mapping[str, Any]]] = {r: [] for r in routes}
|
|
3445
|
+
for entry in entries:
|
|
3446
|
+
details = entry.get("details") or {}
|
|
3447
|
+
route = details.get("route")
|
|
3448
|
+
if route in by_route:
|
|
3449
|
+
by_route[route].append(entry)
|
|
3450
|
+
|
|
3451
|
+
rows: list[dict[str, Any]] = []
|
|
3452
|
+
for route in sorted(routes):
|
|
3453
|
+
calls = sorted(
|
|
3454
|
+
by_route.get(route, []), key=lambda e: e.get("ts") or 0, reverse=True
|
|
3455
|
+
)
|
|
3456
|
+
last_call = calls[0].get("ts") if calls else None
|
|
3457
|
+
clients: list[str] = []
|
|
3458
|
+
seen: set[tuple[str, str]] = set()
|
|
3459
|
+
for call in calls:
|
|
3460
|
+
details = call.get("details") or {}
|
|
3461
|
+
pair = (
|
|
3462
|
+
details.get("client") or "unknown",
|
|
3463
|
+
details.get("client_version") or "unknown",
|
|
3464
|
+
)
|
|
3465
|
+
if pair not in seen:
|
|
3466
|
+
seen.add(pair)
|
|
3467
|
+
clients.append(f"{pair[0]}@{pair[1]}")
|
|
3468
|
+
if calls:
|
|
3469
|
+
status = DEPRECATED_ROUTE_IN_USE
|
|
3470
|
+
elif any_data:
|
|
3471
|
+
status = DEPRECATED_ROUTE_ZERO_CALLS
|
|
3472
|
+
else:
|
|
3473
|
+
status = DEPRECATED_ROUTE_NO_DATA
|
|
3474
|
+
rows.append(
|
|
3475
|
+
{
|
|
3476
|
+
"route": route,
|
|
3477
|
+
"replacement": routes[route],
|
|
3478
|
+
"status": status,
|
|
3479
|
+
"last_call": last_call,
|
|
3480
|
+
"call_count": len(calls),
|
|
3481
|
+
"clients": clients,
|
|
3482
|
+
}
|
|
3483
|
+
)
|
|
3484
|
+
|
|
3485
|
+
notes: list[str] = []
|
|
3486
|
+
if not any_data:
|
|
3487
|
+
notes.append(
|
|
3488
|
+
"No deprecation telemetry has been recorded at all, for any "
|
|
3489
|
+
"route — this may mean genuinely zero calls, or that capture "
|
|
3490
|
+
"is not running (an old daemon build predating #1945, "
|
|
3491
|
+
"`audit.level: business` dropping operational-tier rows, or "
|
|
3492
|
+
"the audit table's own retention trim). Every row above reads "
|
|
3493
|
+
"`no_data`, not `zero_calls` — treat it as UNKNOWN, never as "
|
|
3494
|
+
"evidence it is safe to retire."
|
|
3495
|
+
)
|
|
3496
|
+
|
|
3497
|
+
return ReportResult(
|
|
3498
|
+
report_id="deprecated-routes",
|
|
3499
|
+
generated_at=generated_at,
|
|
3500
|
+
window=(generated_at, generated_at),
|
|
3501
|
+
columns=list(DEPRECATED_ROUTES_COLUMNS),
|
|
3502
|
+
column_meta=list(DEPRECATED_ROUTES_COLUMN_META),
|
|
3503
|
+
rows=rows,
|
|
3504
|
+
notes=notes,
|
|
3505
|
+
)
|
|
3506
|
+
|
|
3507
|
+
|
|
3508
|
+
def _default_fetch_deprecation_entries(
|
|
3509
|
+
generated_at: float,
|
|
3510
|
+
) -> tuple[list[dict], bool]:
|
|
3511
|
+
return fetch_audit_window(since=0.0, until=generated_at, category="deprecation")
|
|
3512
|
+
|
|
3513
|
+
|
|
3514
|
+
def run_deprecated_routes(
|
|
3515
|
+
*,
|
|
3516
|
+
now: float | None = None,
|
|
3517
|
+
fetch: Callable[[float], tuple[Sequence[Mapping[str, Any]], bool]] | None = None,
|
|
3518
|
+
routes: Mapping[str, str] | None = None,
|
|
3519
|
+
) -> ReportResult:
|
|
3520
|
+
"""Fetch every recorded deprecated-RPC-route call and fold it (#1945).
|
|
3521
|
+
|
|
3522
|
+
``fetch``/``routes`` are test seams (mirrors every other ``run_*``'s
|
|
3523
|
+
``fetch=`` seam). Production always walks the FULL audit history
|
|
3524
|
+
(``since=0``), never a recent window — "this route has not been called
|
|
3525
|
+
in months" is exactly the number #1945 exists to produce, and a
|
|
3526
|
+
windowed report would silently hide the very evidence retirement needs.
|
|
3527
|
+
``query_audit_log`` orders newest-first, so ``last_call`` is accurate
|
|
3528
|
+
even if the walk is truncated by the page cap; only the full
|
|
3529
|
+
client/version set and total ``call_count`` could then be incomplete,
|
|
3530
|
+
which is called out in a note exactly like every other truncated fold
|
|
3531
|
+
in this module.
|
|
3532
|
+
"""
|
|
3533
|
+
generated_at = time.time() if now is None else float(now)
|
|
3534
|
+
fetch_fn = _default_fetch_deprecation_entries if fetch is None else fetch
|
|
3535
|
+
entries, truncated = fetch_fn(generated_at)
|
|
3536
|
+
result = fold_deprecated_routes(entries, generated_at, routes=routes)
|
|
3537
|
+
if truncated:
|
|
3538
|
+
result.notes.append(
|
|
3539
|
+
"Audit history walk hit its page cap before covering the full "
|
|
3540
|
+
"history — `clients`/`call_count` may be missing older calls, "
|
|
3541
|
+
"though `last_call` (newest-first order) is still accurate."
|
|
3542
|
+
)
|
|
3543
|
+
return result
|
|
3544
|
+
|
|
3545
|
+
|
|
3369
3546
|
# ── the catalogue ──────────────────────────────────────────────────────────
|
|
3370
3547
|
|
|
3371
3548
|
SINCE_PRESETS = ("1h", "6h", "24h", "3d", "7d")
|
|
@@ -3683,6 +3860,22 @@ TREND = ReportDef(
|
|
|
3683
3860
|
)
|
|
3684
3861
|
|
|
3685
3862
|
|
|
3863
|
+
DEPRECATED_ROUTES = ReportDef(
|
|
3864
|
+
id="deprecated-routes",
|
|
3865
|
+
title="Deprecated RPC Routes",
|
|
3866
|
+
description=(
|
|
3867
|
+
"Per deprecated RPC route (the #1944 superseded-by-resource table): "
|
|
3868
|
+
"last call, distinct calling client+version pairs, and a total "
|
|
3869
|
+
"count — evidence for retirement instead of belief (#1945). "
|
|
3870
|
+
"`status` distinguishes `in_use` from `zero_calls` (a real, "
|
|
3871
|
+
"actionable signal) from `no_data` (telemetry not confirmed live — "
|
|
3872
|
+
"never safe to read as `zero_calls`)."
|
|
3873
|
+
),
|
|
3874
|
+
params=(),
|
|
3875
|
+
run=run_deprecated_routes,
|
|
3876
|
+
)
|
|
3877
|
+
|
|
3878
|
+
|
|
3686
3879
|
# ── CSV serialisation (#1765) ──────────────────────────────────────────────
|
|
3687
3880
|
#
|
|
3688
3881
|
# One serializer, server-side, for every surface: `coord report run --format
|
|
@@ -3863,6 +4056,7 @@ REPORTS: dict[str, ReportDef] = {
|
|
|
3863
4056
|
USAGE.id: USAGE,
|
|
3864
4057
|
QUEUE_OUTCOMES.id: QUEUE_OUTCOMES,
|
|
3865
4058
|
TREND.id: TREND,
|
|
4059
|
+
DEPRECATED_ROUTES.id: DEPRECATED_ROUTES,
|
|
3866
4060
|
}
|
|
3867
4061
|
|
|
3868
4062
|
|
|
@@ -453,6 +453,55 @@ class _SchemaNegotiationMiddleware(BaseHTTPMiddleware):
|
|
|
453
453
|
)
|
|
454
454
|
|
|
455
455
|
|
|
456
|
+
class _DeprecatedRouteTelemetryMiddleware(BaseHTTPMiddleware):
|
|
457
|
+
"""Record client identity + version on every call to a deprecated RPC
|
|
458
|
+
route (#1945, Phase B of #60 -- retirement needs a number, not a belief).
|
|
459
|
+
|
|
460
|
+
``RPC_SUPERSEDED_BY_RESOURCE`` (defined further down this module) is the
|
|
461
|
+
single source of truth for "which routes are deprecated" -- the same
|
|
462
|
+
dict :func:`_mark_superseded_rpc_routes` stamps ``deprecated: true``
|
|
463
|
+
with in the served OpenAPI spec (#1944). Matching against it here rather
|
|
464
|
+
than a second hardcoded list means every route the spec calls
|
|
465
|
+
deprecated is automatically covered by telemetry too; they cannot drift
|
|
466
|
+
apart.
|
|
467
|
+
|
|
468
|
+
Innermost middleware by construction (appended last in ``build_app``,
|
|
469
|
+
after gzip / schema negotiation / bearer auth) -- it only ever sees a
|
|
470
|
+
request that has already cleared every earlier gate, so it counts real
|
|
471
|
+
calls that reached a deprecated handler, not requests bounced upstream.
|
|
472
|
+
|
|
473
|
+
Capture happens by calling
|
|
474
|
+
:func:`coord.deprecation_telemetry.record_deprecated_rpc_call`, which is
|
|
475
|
+
itself best-effort and never raises -- but this dispatch method wraps it
|
|
476
|
+
in its own ``try/except`` besides, so even an import failure or a
|
|
477
|
+
surprising ``request.headers`` type can never turn telemetry into a
|
|
478
|
+
broken response. The write is a single local SQLite insert (the same
|
|
479
|
+
``record_audit`` every board-mutation handler in this file already calls
|
|
480
|
+
synchronously on its own request path), so it adds no meaningfully
|
|
481
|
+
different latency than those existing writes -- there is no separate
|
|
482
|
+
async/background-thread mechanism elsewhere in this file to match, and
|
|
483
|
+
none is warranted here either.
|
|
484
|
+
"""
|
|
485
|
+
|
|
486
|
+
async def dispatch(self, request: Request, call_next): # noqa: ANN001, ANN201
|
|
487
|
+
if request.url.path in RPC_SUPERSEDED_BY_RESOURCE:
|
|
488
|
+
try:
|
|
489
|
+
from coord.deprecation_telemetry import ( # noqa: PLC0415
|
|
490
|
+
CLIENT_HEADER,
|
|
491
|
+
CLIENT_VERSION_HEADER,
|
|
492
|
+
record_deprecated_rpc_call,
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
record_deprecated_rpc_call(
|
|
496
|
+
request.url.path,
|
|
497
|
+
client=request.headers.get(CLIENT_HEADER),
|
|
498
|
+
client_version=request.headers.get(CLIENT_VERSION_HEADER),
|
|
499
|
+
)
|
|
500
|
+
except Exception: # noqa: BLE001 — telemetry must never break a request
|
|
501
|
+
pass
|
|
502
|
+
return await call_next(request)
|
|
503
|
+
|
|
504
|
+
|
|
456
505
|
def _reload_config_if_stale(
|
|
457
506
|
current: Config, last_mtime: float | None
|
|
458
507
|
) -> tuple[Config, float | None]:
|
|
@@ -9649,4 +9698,9 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
|
|
|
9649
9698
|
]
|
|
9650
9699
|
if token:
|
|
9651
9700
|
middleware.append(Middleware(_BearerAuthMiddleware, token=token))
|
|
9701
|
+
# #1945: innermost -- runs closest to the route handler, after schema
|
|
9702
|
+
# negotiation and (if configured) bearer auth have already let the
|
|
9703
|
+
# request through, so telemetry only counts calls that actually reached
|
|
9704
|
+
# a deprecated route's handler.
|
|
9705
|
+
middleware.append(Middleware(_DeprecatedRouteTelemetryMiddleware))
|
|
9652
9706
|
return Starlette(routes=routes, middleware=middleware, lifespan=_lifespan)
|
|
@@ -380,9 +380,9 @@ def fetch_usage_rows(
|
|
|
380
380
|
:class:`~coord.models.Assignment` instances — the aggregator consumes the
|
|
381
381
|
daemon ``/board`` ``assignments`` shape directly, including
|
|
382
382
|
``is_interactive``, which is a real DB/wire column but (deliberately,
|
|
383
|
-
#748/#632 — see
|
|
384
|
-
|
|
385
|
-
drop it.
|
|
383
|
+
#748/#632 — see ``coord.board_schema.INTEGER_BACKED_BOOLEANS`` and
|
|
384
|
+
``tests/test_board_schema.py``) not an ``Assignment`` dataclass field, so
|
|
385
|
+
converting through ``Assignment`` would silently drop it.
|
|
386
386
|
|
|
387
387
|
Remote reads the same ``/board`` endpoint ``coord status`` polls. Local
|
|
388
388
|
reads the sqlite DB directly via ``SqliteStore.list_assignments()``
|