code-coordinator 0.5.196__tar.gz → 0.5.200__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.200}/PKG-INFO +1 -1
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/release.py +67 -1
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/status.py +43 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/pipeline.py +62 -7
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/release_cordon.py +43 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/release_propagate.py +8 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_pipeline.py +96 -0
- code_coordinator-0.5.200/tests/test_release_cordon_stuck_2490.py +272 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_propagate.py +20 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/data.rs +49 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/dialogs.rs +54 -6
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/doc_tabs.rs +6 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/drive.rs +2 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/drive_queue.rs +2 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/escalation.rs +2 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/fixtures.rs +4 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/milestone_dag.rs +40 -3
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/mod.rs +19 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/pipeline.rs +55 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/render.rs +28 -2
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/reports.rs +4 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/settings_ui.rs +38 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/tests.rs +975 -3
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/types.rs +22 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/workspace.rs +2 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/.gitignore +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/CLAUDE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/GOAL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/LICENSE +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/MANIFEST.in +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/README.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agent.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/block_log.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/board_service.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/brain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/claim.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/client.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/comments.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dao.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/db.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/deps.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/drive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/events.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/filelock.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/freshness.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/gates.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/goal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/context.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/models.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/render.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/health/units.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/hooks.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/interactive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/models.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/network.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/notify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/openapi.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/parentage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/plans.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/progress.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/release_window.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/reports.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/review.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/self_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/smoke.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/split_work.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/test_author.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/test_report.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/usage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/install-agent.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/pyproject.toml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/setup.cfg +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/__init__.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/conftest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_db.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_events.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_init.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_models.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_network.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_session.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_split.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_state.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.196 → code_coordinator-0.5.200}/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.200}/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")
|
|
@@ -228,6 +228,17 @@ def compute_pipeline(
|
|
|
228
228
|
None,
|
|
229
229
|
)
|
|
230
230
|
|
|
231
|
+
# #2498: a review that came back "request-changes" must never read as
|
|
232
|
+
# mergeable, no matter what else is true about the assignment (including
|
|
233
|
+
# a stray `mq_entry` — see the `mq_entry is not None` branch below, and
|
|
234
|
+
# the unconditional "enqueue" gate this used to feed). Computed once here
|
|
235
|
+
# so both the stage-progression chain and the stage-status/gate-list
|
|
236
|
+
# logic further down share the same verdict check.
|
|
237
|
+
review_rejected = (
|
|
238
|
+
review_assignment is not None
|
|
239
|
+
and review_assignment.review_verdict == "request-changes"
|
|
240
|
+
)
|
|
241
|
+
|
|
231
242
|
# ── Determine current_stage ──────────────────────────────────────────────
|
|
232
243
|
current_stage: str
|
|
233
244
|
if assignment.status == "running":
|
|
@@ -251,7 +262,39 @@ def compute_pipeline(
|
|
|
251
262
|
current_stage = "merged"
|
|
252
263
|
elif assignment.status in ("done", "pending"):
|
|
253
264
|
# Evaluate from most advanced to least advanced.
|
|
254
|
-
|
|
265
|
+
# #2498: an `mq_entry` (queued/merging/merged) no longer trumps
|
|
266
|
+
# everything else when the linked review came back request-changes —
|
|
267
|
+
# fall through to the normal review/smoke evaluation below instead,
|
|
268
|
+
# so a rejected review keeps showing as blocked even if it was
|
|
269
|
+
# (incorrectly) enqueued before this fix, or by any other path that
|
|
270
|
+
# doesn't re-check the verdict.
|
|
271
|
+
#
|
|
272
|
+
# #2498 (review 1): a *genuine* smoke/test failure or an
|
|
273
|
+
# in-progress smoke assignment must still be checked, and still win,
|
|
274
|
+
# BEFORE `review_assignment` — those are real, distinct signals
|
|
275
|
+
# (an infra failure, or a smoke run that hasn't finished yet) and
|
|
276
|
+
# existing coverage (test_failed_smoke_assignment_does_not_fall_
|
|
277
|
+
# through_to_review) depends on a failed smoke assignment surfacing
|
|
278
|
+
# even when a review also completed.
|
|
279
|
+
#
|
|
280
|
+
# But `assignment.smoke_test == "pass"` (and the sibling
|
|
281
|
+
# "smoke_assignment done → treat as passed" branch) is a different
|
|
282
|
+
# kind of signal: per `coord/state.py:_record_test_verdict_local`
|
|
283
|
+
# (#1384), recording `test_state="passed"` always mirrors to
|
|
284
|
+
# `smoke_test="pass"` on this same work assignment — the default
|
|
285
|
+
# behaviour on every ordinary Test-gate pass, not an edge case — and
|
|
286
|
+
# `auto_loop.py`'s `test_precedes_review` gate requires exactly that
|
|
287
|
+
# mirrored "passed" state before it will ever dispatch a review. So
|
|
288
|
+
# by the time `review_assignment` exists at all, `smoke_test` is
|
|
289
|
+
# already "pass" essentially every time — meaning checking it before
|
|
290
|
+
# `review_assignment` resolved `current_stage` to "smoke_passed" and
|
|
291
|
+
# never reached the review branch at all, leaving `review_rejected`
|
|
292
|
+
# unenforced on the realistic "Test passed, then Review rejected"
|
|
293
|
+
# path. A dispatched review is definitionally more advanced than a
|
|
294
|
+
# merely-passed Test gate (Test precedes Review), so the "pass"
|
|
295
|
+
# branches move below the review check while the failure/running
|
|
296
|
+
# branches stay above it.
|
|
297
|
+
if mq_entry is not None and not review_rejected:
|
|
255
298
|
from coord.merge_queue import MERGED, MERGING
|
|
256
299
|
|
|
257
300
|
if mq_entry.state == MERGED:
|
|
@@ -260,8 +303,6 @@ def compute_pipeline(
|
|
|
260
303
|
current_stage = "merging"
|
|
261
304
|
else:
|
|
262
305
|
current_stage = "merge_ready"
|
|
263
|
-
elif assignment.smoke_test == "pass":
|
|
264
|
-
current_stage = "smoke_passed"
|
|
265
306
|
elif assignment.smoke_test == "fail":
|
|
266
307
|
current_stage = "smoke_failed"
|
|
267
308
|
elif smoke_assignment is not None and smoke_assignment.status in ("running", "pending"):
|
|
@@ -270,9 +311,6 @@ def compute_pipeline(
|
|
|
270
311
|
# Smoke assignment itself failed (infra failure) — not the same as
|
|
271
312
|
# the smoke *test* failing, but still unblocks the work assignment.
|
|
272
313
|
current_stage = "smoke_failed"
|
|
273
|
-
elif smoke_assignment is not None and smoke_assignment.status in ("done",):
|
|
274
|
-
# Smoke assignment completed but smoke_test not yet set — treat as passed.
|
|
275
|
-
current_stage = "smoke_passed"
|
|
276
314
|
elif review_assignment is not None:
|
|
277
315
|
if review_assignment.status in ("running", "pending", "finalizing"):
|
|
278
316
|
# #1566: "finalizing" is a review row whose agent finished but
|
|
@@ -288,6 +326,11 @@ def compute_pipeline(
|
|
|
288
326
|
current_stage = "review_failed"
|
|
289
327
|
else:
|
|
290
328
|
current_stage = "review_done"
|
|
329
|
+
elif assignment.smoke_test == "pass":
|
|
330
|
+
current_stage = "smoke_passed"
|
|
331
|
+
elif smoke_assignment is not None and smoke_assignment.status in ("done",):
|
|
332
|
+
# Smoke assignment completed but smoke_test not yet set — treat as passed.
|
|
333
|
+
current_stage = "smoke_passed"
|
|
291
334
|
else:
|
|
292
335
|
current_stage = "done"
|
|
293
336
|
else:
|
|
@@ -327,6 +370,12 @@ def compute_pipeline(
|
|
|
327
370
|
# This is the current stage.
|
|
328
371
|
if current_stage == "merged":
|
|
329
372
|
status = "completed" # final state, show as completed
|
|
373
|
+
elif current_stage == "review_done" and review_rejected:
|
|
374
|
+
# #2498: the review step finished, but a request-changes
|
|
375
|
+
# verdict means it did NOT clear the assignment for the next
|
|
376
|
+
# gate — show "active"/blocked, not a green "completed" that
|
|
377
|
+
# reads as "review passed."
|
|
378
|
+
status = "active"
|
|
330
379
|
elif current_stage in ("smoke_passed", "review_done"):
|
|
331
380
|
status = "completed" # sub-stage "done", ready for next gate
|
|
332
381
|
elif current_stage == "failed":
|
|
@@ -367,7 +416,13 @@ def compute_pipeline(
|
|
|
367
416
|
elif current_stage == "review_failed":
|
|
368
417
|
available_gates.append(PipelineGate("dispatch_review", "Dispatch Review", _EP))
|
|
369
418
|
elif current_stage == "review_done":
|
|
370
|
-
|
|
419
|
+
# #2498: only offer "Queue for Merge" when the review is approved or
|
|
420
|
+
# hasn't produced a verdict yet — a request-changes verdict must not
|
|
421
|
+
# be one click from the merge queue. `dispatch_fix` just below is
|
|
422
|
+
# already correctly gated the mirror-image way (only offered ON
|
|
423
|
+
# request-changes); this makes `enqueue` its proper complement.
|
|
424
|
+
if not review_rejected:
|
|
425
|
+
available_gates.append(PipelineGate("enqueue", "Queue for Merge", _EP))
|
|
371
426
|
if review_assignment is not None and review_assignment.review_posted_at is None:
|
|
372
427
|
available_gates.append(PipelineGate("post_findings", "Post Findings", _EP))
|
|
373
428
|
# Offer the phone a way to record a review verdict manually when the
|
|
@@ -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 []:
|
|
@@ -1787,3 +1787,99 @@ class TestDispatchFixGateForRequestChanges:
|
|
|
1787
1787
|
pv = compute_pipeline(work, board, [], _config())
|
|
1788
1788
|
gate_actions = {g.action for g in pv.available_gates}
|
|
1789
1789
|
assert "dispatch_fix" not in gate_actions
|
|
1790
|
+
|
|
1791
|
+
|
|
1792
|
+
class TestMergeQueueIgnoresRejectedReview:
|
|
1793
|
+
"""#2498: coord-web showed a request-changes review as mergeable once
|
|
1794
|
+
merge-queued — the top badge read "mergeable," the Review row in the
|
|
1795
|
+
gate-status list read green/"completed," and "Merge" was enabled,
|
|
1796
|
+
directly under a Review section whose own verdict said "Changes
|
|
1797
|
+
requested." Root cause was `current_stage`'s `mq_entry is not None`
|
|
1798
|
+
check firing unconditionally, before ever consulting
|
|
1799
|
+
`review_assignment.review_verdict` — and a second bug feeding it: the
|
|
1800
|
+
"enqueue" gate at review_done was offered unconditionally instead of
|
|
1801
|
+
being gated on the verdict the way `dispatch_fix` already was."""
|
|
1802
|
+
|
|
1803
|
+
def test_mq_entry_with_rejected_review_is_not_merge_ready(self) -> None:
|
|
1804
|
+
"""An mq_entry existing (e.g. from before this fix, or any other path
|
|
1805
|
+
that skipped the verdict check) must not make a request-changes
|
|
1806
|
+
assignment read as merge_ready/merging/merged."""
|
|
1807
|
+
work = _work(aid="work-1", status="done")
|
|
1808
|
+
rev = _review(of_aid="work-1", status="done")
|
|
1809
|
+
rev.review_verdict = "request-changes"
|
|
1810
|
+
mq = [_mq_entry(state=PENDING)]
|
|
1811
|
+
board = Board(completed=[work, rev])
|
|
1812
|
+
pv = compute_pipeline(work, board, mq, _config())
|
|
1813
|
+
|
|
1814
|
+
assert pv.current_stage not in ("merge_ready", "merging", "merged")
|
|
1815
|
+
assert pv.current_stage == "review_done"
|
|
1816
|
+
|
|
1817
|
+
gate_actions = {g.action for g in pv.available_gates}
|
|
1818
|
+
assert "merge" not in gate_actions
|
|
1819
|
+
assert "enqueue" not in gate_actions
|
|
1820
|
+
assert "dispatch_fix" in gate_actions
|
|
1821
|
+
|
|
1822
|
+
review = next(s for s in pv.stages if s.name == "review")
|
|
1823
|
+
assert review.status != "completed"
|
|
1824
|
+
|
|
1825
|
+
def test_review_done_rejected_does_not_offer_enqueue(self) -> None:
|
|
1826
|
+
"""Even with no mq_entry at all, "Queue for Merge" must not be
|
|
1827
|
+
offered on a request-changes verdict (the bug's proximate cause: a
|
|
1828
|
+
human — or an automated caller — one click from queueing rejected
|
|
1829
|
+
code)."""
|
|
1830
|
+
work = _work(aid="work-1", status="done")
|
|
1831
|
+
rev = _review(of_aid="work-1", status="done")
|
|
1832
|
+
rev.review_verdict = "request-changes"
|
|
1833
|
+
board = Board(completed=[work, rev])
|
|
1834
|
+
pv = compute_pipeline(work, board, [], _config())
|
|
1835
|
+
|
|
1836
|
+
assert pv.current_stage == "review_done"
|
|
1837
|
+
gate_actions = {g.action for g in pv.available_gates}
|
|
1838
|
+
assert "enqueue" not in gate_actions
|
|
1839
|
+
assert "dispatch_fix" in gate_actions
|
|
1840
|
+
|
|
1841
|
+
def test_smoke_test_pass_then_rejected_review_is_not_smoke_passed(self) -> None:
|
|
1842
|
+
"""#2498 review 1: the realistic path. Per `_record_test_verdict_local`
|
|
1843
|
+
(#1384), a passed Test gate always mirrors `smoke_test="pass"` onto
|
|
1844
|
+
the parent work assignment BEFORE review ever dispatches (Test
|
|
1845
|
+
precedes Review) — so `smoke_test == "pass"` is the normal state by
|
|
1846
|
+
the time a review completes, not an edge case. The old elif-chain
|
|
1847
|
+
checked `assignment.smoke_test == "pass"` before `review_assignment
|
|
1848
|
+
is not None`, so it resolved to "smoke_passed" and never reached the
|
|
1849
|
+
review_rejected guard at all: the review stage rendered "waiting"
|
|
1850
|
+
(hiding that a review even ran) and the untouched `smoke_passed`
|
|
1851
|
+
branch offered "enqueue" unconditionally — one click from queueing
|
|
1852
|
+
rejected code. No `mq_entry` needed to trigger it."""
|
|
1853
|
+
work = _work(aid="work-1", status="done", smoke_test="pass")
|
|
1854
|
+
rev = _review(of_aid="work-1", status="done")
|
|
1855
|
+
rev.review_verdict = "request-changes"
|
|
1856
|
+
board = Board(completed=[work, rev])
|
|
1857
|
+
pv = compute_pipeline(work, board, [], _config())
|
|
1858
|
+
|
|
1859
|
+
assert pv.current_stage not in ("smoke_passed", "merge_ready", "merging", "merged")
|
|
1860
|
+
assert pv.current_stage == "review_done"
|
|
1861
|
+
|
|
1862
|
+
gate_actions = {g.action for g in pv.available_gates}
|
|
1863
|
+
assert "enqueue" not in gate_actions
|
|
1864
|
+
assert "dispatch_fix" in gate_actions
|
|
1865
|
+
|
|
1866
|
+
review = next(s for s in pv.stages if s.name == "review")
|
|
1867
|
+
assert review.status != "waiting"
|
|
1868
|
+
assert review.status != "completed"
|
|
1869
|
+
|
|
1870
|
+
def test_review_done_approved_still_offers_enqueue_with_mq_entry_absent(self) -> None:
|
|
1871
|
+
"""Sanity check the fix doesn't over-correct: an approved (or
|
|
1872
|
+
no-verdict-yet) review_done still offers enqueue, unaffected."""
|
|
1873
|
+
work = _work(aid="work-1", status="done")
|
|
1874
|
+
rev = _review(of_aid="work-1", status="done")
|
|
1875
|
+
rev.review_verdict = "approve"
|
|
1876
|
+
board = Board(completed=[work, rev])
|
|
1877
|
+
pv = compute_pipeline(work, board, [], _config())
|
|
1878
|
+
|
|
1879
|
+
assert pv.current_stage == "review_done"
|
|
1880
|
+
gate_actions = {g.action for g in pv.available_gates}
|
|
1881
|
+
assert "enqueue" in gate_actions
|
|
1882
|
+
assert "dispatch_fix" not in gate_actions
|
|
1883
|
+
|
|
1884
|
+
review = next(s for s in pv.stages if s.name == "review")
|
|
1885
|
+
assert review.status == "completed"
|