code-coordinator 0.5.196__tar.gz → 0.5.197__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.196 → code_coordinator-0.5.197}/PKG-INFO +1 -1
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/release.py +67 -1
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/status.py +43 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/release_cordon.py +43 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/release_propagate.py +8 -0
- code_coordinator-0.5.197/tests/test_release_cordon_stuck_2490.py +272 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_release_propagate.py +20 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/.gitignore +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/CLAUDE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/GOAL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/LICENSE +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/MANIFEST.in +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/README.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/agent.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/block_log.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/board_service.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/brain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/claim.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/client.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/comments.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/dao.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/db.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/deps.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/drive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/events.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/filelock.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/freshness.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/gates.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/goal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/context.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/models.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/render.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/health/units.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/hooks.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/interactive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/models.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/network.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/notify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/openapi.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/parentage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/plans.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/progress.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/release_window.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/reports.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/review.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/self_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/smoke.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/split_work.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/test_author.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/test_report.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/usage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/install-agent.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/pyproject.toml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/setup.cfg +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/conftest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_db.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_events.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_init.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_models.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_network.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_review.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_session.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_split.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.197}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -608,6 +608,7 @@ tests/test_refine_chat.py
|
|
|
608
608
|
tests/test_release_cordon_2101.py
|
|
609
609
|
tests/test_release_cordon_daemon_leads_2176.py
|
|
610
610
|
tests/test_release_cordon_deadlock_2240.py
|
|
611
|
+
tests/test_release_cordon_stuck_2490.py
|
|
611
612
|
tests/test_release_propagate.py
|
|
612
613
|
tests/test_release_unified_1242.py
|
|
613
614
|
tests/test_release_verify.py
|
{code_coordinator-0.5.196 → code_coordinator-0.5.197}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -670,6 +670,7 @@
|
|
|
670
670
|
"tests/test_release_cordon_2101.py",
|
|
671
671
|
"tests/test_release_cordon_daemon_leads_2176.py",
|
|
672
672
|
"tests/test_release_cordon_deadlock_2240.py",
|
|
673
|
+
"tests/test_release_cordon_stuck_2490.py",
|
|
673
674
|
"tests/test_release_propagate.py",
|
|
674
675
|
"tests/test_release_unified_1242.py",
|
|
675
676
|
"tests/test_release_verify.py",
|
|
@@ -1354,6 +1354,7 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
|
|
|
1354
1354
|
outcome.cooling_seconds = plan.cooling_seconds
|
|
1355
1355
|
outcome.collateral_spared = list(plan.collateral_spared)
|
|
1356
1356
|
outcome.blocked_behind = plan.blocked_behind
|
|
1357
|
+
outcome.stuck_in_cooldown = list(plan.stuck_in_cooldown)
|
|
1357
1358
|
if plan.released is not None:
|
|
1358
1359
|
outcome.released = plan.released.to_dict()
|
|
1359
1360
|
# stderr as well as stdout: on the timer host this line IS the
|
|
@@ -2148,8 +2149,18 @@ def release_cordon(
|
|
|
2148
2149
|
)
|
|
2149
2150
|
)
|
|
2150
2151
|
return
|
|
2152
|
+
# #2490: hosts the newest propagate run flagged as behind, idle, and
|
|
2153
|
+
# left uncordoned only because the #2240 cooldown is suppressing new
|
|
2154
|
+
# cordons. These are exactly the machines an operator would otherwise
|
|
2155
|
+
# have to notice by hand (`coord status` showing `online • idle` on a
|
|
2156
|
+
# host that's actually stuck on an old version) — surface them even when
|
|
2157
|
+
# `active` is empty, since a stuck host is by definition NOT cordoned.
|
|
2158
|
+
stuck_hosts, stuck_target = _stuck_hosts_from_journal()
|
|
2151
2159
|
if not active:
|
|
2152
|
-
|
|
2160
|
+
if stuck_hosts:
|
|
2161
|
+
_echo_stuck_hosts(stuck_hosts, stuck_target)
|
|
2162
|
+
else:
|
|
2163
|
+
click.echo("no machines are cordoned — the fleet is free to take work")
|
|
2153
2164
|
return
|
|
2154
2165
|
for name, record in sorted(active.items()):
|
|
2155
2166
|
remaining = max(0.0, record.expires_at - now) / 60.0
|
|
@@ -2180,6 +2191,8 @@ def release_cordon(
|
|
|
2180
2191
|
f"`coord release propagate` releases it by itself after "
|
|
2181
2192
|
f"{rc.DEFAULT_MAX_DEFERRALS}."
|
|
2182
2193
|
)
|
|
2194
|
+
if stuck_hosts:
|
|
2195
|
+
_echo_stuck_hosts(stuck_hosts, stuck_target)
|
|
2183
2196
|
click.echo(
|
|
2184
2197
|
f"\nclear one with `coord release cordon --clear <machine>` "
|
|
2185
2198
|
f"(default lifetime {rc.DEFAULT_TTL_SECONDS / 60:.0f}m — a cordon "
|
|
@@ -2197,6 +2210,59 @@ def _read_propagation_records() -> list[dict]:
|
|
|
2197
2210
|
return []
|
|
2198
2211
|
|
|
2199
2212
|
|
|
2213
|
+
def _stuck_hosts_from_journal() -> tuple[list[str], str | None]:
|
|
2214
|
+
"""Hosts the NEWEST propagate run flagged as stuck-in-cooldown (#2490).
|
|
2215
|
+
|
|
2216
|
+
``CordonPlan.stuck_in_cooldown`` (mirrored onto ``CordonOutcome`` and
|
|
2217
|
+
journalled under a run's ``cordons`` key) names behind, idle hosts a run
|
|
2218
|
+
left uncordoned only because the #2240 deadlock-release cooldown is
|
|
2219
|
+
still active — the gap the issue is about: nothing gave such a host a
|
|
2220
|
+
signal or a path back to rolling for up to the cooldown's full length.
|
|
2221
|
+
|
|
2222
|
+
Only the single newest record counts, deliberately: this is a
|
|
2223
|
+
point-in-time reading ("as of the last tick"), and a host named in an
|
|
2224
|
+
older record may since have gone busy, rolled, or had its cooldown
|
|
2225
|
+
lift — reporting it from a stale record would be a false alarm, which is
|
|
2226
|
+
exactly the kind of noise this fleet already has too much of. No
|
|
2227
|
+
journal (a thin client, or a host that has never run propagate)
|
|
2228
|
+
degrades to nothing rather than raising — mirrors every other reader of
|
|
2229
|
+
this journal in this module.
|
|
2230
|
+
"""
|
|
2231
|
+
try:
|
|
2232
|
+
records = _read_propagation_records()
|
|
2233
|
+
except Exception: # noqa: BLE001 — never load-bearing
|
|
2234
|
+
return [], None
|
|
2235
|
+
if not records:
|
|
2236
|
+
return [], None
|
|
2237
|
+
newest = records[-1]
|
|
2238
|
+
if not isinstance(newest, dict):
|
|
2239
|
+
return [], None
|
|
2240
|
+
cordons = newest.get("cordons")
|
|
2241
|
+
if not isinstance(cordons, dict):
|
|
2242
|
+
return [], None
|
|
2243
|
+
stuck = cordons.get("stuck_in_cooldown") or []
|
|
2244
|
+
if not isinstance(stuck, list):
|
|
2245
|
+
return [], None
|
|
2246
|
+
target = newest.get("target_version")
|
|
2247
|
+
return [str(h) for h in stuck], (str(target) if target else None)
|
|
2248
|
+
|
|
2249
|
+
|
|
2250
|
+
def _echo_stuck_hosts(stuck_hosts: list[str], stuck_target: str | None) -> None:
|
|
2251
|
+
"""The #2490 notice both branches of ``release_cordon`` share.
|
|
2252
|
+
|
|
2253
|
+
One line per host, each naming its own override command — the format
|
|
2254
|
+
the issue itself asks for: "precision: 18m behind v0.5.192, idle, cordon
|
|
2255
|
+
suppressed by cooldown (#2240) — consider `coord agent update --machine
|
|
2256
|
+
precision`."
|
|
2257
|
+
"""
|
|
2258
|
+
version = f"v{stuck_target}" if stuck_target else "the release"
|
|
2259
|
+
click.echo(f"\n! STUCK (#2490): behind {version}, idle, cordon suppressed "
|
|
2260
|
+
"by the #2240 deadlock-release cooldown — no automatic path "
|
|
2261
|
+
"back to rolling until it lifts on its own:")
|
|
2262
|
+
for host in sorted(stuck_hosts):
|
|
2263
|
+
click.echo(f" ! {host}: consider `coord agent update --machine {host}`")
|
|
2264
|
+
|
|
2265
|
+
|
|
2200
2266
|
@release_group.command(
|
|
2201
2267
|
"rollback",
|
|
2202
2268
|
help=(
|
|
@@ -55,6 +55,30 @@ def _cordon_stall_suffix(cordons: dict) -> str:
|
|
|
55
55
|
return f" ({described})" if described else ""
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
def _stuck_in_cooldown_hosts() -> dict[str, str | None]:
|
|
59
|
+
"""Machine name -> target version, for hosts stuck-in-cooldown (#2490).
|
|
60
|
+
|
|
61
|
+
Thin wrapper around :func:`coord.commands.release._stuck_hosts_from_journal`
|
|
62
|
+
— same journal, same "newest record only" reading, reused rather than
|
|
63
|
+
reimplemented. A host in this dict is behind the target version, was
|
|
64
|
+
idle as of the last `coord release propagate` tick, and is NOT cordoned
|
|
65
|
+
(the #2240 cooldown is suppressing it) — which is exactly why it shows
|
|
66
|
+
up everywhere else in this command as a flatly ordinary `online • idle`.
|
|
67
|
+
That silence is the whole finding of #2490: a human noticed only because
|
|
68
|
+
they happened to be watching `coord status` themselves.
|
|
69
|
+
|
|
70
|
+
Degrades to ``{}`` on any error (no journal, an unreadable one, a thin
|
|
71
|
+
client) — never load-bearing, same contract as `_cordon_stall_suffix`.
|
|
72
|
+
"""
|
|
73
|
+
from coord.commands.release import _stuck_hosts_from_journal # noqa: PLC0415
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
hosts, target = _stuck_hosts_from_journal()
|
|
77
|
+
except Exception: # noqa: BLE001 — a status render must never fail on this
|
|
78
|
+
return {}
|
|
79
|
+
return {h: target for h in hosts}
|
|
80
|
+
|
|
81
|
+
|
|
58
82
|
def _live_advisory_entries(
|
|
59
83
|
entries: list[dict],
|
|
60
84
|
cfg: "Config",
|
|
@@ -187,6 +211,9 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
|
|
|
187
211
|
# same, which is why the 70-minute stall was invisible.
|
|
188
212
|
cordon_stall = _cordon_stall_suffix(cordons)
|
|
189
213
|
quiet_windows = effective_quiet_hours(cfg.machines)
|
|
214
|
+
# #2490: hosts the last propagate run flagged as behind + idle + stuck
|
|
215
|
+
# behind an active #2240 cooldown — see `_stuck_in_cooldown_hosts`.
|
|
216
|
+
stuck_in_cooldown = _stuck_in_cooldown_hosts()
|
|
190
217
|
|
|
191
218
|
statuses = check_all(machines, timeout=timeout)
|
|
192
219
|
agent_completed: dict[str, dict] = {}
|
|
@@ -314,6 +341,22 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
|
|
|
314
341
|
for repo_name, reason in degraded.items():
|
|
315
342
|
click.echo(f" ⚠ degraded: {repo_name} — {reason}")
|
|
316
343
|
|
|
344
|
+
# #2490: this host is behind the release, was idle last tick, and
|
|
345
|
+
# nothing is cordoning it because a #2240 deadlock-release cooldown
|
|
346
|
+
# is suppressing all new cordons fleet-wide. Without this line the
|
|
347
|
+
# machine above reads as a plain `online • idle` — indistinguishable
|
|
348
|
+
# from a machine with nothing to do, which is exactly how the
|
|
349
|
+
# 2026-08-20 incident went unnoticed for the length of the cooldown.
|
|
350
|
+
if m.name in stuck_in_cooldown:
|
|
351
|
+
stuck_target = stuck_in_cooldown[m.name]
|
|
352
|
+
stuck_version = f"v{stuck_target}" if stuck_target else "the release"
|
|
353
|
+
click.echo(
|
|
354
|
+
f" ⚠ STUCK: behind {stuck_version} and idle, but cordoning "
|
|
355
|
+
"is suppressed by an active #2240 deadlock-release cooldown "
|
|
356
|
+
"(#2490) — no automatic path back to rolling until it lifts; "
|
|
357
|
+
f"consider `coord agent update --machine {m.name}`"
|
|
358
|
+
)
|
|
359
|
+
|
|
317
360
|
if status_result and status_result.ok and status_result.data:
|
|
318
361
|
for entry in status_result.data.get("active", []):
|
|
319
362
|
progress = entry.get("progress")
|
|
@@ -658,6 +658,17 @@ class CordonPlan:
|
|
|
658
658
|
#: exactly when `collateral_spared` is non-empty. The single fact that
|
|
659
659
|
#: would have turned a 40-minute puzzle into one line of output.
|
|
660
660
|
blocked_behind: str | None = None
|
|
661
|
+
#: #2490: hosts that are BEHIND *target_version*, have no busy signal of
|
|
662
|
+
#: their own this run (idle), and are not being cordoned only because an
|
|
663
|
+
#: unexpired deadlock-release cooldown is suppressing all new cordons —
|
|
664
|
+
#: set exactly when ``cooling_seconds > 0``. This is the gap the issue
|
|
665
|
+
#: names: a host in this state has no automatic path back to rolling for
|
|
666
|
+
#: up to the cooldown's full length, and nothing surfaced that it was
|
|
667
|
+
#: sitting there idle, behind, and unflagged. Reported separately from
|
|
668
|
+
#: ``collateral_spared`` (blocked behind a busy daemon host — a different
|
|
669
|
+
#: reason a behind host stays uncordoned) so each surface can name the
|
|
670
|
+
#: actual cause instead of collapsing both into "not cordoned".
|
|
671
|
+
stuck_in_cooldown: tuple[str, ...] = ()
|
|
661
672
|
|
|
662
673
|
@property
|
|
663
674
|
def empty(self) -> bool:
|
|
@@ -668,6 +679,7 @@ class CordonPlan:
|
|
|
668
679
|
or self.expired
|
|
669
680
|
or self.released
|
|
670
681
|
or self.collateral_spared
|
|
682
|
+
or self.stuck_in_cooldown
|
|
671
683
|
)
|
|
672
684
|
|
|
673
685
|
def to_dict(self) -> dict:
|
|
@@ -681,6 +693,7 @@ class CordonPlan:
|
|
|
681
693
|
"cooling_seconds": self.cooling_seconds,
|
|
682
694
|
"collateral_spared": list(self.collateral_spared),
|
|
683
695
|
"blocked_behind": self.blocked_behind,
|
|
696
|
+
"stuck_in_cooldown": list(self.stuck_in_cooldown),
|
|
684
697
|
}
|
|
685
698
|
|
|
686
699
|
def render(self) -> list[str]:
|
|
@@ -718,6 +731,13 @@ class CordonPlan:
|
|
|
718
731
|
"release (#2240) is still letting the fleet work; nothing was "
|
|
719
732
|
"cordoned this run"
|
|
720
733
|
)
|
|
734
|
+
for host in self.stuck_in_cooldown:
|
|
735
|
+
lines.append(
|
|
736
|
+
f" ! STUCK: {host} is behind and idle, but cordoning is "
|
|
737
|
+
"suppressed by the deadlock-release cooldown above (#2490) — "
|
|
738
|
+
f"it has no automatic path back to rolling until the cooldown "
|
|
739
|
+
f"lifts. Consider `coord agent update --machine {host}`."
|
|
740
|
+
)
|
|
721
741
|
for esc in self.escalations:
|
|
722
742
|
lines.append(f" ! {esc.message}")
|
|
723
743
|
return lines
|
|
@@ -880,6 +900,21 @@ def plan_cordons(
|
|
|
880
900
|
pressure = pressure or DeferralPressure()
|
|
881
901
|
cooling = pressure.cooling_for(now, release_cooldown)
|
|
882
902
|
if cooling > 0:
|
|
903
|
+
# #2490: a behind host with no busy signal of its own has nothing
|
|
904
|
+
# left holding it back except this cooldown — it is idle, it is
|
|
905
|
+
# behind, and it will sit exactly like that until the cooldown
|
|
906
|
+
# lifts (up to `release_cooldown` seconds) with no cordon and,
|
|
907
|
+
# before this, no signal anywhere that it needs attention.
|
|
908
|
+
# `collateral` hosts are excluded: those are uncordoned for an
|
|
909
|
+
# unrelated reason (blocked behind a busy daemon host) that already
|
|
910
|
+
# has its own name (`collateral_spared`/`blocked_behind`).
|
|
911
|
+
stuck = tuple(
|
|
912
|
+
sorted(
|
|
913
|
+
host
|
|
914
|
+
for host in (drift.behind - collateral)
|
|
915
|
+
if not (busy_reasons or {}).get(host)
|
|
916
|
+
)
|
|
917
|
+
)
|
|
883
918
|
return CordonPlan(
|
|
884
919
|
uncordon=to_uncordon,
|
|
885
920
|
expired=expired,
|
|
@@ -887,6 +922,7 @@ def plan_cordons(
|
|
|
887
922
|
unknown=tuple(sorted(drift.undecided & set(live))),
|
|
888
923
|
collateral_spared=tuple(sorted(collateral)),
|
|
889
924
|
blocked_behind=blocked_behind,
|
|
925
|
+
stuck_in_cooldown=stuck,
|
|
890
926
|
)
|
|
891
927
|
if max_deferrals > 0 and pressure.consecutive >= max_deferrals:
|
|
892
928
|
return CordonPlan(
|
|
@@ -984,6 +1020,12 @@ class CordonOutcome:
|
|
|
984
1020
|
#: #2176: the daemon host `collateral_spared` was spared on account of.
|
|
985
1021
|
#: Mirrors `CordonPlan.blocked_behind`.
|
|
986
1022
|
blocked_behind: str | None = None
|
|
1023
|
+
#: #2490: mirrors `CordonPlan.stuck_in_cooldown` — behind, idle hosts this
|
|
1024
|
+
#: run left uncordoned only because the #2240 deadlock cooldown is still
|
|
1025
|
+
#: active. Journalled (not just printed) so a read-only surface like
|
|
1026
|
+
#: `coord status` can flag them without recomputing `plan_cordons` itself
|
|
1027
|
+
#: — see `coord.commands.status._stuck_in_cooldown_hosts`.
|
|
1028
|
+
stuck_in_cooldown: list[str] = field(default_factory=list)
|
|
987
1029
|
|
|
988
1030
|
def to_dict(self) -> dict:
|
|
989
1031
|
return {
|
|
@@ -999,4 +1041,5 @@ class CordonOutcome:
|
|
|
999
1041
|
"max_deferrals": self.max_deferrals,
|
|
1000
1042
|
"collateral_spared": list(self.collateral_spared),
|
|
1001
1043
|
"blocked_behind": self.blocked_behind,
|
|
1044
|
+
"stuck_in_cooldown": list(self.stuck_in_cooldown),
|
|
1002
1045
|
}
|
|
@@ -1294,6 +1294,14 @@ def render_record(record: PropagationRecord | Mapping[str, Any]) -> list[str]:
|
|
|
1294
1294
|
" cordons held off (post-release cooldown, #2240): "
|
|
1295
1295
|
f"{float(cordons['cooling_seconds']) / 60.0:.0f}m left"
|
|
1296
1296
|
)
|
|
1297
|
+
# #2490: name the hosts that were behind and idle but left uncordoned
|
|
1298
|
+
# purely because of the cooldown above — the gap that let `precision`
|
|
1299
|
+
# sit stuck for 30 minutes with no automatic path back to rolling.
|
|
1300
|
+
if cordons.get("stuck_in_cooldown"):
|
|
1301
|
+
lines.append(
|
|
1302
|
+
" ! STUCK (idle, behind, cooldown-suppressed, #2490): "
|
|
1303
|
+
+ ", ".join(cordons["stuck_in_cooldown"])
|
|
1304
|
+
)
|
|
1297
1305
|
for esc in cordons.get("escalated") or []:
|
|
1298
1306
|
lines.append(f" ! {esc.get('message') or esc}")
|
|
1299
1307
|
for err in cordons.get("errors") or []:
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"""A host stuck behind during a #2240 deadlock-release cooldown has no
|
|
2
|
+
automatic path back to rolling — and, until this fix, no signal anywhere
|
|
3
|
+
either (#2490).
|
|
4
|
+
|
|
5
|
+
Incident, 2026-08-20: `precision` needed v0.5.192, kept cycling
|
|
6
|
+
busy→fail→idle→busy on the drive queue (the exact churn pattern that trips
|
|
7
|
+
`max_deferrals`), self-released its cordon, and sat on the broken version —
|
|
8
|
+
uncordoned, receiving normal dispatch, failing every attempt, genuinely idle
|
|
9
|
+
at several points — for the length of the 30-minute cooldown. Nothing
|
|
10
|
+
surfaced it: `coord status` showed a flatly ordinary `online • idle`, and
|
|
11
|
+
`coord release propagate` refused to even attempt cordoning it ("nothing was
|
|
12
|
+
cordoned this run"). An operator noticed only because a human happened to be
|
|
13
|
+
watching `coord status`.
|
|
14
|
+
|
|
15
|
+
Every test here fails against the pre-fix code: `CordonPlan` had no
|
|
16
|
+
`stuck_in_cooldown` field, `CordonOutcome` did not journal one, and neither
|
|
17
|
+
`coord release cordon` nor `coord status` read anything back out of the
|
|
18
|
+
journal for this case — a behind, idle host during an active cooldown
|
|
19
|
+
produced no cordon and no signal at all, anywhere.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
import pytest
|
|
27
|
+
from click.testing import CliRunner
|
|
28
|
+
|
|
29
|
+
from coord import release_cordon as rc
|
|
30
|
+
from coord import release_propagate as rp
|
|
31
|
+
from coord.cli import main
|
|
32
|
+
from coord.commands import release as release_cmd
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.fixture()
|
|
36
|
+
def tmp_home(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path:
|
|
37
|
+
monkeypatch.setenv("HOME", str(tmp_path))
|
|
38
|
+
(tmp_path / ".coord").mkdir()
|
|
39
|
+
return tmp_path
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _stub_state_dir(monkeypatch, tmp_path):
|
|
43
|
+
d = tmp_path / "state"
|
|
44
|
+
d.mkdir(exist_ok=True)
|
|
45
|
+
monkeypatch.setattr(release_cmd, "_state_dir", lambda: d)
|
|
46
|
+
return d
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# ══════════════════════════════════════════════════════════════════════════
|
|
50
|
+
# `plan_cordons`: the pure acceptance criterion the issue names directly —
|
|
51
|
+
# "construct a DeferralPressure that has just triggered a deadlock release
|
|
52
|
+
# (cooldown active), a host that is behind the target version AND idle, and
|
|
53
|
+
# assert that something ... flags it."
|
|
54
|
+
# ══════════════════════════════════════════════════════════════════════════
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_a_behind_idle_host_is_flagged_during_the_cooldown() -> None:
|
|
58
|
+
plan = rc.plan_cordons(
|
|
59
|
+
target_version="0.5.192",
|
|
60
|
+
host_versions={"precision": "0.5.191"},
|
|
61
|
+
existing={},
|
|
62
|
+
now=1200.0,
|
|
63
|
+
pressure=rc.DeferralPressure(consecutive=0, last_release_at=1000.0),
|
|
64
|
+
busy_reasons={},
|
|
65
|
+
)
|
|
66
|
+
assert plan.cooling_seconds > 0, "the cooldown must still be active for this test"
|
|
67
|
+
assert plan.cordon == (), "the cooldown must still be suppressing new cordons"
|
|
68
|
+
assert plan.stuck_in_cooldown == ("precision",)
|
|
69
|
+
assert any("STUCK" in line and "precision" in line for line in plan.render())
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_a_busy_behind_host_is_not_flagged_stuck() -> None:
|
|
73
|
+
"""A host that IS busy is not sitting idle for lack of a cordon — it has
|
|
74
|
+
its own work in flight, which is the ordinary "cordon deferred" case,
|
|
75
|
+
not the #2490 gap."""
|
|
76
|
+
plan = rc.plan_cordons(
|
|
77
|
+
target_version="0.5.192",
|
|
78
|
+
host_versions={"precision": "0.5.191"},
|
|
79
|
+
existing={},
|
|
80
|
+
now=1200.0,
|
|
81
|
+
pressure=rc.DeferralPressure(consecutive=0, last_release_at=1000.0),
|
|
82
|
+
busy_reasons={"precision": "dispatched: issue #2481"},
|
|
83
|
+
)
|
|
84
|
+
assert plan.stuck_in_cooldown == ()
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def test_a_current_host_is_never_flagged_stuck() -> None:
|
|
88
|
+
plan = rc.plan_cordons(
|
|
89
|
+
target_version="0.5.192",
|
|
90
|
+
host_versions={"precision": "0.5.192"},
|
|
91
|
+
existing={},
|
|
92
|
+
now=1200.0,
|
|
93
|
+
pressure=rc.DeferralPressure(consecutive=0, last_release_at=1000.0),
|
|
94
|
+
busy_reasons={},
|
|
95
|
+
)
|
|
96
|
+
assert plan.stuck_in_cooldown == ()
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def test_a_collateral_host_is_not_double_reported(monkeypatch=None) -> None:
|
|
100
|
+
"""A host spared because it's blocked behind a busy daemon host already
|
|
101
|
+
has its own name for the reason (`collateral_spared`/`blocked_behind`) —
|
|
102
|
+
it must not also show up as `stuck_in_cooldown`, which would give an
|
|
103
|
+
operator two different explanations for the same machine."""
|
|
104
|
+
plan = rc.plan_cordons(
|
|
105
|
+
target_version="0.5.192",
|
|
106
|
+
host_versions={"daemon": "0.5.191", "elitebook": "0.5.191"},
|
|
107
|
+
existing={},
|
|
108
|
+
now=1200.0,
|
|
109
|
+
pressure=rc.DeferralPressure(consecutive=0, last_release_at=1000.0),
|
|
110
|
+
busy_reasons={"daemon": "dispatched: issue #1"},
|
|
111
|
+
daemon_host="daemon",
|
|
112
|
+
)
|
|
113
|
+
assert plan.collateral_spared == ("elitebook",)
|
|
114
|
+
assert "elitebook" not in plan.stuck_in_cooldown
|
|
115
|
+
# the daemon host itself IS busy, so it is not idle either
|
|
116
|
+
assert "daemon" not in plan.stuck_in_cooldown
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def test_outside_a_cooldown_nothing_is_flagged_stuck() -> None:
|
|
120
|
+
"""Ordinary drain: the host gets cordoned outright, so there is nothing
|
|
121
|
+
to flag — `stuck_in_cooldown` is specifically the cooldown-suppressed
|
|
122
|
+
case."""
|
|
123
|
+
plan = rc.plan_cordons(
|
|
124
|
+
target_version="0.5.192",
|
|
125
|
+
host_versions={"precision": "0.5.191"},
|
|
126
|
+
existing={},
|
|
127
|
+
now=100.0,
|
|
128
|
+
pressure=rc.DeferralPressure(),
|
|
129
|
+
busy_reasons={},
|
|
130
|
+
)
|
|
131
|
+
assert plan.stuck_in_cooldown == ()
|
|
132
|
+
assert [c.machine for c in plan.cordon] == ["precision"]
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def test_to_dict_and_outcome_carry_the_field() -> None:
|
|
136
|
+
plan = rc.plan_cordons(
|
|
137
|
+
target_version="0.5.192",
|
|
138
|
+
host_versions={"precision": "0.5.191"},
|
|
139
|
+
existing={},
|
|
140
|
+
now=1200.0,
|
|
141
|
+
pressure=rc.DeferralPressure(consecutive=0, last_release_at=1000.0),
|
|
142
|
+
busy_reasons={},
|
|
143
|
+
)
|
|
144
|
+
assert plan.to_dict()["stuck_in_cooldown"] == ["precision"]
|
|
145
|
+
assert not plan.empty, "a stuck host is actionable — never silently 'empty'"
|
|
146
|
+
|
|
147
|
+
outcome = rc.CordonOutcome()
|
|
148
|
+
outcome.stuck_in_cooldown = list(plan.stuck_in_cooldown)
|
|
149
|
+
assert outcome.to_dict()["stuck_in_cooldown"] == ["precision"]
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# ══════════════════════════════════════════════════════════════════════════
|
|
153
|
+
# The journal round trip: `_apply_cordons` writes it, `_stuck_hosts_from_
|
|
154
|
+
# journal` reads it back — the same shape `coord status` and `coord release
|
|
155
|
+
# cordon` both consume.
|
|
156
|
+
# ══════════════════════════════════════════════════════════════════════════
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def test_stuck_hosts_from_journal_reads_the_newest_record(
|
|
160
|
+
tmp_home, monkeypatch, tmp_path
|
|
161
|
+
) -> None:
|
|
162
|
+
state_dir = _stub_state_dir(monkeypatch, tmp_path)
|
|
163
|
+
rp.append_record(
|
|
164
|
+
state_dir,
|
|
165
|
+
rp.PropagationRecord(
|
|
166
|
+
started_at=1.0, target_version="0.5.192",
|
|
167
|
+
status=rp.STATUS_DEFERRED,
|
|
168
|
+
cordons={"stuck_in_cooldown": ["precision"]},
|
|
169
|
+
),
|
|
170
|
+
)
|
|
171
|
+
hosts, target = release_cmd._stuck_hosts_from_journal()
|
|
172
|
+
assert hosts == ["precision"]
|
|
173
|
+
assert target == "0.5.192"
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def test_stuck_hosts_from_journal_only_trusts_the_newest_record(
|
|
177
|
+
tmp_home, monkeypatch, tmp_path
|
|
178
|
+
) -> None:
|
|
179
|
+
"""A host named in an OLDER record may since have gone busy, rolled, or
|
|
180
|
+
had its cooldown lift — reporting it would be a false alarm."""
|
|
181
|
+
state_dir = _stub_state_dir(monkeypatch, tmp_path)
|
|
182
|
+
rp.append_record(
|
|
183
|
+
state_dir,
|
|
184
|
+
rp.PropagationRecord(
|
|
185
|
+
started_at=1.0, target_version="0.5.192",
|
|
186
|
+
status=rp.STATUS_DEFERRED,
|
|
187
|
+
cordons={"stuck_in_cooldown": ["precision"]},
|
|
188
|
+
),
|
|
189
|
+
)
|
|
190
|
+
rp.append_record(
|
|
191
|
+
state_dir,
|
|
192
|
+
rp.PropagationRecord(
|
|
193
|
+
started_at=2.0, target_version="0.5.192",
|
|
194
|
+
status=rp.STATUS_DEFERRED,
|
|
195
|
+
cordons={"stuck_in_cooldown": []},
|
|
196
|
+
),
|
|
197
|
+
)
|
|
198
|
+
hosts, _target = release_cmd._stuck_hosts_from_journal()
|
|
199
|
+
assert hosts == []
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def test_no_journal_reads_as_nothing_stuck(tmp_home, monkeypatch, tmp_path) -> None:
|
|
203
|
+
_stub_state_dir(monkeypatch, tmp_path)
|
|
204
|
+
assert release_cmd._stuck_hosts_from_journal() == ([], None)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
# ══════════════════════════════════════════════════════════════════════════
|
|
208
|
+
# `coord release cordon`: the surface an operator lands on once they've
|
|
209
|
+
# noticed the fleet is quiet. Pre-fix, this printed "no machines are
|
|
210
|
+
# cordoned — the fleet is free to take work" for exactly the incident above
|
|
211
|
+
# — technically true and completely misleading.
|
|
212
|
+
# ══════════════════════════════════════════════════════════════════════════
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def test_the_cordon_listing_flags_a_stuck_host_even_with_none_cordoned(
|
|
216
|
+
tmp_home, monkeypatch, tmp_path
|
|
217
|
+
) -> None:
|
|
218
|
+
_stub_state_dir(monkeypatch, tmp_path)
|
|
219
|
+
rp.append_record(
|
|
220
|
+
Path(tmp_path / "state"),
|
|
221
|
+
rp.PropagationRecord(
|
|
222
|
+
started_at=1.0, target_version="0.5.192",
|
|
223
|
+
status=rp.STATUS_DEFERRED,
|
|
224
|
+
cordons={"stuck_in_cooldown": ["precision"]},
|
|
225
|
+
),
|
|
226
|
+
)
|
|
227
|
+
listed = CliRunner().invoke(main, ["release", "cordon"])
|
|
228
|
+
assert listed.exit_code == 0, listed.output
|
|
229
|
+
assert "STUCK" in listed.output
|
|
230
|
+
assert "precision" in listed.output
|
|
231
|
+
assert "v0.5.192" in listed.output
|
|
232
|
+
assert "#2490" in listed.output
|
|
233
|
+
assert "coord agent update --machine precision" in listed.output
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def test_the_cordon_listing_is_quiet_when_nothing_is_stuck(
|
|
237
|
+
tmp_home, monkeypatch, tmp_path
|
|
238
|
+
) -> None:
|
|
239
|
+
_stub_state_dir(monkeypatch, tmp_path)
|
|
240
|
+
listed = CliRunner().invoke(main, ["release", "cordon"])
|
|
241
|
+
assert listed.exit_code == 0, listed.output
|
|
242
|
+
assert "STUCK" not in listed.output
|
|
243
|
+
assert "no machines are cordoned" in listed.output
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
# ══════════════════════════════════════════════════════════════════════════
|
|
247
|
+
# `coord status`'s own reader — same journal, same helper underneath.
|
|
248
|
+
# ══════════════════════════════════════════════════════════════════════════
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def test_status_surface_reads_the_stuck_hosts(tmp_home, monkeypatch, tmp_path) -> None:
|
|
252
|
+
from coord.commands.status import _stuck_in_cooldown_hosts
|
|
253
|
+
|
|
254
|
+
state_dir = _stub_state_dir(monkeypatch, tmp_path)
|
|
255
|
+
rp.append_record(
|
|
256
|
+
state_dir,
|
|
257
|
+
rp.PropagationRecord(
|
|
258
|
+
started_at=1.0, target_version="0.5.192",
|
|
259
|
+
status=rp.STATUS_DEFERRED,
|
|
260
|
+
cordons={"stuck_in_cooldown": ["precision"]},
|
|
261
|
+
),
|
|
262
|
+
)
|
|
263
|
+
assert _stuck_in_cooldown_hosts() == {"precision": "0.5.192"}
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def test_status_surface_degrades_to_empty_with_no_journal(
|
|
267
|
+
tmp_home, monkeypatch, tmp_path
|
|
268
|
+
) -> None:
|
|
269
|
+
from coord.commands.status import _stuck_in_cooldown_hosts
|
|
270
|
+
|
|
271
|
+
_stub_state_dir(monkeypatch, tmp_path)
|
|
272
|
+
assert _stuck_in_cooldown_hosts() == {}
|
|
@@ -664,6 +664,26 @@ def test_a_real_roll_is_never_collapsed():
|
|
|
664
664
|
assert "verify: ok" in out
|
|
665
665
|
|
|
666
666
|
|
|
667
|
+
def test_a_stuck_in_cooldown_host_is_named_in_history():
|
|
668
|
+
"""#2490: a host that's behind, idle, and left uncordoned only by an
|
|
669
|
+
active #2240 cooldown must be visible in `coord release history`, not
|
|
670
|
+
just in the raw JSON — this is the surface an operator reaches for after
|
|
671
|
+
`coord status` looked ordinary."""
|
|
672
|
+
records = [
|
|
673
|
+
{"started_at": 1.0, "status": rp.STATUS_DEFERRED,
|
|
674
|
+
"target_version": "0.5.192",
|
|
675
|
+
"quiescence": {"reason": "busy"},
|
|
676
|
+
"cordons": {"cooling_seconds": 900.0, "stuck_in_cooldown": ["precision"]}},
|
|
677
|
+
{"started_at": 2.0, "status": rp.STATUS_VERIFIED, "target_version": "0.4.111",
|
|
678
|
+
"lanes": [{"lane": "python", "host": "dellserver", "ok": True, "detail": "now v0.4.111"}],
|
|
679
|
+
"verification": {"severity": "ok", "findings": []}},
|
|
680
|
+
]
|
|
681
|
+
out = rp.render_history(records)
|
|
682
|
+
assert "STUCK" in out
|
|
683
|
+
assert "precision" in out
|
|
684
|
+
assert "#2490" in out
|
|
685
|
+
|
|
686
|
+
|
|
667
687
|
def test_a_rollback_is_rendered():
|
|
668
688
|
record = rp.PropagationRecord(
|
|
669
689
|
started_at=1.0, target_version="0.4.111", status=rp.STATUS_ROLLED_BACK,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|