code-coordinator 0.5.220__tar.gz → 0.5.222__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.220 → code_coordinator-0.5.222}/PKG-INFO +1 -1
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/agent.py +77 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/drive_queue.py +14 -7
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/drive_queue.py +83 -20
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/merge_queue.py +35 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/test_author.py +30 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent.py +93 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_drive_queue.py +48 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_drive.py +37 -17
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_drive_queue.py +90 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_test_author.py +68 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/.gitignore +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/CLAUDE.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/GOAL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/LICENSE +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/MANIFEST.in +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/README.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/__init__.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/audit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/block_log.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/board_service.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/brain.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/claim.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/cli.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/client.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/comments.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/config.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/dao.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/db.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/deps.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/drive.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/events.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/filelock.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/freshness.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/gates.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/goal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/context.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/models.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/render.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/health/units.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/hooks.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/interactive.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/models.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/network.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/notify.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/openapi.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/parentage.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/plans.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/progress.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/release_window.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/reports.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/review.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/self_health.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/smoke.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/split_work.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/state.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/test_report.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/usage.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/install-agent.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/pyproject.toml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/setup.cfg +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/__init__.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/conftest.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_config.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_db.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_events.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_init.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_models.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_network.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_review.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_session.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_split.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_state.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.220 → code_coordinator-0.5.222}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -1076,6 +1076,37 @@ def _commits_ahead(wt_path: Path, base: str) -> int | None:
|
|
|
1076
1076
|
return None
|
|
1077
1077
|
|
|
1078
1078
|
|
|
1079
|
+
def _pushed_commits_ahead(repo_path: Path, base: str, branch: str) -> int | None:
|
|
1080
|
+
"""Commits ``origin/<branch>`` is ahead of *base*, checked from *repo_path*.
|
|
1081
|
+
|
|
1082
|
+
#2552: used by ``_reap``'s post-cleanup recheck, run AFTER
|
|
1083
|
+
``_cleanup_worktree`` has possibly already torn the worktree down — so,
|
|
1084
|
+
unlike :func:`_commits_ahead`, this never touches the (possibly gone)
|
|
1085
|
+
worktree directory. It reads from *repo_path* instead, which stays valid
|
|
1086
|
+
for the whole reap: branch refs (including ``refs/remotes/origin/*``)
|
|
1087
|
+
live in the shared ``.git`` directory, not per-worktree.
|
|
1088
|
+
|
|
1089
|
+
Deliberately compares against the REMOTE-tracking ref ``origin/<branch>``
|
|
1090
|
+
rather than the local branch ref. A commit that only exists locally on
|
|
1091
|
+
this one agent (the push in ``_rescue_uncommitted_work`` can fail, same
|
|
1092
|
+
as any push) isn't yet something Test/Review/Merge — which all operate
|
|
1093
|
+
against GitHub — can act on, so it must not flip a status that implies
|
|
1094
|
+
"ready for the pipeline". Returns ``None`` when the remote ref can't be
|
|
1095
|
+
resolved at all (no ``origin`` configured, or the push never landed) —
|
|
1096
|
+
callers should treat that exactly like :func:`_commits_ahead`'s ``None``:
|
|
1097
|
+
unknown, don't act on it.
|
|
1098
|
+
"""
|
|
1099
|
+
for base_ref in (f"origin/{base}", base):
|
|
1100
|
+
try:
|
|
1101
|
+
raw = _git(
|
|
1102
|
+
repo_path, "rev-list", "--count", f"{base_ref}..origin/{branch}"
|
|
1103
|
+
)
|
|
1104
|
+
return int(raw.strip())
|
|
1105
|
+
except (_GitError, ValueError):
|
|
1106
|
+
continue
|
|
1107
|
+
return None
|
|
1108
|
+
|
|
1109
|
+
|
|
1079
1110
|
_ISSUE_REF_RE = re.compile(r"#(\d+)")
|
|
1080
1111
|
|
|
1081
1112
|
|
|
@@ -8903,6 +8934,52 @@ class AgentServer:
|
|
|
8903
8934
|
if assignment is not None:
|
|
8904
8935
|
self._cleanup_worktree(assignment)
|
|
8905
8936
|
|
|
8937
|
+
# #2552: `_cleanup_worktree` above may have just rescued a dirty
|
|
8938
|
+
# worktree into a WIP commit and pushed it (`_rescue_uncommitted_
|
|
8939
|
+
# work`) — AFTER the "0 commits ahead" status decision earlier in
|
|
8940
|
+
# this method already ran. That decision (ADVISORY's `zero_commit_
|
|
8941
|
+
# reason`, or REFUSED_POLICY's `policy_refusal_reason`) was computed
|
|
8942
|
+
# from a branch that was genuinely empty at the moment of judgement;
|
|
8943
|
+
# a rescue that landed a real, pushed commit on it makes the verdict
|
|
8944
|
+
# stale by construction — reporting "nothing was authored" about a
|
|
8945
|
+
# branch that, four log lines later, carries the worker's actual
|
|
8946
|
+
# output. Recompute from `repo_path` (not the worktree, which may
|
|
8947
|
+
# already be gone) whether the rescue's push actually reached
|
|
8948
|
+
# origin, and correct the status when it did. Only ADVISORY/
|
|
8949
|
+
# REFUSED_POLICY are ever reachable here (both are set exclusively
|
|
8950
|
+
# in the `_ahead == 0` branch above, itself gated on `spec.type in
|
|
8951
|
+
# _ZERO_COMMIT_TYPES`) — DONE, FAILED-for-other-reasons, CANCELLED
|
|
8952
|
+
# etc. are untouched.
|
|
8953
|
+
if (
|
|
8954
|
+
assignment is not None
|
|
8955
|
+
and assignment.status in (ADVISORY, REFUSED_POLICY)
|
|
8956
|
+
and assignment.dirty_worktree_reason is not None
|
|
8957
|
+
):
|
|
8958
|
+
_rescue_branch = assignment.branch or assignment.spec.target_branch
|
|
8959
|
+
if _rescue_branch:
|
|
8960
|
+
_rescue_repo_path = Path(assignment.spec.repo_path).expanduser()
|
|
8961
|
+
_rescue_base = assignment.spec.branch or "main"
|
|
8962
|
+
_post_ahead = _pushed_commits_ahead(
|
|
8963
|
+
_rescue_repo_path, _rescue_base, _rescue_branch
|
|
8964
|
+
)
|
|
8965
|
+
if _post_ahead is not None and _post_ahead > 0:
|
|
8966
|
+
_prior_status = assignment.status
|
|
8967
|
+
with self._lock:
|
|
8968
|
+
_live = self._assignments.get(assignment_id)
|
|
8969
|
+
if _live is not None and _live.status == _prior_status:
|
|
8970
|
+
_live.status = DONE
|
|
8971
|
+
if assignment is not _live:
|
|
8972
|
+
assignment.status = DONE
|
|
8973
|
+
self._persist()
|
|
8974
|
+
self._log_line(
|
|
8975
|
+
assignment,
|
|
8976
|
+
"# reap: post-cleanup recheck — "
|
|
8977
|
+
f"{_post_ahead} commit(s) pushed to origin/"
|
|
8978
|
+
f"{_rescue_branch} ahead of {_rescue_base} after "
|
|
8979
|
+
f"rescue (was {_prior_status!r}); status corrected "
|
|
8980
|
+
"to done (#2552)",
|
|
8981
|
+
)
|
|
8982
|
+
|
|
8906
8983
|
def _prune_completed_history(self) -> None:
|
|
8907
8984
|
"""Drop oldest terminal assignments over _COMPLETED_HISTORY_CAP (#452).
|
|
8908
8985
|
|
|
@@ -1916,14 +1916,21 @@ def _fetch_live_ci_gate(
|
|
|
1916
1916
|
gate ``coord merge --plan`` computes, taken live, right now, this tick
|
|
1917
1917
|
(#2182).
|
|
1918
1918
|
|
|
1919
|
-
The second dict (#2347) carries the reason text
|
|
1919
|
+
The second dict (#2347, extended by #2556) carries the reason text
|
|
1920
1920
|
:func:`coord.merge_queue.entry_gate_status` returned alongside each
|
|
1921
|
-
still-blocked verdict
|
|
1922
|
-
plan_tick`
|
|
1923
|
-
|
|
1924
|
-
(``
|
|
1925
|
-
|
|
1926
|
-
|
|
1921
|
+
still-blocked verdict, and is handed to :func:`coord.drive_queue.
|
|
1922
|
+
plan_tick` as its ``live_ci_gate_reason`` parameter, which now gives it
|
|
1923
|
+
a first, decisive job (#2556): when this text carries none of the
|
|
1924
|
+
self-refreshing prefixes (``is_ci_pending_reason``/``is_ci_infra_reason``/
|
|
1925
|
+
``is_ci_flaky_reason``/``is_ci_unreadable_reason``), ``plan_tick``
|
|
1926
|
+
overrides the first dict's still-blocked verdict into a resume — a
|
|
1927
|
+
completed, *failing* CI run must never be indistinguishable from a slow
|
|
1928
|
+
one. When it DOES carry one of those prefixes, this reason is used the
|
|
1929
|
+
pre-#2556 way: only to rewrite a still-``parked`` entry's
|
|
1930
|
+
``last_reason`` when the fresh reading is specifically "GitHub
|
|
1931
|
+
unreachable" (``is_ci_unreadable_reason``) and differs from what is
|
|
1932
|
+
currently stored. See ``plan_tick``'s own ``live_ci_gate_reason``
|
|
1933
|
+
docstring for the full account.
|
|
1927
1934
|
|
|
1928
1935
|
THE GAP THIS CLOSES. On the daemon host — the only machine that ever
|
|
1929
1936
|
runs this tick (``docs/AGENT_OPERATIONS.md``) — ``_fetch_board_view``
|
|
@@ -95,7 +95,7 @@ from coord.merge_queue import (
|
|
|
95
95
|
PLAN_READY,
|
|
96
96
|
is_ci_flaky_reason,
|
|
97
97
|
is_ci_infra_reason,
|
|
98
|
-
|
|
98
|
+
is_ci_terminal_reason,
|
|
99
99
|
is_ci_unreadable_reason,
|
|
100
100
|
is_stale_smoke_reason,
|
|
101
101
|
)
|
|
@@ -1121,12 +1121,7 @@ def build_board_view(
|
|
|
1121
1121
|
# board-build time. `plan_reason` already carries it whenever it
|
|
1122
1122
|
# applies; the live plan reading and a live `coord merge` attempt's
|
|
1123
1123
|
# raw reading can never disagree about this one.
|
|
1124
|
-
if
|
|
1125
|
-
is_ci_pending_reason(reason)
|
|
1126
|
-
or is_ci_infra_reason(reason)
|
|
1127
|
-
or is_ci_flaky_reason(reason)
|
|
1128
|
-
or is_ci_unreadable_reason(reason)
|
|
1129
|
-
):
|
|
1124
|
+
if is_ci_terminal_reason(reason):
|
|
1130
1125
|
continue
|
|
1131
1126
|
# #2158: the same plan row that came back with NO reason of its own
|
|
1132
1127
|
# also carries `ci_summary` — `summarize_counts` over the very checks
|
|
@@ -3180,18 +3175,33 @@ def plan_tick(
|
|
|
3180
3175
|
the #2158 ceiling included — see
|
|
3181
3176
|
:func:`coord.commands.drive_queue._fetch_live_ci_gate` for the shell
|
|
3182
3177
|
side, which computes this ONLY for the bounded set of entries currently
|
|
3183
|
-
`parked` on a CI reason, never the whole queue.
|
|
3184
|
-
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
|
|
3193
|
-
|
|
3194
|
-
|
|
3178
|
+
`parked` on a CI reason, never the whole queue. `True` is NOT simply
|
|
3179
|
+
"stay parked" any more (#2556): it means the fresh read isn't
|
|
3180
|
+
``PLAN_READY``, which is true both while checks are still genuinely in
|
|
3181
|
+
flight (or mid one of their own bounded self-refreshing windows —
|
|
3182
|
+
:func:`~coord.merge_queue.is_ci_pending_reason`/`is_ci_infra_reason`/
|
|
3183
|
+
`is_ci_flaky_reason`/`is_ci_unreadable_reason`, stay parked) AND once
|
|
3184
|
+
they have reported a TERMINAL verdict against the code (a plain "CI
|
|
3185
|
+
failed: ..." reading with none of those prefixes — resume instead, so a
|
|
3186
|
+
completed, failing run can never be indistinguishable from a slow one).
|
|
3187
|
+
See *live_ci_gate_reason* just below, which is what makes that
|
|
3188
|
+
distinction possible.
|
|
3189
|
+
|
|
3190
|
+
*live_ci_gate_reason* (#2347, extended by #2556) is *live_ci_gate*'s
|
|
3191
|
+
companion: the reason text the SAME fresh `entry_gate_status` call
|
|
3192
|
+
returned, for entries whose reading is STILL not `PLAN_READY`. #2556
|
|
3193
|
+
gives it a first, decisive job: when this text carries none of the
|
|
3194
|
+
self-refreshing prefixes (`is_ci_pending_reason`/`is_ci_infra_reason`/
|
|
3195
|
+
`is_ci_flaky_reason`/`is_ci_unreadable_reason`), `live_ci_gate`'s `True`
|
|
3196
|
+
is overridden into a resume — see `plan_tick`'s body. When it DOES carry
|
|
3197
|
+
one of those prefixes, this reason is used the pre-#2556 way: only to
|
|
3198
|
+
rewrite a still-parked entry's `last_reason` when the fresh reading is
|
|
3199
|
+
`CI_UNREADABLE_PREFIX`-shaped and differs from what is currently stored,
|
|
3200
|
+
so `coord drive-queue list`/`status` shows "GitHub could not be reached"
|
|
3201
|
+
the moment that becomes the real cause, instead of silently keeping
|
|
3202
|
+
whatever reason the entry happened to park on originally (which
|
|
3203
|
+
#1891/#1892/#2252's "still shut ⇒ no reconcile, no write" rule would
|
|
3204
|
+
otherwise leave frozen indefinitely —
|
|
3195
3205
|
see the issue for the observed incident: a stale "CI running: ..."
|
|
3196
3206
|
reason surviving a run of transient GitHub API 503s for most of
|
|
3197
3207
|
`PARK_STALE_SECONDS` with no operator-visible signal of the real cause).
|
|
@@ -3524,6 +3534,60 @@ def plan_tick(
|
|
|
3524
3534
|
live_override = (live_ci_gate or {}).get(entry.key)
|
|
3525
3535
|
if live_override is not None:
|
|
3526
3536
|
if live_override:
|
|
3537
|
+
live_reason = (live_ci_gate_reason or {}).get(entry.key)
|
|
3538
|
+
# #2556: `live_override=True` only means the FRESH read
|
|
3539
|
+
# taken THIS tick isn't PLAN_READY — but "not ready" folds
|
|
3540
|
+
# together two very different facts. One is "checks are
|
|
3541
|
+
# genuinely still in flight" (`is_ci_pending_reason`), or one
|
|
3542
|
+
# of the other self-refreshing, no-verdict-yet classes
|
|
3543
|
+
# (`is_ci_infra_reason`'s verdictless failure mid its own
|
|
3544
|
+
# bounded auto-rerun, `is_ci_flaky_reason`'s one-shot re-run
|
|
3545
|
+
# to rule out a flake, `is_ci_unreadable_reason`'s bare
|
|
3546
|
+
# GitHub-unreachable read, handled specially just below) —
|
|
3547
|
+
# for all of these, "still shut ⇒ stay parked" (#1891/#2182)
|
|
3548
|
+
# is exactly right, because there is no fresh verdict to act
|
|
3549
|
+
# on yet. The other is "checks already reported a TERMINAL
|
|
3550
|
+
# verdict against the code" — a plain "CI failed: ..."
|
|
3551
|
+
# reading carrying none of those prefixes. This entry's own
|
|
3552
|
+
# park message promises "the queue resumes it automatically
|
|
3553
|
+
# once they do [report]" — a completed, failing run
|
|
3554
|
+
# satisfies that in every ordinary reading, so staying
|
|
3555
|
+
# parked on it forever (as every prior tick did — the #2158
|
|
3556
|
+
# staleness ceiling never even runs, because it only applies
|
|
3557
|
+
# when `live_override` is absent) is the bug: a red CI on a
|
|
3558
|
+
# parked row was indistinguishable from a slow CI on one,
|
|
3559
|
+
# unboundedly. Resume here exactly like the "reads READY"
|
|
3560
|
+
# branch below (no attempt spent — a fresh GitHub read is
|
|
3561
|
+
# not a failed launch attempt) so this falls straight into
|
|
3562
|
+
# the SAME `waiting` walk, on the SAME tick; whatever
|
|
3563
|
+
# relaunches `coord drive` finds the terminal CI reading and
|
|
3564
|
+
# routes it through `_decide_merge`'s existing checks_failed
|
|
3565
|
+
# handling (dispatch a fix, or block with a real reason) —
|
|
3566
|
+
# exactly the path any other red-CI entry already takes.
|
|
3567
|
+
if live_reason and is_ci_terminal_reason(live_reason):
|
|
3568
|
+
reason = (
|
|
3569
|
+
f"live re-check of {entry.key}'s gate this tick "
|
|
3570
|
+
f"reads a terminal, non-pending result ({live_reason}) "
|
|
3571
|
+
"— resuming from parked without spending an attempt "
|
|
3572
|
+
"so the normal checks_failed handling can take over "
|
|
3573
|
+
"(#2556)"
|
|
3574
|
+
)
|
|
3575
|
+
reconciles.append(
|
|
3576
|
+
Reconcile(
|
|
3577
|
+
entry.key,
|
|
3578
|
+
"resumed",
|
|
3579
|
+
reason,
|
|
3580
|
+
occupies=False,
|
|
3581
|
+
updates={
|
|
3582
|
+
"state": STATE_WAITING,
|
|
3583
|
+
"attempts": 0,
|
|
3584
|
+
"last_reason": reason,
|
|
3585
|
+
},
|
|
3586
|
+
)
|
|
3587
|
+
)
|
|
3588
|
+
states[entry.key] = STATE_WAITING
|
|
3589
|
+
effective_attempts[entry.key] = 0
|
|
3590
|
+
continue
|
|
3527
3591
|
# #2347: CONFIRMED still blocked — but if the FRESH reading
|
|
3528
3592
|
# taken THIS tick says the real cause is "GitHub could not
|
|
3529
3593
|
# be reached" (not a real CI verdict) and that differs from
|
|
@@ -3535,7 +3599,6 @@ def plan_tick(
|
|
|
3535
3599
|
# rule does for every other still-blocked reading. State
|
|
3536
3600
|
# stays `parked`, no attempt spent — this changes only what
|
|
3537
3601
|
# the operator is told, never the decision.
|
|
3538
|
-
live_reason = (live_ci_gate_reason or {}).get(entry.key)
|
|
3539
3602
|
if (
|
|
3540
3603
|
live_reason
|
|
3541
3604
|
and is_ci_unreadable_reason(live_reason)
|
|
@@ -1525,6 +1525,41 @@ def is_ci_flaky_reason(reason: str | None) -> bool:
|
|
|
1525
1525
|
return (reason or "").startswith(CI_FLAKY_PREFIX)
|
|
1526
1526
|
|
|
1527
1527
|
|
|
1528
|
+
def is_ci_terminal_reason(reason: str | None) -> bool:
|
|
1529
|
+
"""True when *reason* is a CONCLUDED CI verdict — a plain "checks
|
|
1530
|
+
failed: ..." (or similarly final) reading carrying none of the four
|
|
1531
|
+
self-refreshing, no-verdict-yet prefixes above (#2556).
|
|
1532
|
+
|
|
1533
|
+
``not is_ci_terminal_reason(r)`` is exactly "this reading is still
|
|
1534
|
+
genuinely in flight, or mid one of its own bounded self-refreshing
|
|
1535
|
+
windows, and answers nothing yet about whether the code is any good" —
|
|
1536
|
+
:func:`is_ci_pending_reason` (checks exist and are still running),
|
|
1537
|
+
:func:`is_ci_infra_reason` (a check completed but said nothing about the
|
|
1538
|
+
code, mid its own auto-rerun), :func:`is_ci_flaky_reason` (a real
|
|
1539
|
+
verdict, but only observed once, mid its one-shot re-run to rule out a
|
|
1540
|
+
flake), or :func:`is_ci_unreadable_reason` (GitHub could not even be
|
|
1541
|
+
asked the question). Anything else — most commonly a plain "checks
|
|
1542
|
+
failed: ..." with none of those prefixes — is terminal: a concluded
|
|
1543
|
+
result the queue can act on now, never indistinguishable from a slow or
|
|
1544
|
+
still-resolving one.
|
|
1545
|
+
|
|
1546
|
+
The single implementation of this classification. Two call sites used to
|
|
1547
|
+
each spell out the identical four-way disjunction inline — a `parked`
|
|
1548
|
+
entry's "is this still self-refreshing?" gate in this module's own
|
|
1549
|
+
`process()`, and `coord.drive_queue.plan_tick`'s #2556 resume-on-
|
|
1550
|
+
terminal-failure branch — which is exactly the "two independent
|
|
1551
|
+
implementations that agree today are a split-brain waiting to happen"
|
|
1552
|
+
shape this repo's own review checklist warns against. Call this instead
|
|
1553
|
+
of re-deriving the disjunction at a new call site.
|
|
1554
|
+
"""
|
|
1555
|
+
return not (
|
|
1556
|
+
is_ci_pending_reason(reason)
|
|
1557
|
+
or is_ci_infra_reason(reason)
|
|
1558
|
+
or is_ci_flaky_reason(reason)
|
|
1559
|
+
or is_ci_unreadable_reason(reason)
|
|
1560
|
+
)
|
|
1561
|
+
|
|
1562
|
+
|
|
1528
1563
|
# #1892: auto-reruns `process()` will trigger for a single entry's verdictless
|
|
1529
1564
|
# CI failure (via `CiStore.rerun_for_pr`) before giving up and parking it for
|
|
1530
1565
|
# a human instead of the queue's own #1891 machinery. A workflow genuinely
|
|
@@ -579,6 +579,36 @@ def dispatch_test_author(
|
|
|
579
579
|
"work, open a fresh branch by hand — do not retry as-is."
|
|
580
580
|
)
|
|
581
581
|
|
|
582
|
+
# #2552: a retried JIT dispatch re-derives this SAME branch for the same
|
|
583
|
+
# (tracking_issue, issue_number) pair, and `_setup_worktree` already
|
|
584
|
+
# resumes from `origin/<branch>` at the git level whenever it exists —
|
|
585
|
+
# the #389/#460 continuation-branch logic checks out the remote tip
|
|
586
|
+
# instead of branching fresh. So a retried worker's worktree is NOT
|
|
587
|
+
# empty when the branch already carries real commits (e.g. a #1394
|
|
588
|
+
# WIP-rescue commit left behind by a killed prior attempt) — but the
|
|
589
|
+
# briefing built above reads identically whether the branch is fresh or
|
|
590
|
+
# already has content, so nothing told the worker to check what's
|
|
591
|
+
# already there before writing more, and a worker that doesn't think to
|
|
592
|
+
# `git log` first can end up re-authoring over its own prior output.
|
|
593
|
+
# `branch_commits_ahead` asks GitHub directly (no local checkout
|
|
594
|
+
# required — the coordinator dispatching this may not have one); `None`
|
|
595
|
+
# (lookup failed) is left silent rather than asserted either way, same
|
|
596
|
+
# fail-quiet posture as every other best-effort GitHub read in this
|
|
597
|
+
# function.
|
|
598
|
+
_resume_ahead = github_ops.branch_commits_ahead(
|
|
599
|
+
repo_cfg.github, repo_cfg.default_branch or "main", branch
|
|
600
|
+
)
|
|
601
|
+
if _resume_ahead:
|
|
602
|
+
briefing += (
|
|
603
|
+
"\n\n---\nRESUMING: this branch already has "
|
|
604
|
+
f"{_resume_ahead} commit(s) on it ahead of "
|
|
605
|
+
f"{repo_cfg.default_branch or 'main'} — likely unfinished or "
|
|
606
|
+
"unverified work from an interrupted prior session (possibly a "
|
|
607
|
+
"coordinator WIP-rescue commit — see #1394). Run `git log` and "
|
|
608
|
+
"read what's already there FIRST. Continue/complete/verify it "
|
|
609
|
+
"rather than re-authoring from scratch (#2552)."
|
|
610
|
+
)
|
|
611
|
+
|
|
582
612
|
deny_commands = test_author_deny_commands(config, repo_name)
|
|
583
613
|
|
|
584
614
|
# #2549: this was the only dispatcher on the fleet that never sent
|
|
@@ -3938,6 +3938,99 @@ def test_reap_review_type_gets_no_stash_diagnostic(tmp_path: Path) -> None:
|
|
|
3938
3938
|
server.shutdown()
|
|
3939
3939
|
|
|
3940
3940
|
|
|
3941
|
+
def _init_repo_with_remote(path: Path) -> Path:
|
|
3942
|
+
"""Like `_init_repo`, but with a real (local, bare) `origin` configured
|
|
3943
|
+
and `main` already pushed.
|
|
3944
|
+
|
|
3945
|
+
#2552's post-cleanup recheck (`AgentServer._pushed_commits_ahead`)
|
|
3946
|
+
deliberately reads the REMOTE-tracking ref (`origin/<branch>`), not the
|
|
3947
|
+
local branch — a rescue commit that never reached origin must not flip
|
|
3948
|
+
status. `_init_repo` (no remote) can't exercise that path at all, since
|
|
3949
|
+
`origin/<branch>` never exists there.
|
|
3950
|
+
"""
|
|
3951
|
+
remote = path.parent / f"{path.name}-remote.git"
|
|
3952
|
+
subprocess.run(
|
|
3953
|
+
["git", "init", "--bare", "-b", "main", str(remote)],
|
|
3954
|
+
check=True, capture_output=True,
|
|
3955
|
+
)
|
|
3956
|
+
_init_repo(path)
|
|
3957
|
+
subprocess.run(
|
|
3958
|
+
["git", "remote", "add", "origin", str(remote)],
|
|
3959
|
+
cwd=str(path), check=True, capture_output=True,
|
|
3960
|
+
)
|
|
3961
|
+
subprocess.run(
|
|
3962
|
+
["git", "push", "-u", "origin", "main"],
|
|
3963
|
+
cwd=str(path), check=True, capture_output=True,
|
|
3964
|
+
)
|
|
3965
|
+
return path
|
|
3966
|
+
|
|
3967
|
+
|
|
3968
|
+
def test_reap_status_reflects_post_rescue_branch_state(tmp_path: Path) -> None:
|
|
3969
|
+
"""#2552: a rescued WIP commit that reaches origin must correct the
|
|
3970
|
+
pre-cleanup zero-commit verdict instead of leaving it standing.
|
|
3971
|
+
|
|
3972
|
+
Reported bug: `_reap` measures "0 commits ahead of main" (true at that
|
|
3973
|
+
instant, since the worker left a tracked-file edit uncommitted) and sets
|
|
3974
|
+
ADVISORY with `zero_commit_reason` — BEFORE `_cleanup_worktree` runs.
|
|
3975
|
+
Cleanup then rescues the dirty worktree into a `WIP [coord-rescue]`
|
|
3976
|
+
commit and pushes it (`_rescue_uncommitted_work`), landing a real commit
|
|
3977
|
+
on the very branch the ADVISORY verdict was judged empty one step
|
|
3978
|
+
earlier. Nothing ever revisited the verdict, so a successful #1394
|
|
3979
|
+
rescue was always scored as "nothing was authored".
|
|
3980
|
+
|
|
3981
|
+
Drives the real `_reap` path end to end (`assign()`/`wait_for()`,
|
|
3982
|
+
exactly like the neighboring stash-diagnostic tests above) rather than
|
|
3983
|
+
re-implementing the ordering inline, so a regression in the actual
|
|
3984
|
+
`_reap`/`_cleanup_worktree` sequence is what this test would catch.
|
|
3985
|
+
"""
|
|
3986
|
+
repo = _init_repo_with_remote(tmp_path / "repo")
|
|
3987
|
+
server = _server(
|
|
3988
|
+
tmp_path,
|
|
3989
|
+
argv=["/bin/sh", "-c", "echo dirty >> README; exit 0"],
|
|
3990
|
+
repo_path=repo,
|
|
3991
|
+
)
|
|
3992
|
+
|
|
3993
|
+
a = server.assign(_spec(repo))
|
|
3994
|
+
final = server.wait_for(a.id, timeout=15)
|
|
3995
|
+
|
|
3996
|
+
assert final.status == DONE
|
|
3997
|
+
assert final.dirty_worktree_reason is not None
|
|
3998
|
+
assert "coord-rescue" in final.dirty_worktree_reason
|
|
3999
|
+
assert "UNVERIFIED" in final.dirty_worktree_reason
|
|
4000
|
+
server.shutdown()
|
|
4001
|
+
|
|
4002
|
+
|
|
4003
|
+
def test_reap_stays_advisory_when_rescue_commit_never_reaches_origin(
|
|
4004
|
+
tmp_path: Path,
|
|
4005
|
+
) -> None:
|
|
4006
|
+
"""#2552 control: a rescue commit that stays LOCAL ONLY must NOT flip
|
|
4007
|
+
status to done.
|
|
4008
|
+
|
|
4009
|
+
Same dirty-worktree shape as the test above, but the repo has no
|
|
4010
|
+
`origin` at all — the WIP-rescue push has nothing to push to, so the
|
|
4011
|
+
commit only ever exists on this one agent. Test/Review/Merge all operate
|
|
4012
|
+
against GitHub; a branch nobody but this agent can see is not "ready for
|
|
4013
|
+
the pipeline", so the post-cleanup recheck must leave the pre-existing
|
|
4014
|
+
ADVISORY verdict alone (the `dirty_worktree_reason` still records that
|
|
4015
|
+
real work exists — see `_record_dirty_worktree` — just not that it is
|
|
4016
|
+
live anywhere the pipeline can consume it).
|
|
4017
|
+
"""
|
|
4018
|
+
repo = _init_repo(tmp_path / "repo") # no `origin` remote configured
|
|
4019
|
+
server = _server(
|
|
4020
|
+
tmp_path,
|
|
4021
|
+
argv=["/bin/sh", "-c", "echo dirty >> README; exit 0"],
|
|
4022
|
+
repo_path=repo,
|
|
4023
|
+
)
|
|
4024
|
+
|
|
4025
|
+
a = server.assign(_spec(repo))
|
|
4026
|
+
final = server.wait_for(a.id, timeout=15)
|
|
4027
|
+
|
|
4028
|
+
assert final.status == ADVISORY
|
|
4029
|
+
assert final.dirty_worktree_reason is not None
|
|
4030
|
+
assert "coord-rescue" in final.dirty_worktree_reason
|
|
4031
|
+
server.shutdown()
|
|
4032
|
+
|
|
4033
|
+
|
|
3941
4034
|
def test_sanitize_branch_replaces_slashes(tmp_path: Path) -> None:
|
|
3942
4035
|
"""_sanitize_branch should replace slashes with dashes."""
|
|
3943
4036
|
from coord.agent import _sanitize_branch
|
|
@@ -1835,6 +1835,15 @@ def _green_check(name: str = "test (3.12)"):
|
|
|
1835
1835
|
)
|
|
1836
1836
|
|
|
1837
1837
|
|
|
1838
|
+
def _failed_check(name: str = "test (3.12)"):
|
|
1839
|
+
from coord.ci_store import CheckRun
|
|
1840
|
+
|
|
1841
|
+
return CheckRun(
|
|
1842
|
+
name=name, status="completed", conclusion="failure",
|
|
1843
|
+
url="", run_id="1", started_at=100.0, completed_at=160.0,
|
|
1844
|
+
)
|
|
1845
|
+
|
|
1846
|
+
|
|
1838
1847
|
def _running_check(name: str = "test (3.12)"):
|
|
1839
1848
|
from coord.ci_store import CheckRun
|
|
1840
1849
|
|
|
@@ -1914,6 +1923,45 @@ def test_a_parked_entry_with_ci_still_genuinely_running_stays_parked(
|
|
|
1914
1923
|
assert "1 parked" in cli_no_gates("status").output
|
|
1915
1924
|
|
|
1916
1925
|
|
|
1926
|
+
def test_a_parked_entry_resumes_once_ci_reports_a_confirmed_failure(
|
|
1927
|
+
cli_no_gates, seed, launches, coord_db, live_ci_backend,
|
|
1928
|
+
):
|
|
1929
|
+
"""#2556, reproduced rather than injected.
|
|
1930
|
+
|
|
1931
|
+
coord-portal#131 (live, 2026-08-22): a row parked on "CI running: e2e
|
|
1932
|
+
smoke (playwright)" never noticed the check it was watching completed as
|
|
1933
|
+
FAILURE — it stayed `parked`, with `last_reason` still reading "CI
|
|
1934
|
+
running: ..." over an hour after the run finished. The #2182 live
|
|
1935
|
+
re-check correctly asks GitHub again every tick, but collapsed "still
|
|
1936
|
+
running" and "confirmed failed" into the same "stay parked" branch,
|
|
1937
|
+
because both merely fail to read `PLAN_READY`. A completed run — even a
|
|
1938
|
+
red one — satisfies this entry's own park promise ("the queue resumes it
|
|
1939
|
+
automatically once they do [report]"); it must resume and let the normal
|
|
1940
|
+
`waiting`/launch path route the failure through `coord drive`'s existing
|
|
1941
|
+
checks_failed handling, exactly like any other red-CI entry.
|
|
1942
|
+
"""
|
|
1943
|
+
_park_with_pr(cli_no_gates, seed, coord_db)
|
|
1944
|
+
assert "CI running" in (queued(2159)["last_reason"] or "")
|
|
1945
|
+
|
|
1946
|
+
live_ci_backend([_failed_check()])
|
|
1947
|
+
|
|
1948
|
+
result = cli_no_gates("tick")
|
|
1949
|
+
assert result.exit_code == 0, result.output
|
|
1950
|
+
# The resume itself is visible in this tick's own reconcile line — the
|
|
1951
|
+
# entry then launches in the SAME tick (like the #2182 green-check case
|
|
1952
|
+
# above), which clears `last_reason` to "" on success, so the CI-failed
|
|
1953
|
+
# reading is only observable in the tick's rendered output, not the
|
|
1954
|
+
# post-launch row.
|
|
1955
|
+
assert "resumed" in result.output
|
|
1956
|
+
assert "CI failed" in result.output
|
|
1957
|
+
entry = queued(2159)
|
|
1958
|
+
assert entry["state"] != "parked", entry # no longer wedged
|
|
1959
|
+
assert entry["attempts"] == 0 # #1891/#2273: still free — no attempt spent
|
|
1960
|
+
assert len(launches) == 2, launches # resumed straight into a fresh launch
|
|
1961
|
+
|
|
1962
|
+
assert "parked" not in cli_no_gates("status").output
|
|
1963
|
+
|
|
1964
|
+
|
|
1917
1965
|
def test_a_parked_entrys_reason_is_corrected_when_github_is_unreachable(
|
|
1918
1966
|
cli_no_gates, seed, launches, coord_db, live_ci_backend,
|
|
1919
1967
|
):
|
|
@@ -4662,24 +4662,33 @@ def driver_factory(tmp_path, monkeypatch, capsys):
|
|
|
4662
4662
|
monkeypatch.setenv("TMPDIR", str(tmp_path))
|
|
4663
4663
|
monkeypatch.setattr("coord.drive_state.scratch_dir", lambda: tmp_path)
|
|
4664
4664
|
monkeypatch.setattr("coord.drive.scratch_dir", lambda: tmp_path)
|
|
4665
|
-
#
|
|
4666
|
-
#
|
|
4667
|
-
#
|
|
4668
|
-
#
|
|
4665
|
+
# #2170-class isolation, fixture-wide: `run_notify()` takes a REAL flock
|
|
4666
|
+
# on `notify_lock_path()` (`Path.home()/".coord"/"notify.lock"`, resolved
|
|
4667
|
+
# at call time) whenever `DriveOptions(notify=True)` is in play. Any
|
|
4668
|
+
# driver test in this module can turn that on, and without isolating it
|
|
4669
|
+
# the lock contends with whatever else on the host legitimately holds it
|
|
4670
|
+
# — on a machine that actually runs the fleet, `coord-notify.timer`
|
|
4671
|
+
# (5-minute cadence) and the board daemon's own drain both hold it for
|
|
4672
|
+
# the length of a full notify pass. The test then burns up to the full
|
|
4673
|
+
# 5-minute `timeout=300` per acquire, logs "could not take
|
|
4674
|
+
# ~/.coord/notify.lock within 5m — skipping nudge", and fails with an
|
|
4675
|
+
# empty call list. That is a race with whatever else is running on the
|
|
4676
|
+
# machine, not a signal about the code under test — exactly the class
|
|
4677
|
+
# `tests/test_ambient_home_isolation.py` and the `populated-home` CI job
|
|
4678
|
+
# exist to keep out.
|
|
4669
4679
|
#
|
|
4670
|
-
#
|
|
4671
|
-
#
|
|
4672
|
-
#
|
|
4673
|
-
#
|
|
4674
|
-
#
|
|
4675
|
-
#
|
|
4676
|
-
#
|
|
4677
|
-
#
|
|
4678
|
-
#
|
|
4679
|
-
#
|
|
4680
|
-
|
|
4681
|
-
|
|
4682
|
-
)
|
|
4680
|
+
# Redirecting $HOME is the whole mechanism, and it subsumes the earlier
|
|
4681
|
+
# #2536 fix (which pinned `coord.drive.notify_lock_path` at
|
|
4682
|
+
# `tmp_path/"notify.lock"` instead): `notify_lock_path()` resolves
|
|
4683
|
+
# `Path.home()` at call time, so the lock lands at
|
|
4684
|
+
# `tmp_path/".coord"/"notify.lock"` either way — but $HOME also covers
|
|
4685
|
+
# everything *else* in the driver that reaches for `~/.coord`, and it
|
|
4686
|
+
# needs no upkeep as call sites move. Deliberately NOT belt-and-braces:
|
|
4687
|
+
# re-pinning `notify_lock_path` on top of this would move the lock back
|
|
4688
|
+
# out of the redirected $HOME and silently defeat
|
|
4689
|
+
# `test_notify_nudges_coord_notify_under_the_shared_lock`, whose whole
|
|
4690
|
+
# job is to assert the redirection took.
|
|
4691
|
+
monkeypatch.setenv("HOME", str(tmp_path))
|
|
4683
4692
|
|
|
4684
4693
|
def make(
|
|
4685
4694
|
payloads, *, opts=None, verifier=None, config=None, oracle_gate=None,
|
|
@@ -5725,6 +5734,15 @@ def test_notify_is_off_by_default(driver_factory, monkeypatch):
|
|
|
5725
5734
|
|
|
5726
5735
|
|
|
5727
5736
|
def test_notify_nudges_coord_notify_under_the_shared_lock(driver_factory, tmp_path):
|
|
5737
|
+
# #2170-class isolation: `run_notify()` takes a REAL flock on
|
|
5738
|
+
# `notify_lock_path()` — i.e. `Path.home()/".coord"/"notify.lock"`,
|
|
5739
|
+
# resolved at call time. `driver_factory` redirects $HOME to `tmp_path`
|
|
5740
|
+
# fixture-wide (see its definition) precisely so this doesn't contend
|
|
5741
|
+
# with whatever else on the host legitimately holds that lock (a live
|
|
5742
|
+
# `coord notify` / `run_drain` on a daemon host, or simply another
|
|
5743
|
+
# pytest worker running the sibling drain tests) and burn the full
|
|
5744
|
+
# 5-minute `timeout=300` before failing with an empty `seen`. This
|
|
5745
|
+
# assertion just confirms the redirection actually took.
|
|
5728
5746
|
driver = driver_factory(
|
|
5729
5747
|
[board(status="merged")], opts=DriveOptions(machine="precision", notify=True)
|
|
5730
5748
|
)
|
|
@@ -5732,6 +5750,8 @@ def test_notify_nudges_coord_notify_under_the_shared_lock(driver_factory, tmp_pa
|
|
|
5732
5750
|
driver.run_coord = lambda args, **kw: seen.append(args) or 0 # type: ignore[assignment]
|
|
5733
5751
|
driver.run_notify()
|
|
5734
5752
|
assert seen == [("notify",)]
|
|
5753
|
+
# The lock really was taken under the redirected $HOME, not the host's.
|
|
5754
|
+
assert (tmp_path / ".coord" / "notify.lock").exists()
|
|
5735
5755
|
|
|
5736
5756
|
|
|
5737
5757
|
def test_stalled_stage_gets_re_nudged_on_every_stall_window(driver_factory, capsys):
|