code-coordinator 0.5.284__tar.gz → 0.5.286__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.284 → code_coordinator-0.5.286}/PKG-INFO +1 -1
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agent.py +18 -2
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/status.py +47 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/network.py +146 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/prereqs.py +30 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/smoke.py +12 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent.py +48 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_doctor.py +61 -1
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_network.py +109 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_prereqs.py +24 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.gitignore +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/CLAUDE.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/GOAL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/LICENSE +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/MANIFEST.in +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/README.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/__init__.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/audit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/block_log.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/board_service.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/brain.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/claim.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/cli.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/client.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/comments.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/config.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dao.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/db.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deps.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/drive.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/events.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/filelock.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/freshness.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/gates.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/goal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/context.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/models.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/render.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/units.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/hooks.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/interactive.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/models.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notify.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/openapi.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/parentage.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/plans.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/progress.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/release_window.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/reports.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/review.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/self_health.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/split_work.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/sql.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/state.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/test_author.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/test_report.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/usage.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/install-agent.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/pyproject.toml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/setup.cfg +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/__init__.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/backends.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/conftest.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_db.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_events.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_init.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_models.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_session.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_split.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_state.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/write_parity.py +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/types/generated.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -6130,14 +6130,30 @@ class AgentServer:
|
|
|
6130
6130
|
|
|
6131
6131
|
See `_tool_versions_ttl` for why: probing shells out per tool, and
|
|
6132
6132
|
`/health` is polled frequently.
|
|
6133
|
+
|
|
6134
|
+
#2913: `probe_all()` normally restricts probing to `self.capabilities`
|
|
6135
|
+
so a plain CLI-only machine never pays to probe a browser or GTK4 it
|
|
6136
|
+
never claimed. A config-free agent's `self.capabilities` is `[]` by
|
|
6137
|
+
construction — it has nothing of its own to declare; the coordinator
|
|
6138
|
+
supplies capabilities from its OWN `coordinator.yml` at dispatch time
|
|
6139
|
+
(docs/EPHEMERAL_WORKERS.md). Probing only `self.capabilities` there
|
|
6140
|
+
means `/health.tool_versions` never covers cargo, python3, or any
|
|
6141
|
+
other capability-gated tool, so `unmet_capabilities()` — the #1570 D
|
|
6142
|
+
cross-check `dispatch_smoke` relies on before routing capability-
|
|
6143
|
+
gated work here — finds nothing to compare and fails OPEN, not
|
|
6144
|
+
closed, exactly backwards from what #1570 D exists to guarantee.
|
|
6145
|
+
Probe every known capability instead for a config-free agent: it has
|
|
6146
|
+
no legitimate narrower set to restrict to anyway, since it doesn't
|
|
6147
|
+
know what the coordinator is about to route to it.
|
|
6133
6148
|
"""
|
|
6134
6149
|
now = time.time()
|
|
6135
6150
|
cached = self._tool_versions_cache
|
|
6136
6151
|
if cached is not None and (now - cached[0]) < self._tool_versions_ttl:
|
|
6137
6152
|
return cached[1]
|
|
6138
|
-
from coord.prereqs import probe_all, tool_versions_summary
|
|
6153
|
+
from coord.prereqs import ALL_CAPABILITY_NAMES, probe_all, tool_versions_summary
|
|
6139
6154
|
|
|
6140
|
-
|
|
6155
|
+
probe_caps = ALL_CAPABILITY_NAMES if self.config_free_reason is not None else self.capabilities
|
|
6156
|
+
summary = tool_versions_summary(probe_all(probe_caps))
|
|
6141
6157
|
self._tool_versions_cache = (now, summary)
|
|
6142
6158
|
return summary
|
|
6143
6159
|
|
|
@@ -923,6 +923,39 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
|
|
|
923
923
|
click.echo("FLEET: ? (health footer unavailable — coord health for detail)")
|
|
924
924
|
|
|
925
925
|
|
|
926
|
+
def _host_resolution_lines(machine, ts_map: dict[str, tuple[str, str]] | None) -> list[tuple[bool, str]]:
|
|
927
|
+
"""#2912: does ``host:`` actually resolve to THIS machine's tailnet
|
|
928
|
+
address? A LAN DHCP/DNS entry that shares a name with a tailnet node
|
|
929
|
+
(e.g. a WSL2 box named ``dell64`` whose Windows host also registers
|
|
930
|
+
``dell64.lan``) shadows MagicDNS in the resolver order — HTTP-by-name
|
|
931
|
+
times out against the wrong LAN device while ``tailscale ping`` and the
|
|
932
|
+
agent's own ``/health`` are both perfectly healthy, so the symptom is
|
|
933
|
+
indistinguishable from a dead agent, a firewall, or a crashed unit.
|
|
934
|
+
|
|
935
|
+
Fires regardless of whether the machine is currently reachable — that's
|
|
936
|
+
the whole point: it names the cause a plain "unreachable" cannot, and it
|
|
937
|
+
also catches a collision BEFORE it manifests as an outage. Silent when
|
|
938
|
+
``coord.network.check_host_resolution`` can't determine an answer (no
|
|
939
|
+
local ``tailscale``, node not in this box's peer list, ``host:`` doesn't
|
|
940
|
+
resolve at all) — those are absence-of-evidence, not a finding.
|
|
941
|
+
|
|
942
|
+
Pure function over :func:`coord.network.check_host_resolution`'s result
|
|
943
|
+
— no I/O of its own — so it's testable without a live tailnet.
|
|
944
|
+
"""
|
|
945
|
+
from coord import network # noqa: PLC0415
|
|
946
|
+
|
|
947
|
+
result = network.check_host_resolution(machine, ts_map)
|
|
948
|
+
if result.matches is not False:
|
|
949
|
+
return []
|
|
950
|
+
return [(
|
|
951
|
+
True,
|
|
952
|
+
f" ✗ CRIT machines.host_resolves_offtailnet: {result.reason} "
|
|
953
|
+
f"(#2912). Remedy: set `host: {result.magicdns_fqdn}` in "
|
|
954
|
+
"coordinator.yml — the MagicDNS FQDN — instead of the bare "
|
|
955
|
+
"hostname, which a LAN DNS entry can shadow.",
|
|
956
|
+
)]
|
|
957
|
+
|
|
958
|
+
|
|
926
959
|
def _health_vs_config_lines(machine, health: dict) -> list[tuple[bool, str]]:
|
|
927
960
|
"""Cross-check a machine's ``/health`` against what ``coordinator.yml``
|
|
928
961
|
declares for it. Returns ``(is_problem, line)`` pairs (#1712).
|
|
@@ -1323,6 +1356,7 @@ def doctor(
|
|
|
1323
1356
|
expected: str | None,
|
|
1324
1357
|
use_pypi: bool,
|
|
1325
1358
|
) -> None:
|
|
1359
|
+
from coord import network
|
|
1326
1360
|
from coord.network import check_all
|
|
1327
1361
|
from coord.prereqs import ToolProbe, unmet_capabilities
|
|
1328
1362
|
|
|
@@ -1339,10 +1373,23 @@ def doctor(
|
|
|
1339
1373
|
sys.exit(2)
|
|
1340
1374
|
|
|
1341
1375
|
statuses = check_all(machines, timeout=timeout)
|
|
1376
|
+
# #2912: resolved once, locally, up front — every machine's `host:` is
|
|
1377
|
+
# checked against the SAME local tailscale peer list, and a single
|
|
1378
|
+
# `tailscale status --json` covers the whole fleet. `None` when
|
|
1379
|
+
# tailscale isn't available on THIS box; `_host_resolution_lines`
|
|
1380
|
+
# renders nothing in that case rather than fabricating a mismatch.
|
|
1381
|
+
ts_map = network.tailscale_ip_map(timeout=timeout)
|
|
1342
1382
|
any_problem = False
|
|
1343
1383
|
for s in statuses:
|
|
1344
1384
|
m = s.machine
|
|
1345
1385
|
click.echo(f"{m.name} ({m.host}):")
|
|
1386
|
+
# Runs even when unreachable — that's the case this exists for:
|
|
1387
|
+
# naming why "unreachable" is misleading instead of leaving it
|
|
1388
|
+
# indistinguishable from a dead agent or a crashed unit.
|
|
1389
|
+
for is_problem, line in _host_resolution_lines(m, ts_map):
|
|
1390
|
+
click.echo(line)
|
|
1391
|
+
if is_problem:
|
|
1392
|
+
any_problem = True
|
|
1346
1393
|
if not s.is_online:
|
|
1347
1394
|
click.echo(f" ✗ unreachable — {s.reason}")
|
|
1348
1395
|
any_problem = True
|
|
@@ -8,7 +8,9 @@ a generic "offline".
|
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
+
import json
|
|
11
12
|
import socket
|
|
13
|
+
import subprocess
|
|
12
14
|
import time
|
|
13
15
|
from concurrent.futures import ThreadPoolExecutor
|
|
14
16
|
from dataclasses import dataclass
|
|
@@ -119,6 +121,150 @@ def check_all(
|
|
|
119
121
|
return list(pool.map(lambda m: check_machine(m, timeout=timeout), machines))
|
|
120
122
|
|
|
121
123
|
|
|
124
|
+
# #2912: `coord doctor` checks reachability by resolving `host:` and hitting
|
|
125
|
+
# it — but never checks whether `host:` resolves to the RIGHT thing. A LAN
|
|
126
|
+
# DHCP/DNS entry that happens to share a name with a tailnet node (e.g. a
|
|
127
|
+
# WSL2 box named `dell64` whose Windows host also registers `dell64.lan`)
|
|
128
|
+
# shadows MagicDNS in the resolver order: `tailscale ping <name>` succeeds
|
|
129
|
+
# (it talks to tailscaled directly, not the resolver) while plain HTTP by
|
|
130
|
+
# name times out against the wrong LAN device — indistinguishable from a
|
|
131
|
+
# dead agent, a firewall, or a crashed unit. The two helpers below let
|
|
132
|
+
# `coord doctor` name that specific cause instead.
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def tailscale_ip_map(timeout: float = 5.0) -> dict[str, tuple[str, str]] | None:
|
|
136
|
+
"""Map each tailnet node's short hostname (lowercased) to its
|
|
137
|
+
``(tailnet_ipv4, magicdns_fqdn)``, read from the LOCAL machine's own
|
|
138
|
+
``tailscale status --json`` — i.e. what THIS box's tailscaled believes,
|
|
139
|
+
which is what its own DNS resolver should agree with.
|
|
140
|
+
|
|
141
|
+
Returns ``None`` when the ``tailscale`` CLI is missing, not logged in,
|
|
142
|
+
or anything else goes wrong. This check is best-effort and must fail
|
|
143
|
+
soft: a probe that cannot tell tailnet truth from LAN truth must stay
|
|
144
|
+
silent rather than fabricate a mismatch.
|
|
145
|
+
"""
|
|
146
|
+
try:
|
|
147
|
+
result = subprocess.run(
|
|
148
|
+
["tailscale", "status", "--json"],
|
|
149
|
+
capture_output=True,
|
|
150
|
+
text=True,
|
|
151
|
+
timeout=timeout,
|
|
152
|
+
)
|
|
153
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
154
|
+
return None
|
|
155
|
+
if result.returncode != 0:
|
|
156
|
+
return None
|
|
157
|
+
try:
|
|
158
|
+
data = json.loads(result.stdout)
|
|
159
|
+
except ValueError:
|
|
160
|
+
return None
|
|
161
|
+
|
|
162
|
+
nodes = list((data.get("Peer") or {}).values())
|
|
163
|
+
self_node = data.get("Self")
|
|
164
|
+
if self_node:
|
|
165
|
+
nodes.append(self_node)
|
|
166
|
+
|
|
167
|
+
out: dict[str, tuple[str, str]] = {}
|
|
168
|
+
for node in nodes:
|
|
169
|
+
if not isinstance(node, dict):
|
|
170
|
+
continue
|
|
171
|
+
host_name = (node.get("HostName") or "").strip().lower()
|
|
172
|
+
if not host_name:
|
|
173
|
+
continue
|
|
174
|
+
ipv4 = next(
|
|
175
|
+
(ip for ip in (node.get("TailscaleIPs") or []) if ":" not in ip), None
|
|
176
|
+
)
|
|
177
|
+
if not ipv4:
|
|
178
|
+
continue
|
|
179
|
+
dns_name = (node.get("DNSName") or "").rstrip(".")
|
|
180
|
+
out[host_name] = (ipv4, dns_name)
|
|
181
|
+
return out
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def resolve_host_ip(host: str, timeout: float = 5.0) -> str | None:
|
|
185
|
+
"""Resolve *host* via normal system DNS/hosts resolution — the same
|
|
186
|
+
resolution path plain HTTP-by-name takes. ``None`` on any failure."""
|
|
187
|
+
old_timeout = socket.getdefaulttimeout()
|
|
188
|
+
socket.setdefaulttimeout(timeout)
|
|
189
|
+
try:
|
|
190
|
+
return socket.gethostbyname(host)
|
|
191
|
+
except OSError:
|
|
192
|
+
return None
|
|
193
|
+
finally:
|
|
194
|
+
socket.setdefaulttimeout(old_timeout)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@dataclass
|
|
198
|
+
class HostResolutionCheck:
|
|
199
|
+
"""Does a machine's configured ``host:`` resolve to ITS tailnet address?
|
|
200
|
+
|
|
201
|
+
``matches is None`` means "could not determine" (no local ``tailscale``,
|
|
202
|
+
the node wasn't found in this box's peer list, or ``host:`` didn't
|
|
203
|
+
resolve at all) — that's a different, softer story than ``False``
|
|
204
|
+
("resolved, but to the wrong place") and callers must not conflate them.
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
matches: bool | None
|
|
208
|
+
resolved_ip: str | None = None
|
|
209
|
+
tailnet_ip: str | None = None
|
|
210
|
+
magicdns_fqdn: str | None = None
|
|
211
|
+
reason: str = ""
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def check_host_resolution(
|
|
215
|
+
machine: Machine, ts_map: dict[str, tuple[str, str]] | None
|
|
216
|
+
) -> HostResolutionCheck:
|
|
217
|
+
"""Compare ``machine.host``'s DNS resolution against what *ts_map*
|
|
218
|
+
(from :func:`tailscale_ip_map`) says this tailnet node's real address
|
|
219
|
+
is. Pure function of its inputs — no I/O — so it's unit-testable
|
|
220
|
+
without a live tailnet or DNS resolver.
|
|
221
|
+
"""
|
|
222
|
+
if ts_map is None:
|
|
223
|
+
return HostResolutionCheck(
|
|
224
|
+
matches=None, reason="tailscale not available locally — skipped"
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
peer = ts_map.get(machine.name.strip().lower())
|
|
228
|
+
if peer is None:
|
|
229
|
+
# `machine.name` and `machine.host`'s leading label don't always
|
|
230
|
+
# agree (host aliases, an already-FQDN host, ...) — fall back to
|
|
231
|
+
# the host's own short label before giving up.
|
|
232
|
+
peer = ts_map.get(machine.host.split(".")[0].strip().lower())
|
|
233
|
+
if peer is None:
|
|
234
|
+
return HostResolutionCheck(
|
|
235
|
+
matches=None,
|
|
236
|
+
reason=f"{machine.name!r} not found in local tailscale peer list — skipped",
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
tailnet_ip, magicdns_fqdn = peer
|
|
240
|
+
resolved = resolve_host_ip(machine.host)
|
|
241
|
+
if resolved is None:
|
|
242
|
+
return HostResolutionCheck(
|
|
243
|
+
matches=None,
|
|
244
|
+
tailnet_ip=tailnet_ip,
|
|
245
|
+
magicdns_fqdn=magicdns_fqdn,
|
|
246
|
+
reason=f"{machine.host!r} did not resolve at all",
|
|
247
|
+
)
|
|
248
|
+
if resolved == tailnet_ip:
|
|
249
|
+
return HostResolutionCheck(
|
|
250
|
+
matches=True,
|
|
251
|
+
resolved_ip=resolved,
|
|
252
|
+
tailnet_ip=tailnet_ip,
|
|
253
|
+
magicdns_fqdn=magicdns_fqdn,
|
|
254
|
+
)
|
|
255
|
+
return HostResolutionCheck(
|
|
256
|
+
matches=False,
|
|
257
|
+
resolved_ip=resolved,
|
|
258
|
+
tailnet_ip=tailnet_ip,
|
|
259
|
+
magicdns_fqdn=magicdns_fqdn,
|
|
260
|
+
reason=(
|
|
261
|
+
f"{machine.host!r} resolves to {resolved}, not this machine's "
|
|
262
|
+
f"tailnet address {tailnet_ip} — a LAN DNS entry is very likely "
|
|
263
|
+
"shadowing MagicDNS for this name"
|
|
264
|
+
),
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
|
|
122
268
|
@dataclass
|
|
123
269
|
class StatusResult:
|
|
124
270
|
"""Result of fetching /status from an agent.
|
|
@@ -382,6 +382,24 @@ CAPABILITY_PREREQS: tuple[Prereq, ...] = (
|
|
|
382
382
|
|
|
383
383
|
ALL_PREREQS: tuple[Prereq, ...] = BASELINE_PREREQS + CAPABILITY_PREREQS
|
|
384
384
|
|
|
385
|
+
# Every capability name any `CAPABILITY_PREREQS` entry gates, in one place
|
|
386
|
+
# (#2913). `probe_all()` restricts probing to a caller-supplied capability
|
|
387
|
+
# set so a normal, fully-configured machine never pays to probe a browser
|
|
388
|
+
# or GTK4 it never claimed — but that same restriction silently defeats
|
|
389
|
+
# `unmet_capabilities()` for a config-free agent (docs/EPHEMERAL_WORKERS.md):
|
|
390
|
+
# its OWN `capabilities` is `[]` by construction (nothing to declare — the
|
|
391
|
+
# coordinator's `coordinator.yml` supplies capabilities at dispatch time,
|
|
392
|
+
# not this process), so `probe_all(self.capabilities)` never probes cargo,
|
|
393
|
+
# python3, or any other capability-gated tool, and the #1570 D cross-check
|
|
394
|
+
# has nothing to compare against. `AgentServer._cached_tool_versions`
|
|
395
|
+
# (coord/agent.py) passes this set instead of `self.capabilities` for a
|
|
396
|
+
# config-free agent, so `/health` always reports the truth about what is
|
|
397
|
+
# actually on the box regardless of what config, if any, this process
|
|
398
|
+
# itself holds.
|
|
399
|
+
ALL_CAPABILITY_NAMES: frozenset[str] = frozenset(
|
|
400
|
+
p.capability for p in CAPABILITY_PREREQS if p.capability is not None
|
|
401
|
+
)
|
|
402
|
+
|
|
385
403
|
|
|
386
404
|
def _parse_version(text: str, pattern: str) -> str | None:
|
|
387
405
|
match = re.search(pattern, text)
|
|
@@ -515,6 +533,18 @@ def unmet_capabilities(
|
|
|
515
533
|
`CAPABILITY_PREREQS` names it) is silently skipped, not flagged — an
|
|
516
534
|
unprobed claim is not (yet) a *known-broken* one; this only reports
|
|
517
535
|
claims this module can actually verify.
|
|
536
|
+
|
|
537
|
+
The `p is None` skip is meant for exactly one case: an agent whose
|
|
538
|
+
`/health` predates this module probing that particular tool at all.
|
|
539
|
+
Before #2913 it also silently swallowed a second, permanent case — a
|
|
540
|
+
config-free agent (`self.capabilities == []`) whose `probes` therefore
|
|
541
|
+
never included the caller's `required_caps` in the first place, so
|
|
542
|
+
`dispatch_smoke`'s #1570 D cross-check verified nothing for exactly the
|
|
543
|
+
machines it exists to protect. `AgentServer._cached_tool_versions`
|
|
544
|
+
closes that by probing `ALL_CAPABILITY_NAMES` (not `self.capabilities`)
|
|
545
|
+
when the agent is config-free, so `probes` passed in here now genuinely
|
|
546
|
+
covers every capability this function is asked about, and `p is None`
|
|
547
|
+
goes back to meaning only "predates the probe" — see coord/agent.py.
|
|
518
548
|
"""
|
|
519
549
|
unmet: dict[str, list[str]] = {}
|
|
520
550
|
for cap in capabilities:
|
|
@@ -436,6 +436,18 @@ def _capability_probe_reasons(
|
|
|
436
436
|
would be strictly worse than the blind trust this replaces. Only an
|
|
437
437
|
*explicit* probe failure refuses routing.
|
|
438
438
|
|
|
439
|
+
#2913: this used to fail open the same way for a config-free agent too
|
|
440
|
+
— `tool_versions` was present (baseline `git`/`gh`) but never covered
|
|
441
|
+
`required_caps`, since a config-free agent has no `capabilities` of its
|
|
442
|
+
own to probe against and `AgentServer._cached_tool_versions` used to
|
|
443
|
+
restrict probing to exactly that empty list. `unmet_capabilities` then
|
|
444
|
+
found nothing to compare and returned `{}`, indistinguishable from
|
|
445
|
+
"probed and clean". Fixed at the source: a config-free agent now probes
|
|
446
|
+
every known capability (`coord.prereqs.ALL_CAPABILITY_NAMES`) regardless
|
|
447
|
+
of what it declares, so `tool_versions` here genuinely covers
|
|
448
|
+
`required_caps` and this function's refusal path works the same for a
|
|
449
|
+
config-free agent as for a fully-configured one.
|
|
450
|
+
|
|
439
451
|
Never raises — a connectivity hiccup here just skips the extra check;
|
|
440
452
|
the POST to `/assign` right after this call in `dispatch_smoke` is the
|
|
441
453
|
real reachability test and fails closed on its own if the machine is
|
|
@@ -231,6 +231,54 @@ def test_health_tool_versions_is_cached(tmp_path: Path) -> None:
|
|
|
231
231
|
assert third == first
|
|
232
232
|
|
|
233
233
|
|
|
234
|
+
def test_health_tool_versions_probes_everything_when_config_free(
|
|
235
|
+
tmp_path: Path,
|
|
236
|
+
) -> None:
|
|
237
|
+
"""#2913: a config-free agent declares `capabilities=[]` by design
|
|
238
|
+
(docs/EPHEMERAL_WORKERS.md) — the coordinator's own `coordinator.yml`
|
|
239
|
+
supplies capabilities at dispatch time, not this process. Restricting
|
|
240
|
+
`/health.tool_versions` to `self.capabilities` (empty) meant the #1570 D
|
|
241
|
+
cross-check in `dispatch_smoke` never had cargo/python3/etc. to compare
|
|
242
|
+
against and silently failed OPEN for exactly the machines it exists to
|
|
243
|
+
protect. A config-free agent must now probe every known capability
|
|
244
|
+
regardless of its own (empty) declared list."""
|
|
245
|
+
from coord.prereqs import ALL_CAPABILITY_NAMES
|
|
246
|
+
|
|
247
|
+
server = AgentServer(
|
|
248
|
+
machine_name="ephemeral-1",
|
|
249
|
+
capabilities=[],
|
|
250
|
+
repos=[],
|
|
251
|
+
state_dir=tmp_path / "state",
|
|
252
|
+
worktree_writable_settings_files=[],
|
|
253
|
+
config_free_reason="no local coordinator.yml and no board service",
|
|
254
|
+
)
|
|
255
|
+
tool_versions = server.health()["tool_versions"]
|
|
256
|
+
assert "cargo" in tool_versions
|
|
257
|
+
assert "python3" in tool_versions
|
|
258
|
+
assert "gtk4" in tool_versions
|
|
259
|
+
assert "node" in tool_versions
|
|
260
|
+
# Sanity: the probed set really does cover every capability-gated tool,
|
|
261
|
+
# not just a hardcoded couple of names.
|
|
262
|
+
probed_capabilities = {
|
|
263
|
+
info["capability"] for info in tool_versions.values() if info["capability"]
|
|
264
|
+
}
|
|
265
|
+
assert probed_capabilities == set(ALL_CAPABILITY_NAMES)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def test_health_tool_versions_stays_restricted_when_not_config_free(
|
|
269
|
+
tmp_path: Path,
|
|
270
|
+
) -> None:
|
|
271
|
+
"""A normal, fully-configured agent (`config_free_reason=None`, the
|
|
272
|
+
default) must NOT gain the config-free agent's wider probe — `_server`
|
|
273
|
+
declares only `capabilities=["python"]`, so `cargo`/`gtk4` stay absent,
|
|
274
|
+
same as before #2913."""
|
|
275
|
+
server = _server(tmp_path)
|
|
276
|
+
tool_versions = server.health()["tool_versions"]
|
|
277
|
+
assert "python3" in tool_versions
|
|
278
|
+
assert "cargo" not in tool_versions
|
|
279
|
+
assert "gtk4" not in tool_versions
|
|
280
|
+
|
|
281
|
+
|
|
234
282
|
def test_assign_success(tmp_path: Path) -> None:
|
|
235
283
|
repo = _init_repo(tmp_path / "repo")
|
|
236
284
|
server = _server(tmp_path, repo_path=repo)
|
|
@@ -16,8 +16,13 @@ from coord.commands.status import doctor
|
|
|
16
16
|
from coord.network import ONLINE, OFFLINE, MachineStatus
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def _run_doctor(config_path, monkeypatch, statuses, *, extra_args=None):
|
|
19
|
+
def _run_doctor(config_path, monkeypatch, statuses, *, extra_args=None, ts_map=None):
|
|
20
20
|
monkeypatch.setattr(network_mod, "check_all", lambda *a, **k: statuses)
|
|
21
|
+
# #2912: default the new host-resolution check to "tailscale not
|
|
22
|
+
# available" (matches=None, silent) so every PRE-EXISTING test here
|
|
23
|
+
# stays hermetic and unaffected — tests that actually exercise the
|
|
24
|
+
# check pass their own `ts_map`.
|
|
25
|
+
monkeypatch.setattr(network_mod, "tailscale_ip_map", lambda *a, **k: ts_map)
|
|
21
26
|
runner = CliRunner()
|
|
22
27
|
# #2082: doctor resolves --expected from PyPI by default now. Default
|
|
23
28
|
# these tests to --no-pypi so they stay hermetic (no real network call);
|
|
@@ -101,6 +106,61 @@ def test_doctor_flags_unreachable_machine(valid_config_path, monkeypatch) -> Non
|
|
|
101
106
|
assert "connection refused" in result.output
|
|
102
107
|
|
|
103
108
|
|
|
109
|
+
def test_doctor_names_lan_dns_shadow_even_when_unreachable(
|
|
110
|
+
valid_config_path, monkeypatch,
|
|
111
|
+
) -> None:
|
|
112
|
+
"""#2912: `laptop`'s `host: laptop.tailnet` resolving to something other
|
|
113
|
+
than laptop's own tailnet address must be named EVEN on the branch that
|
|
114
|
+
reports "unreachable" — that's the whole failure mode: a DNS shadow
|
|
115
|
+
makes a healthy agent look dead with no clue why."""
|
|
116
|
+
from coord.config import load
|
|
117
|
+
|
|
118
|
+
cfg = load(valid_config_path)
|
|
119
|
+
statuses = [
|
|
120
|
+
MachineStatus(machine=cfg.machines[0], state=network_mod.TIMEOUT, reason="timed out"),
|
|
121
|
+
MachineStatus(
|
|
122
|
+
machine=cfg.machines[1], state=ONLINE,
|
|
123
|
+
health=_health({"git": _ok_probe(), "gh": _ok_probe()}, cfg.machines[1]),
|
|
124
|
+
),
|
|
125
|
+
]
|
|
126
|
+
ts_map = {"laptop": ("100.64.0.1", "laptop.tailf46ef8.ts.net")}
|
|
127
|
+
monkeypatch.setattr(
|
|
128
|
+
network_mod, "resolve_host_ip", lambda host, **k: "192.168.1.183"
|
|
129
|
+
)
|
|
130
|
+
result = _run_doctor(valid_config_path, monkeypatch, statuses, ts_map=ts_map)
|
|
131
|
+
assert result.exit_code == 1
|
|
132
|
+
assert "machines.host_resolves_offtailnet" in result.output
|
|
133
|
+
assert "100.64.0.1" in result.output
|
|
134
|
+
assert "laptop.tailf46ef8.ts.net" in result.output
|
|
135
|
+
assert "unreachable" in result.output
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def test_doctor_is_silent_when_host_matches_tailnet_address(
|
|
139
|
+
valid_config_path, monkeypatch,
|
|
140
|
+
) -> None:
|
|
141
|
+
from coord.config import load
|
|
142
|
+
|
|
143
|
+
cfg = load(valid_config_path)
|
|
144
|
+
statuses = [
|
|
145
|
+
MachineStatus(
|
|
146
|
+
machine=m, state=ONLINE,
|
|
147
|
+
health=_health({"git": _ok_probe(), "gh": _ok_probe()}, m),
|
|
148
|
+
)
|
|
149
|
+
for m in cfg.machines
|
|
150
|
+
]
|
|
151
|
+
ts_map = {
|
|
152
|
+
"laptop": ("100.64.0.1", "laptop.tailf46ef8.ts.net"),
|
|
153
|
+
"server": ("100.64.0.2", "server.tailf46ef8.ts.net"),
|
|
154
|
+
}
|
|
155
|
+
monkeypatch.setattr(
|
|
156
|
+
network_mod, "resolve_host_ip",
|
|
157
|
+
lambda host, **k: {"laptop.tailnet": "100.64.0.1", "server.tailnet": "100.64.0.2"}[host],
|
|
158
|
+
)
|
|
159
|
+
result = _run_doctor(valid_config_path, monkeypatch, statuses, ts_map=ts_map)
|
|
160
|
+
assert result.exit_code == 0, result.output
|
|
161
|
+
assert "host_resolves_offtailnet" not in result.output
|
|
162
|
+
|
|
163
|
+
|
|
104
164
|
def test_doctor_flags_missing_baseline_tool(valid_config_path, monkeypatch) -> None:
|
|
105
165
|
from coord.config import load
|
|
106
166
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import json
|
|
5
6
|
import socket
|
|
6
7
|
from unittest.mock import MagicMock, patch
|
|
7
8
|
|
|
@@ -276,3 +277,111 @@ class TestCleanWorktrees:
|
|
|
276
277
|
result = network.clean_worktrees(_m())
|
|
277
278
|
assert result["ok"] is False
|
|
278
279
|
assert "invalid JSON" in result["error"]
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
class TestTailscaleIpMap:
|
|
283
|
+
"""#2912: `tailscale status --json` parsing — best-effort, fails soft."""
|
|
284
|
+
|
|
285
|
+
def _fake_run(self, stdout: str, returncode: int = 0):
|
|
286
|
+
result = MagicMock()
|
|
287
|
+
result.returncode = returncode
|
|
288
|
+
result.stdout = stdout
|
|
289
|
+
return result
|
|
290
|
+
|
|
291
|
+
def test_parses_self_and_peers(self) -> None:
|
|
292
|
+
payload = {
|
|
293
|
+
"Self": {
|
|
294
|
+
"HostName": "dellserver",
|
|
295
|
+
"DNSName": "dellserver.tailf46ef8.ts.net.",
|
|
296
|
+
"TailscaleIPs": ["100.97.107.88", "fd7a:115c:a1e0::4c3b:6b58"],
|
|
297
|
+
},
|
|
298
|
+
"Peer": {
|
|
299
|
+
"abc": {
|
|
300
|
+
"HostName": "dell64",
|
|
301
|
+
"DNSName": "dell64.tailf46ef8.ts.net.",
|
|
302
|
+
"TailscaleIPs": ["100.118.111.76", "fd7a:115c:a1e0::f430:6f4d"],
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
}
|
|
306
|
+
with patch.object(
|
|
307
|
+
network.subprocess, "run",
|
|
308
|
+
return_value=self._fake_run(json.dumps(payload)),
|
|
309
|
+
):
|
|
310
|
+
out = network.tailscale_ip_map()
|
|
311
|
+
assert out == {
|
|
312
|
+
"dellserver": ("100.97.107.88", "dellserver.tailf46ef8.ts.net"),
|
|
313
|
+
"dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net"),
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
def test_missing_cli_returns_none(self) -> None:
|
|
317
|
+
with patch.object(network.subprocess, "run", side_effect=FileNotFoundError()):
|
|
318
|
+
assert network.tailscale_ip_map() is None
|
|
319
|
+
|
|
320
|
+
def test_nonzero_exit_returns_none(self) -> None:
|
|
321
|
+
with patch.object(
|
|
322
|
+
network.subprocess, "run", return_value=self._fake_run("", returncode=1)
|
|
323
|
+
):
|
|
324
|
+
assert network.tailscale_ip_map() is None
|
|
325
|
+
|
|
326
|
+
def test_invalid_json_returns_none(self) -> None:
|
|
327
|
+
with patch.object(
|
|
328
|
+
network.subprocess, "run", return_value=self._fake_run("not json")
|
|
329
|
+
):
|
|
330
|
+
assert network.tailscale_ip_map() is None
|
|
331
|
+
|
|
332
|
+
def test_timeout_returns_none(self) -> None:
|
|
333
|
+
with patch.object(
|
|
334
|
+
network.subprocess, "run",
|
|
335
|
+
side_effect=network.subprocess.TimeoutExpired(cmd="tailscale", timeout=5),
|
|
336
|
+
):
|
|
337
|
+
assert network.tailscale_ip_map() is None
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
class TestCheckHostResolution:
|
|
341
|
+
"""#2912: is `host:` pointed at the RIGHT tailnet address?"""
|
|
342
|
+
|
|
343
|
+
def test_no_tailscale_available_is_unknown(self) -> None:
|
|
344
|
+
result = network.check_host_resolution(_m(name="dell64", host="dell64"), None)
|
|
345
|
+
assert result.matches is None
|
|
346
|
+
|
|
347
|
+
def test_node_not_in_peer_list_is_unknown(self) -> None:
|
|
348
|
+
result = network.check_host_resolution(
|
|
349
|
+
_m(name="dell64", host="dell64"), {"otherbox": ("100.1.1.1", "otherbox.ts.net")}
|
|
350
|
+
)
|
|
351
|
+
assert result.matches is None
|
|
352
|
+
|
|
353
|
+
def test_matching_address_is_ok(self) -> None:
|
|
354
|
+
machine = _m(name="dell64", host="dell64.tailf46ef8.ts.net")
|
|
355
|
+
ts_map = {"dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net")}
|
|
356
|
+
with patch.object(network, "resolve_host_ip", return_value="100.118.111.76"):
|
|
357
|
+
result = network.check_host_resolution(machine, ts_map)
|
|
358
|
+
assert result.matches is True
|
|
359
|
+
|
|
360
|
+
def test_lan_shadow_mismatch_is_flagged(self) -> None:
|
|
361
|
+
"""The exact #2912 scenario: `host: dell64` resolves to the Windows
|
|
362
|
+
LAN box (192.168.1.183) instead of dell64's own tailnet address."""
|
|
363
|
+
machine = _m(name="dell64", host="dell64")
|
|
364
|
+
ts_map = {"dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net")}
|
|
365
|
+
with patch.object(network, "resolve_host_ip", return_value="192.168.1.183"):
|
|
366
|
+
result = network.check_host_resolution(machine, ts_map)
|
|
367
|
+
assert result.matches is False
|
|
368
|
+
assert result.tailnet_ip == "100.118.111.76"
|
|
369
|
+
assert result.magicdns_fqdn == "dell64.tailf46ef8.ts.net"
|
|
370
|
+
assert "192.168.1.183" in result.reason
|
|
371
|
+
|
|
372
|
+
def test_unresolvable_host_is_unknown(self) -> None:
|
|
373
|
+
machine = _m(name="dell64", host="dell64.invalid")
|
|
374
|
+
ts_map = {"dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net")}
|
|
375
|
+
with patch.object(network, "resolve_host_ip", return_value=None):
|
|
376
|
+
result = network.check_host_resolution(machine, ts_map)
|
|
377
|
+
assert result.matches is None
|
|
378
|
+
|
|
379
|
+
def test_falls_back_to_host_short_label_when_name_not_found(self) -> None:
|
|
380
|
+
"""`machine.name` doesn't have to match tailscale's `HostName` —
|
|
381
|
+
e.g. an alias in coordinator.yml — so the host's own short label is
|
|
382
|
+
tried too before giving up."""
|
|
383
|
+
machine = _m(name="my-dell-alias", host="dell64.lan")
|
|
384
|
+
ts_map = {"dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net")}
|
|
385
|
+
with patch.object(network, "resolve_host_ip", return_value="100.118.111.76"):
|
|
386
|
+
result = network.check_host_resolution(machine, ts_map)
|
|
387
|
+
assert result.matches is True
|
|
@@ -178,6 +178,30 @@ class TestProbeAll:
|
|
|
178
178
|
"meets_floor": None, "capability": None, "ok": False,
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
+
def test_all_capability_names_probes_every_capability_prereq(self) -> None:
|
|
182
|
+
"""#2913: `ALL_CAPABILITY_NAMES` is what `AgentServer` probes for a
|
|
183
|
+
config-free agent in place of its own (empty) `capabilities` — it
|
|
184
|
+
must actually cover every `CAPABILITY_PREREQS` entry, else the
|
|
185
|
+
cross-check it exists to unblock would quietly narrow again."""
|
|
186
|
+
with patch("coord.prereqs.shutil.which", return_value=None):
|
|
187
|
+
probes = prereqs.probe_all(prereqs.ALL_CAPABILITY_NAMES)
|
|
188
|
+
expected_tools = {p.tool for p in prereqs.CAPABILITY_PREREQS} | {"git", "gh"}
|
|
189
|
+
assert set(probes) == expected_tools
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class TestAllCapabilityNames:
|
|
193
|
+
def test_matches_every_declared_capability(self) -> None:
|
|
194
|
+
declared = {
|
|
195
|
+
p.capability for p in prereqs.CAPABILITY_PREREQS if p.capability is not None
|
|
196
|
+
}
|
|
197
|
+
assert prereqs.ALL_CAPABILITY_NAMES == declared
|
|
198
|
+
|
|
199
|
+
def test_nonempty(self) -> None:
|
|
200
|
+
# A regression guard against this collapsing to an empty set (e.g. a
|
|
201
|
+
# future refactor of CAPABILITY_PREREQS dropping `capability` values)
|
|
202
|
+
# and silently making the #2913 fix probe nothing again.
|
|
203
|
+
assert prereqs.ALL_CAPABILITY_NAMES
|
|
204
|
+
|
|
181
205
|
|
|
182
206
|
class TestUnmetCapabilities:
|
|
183
207
|
def test_empty_when_capability_backs_out(self) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|