code-coordinator 0.5.493__tar.gz → 0.5.494__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.493 → code_coordinator-0.5.494}/PKG-INFO +1 -1
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/drive_queue.py +281 -49
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/merge_queue.py +14 -6
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_drive_queue.py +156 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/.gitignore +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/CLAUDE.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/GOAL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/LICENSE +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/MANIFEST.in +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/README.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/__init__.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/agent.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/audit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/backup.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/block_log.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/board_service.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/brain.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/claim.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/cli.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/client.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/codegen.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/comments.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/config.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dao.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/db.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/deps.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/drive.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/events.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/filelock.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/freshness.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/gates.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/goal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/context.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/models.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/render.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/health/units.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/hooks.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/interactive.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/models.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/network.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/notify.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/openapi.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/parentage.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/plans.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/progress.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/release_window.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/reports.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/review.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/self_health.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/smoke.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/split_work.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/sql.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/state.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/test_author.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/test_report.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/usage.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/install-agent.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/pyproject.toml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/setup.cfg +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/__init__.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/backends.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/conftest.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_client.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_config.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_db.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_events.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_init.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_models.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_network.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_review.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_session.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_split.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_state.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.493 → code_coordinator-0.5.494}/tests/write_parity.py +0 -0
|
@@ -124,6 +124,7 @@ from coord.overlap_predict import (
|
|
|
124
124
|
|
|
125
125
|
if TYPE_CHECKING: # pragma: no cover — typing only
|
|
126
126
|
from coord.config import Config
|
|
127
|
+
from coord.merge_queue import QueuedMerge
|
|
127
128
|
|
|
128
129
|
log = logging.getLogger(__name__)
|
|
129
130
|
|
|
@@ -4740,14 +4741,51 @@ def _run_merge_only_candidates(plan: TickPlan, config_path: Path | None) -> None
|
|
|
4740
4741
|
click.echo(f"merge-only: {reason}")
|
|
4741
4742
|
|
|
4742
4743
|
|
|
4744
|
+
# #3396: the `stage` this call site's escalations are recorded under —
|
|
4745
|
+
# mirrors `ROLL_PENDING_ALERT_STAGE`/`SELF_CORDON_ALERT_STAGE` above, but
|
|
4746
|
+
# keyed per-entry (the entry's own `(repo_name, issue_number)`) rather than a
|
|
4747
|
+
# single fleet-wide slot, since more than one branch can be `checks_stale` at
|
|
4748
|
+
# once. `_run_auto_revalidate_checks_stale`'s cleanup pass reads this same
|
|
4749
|
+
# constant back to find which open escalations are its own to dismiss.
|
|
4750
|
+
CHECKS_STALE_ALERT_STAGE = "checks_stale"
|
|
4751
|
+
|
|
4752
|
+
|
|
4753
|
+
def _record_checks_stale_escalation(entry: "QueuedMerge", *, reason: str) -> None:
|
|
4754
|
+
"""Write (or refresh) the durable, human-visible escalation for *entry*
|
|
4755
|
+
(#3396 item 2) — ``coord escalate list``/``coord escalate run`` and the
|
|
4756
|
+
TUI already surface this table for every other "needs a human" condition
|
|
4757
|
+
in this file; a `checks_stale` block that this tick cannot move forward
|
|
4758
|
+
on its own now reaches it too, instead of only ever reprinting the same
|
|
4759
|
+
diagnosis to the journal every ~3 minutes forever.
|
|
4760
|
+
|
|
4761
|
+
Best-effort: a write failure here must not take down the rest of the
|
|
4762
|
+
tick — the caller already echoed the reason to stdout, which is the
|
|
4763
|
+
floor this falls back to.
|
|
4764
|
+
"""
|
|
4765
|
+
try:
|
|
4766
|
+
from coord.state import record_drive_escalation # noqa: PLC0415
|
|
4767
|
+
|
|
4768
|
+
record_drive_escalation(
|
|
4769
|
+
entry.repo_name,
|
|
4770
|
+
entry.issue_number,
|
|
4771
|
+
stage=CHECKS_STALE_ALERT_STAGE,
|
|
4772
|
+
reason=reason,
|
|
4773
|
+
gate_readings=f"error={entry.error}" if entry.error else "gate: READY",
|
|
4774
|
+
proposed_command=(
|
|
4775
|
+
f"coord merge --only {entry.repo_name}#{entry.issue_number}"
|
|
4776
|
+
),
|
|
4777
|
+
assignment_id=entry.assignment_id,
|
|
4778
|
+
)
|
|
4779
|
+
except Exception as exc: # noqa: BLE001 — the stdout line is the floor
|
|
4780
|
+
click.echo(f" (could not record the checks_stale escalation: {exc})")
|
|
4781
|
+
|
|
4782
|
+
|
|
4743
4783
|
def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
|
|
4744
|
-
"""#2535:
|
|
4784
|
+
"""#2535: unattended remedy for merge-queue entries blocked SOLELY on
|
|
4745
4785
|
stale CI checks against an already-approved review — closing the gap
|
|
4746
4786
|
where nothing periodic ever looks at such an entry on an operator's
|
|
4747
|
-
behalf
|
|
4748
|
-
|
|
4749
|
-
blocked 2026-08-21 on nothing but 210 unrelated merges having landed
|
|
4750
|
-
since its CI last ran).
|
|
4787
|
+
behalf (the trigger: #2530's Gate-A PR #2534 sat blocked 2026-08-21 on
|
|
4788
|
+
nothing but 210 unrelated merges having landed since its CI last ran).
|
|
4751
4789
|
|
|
4752
4790
|
#3266: this used to auto-fire a ``gh run rerun`` (``CiStore.
|
|
4753
4791
|
rerun_for_pr``) for exactly this shape, up to ``MAX_CI_STALE_RERUNS`` —
|
|
@@ -4756,46 +4794,89 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
|
|
|
4756
4794
|
there too: a ``gh run rerun`` replays the SAME event payload against
|
|
4757
4795
|
the SAME base the stale checks already used, so it can never see a
|
|
4758
4796
|
base that has since moved — which is the ONLY thing a staleness
|
|
4759
|
-
reading means.
|
|
4760
|
-
full CI cycle (this repo's median: ~62 minutes) on a guaranteed no-op,
|
|
4761
|
-
twice, before the shared ``ci_stale_reruns`` budget parked the entry
|
|
4762
|
-
anyway (claude-coordinator#2972). Per this repo's "one question, one
|
|
4763
|
-
answer" rule, this tick and ``process()`` must agree on the same
|
|
4764
|
-
question ("should we auto-rerun CI for a checks_stale block?") — they
|
|
4765
|
-
now both answer "no, park and point at a rebase" identically, rather
|
|
4766
|
-
than this call site silently keeping the old answer #2197 already gave
|
|
4767
|
-
up on live. See ``MAX_CI_STALE_RERUNS``'s comment in
|
|
4797
|
+
reading means. See ``MAX_CI_STALE_RERUNS``'s comment in
|
|
4768
4798
|
``coord/merge_queue.py`` and ``ci_stale_reason``'s docstring for the
|
|
4769
|
-
full reasoning
|
|
4770
|
-
|
|
4771
|
-
check against the CURRENT base
|
|
4799
|
+
full reasoning. The actual remedy is a rebase onto the target branch
|
|
4800
|
+
followed by ``git push --force-with-lease`` — the only thing that
|
|
4801
|
+
produces a check against the CURRENT base.
|
|
4802
|
+
|
|
4803
|
+
#3396: from #2535 through #3266 this call site only ever *reported*
|
|
4804
|
+
that remedy — it never performed it, so a `checks_stale` entry whose
|
|
4805
|
+
owning `coord drive` session had already exhausted its merge attempts
|
|
4806
|
+
and exited had NOTHING left watching it: this tick re-diagnosed the
|
|
4807
|
+
same block every ~3 minutes, forever, and the stale-rebase worker
|
|
4808
|
+
that exists for exactly this shape (:func:`coord.conflict_fix.
|
|
4809
|
+
dispatch_conflict_fix` with ``stale_rebase=True``, #3349) was never
|
|
4810
|
+
dispatched. #3349 already wired that worker into
|
|
4811
|
+
``coord.notify``'s stalled-pipeline sweep (``merge_gate_checks_stale``),
|
|
4812
|
+
but that sweep only runs when ``coord notify`` is invoked and
|
|
4813
|
+
``pipeline.auto_dispatch_stalled`` is on — it is not this tick, which
|
|
4814
|
+
runs unconditionally every few minutes on the daemon host. Per this
|
|
4815
|
+
repo's "one question, one answer" rule this call site now reuses the
|
|
4816
|
+
IDENTICAL dispatcher rather than re-deriving the decision: a
|
|
4817
|
+
content-preserving rebase gets force-pushed and the merge queue picks
|
|
4818
|
+
it up on its own next attempt, with no operator action, exactly like
|
|
4819
|
+
the #1090 reference case in the issue. A rebase that turns out to
|
|
4820
|
+
conflict (or change content) still refuses and escalates — the
|
|
4821
|
+
worker's own narrow briefing (:func:`coord.conflict_fix.
|
|
4822
|
+
build_stale_rebase_briefing`) enforces that, not this call site.
|
|
4823
|
+
|
|
4824
|
+
Escalation (#3396 item 2): a candidate this function cannot move
|
|
4825
|
+
forward — a conflict-fix already tried and failed against this SAME
|
|
4826
|
+
error (:func:`coord.conflict_fix.has_prior_conflict_fix`), or dispatch
|
|
4827
|
+
itself declined (no capable/reachable machine, no ``repo_path``) — is
|
|
4828
|
+
recorded via :func:`coord.state.record_drive_escalation` under the
|
|
4829
|
+
entry's OWN ``(repo, issue)``, the same durable, human-visible table
|
|
4830
|
+
``coord escalate list``/``coord escalate run`` already serve for every
|
|
4831
|
+
other "needs a human" condition in this file (see
|
|
4832
|
+
``ROLL_PENDING_ALERT_REPO``/``SELF_CORDON_ALERT_REPO`` above for the
|
|
4833
|
+
established one-slot-per-condition pattern; this one is naturally
|
|
4834
|
+
keyed per-entry instead, since more than one branch can be
|
|
4835
|
+
``checks_stale`` at once). Before #3396 a block that "needs a human"
|
|
4836
|
+
only ever reached this function's own stdout/journal line, printed
|
|
4837
|
+
again unchanged every tick — never a place an operator or the TUI
|
|
4838
|
+
would actually see it (the issue's own complaint: `coord drive-queue
|
|
4839
|
+
status` reporting ``alert: (none)`` throughout). A candidate that
|
|
4840
|
+
clears on its own (the rebase lands, or the base stops moving) is no
|
|
4841
|
+
longer in the next tick's *candidates* list, so its escalation (if any)
|
|
4842
|
+
is dismissed below — the table only ever holds genuinely-live blocks.
|
|
4772
4843
|
|
|
4773
4844
|
Deliberately narrow — this is NOT ``merge.auto_drain`` reopened (that
|
|
4774
4845
|
flag stays ``False`` by design; see ``docs/DRIVE_QUEUE.md`` and the
|
|
4775
4846
|
2026-06-07 incident it guards against). This step never merges
|
|
4776
|
-
anything
|
|
4777
|
-
|
|
4778
|
-
|
|
4847
|
+
anything and never mutates the merge-queue row itself — it only ever
|
|
4848
|
+
dispatches the SAME bounded, self-refusing worker
|
|
4849
|
+
:func:`coord.conflict_fix.dispatch_conflict_fix` already provides
|
|
4850
|
+
for the identical shape reached from a live drive/stalled-pipeline
|
|
4851
|
+
sweep, gated by the SAME one-per-entry retry cap
|
|
4852
|
+
(:func:`coord.conflict_fix.has_prior_conflict_fix`) — so a second
|
|
4853
|
+
tick finding the same still-stale entry while a rebase attempt is
|
|
4854
|
+
already running/pending does nothing, and one that already failed
|
|
4855
|
+
escalates instead of retrying. It never touches an entry blocked on
|
|
4856
|
+
review, a real CI failure, or a conflict — only the exact shape
|
|
4857
|
+
:func:`coord.merge_queue.ci_revalidation_candidates` scopes
|
|
4779
4858
|
``--revalidate``'s (equally no-op) CI arm to (#1851/#1925): ``PENDING``,
|
|
4780
4859
|
review approved, smoke fresh, CI checks green but predating the current
|
|
4781
4860
|
base.
|
|
4782
4861
|
|
|
4783
4862
|
``MAX_CI_STALE_RERUNS``/``ci_stale_reruns`` are read nowhere in this
|
|
4784
|
-
function
|
|
4785
|
-
|
|
4786
|
-
|
|
4787
|
-
|
|
4788
|
-
|
|
4789
|
-
Cost-visible (#1632's posture)
|
|
4790
|
-
|
|
4791
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4863
|
+
function — nothing here increments or checks that budget, so a row
|
|
4864
|
+
already carrying a nonzero count from before #3266 is left exactly as
|
|
4865
|
+
``process()`` leaves it (converges to 0 on the next genuinely-fresh
|
|
4866
|
+
reading, never incremented further by this call site).
|
|
4867
|
+
|
|
4868
|
+
Cost-visible (#1632's posture): dispatching a worker is real, visible
|
|
4869
|
+
spend — a :func:`coord.audit.record_audit` (business tier) row marks
|
|
4870
|
+
it, distinct from the operational-tier rows for a declined/escalated
|
|
4871
|
+
candidate, so an operator watching the audit trail can tell "this tick
|
|
4872
|
+
spent a session" from "this tick only reported a block" at a glance.
|
|
4873
|
+
|
|
4874
|
+
Deliberately NOT behind a new config flag — the worker it dispatches
|
|
4875
|
+
already carries its own bounded, self-refusing briefing and one-shot
|
|
4876
|
+
retry cap; there is nothing further to gate that
|
|
4877
|
+
``pipeline.auto_dispatch_stalled`` (the flag guarding ``coord
|
|
4878
|
+
notify``'s unrelated, broader stalled-pipeline sweep) doesn't already
|
|
4879
|
+
cover for that other call site.
|
|
4799
4880
|
|
|
4800
4881
|
Best-effort like every other optional step in this tick (conflict
|
|
4801
4882
|
reconciliation in ``_auto_drain_tick``, the merge-only fast path above):
|
|
@@ -4803,6 +4884,24 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
|
|
|
4803
4884
|
on a thin client — this daemon-host tick is the only place it ever
|
|
4804
4885
|
runs, same guard :func:`_fetch_live_ci_gate`/
|
|
4805
4886
|
:func:`_run_merge_only_candidates` use.
|
|
4887
|
+
|
|
4888
|
+
Known race, widened by this change (#3396 review): this tick is a new,
|
|
4889
|
+
independent, ALWAYS-ON caller of ``dispatch_conflict_fix(...,
|
|
4890
|
+
stale_rebase=True)`` (``deploy/coord-drive-queue.service``/``.timer``),
|
|
4891
|
+
alongside ``coord notify``'s stalled-pipeline sweep (a separate systemd
|
|
4892
|
+
timer, see ``docs/AGENT_OPERATIONS.md``) and a live drive's own merge
|
|
4893
|
+
attempt — three independent callers for the identical shape now. The
|
|
4894
|
+
shared guard (``has_prior_conflict_fix``/``_has_active_conflict_fix``)
|
|
4895
|
+
is a plain board-snapshot read with no cross-process lock between them:
|
|
4896
|
+
if two of these fire within the same window for the same gate-READY
|
|
4897
|
+
``checks_stale`` entry, both can independently observe "no prior fix in
|
|
4898
|
+
flight" and dispatch a duplicate stale-rebase worker. Wasted spend, not
|
|
4899
|
+
data loss — the second worker's push is a no-op or is itself refused —
|
|
4900
|
+
but this is the first caller to fire unconditionally on a fixed timer
|
|
4901
|
+
rather than behind a live drive or an opt-in flag, which widens the
|
|
4902
|
+
window. A real fix needs a cross-process claim (e.g. a DB-level lock
|
|
4903
|
+
keyed on the entry) rather than a snapshot read; tracked as a follow-up,
|
|
4904
|
+
not fixed here.
|
|
4806
4905
|
"""
|
|
4807
4906
|
from coord.board_service import resolve as resolve_board_service # noqa: PLC0415
|
|
4808
4907
|
|
|
@@ -4815,10 +4914,32 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
|
|
|
4815
4914
|
from coord.audit import record_audit # noqa: PLC0415
|
|
4816
4915
|
from coord.ci_store import build_ci_store # noqa: PLC0415
|
|
4817
4916
|
from coord.commands._common import _load_config # noqa: PLC0415
|
|
4818
|
-
from coord.
|
|
4917
|
+
from coord.conflict_fix import ( # noqa: PLC0415
|
|
4918
|
+
_has_active_conflict_fix,
|
|
4919
|
+
describe_conflict_fix_decline,
|
|
4920
|
+
dispatch_conflict_fix,
|
|
4921
|
+
has_prior_conflict_fix,
|
|
4922
|
+
)
|
|
4923
|
+
from coord.network import fetch_status # noqa: PLC0415
|
|
4924
|
+
from coord.state import ( # noqa: PLC0415
|
|
4925
|
+
dismiss_drive_escalation,
|
|
4926
|
+
list_drive_escalations,
|
|
4927
|
+
load_board as _load_board,
|
|
4928
|
+
)
|
|
4819
4929
|
|
|
4820
4930
|
cfg = _load_config(config_path)
|
|
4821
|
-
|
|
4931
|
+
# #3396: `load_board()` can legitimately return `None` (no board data
|
|
4932
|
+
# at all yet). `ci_revalidation_candidates` already tolerates that
|
|
4933
|
+
# (its gate reads never dereference a `None` board when the gate they
|
|
4934
|
+
# guard isn't required), but `has_prior_conflict_fix`/
|
|
4935
|
+
# `dispatch_conflict_fix` below unconditionally walk
|
|
4936
|
+
# `board.active`/`board.completed` — an empty board is the correct
|
|
4937
|
+
# "no prior assignments exist" reading for both, and keeps the two
|
|
4938
|
+
# calls sharing the exact same object rather than one seeing `None`
|
|
4939
|
+
# and the other a stand-in.
|
|
4940
|
+
from coord.models import Board # noqa: PLC0415
|
|
4941
|
+
|
|
4942
|
+
board = _load_board() or Board()
|
|
4822
4943
|
ci_store = build_ci_store(
|
|
4823
4944
|
cfg.ci_store.type, host=cfg.ci_store.host, token_env=cfg.ci_store.token_env,
|
|
4824
4945
|
)
|
|
@@ -4829,34 +4950,145 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
|
|
|
4829
4950
|
except Exception: # noqa: BLE001 — best-effort, see docstring
|
|
4830
4951
|
return
|
|
4831
4952
|
|
|
4953
|
+
# #3396 review: the cleanup pass below treats an escalation's absence
|
|
4954
|
+
# from *candidates* as "confirmed cleared" — that's only a safe reading
|
|
4955
|
+
# once we know `candidates` came from a REAL read, not from a
|
|
4956
|
+
# `ci_store` that was `None`/unavailable (which `ci_revalidation_
|
|
4957
|
+
# candidates` also answers with `[]`, indistinguishable by return value
|
|
4958
|
+
# alone from "genuinely nothing is stale"). The `ci_store.is_available`
|
|
4959
|
+
# check above, and the broader `except Exception: return` around this
|
|
4960
|
+
# whole block, both already `return` BEFORE this point on exactly that
|
|
4961
|
+
# ambiguous case — so reaching here at all already means the read was
|
|
4962
|
+
# real. Do not restructure this so cleanup can be reached without a
|
|
4963
|
+
# confirmed-available `ci_store` and a `ci_revalidation_candidates` call
|
|
4964
|
+
# that returned normally; that reintroduces the "unconfirmed success"
|
|
4965
|
+
# bug this comment describes (epic #2096: dismissing an escalation is
|
|
4966
|
+
# asserting "resolved" — only do it from an observation, not an
|
|
4967
|
+
# inability to look).
|
|
4968
|
+
#
|
|
4969
|
+
# #3396: drop any prior checks_stale escalation for an entry that is no
|
|
4970
|
+
# longer a candidate this tick — either it landed, or the base stopped
|
|
4971
|
+
# moving. Runs even when *candidates* is empty (that's the fully-healed
|
|
4972
|
+
# case). Best-effort: a read/write hiccup here must not stop the actual
|
|
4973
|
+
# dispatch loop below from running.
|
|
4974
|
+
try:
|
|
4975
|
+
live_keys = {(c.repo_name, c.issue_number) for c in candidates}
|
|
4976
|
+
for esc in list_drive_escalations():
|
|
4977
|
+
if esc.get("stage") != CHECKS_STALE_ALERT_STAGE:
|
|
4978
|
+
continue
|
|
4979
|
+
key = (esc.get("repo_name"), esc.get("issue_number"))
|
|
4980
|
+
if key not in live_keys:
|
|
4981
|
+
dismiss_drive_escalation(esc["repo_name"], esc["issue_number"])
|
|
4982
|
+
except Exception: # noqa: BLE001 — best-effort, see docstring
|
|
4983
|
+
pass
|
|
4984
|
+
|
|
4832
4985
|
if not candidates:
|
|
4833
4986
|
return
|
|
4834
4987
|
|
|
4835
4988
|
for entry in candidates:
|
|
4836
4989
|
label = f"{entry.repo_name} #{entry.issue_number} ({entry.branch})"
|
|
4837
|
-
|
|
4838
|
-
|
|
4839
|
-
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
|
|
4844
|
-
|
|
4845
|
-
|
|
4990
|
+
|
|
4991
|
+
if has_prior_conflict_fix(board, entry.assignment_id, current_error=entry.error):
|
|
4992
|
+
if _has_active_conflict_fix(board, entry.assignment_id):
|
|
4993
|
+
# A stale-rebase attempt is already running/pending for this
|
|
4994
|
+
# entry (dispatched by this same tick earlier, a live drive,
|
|
4995
|
+
# or the `coord notify` sweep) — nothing to do, and nothing
|
|
4996
|
+
# to escalate: it will resolve, or fail and escalate, on its
|
|
4997
|
+
# own.
|
|
4998
|
+
click.echo(
|
|
4999
|
+
f"auto-revalidate: {label} is checks_stale — a "
|
|
5000
|
+
"stale-rebase conflict-fix is already in flight for it"
|
|
5001
|
+
)
|
|
5002
|
+
continue
|
|
5003
|
+
# A prior stale-rebase (or ordinary conflict-fix) attempt for
|
|
5004
|
+
# this SAME error already failed — the retry cap is spent, and
|
|
5005
|
+
# re-diagnosing it every tick forever is exactly the #3396 bug.
|
|
5006
|
+
# Escalate once into the durable table instead of only echoing.
|
|
5007
|
+
reason = (
|
|
5008
|
+
f"{label} is checks_stale and a prior conflict-fix attempt "
|
|
5009
|
+
"already failed against this same block — a CI re-run "
|
|
5010
|
+
"cannot clear it (same base) and the automatic rebase "
|
|
5011
|
+
"already gave up; needs a human"
|
|
5012
|
+
)
|
|
5013
|
+
click.echo(f"auto-revalidate: {reason}")
|
|
5014
|
+
record_audit(
|
|
5015
|
+
tier="operational", category="merge",
|
|
5016
|
+
event_type="merge_checks_stale_human_required",
|
|
5017
|
+
actor="drive-queue-tick",
|
|
5018
|
+
summary=reason,
|
|
5019
|
+
repo=entry.repo_name, issue=entry.issue_number,
|
|
5020
|
+
assignment_id=entry.assignment_id,
|
|
5021
|
+
details={"pr_number": entry.pr_number, "error": entry.error},
|
|
5022
|
+
)
|
|
5023
|
+
_record_checks_stale_escalation(entry, reason=reason)
|
|
5024
|
+
continue
|
|
5025
|
+
|
|
5026
|
+
pick_out: list = []
|
|
5027
|
+
fix = dispatch_conflict_fix(
|
|
5028
|
+
entry, board, cfg, stale_rebase=True,
|
|
5029
|
+
status_fetcher=fetch_status, machine_pick_out=pick_out,
|
|
5030
|
+
)
|
|
5031
|
+
if fix is not None:
|
|
5032
|
+
click.echo(
|
|
5033
|
+
f"auto-revalidate: {label} is checks_stale — dispatched a "
|
|
5034
|
+
f"stale-rebase conflict-fix ({fix.assignment_id}) to "
|
|
5035
|
+
f"{fix.machine_name} (#3396: no live drive needed)"
|
|
5036
|
+
)
|
|
5037
|
+
record_audit(
|
|
5038
|
+
tier="business", category="merge",
|
|
5039
|
+
event_type="merge_checks_stale_auto_rebase_dispatched",
|
|
5040
|
+
actor="drive-queue-tick",
|
|
5041
|
+
summary=(
|
|
5042
|
+
f"stale-rebase conflict-fix dispatched: {label} → "
|
|
5043
|
+
f"{fix.machine_name}"
|
|
5044
|
+
),
|
|
5045
|
+
repo=entry.repo_name, issue=entry.issue_number,
|
|
5046
|
+
assignment_id=fix.assignment_id,
|
|
5047
|
+
details={
|
|
5048
|
+
"pr_number": entry.pr_number,
|
|
5049
|
+
"merge_entry_id": entry.assignment_id,
|
|
5050
|
+
},
|
|
5051
|
+
)
|
|
5052
|
+
# #3396 review: an earlier tick may have already written a
|
|
5053
|
+
# `checks_stale` escalation for this SAME entry (dispatch
|
|
5054
|
+
# declined that time — no machine, no repo_path) before a later
|
|
5055
|
+
# tick found dispatch available and actually fired the worker.
|
|
5056
|
+
# Without this, `coord escalate list`/the TUI keep showing
|
|
5057
|
+
# "needs a human" for an entry that in fact now has a
|
|
5058
|
+
# stale-rebase worker actively running against it, until it
|
|
5059
|
+
# eventually drops out of `candidates` entirely. Best-effort —
|
|
5060
|
+
# a dismissal failure here must not undo the dispatch above.
|
|
5061
|
+
try:
|
|
5062
|
+
dismiss_drive_escalation(entry.repo_name, entry.issue_number)
|
|
5063
|
+
except Exception: # noqa: BLE001 — best-effort, see docstring
|
|
5064
|
+
pass
|
|
5065
|
+
continue
|
|
5066
|
+
|
|
5067
|
+
# Dispatch declined before ever starting a rebase — no capable or
|
|
5068
|
+
# reachable machine, no `repo_path` configured, or a flapping agent
|
|
5069
|
+
# (#3353). Still `checks_stale`, still gate-ready, and still nobody
|
|
5070
|
+
# is going to clear it on its own — surface it the same durable way
|
|
5071
|
+
# a genuine retry-cap exhaustion does, rather than a print-only line
|
|
5072
|
+
# nothing but the journal ever sees.
|
|
5073
|
+
decline_reason = describe_conflict_fix_decline(pick_out)
|
|
5074
|
+
reason = (
|
|
5075
|
+
f"{label} is checks_stale with a content-preserving rebase "
|
|
5076
|
+
f"expected to clear it, but dispatch declined: {decline_reason}"
|
|
4846
5077
|
)
|
|
5078
|
+
click.echo(f"auto-revalidate: {reason}")
|
|
4847
5079
|
record_audit(
|
|
4848
5080
|
tier="operational", category="merge",
|
|
4849
5081
|
event_type="merge_checks_stale_parked",
|
|
4850
5082
|
actor="drive-queue-tick",
|
|
4851
5083
|
summary=(
|
|
4852
5084
|
f"checks_stale: {label} needs a rebase, not a CI re-run "
|
|
4853
|
-
"(#3266)
|
|
4854
|
-
"staleness"
|
|
5085
|
+
f"(#3266); auto-dispatch declined: {decline_reason} (#3396)"
|
|
4855
5086
|
),
|
|
4856
5087
|
repo=entry.repo_name, issue=entry.issue_number,
|
|
4857
5088
|
assignment_id=entry.assignment_id,
|
|
4858
|
-
details={"pr_number": entry.pr_number},
|
|
5089
|
+
details={"pr_number": entry.pr_number, "decline_reason": decline_reason},
|
|
4859
5090
|
)
|
|
5091
|
+
_record_checks_stale_escalation(entry, reason=reason)
|
|
4860
5092
|
|
|
4861
5093
|
|
|
4862
5094
|
def _run_resume_probe(entry: QueueEntry) -> ProbeResult:
|
|
@@ -3724,16 +3724,24 @@ def ci_revalidation_candidates(
|
|
|
3724
3724
|
`rerun_for_pr` replays the same run against the same base it already
|
|
3725
3725
|
used, so it can never see the new one. `process()`'s OWN #2197
|
|
3726
3726
|
auto-rerun for this trigger was dropped for that reason (see
|
|
3727
|
-
`MAX_CI_STALE_RERUNS`'s comment)
|
|
3728
|
-
|
|
3729
|
-
was fixed the same way in the same change — it still calls this
|
|
3730
|
-
function to find the candidates, but only to report them, never to
|
|
3731
|
-
rerun anything. The one remaining caller that still calls
|
|
3732
|
-
`rerun_for_pr` on what this returns is `coord.commands.merge
|
|
3727
|
+
`MAX_CI_STALE_RERUNS`'s comment). The one remaining caller that still
|
|
3728
|
+
calls `rerun_for_pr` on what this returns is `coord.commands.merge
|
|
3733
3729
|
._apply_ci_revalidation` (the opt-in ``--revalidate`` CI arm) — equally
|
|
3734
3730
|
unable to clear the block, but lower severity since a human has to
|
|
3735
3731
|
explicitly ask for it. Left as-is here: fixing it is a change to that
|
|
3736
3732
|
module, out of this function's/file's scope, and a tracked follow-up.
|
|
3733
|
+
|
|
3734
|
+
#3396: `coord.commands.drive_queue._run_auto_revalidate_checks_stale`
|
|
3735
|
+
(the unattended periodic call site) still calls this function to find
|
|
3736
|
+
the candidates, but no longer only to report them — a #3266-through-
|
|
3737
|
+
#3396 gap meant a `checks_stale` entry whose owning `coord drive`
|
|
3738
|
+
session had already exited was never seen by anything that could
|
|
3739
|
+
actually clear it, only re-diagnosed forever. That call site now
|
|
3740
|
+
dispatches the SAME bounded, self-refusing stale-rebase worker
|
|
3741
|
+
(:func:`coord.conflict_fix.dispatch_conflict_fix` with
|
|
3742
|
+
``stale_rebase=True``) a live drive or `coord notify`'s stalled-pipeline
|
|
3743
|
+
sweep would already use for this exact shape — never a `gh run rerun`,
|
|
3744
|
+
which stays the known no-op described above.
|
|
3737
3745
|
"""
|
|
3738
3746
|
if ci_store is None or not ci_store.is_available:
|
|
3739
3747
|
return []
|
|
@@ -27,12 +27,14 @@ import sys
|
|
|
27
27
|
import time
|
|
28
28
|
from pathlib import Path
|
|
29
29
|
from typing import Any
|
|
30
|
+
from unittest.mock import MagicMock
|
|
30
31
|
|
|
31
32
|
import pytest
|
|
32
33
|
from click.testing import CliRunner
|
|
33
34
|
|
|
34
35
|
from coord import state
|
|
35
36
|
from coord.cli import main
|
|
37
|
+
from coord.models import Assignment
|
|
36
38
|
from coord.drive import tmux_session_alive as _REAL_TMUX_SESSION_ALIVE
|
|
37
39
|
from coord.drive_queue import (
|
|
38
40
|
DEFAULT_MAX_ATTEMPTS,
|
|
@@ -3587,6 +3589,15 @@ def test_auto_revalidate_surfaces_but_never_reruns_an_entry_blocked_on_stale_che
|
|
|
3587
3589
|
assert entries[0]["issue"] == 2534
|
|
3588
3590
|
assert entries[0]["repo"] == REPO
|
|
3589
3591
|
|
|
3592
|
+
# #3396 review: the escalation's `proposed_command` must be a command
|
|
3593
|
+
# `coord escalate run` can actually execute — `--only` is a single-value
|
|
3594
|
+
# Click option that takes the durable `repo#issue` key (#1477), not two
|
|
3595
|
+
# space-separated positional-looking tokens (Click would reject the
|
|
3596
|
+
# latter with "Got unexpected extra argument").
|
|
3597
|
+
escalation = state._get_drive_escalation_local(REPO, 2534)
|
|
3598
|
+
assert escalation is not None
|
|
3599
|
+
assert escalation["proposed_command"] == f"coord merge --only {REPO}#2534"
|
|
3600
|
+
|
|
3590
3601
|
|
|
3591
3602
|
def test_auto_revalidate_keeps_surfacing_an_already_exhausted_entry(
|
|
3592
3603
|
cli_no_gates, coord_db, stale_ci_backend,
|
|
@@ -3618,6 +3629,151 @@ def test_auto_revalidate_keeps_surfacing_an_already_exhausted_entry(
|
|
|
3618
3629
|
assert len(entries) == 1
|
|
3619
3630
|
assert entries[0]["issue"] == 2534
|
|
3620
3631
|
|
|
3632
|
+
# #3396 review: same `proposed_command` check as the sibling test above —
|
|
3633
|
+
# this path (dispatch declined) writes the escalation too.
|
|
3634
|
+
escalation = state._get_drive_escalation_local(REPO, 2534)
|
|
3635
|
+
assert escalation is not None
|
|
3636
|
+
assert escalation["proposed_command"] == f"coord merge --only {REPO}#2534"
|
|
3637
|
+
|
|
3638
|
+
|
|
3639
|
+
# ── #3396: auto-revalidate now DISPATCHES the stale-rebase worker, rather
|
|
3640
|
+
# than only ever reporting the block — see `_run_auto_revalidate_checks_
|
|
3641
|
+
# stale`'s docstring. `coord.conflict_fix.dispatch_conflict_fix` itself is
|
|
3642
|
+
# stubbed (never a real `/assign` POST) — the SAME seam
|
|
3643
|
+
# `tests/test_stalled_pipeline.py`'s equivalent `coord.notify` arm tests use,
|
|
3644
|
+
# since this tick's local import binds it fresh on every call.
|
|
3645
|
+
|
|
3646
|
+
|
|
3647
|
+
def test_auto_revalidate_dispatches_a_stale_rebase_worker_with_no_live_drive(
|
|
3648
|
+
cli_no_gates, coord_db, stale_ci_backend, monkeypatch,
|
|
3649
|
+
):
|
|
3650
|
+
"""#3396 acceptance: a gate-READY `checks_stale` row with NO drive-queue
|
|
3651
|
+
counterpart at all (this row is a bare `merge_queue` entry, exactly like
|
|
3652
|
+
quadraui#1001 after its owning drive exhausted its attempts and exited)
|
|
3653
|
+
still gets the SAME stale-rebase worker a live drive or `coord notify`'s
|
|
3654
|
+
stalled-pipeline sweep would dispatch — no operator action."""
|
|
3655
|
+
_seed_pending_merge_row(coord_db, 2534, pr_number=42)
|
|
3656
|
+
set_board_meta(coord_db, "board_initialized", "1")
|
|
3657
|
+
|
|
3658
|
+
fix_assignment = Assignment(
|
|
3659
|
+
machine_name="dellserver", repo_name=REPO, issue_number=2534,
|
|
3660
|
+
issue_title="[stale-rebase-fix] issue 2534", assignment_id="cf-3396",
|
|
3661
|
+
status="pending", type="conflict-fix",
|
|
3662
|
+
)
|
|
3663
|
+
stub = MagicMock(return_value=fix_assignment)
|
|
3664
|
+
monkeypatch.setattr("coord.conflict_fix.dispatch_conflict_fix", stub)
|
|
3665
|
+
|
|
3666
|
+
result = cli_no_gates("tick")
|
|
3667
|
+
assert result.exit_code == 0, result.output
|
|
3668
|
+
assert "dispatched a stale-rebase conflict-fix" in result.output
|
|
3669
|
+
assert "cf-3396" in result.output
|
|
3670
|
+
|
|
3671
|
+
stub.assert_called_once()
|
|
3672
|
+
_, call_kwargs = stub.call_args
|
|
3673
|
+
assert call_kwargs["stale_rebase"] is True
|
|
3674
|
+
|
|
3675
|
+
from coord.audit import query_audit_log
|
|
3676
|
+
|
|
3677
|
+
entries = query_audit_log(
|
|
3678
|
+
event_type="merge_checks_stale_auto_rebase_dispatched"
|
|
3679
|
+
)["entries"]
|
|
3680
|
+
assert len(entries) == 1
|
|
3681
|
+
assert entries[0]["issue"] == 2534
|
|
3682
|
+
|
|
3683
|
+
# Never escalated — a fresh dispatch is progress, not a stuck block.
|
|
3684
|
+
assert state._get_drive_escalation_local(REPO, 2534) is None
|
|
3685
|
+
|
|
3686
|
+
|
|
3687
|
+
def test_auto_revalidate_dismisses_a_prior_decline_escalation_once_dispatch_succeeds(
|
|
3688
|
+
cli_no_gates, coord_db, stale_ci_backend, monkeypatch,
|
|
3689
|
+
):
|
|
3690
|
+
"""#3396 review: an EARLIER tick may have already written a
|
|
3691
|
+
`checks_stale` escalation for this entry (dispatch declined that time —
|
|
3692
|
+
no machine, no repo_path). Once a LATER tick finds dispatch available
|
|
3693
|
+
and actually fires the stale-rebase worker, that stale "needs a human"
|
|
3694
|
+
record must not keep sitting in `coord escalate list`/the TUI — the
|
|
3695
|
+
entry now has a worker actively running against it, not a stuck block
|
|
3696
|
+
only a human can move."""
|
|
3697
|
+
_seed_pending_merge_row(coord_db, 2534, pr_number=42)
|
|
3698
|
+
set_board_meta(coord_db, "board_initialized", "1")
|
|
3699
|
+
state._record_drive_escalation_local(
|
|
3700
|
+
REPO, 2534, stage="checks_stale",
|
|
3701
|
+
reason="dispatch declined: no machine available",
|
|
3702
|
+
gate_readings="gate: READY",
|
|
3703
|
+
proposed_command=f"coord merge --only {REPO}#2534",
|
|
3704
|
+
)
|
|
3705
|
+
assert state._get_drive_escalation_local(REPO, 2534) is not None
|
|
3706
|
+
|
|
3707
|
+
fix_assignment = Assignment(
|
|
3708
|
+
machine_name="dellserver", repo_name=REPO, issue_number=2534,
|
|
3709
|
+
issue_title="[stale-rebase-fix] issue 2534", assignment_id="cf-3396b",
|
|
3710
|
+
status="pending", type="conflict-fix",
|
|
3711
|
+
)
|
|
3712
|
+
stub = MagicMock(return_value=fix_assignment)
|
|
3713
|
+
monkeypatch.setattr("coord.conflict_fix.dispatch_conflict_fix", stub)
|
|
3714
|
+
|
|
3715
|
+
result = cli_no_gates("tick")
|
|
3716
|
+
assert result.exit_code == 0, result.output
|
|
3717
|
+
assert "dispatched a stale-rebase conflict-fix" in result.output
|
|
3718
|
+
|
|
3719
|
+
assert state._get_drive_escalation_local(REPO, 2534) is None
|
|
3720
|
+
|
|
3721
|
+
|
|
3722
|
+
def test_auto_revalidate_escalates_once_a_prior_stale_rebase_attempt_failed(
|
|
3723
|
+
cli_no_gates, coord_db, stale_ci_backend,
|
|
3724
|
+
):
|
|
3725
|
+
"""#3396 item 2: once a conflict-fix already failed against this exact
|
|
3726
|
+
block (the retry cap `has_prior_conflict_fix` enforces), re-diagnosing it
|
|
3727
|
+
every ~3 minutes forever — the issue's own reported symptom — must stop.
|
|
3728
|
+
It escalates into the durable `drive_escalations` table instead, the
|
|
3729
|
+
same one `coord escalate list`/`coord escalate run` already serve."""
|
|
3730
|
+
_seed_pending_merge_row(coord_db, 2534, pr_number=42)
|
|
3731
|
+
set_board_meta(coord_db, "board_initialized", "1")
|
|
3732
|
+
coord_db.execute(
|
|
3733
|
+
"INSERT INTO assignments "
|
|
3734
|
+
"(assignment_id, repo_name, issue_number, issue_title, machine_name, "
|
|
3735
|
+
" type, status, review_of_assignment_id, dispatched_at) "
|
|
3736
|
+
"VALUES (?, ?, ?, ?, 'dellserver', 'conflict-fix', 'failed', ?, ?)",
|
|
3737
|
+
("cf-prior", REPO, 2534, "issue 2534", "w2534", 200.0),
|
|
3738
|
+
)
|
|
3739
|
+
coord_db.commit()
|
|
3740
|
+
|
|
3741
|
+
result = cli_no_gates("tick")
|
|
3742
|
+
assert result.exit_code == 0, result.output
|
|
3743
|
+
assert "needs a human" in result.output
|
|
3744
|
+
|
|
3745
|
+
escalation = state._get_drive_escalation_local(REPO, 2534)
|
|
3746
|
+
assert escalation is not None
|
|
3747
|
+
assert escalation["stage"] == "checks_stale"
|
|
3748
|
+
assert escalation["proposed_command"] == f"coord merge --only {REPO}#2534"
|
|
3749
|
+
|
|
3750
|
+
from coord.audit import query_audit_log
|
|
3751
|
+
|
|
3752
|
+
entries = query_audit_log(event_type="merge_checks_stale_human_required")["entries"]
|
|
3753
|
+
assert len(entries) == 1
|
|
3754
|
+
assert entries[0]["issue"] == 2534
|
|
3755
|
+
|
|
3756
|
+
|
|
3757
|
+
def test_auto_revalidate_dismisses_a_stale_escalation_once_the_block_clears(
|
|
3758
|
+
cli_no_gates, coord_db, stale_ci_backend,
|
|
3759
|
+
):
|
|
3760
|
+
"""The other half of #3396 item 2: an escalation must not outlive the
|
|
3761
|
+
condition it describes, or `coord escalate list` rots into exactly the
|
|
3762
|
+
kind of noise the issue's own `alert: (none)` complaint was about in the
|
|
3763
|
+
other direction. Nothing in the merge queue names issue 9999 any more
|
|
3764
|
+
(resolved since the escalation was written) — the tick's cleanup pass
|
|
3765
|
+
must drop it even though this run finds zero `checks_stale` candidates."""
|
|
3766
|
+
state._record_drive_escalation_local(
|
|
3767
|
+
REPO, 9999, stage="checks_stale", reason="stale",
|
|
3768
|
+
gate_readings="", proposed_command="coord merge --only x 9999",
|
|
3769
|
+
)
|
|
3770
|
+
assert state._get_drive_escalation_local(REPO, 9999) is not None
|
|
3771
|
+
|
|
3772
|
+
result = cli_no_gates("tick")
|
|
3773
|
+
assert result.exit_code == 0, result.output
|
|
3774
|
+
|
|
3775
|
+
assert state._get_drive_escalation_local(REPO, 9999) is None
|
|
3776
|
+
|
|
3621
3777
|
|
|
3622
3778
|
def test_a_repeatedly_dead_drive_still_reaches_blocked_and_escalates(
|
|
3623
3779
|
cli, seed, launches, coord_db
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|