code-coordinator 0.5.252__tar.gz → 0.5.255__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.252 → code_coordinator-0.5.255}/PKG-INFO +1 -1
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/release.py +7 -6
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/config.py +41 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/release_propagate.py +11 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/release_verify.py +30 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/revalidate.py +161 -7
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/serve_app.py +348 -8
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_release_window.py +65 -3
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config.py +46 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_propagate.py +10 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_verify.py +20 -8
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_revalidate.py +362 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_serve.py +214 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/reports.rs +375 -117
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/tests.rs +288 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/.gitignore +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/CLAUDE.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/GOAL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/LICENSE +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/MANIFEST.in +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/README.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/__init__.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agent.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/audit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/block_log.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/board_service.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/brain.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/claim.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/cli.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/client.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/comments.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dao.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/db.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/deps.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/drive.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/events.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/filelock.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/freshness.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/gates.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/goal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/context.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/models.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/render.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/health/units.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/hooks.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/interactive.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/models.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/network.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/notify.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/openapi.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/parentage.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/plans.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/progress.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/release_window.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/reports.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/review.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/self_health.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/smoke.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/split_work.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/sql.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/state.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/test_author.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/test_report.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/usage.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/install-agent.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/pyproject.toml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/setup.cfg +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/__init__.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/conftest.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_db.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_events.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_init.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_models.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_network.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_session.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_split.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_state.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/types/generated.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.252 → code_coordinator-0.5.255}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -1337,16 +1337,17 @@ def _python_lane_versions(
|
|
|
1337
1337
|
"""``{host: the OLDEST version its python lane reports}`` (#2101).
|
|
1338
1338
|
|
|
1339
1339
|
"Python lane" is whatever :func:`coord.release_propagate.verify_lane_kind`
|
|
1340
|
-
grades as one — the venv itself plus the live `coord-serve`
|
|
1341
|
-
rather than a second list that could drift
|
|
1342
|
-
gate already use.
|
|
1340
|
+
grades as one — the venv itself plus the live `coord-serve` and
|
|
1341
|
+
`coord-agent` processes — rather than a second list that could drift
|
|
1342
|
+
from the one the roll and the gate already use.
|
|
1343
1343
|
|
|
1344
1344
|
Two deliberate readings:
|
|
1345
1345
|
|
|
1346
1346
|
* the OLDEST readable version wins, because a host is as behind as its
|
|
1347
|
-
most stale python lane. A venv that swapped while `coord-serve`
|
|
1348
|
-
|
|
1349
|
-
|
|
1347
|
+
most stale python lane. A venv that swapped while `coord-serve` (or,
|
|
1348
|
+
on the daemon host, `coord-agent` — #2841) still runs the old
|
|
1349
|
+
generation is #2069's exact defect, and it must read as "behind", not
|
|
1350
|
+
as "done";
|
|
1350
1351
|
* a host with an unreadable lane and no readable lane BEHIND the target is
|
|
1351
1352
|
``None`` — "no data", never "current" (#1834). `None` is what stops the
|
|
1352
1353
|
host being cordoned on a guess *and* what stops an existing cordon being
|
|
@@ -1349,12 +1349,41 @@ class MergeConfig:
|
|
|
1349
1349
|
oldest entry in a file-overlapping cluster of approved (PENDING) queue
|
|
1350
1350
|
entries must have been waiting before the warning fires. ``0`` disables
|
|
1351
1351
|
the warning entirely. Default ``24.0``.
|
|
1352
|
+
|
|
1353
|
+
``auto_revalidate`` (#2829) lets the daemon's own tick resolve a
|
|
1354
|
+
stale-but-``passed`` verdict the same way an operator does by hand with
|
|
1355
|
+
``coord merge --revalidate``: compose the candidate(s) onto the current
|
|
1356
|
+
base, run the suite once, merge on green. **Default-off**, and a
|
|
1357
|
+
strictly larger grant than ``auto_drain`` — it *starts test runs*, not
|
|
1358
|
+
just merges pre-approved ones — so it gets its own sibling trust bar
|
|
1359
|
+
(tracked in ``docs/MERGE_AUTO_DRAIN_TRUST_BAR.md``) rather than riding
|
|
1360
|
+
in on ``auto_drain``'s track record. See
|
|
1361
|
+
:func:`coord.serve_app._auto_revalidate_tick` for the lock-hold
|
|
1362
|
+
restructure this required: the composite runs OUTSIDE ``_merge_lock``
|
|
1363
|
+
and the lock is taken only to re-check the base hasn't moved and then
|
|
1364
|
+
merge, so an unattended composite (up to
|
|
1365
|
+
``coord.revalidate.DEFAULT_TIMEOUT_SECONDS`` × ``1 +
|
|
1366
|
+
auto_revalidate_max_batch`` worst case) never wedges the whole fleet's
|
|
1367
|
+
merge lane the way running it inside the lock would.
|
|
1368
|
+
|
|
1369
|
+
``auto_revalidate_max_batch`` caps how many candidates one unattended
|
|
1370
|
+
composite may validate together — deliberately well under
|
|
1371
|
+
:data:`coord.revalidate.MAX_REVALIDATION_BATCH` (10), since a RED
|
|
1372
|
+
composite's 1+N solo-run fallback is what actually holds the lock once
|
|
1373
|
+
the merge step runs, and that cost must stay small when nobody is
|
|
1374
|
+
watching it happen. Default ``3``. Combined with the "at most one
|
|
1375
|
+
composite per tick, never a burst" rule ``_auto_revalidate_tick``
|
|
1376
|
+
enforces in code (not a config knob — there is nothing to tune), this
|
|
1377
|
+
is the per-tick ceiling the trust bar calls for, analogous to
|
|
1378
|
+
``auto_drain``'s ``max_per_tick``.
|
|
1352
1379
|
"""
|
|
1353
1380
|
|
|
1354
1381
|
auto_drain: bool = False
|
|
1355
1382
|
max_per_tick: int = 0
|
|
1356
1383
|
auto_reap_merged: bool = True
|
|
1357
1384
|
sibling_overlap_aging_hours: float = 24.0
|
|
1385
|
+
auto_revalidate: bool = False
|
|
1386
|
+
auto_revalidate_max_batch: int = 3
|
|
1358
1387
|
|
|
1359
1388
|
|
|
1360
1389
|
@dataclass
|
|
@@ -3672,6 +3701,18 @@ def _parse_merge(raw: Any) -> MergeConfig:
|
|
|
3672
3701
|
"merge.sibling_overlap_aging_hours must be a non-negative number"
|
|
3673
3702
|
)
|
|
3674
3703
|
cfg.sibling_overlap_aging_hours = float(value)
|
|
3704
|
+
if "auto_revalidate" in raw:
|
|
3705
|
+
value = raw["auto_revalidate"]
|
|
3706
|
+
if not isinstance(value, bool):
|
|
3707
|
+
raise ConfigError("merge.auto_revalidate must be a boolean")
|
|
3708
|
+
cfg.auto_revalidate = value
|
|
3709
|
+
if "auto_revalidate_max_batch" in raw:
|
|
3710
|
+
value = raw["auto_revalidate_max_batch"]
|
|
3711
|
+
if isinstance(value, bool) or not isinstance(value, int) or value < 1:
|
|
3712
|
+
raise ConfigError(
|
|
3713
|
+
"merge.auto_revalidate_max_batch must be a positive integer"
|
|
3714
|
+
)
|
|
3715
|
+
cfg.auto_revalidate_max_batch = value
|
|
3675
3716
|
return cfg
|
|
3676
3717
|
|
|
3677
3718
|
|
|
@@ -271,10 +271,21 @@ ALL_LANES: tuple[str, ...] = (LANE_PYTHON, LANE_UNITS, LANE_TUI)
|
|
|
271
271
|
#: spawns`` (what it would hand subprocesses), and the one #2069's restart
|
|
272
272
|
#: actually targets, so it needs its own exact entry rather than falling out
|
|
273
273
|
#: of the ``" spawns"`` suffix rule below.
|
|
274
|
+
#:
|
|
275
|
+
#: ``coord-agent process`` (:func:`coord.release_verify.lanes_for_host`) is
|
|
276
|
+
#: #2069 for ``coord-agent``: the agent's own frozen-at-start ``__version__``,
|
|
277
|
+
#: as distinct from ``coord-agent spawns`` (a fresh subprocess re-resolving
|
|
278
|
+
#: the venv on every poll, which flips the instant a swap lands whether or
|
|
279
|
+
#: not the agent restarted). On the daemon host the agent can *never*
|
|
280
|
+
#: self-restart (`agent_app.py`'s `_idle_restart_target` refuses there on
|
|
281
|
+
#: purpose), so this is the only lane that still reads a staged-but-
|
|
282
|
+
#: unrestarted swap as behind on that host — see the module docstring's
|
|
283
|
+
#: "REACH MUST GROW TO MEET THE GATE" section.
|
|
274
284
|
_VERIFY_LANE_EXACT: dict[str, str] = {
|
|
275
285
|
"~/.coord-venv": LANE_PYTHON,
|
|
276
286
|
"coord-tui": LANE_TUI,
|
|
277
287
|
"coord-serve process": LANE_PYTHON,
|
|
288
|
+
"coord-agent process": LANE_PYTHON,
|
|
278
289
|
}
|
|
279
290
|
|
|
280
291
|
#: Units whose *live process* a python-lane roll actually replaces. ``POST
|
|
@@ -245,6 +245,36 @@ def lanes_for_host(host: str, health: dict | None) -> list[Lane]:
|
|
|
245
245
|
)
|
|
246
246
|
)
|
|
247
247
|
|
|
248
|
+
# ── coord-agent process — the agent's OWN running version (#2841) ────
|
|
249
|
+
# `version` is `coord.__version__`, imported once at process start and
|
|
250
|
+
# frozen for that process's whole life (`coord/agent_app.py`'s health
|
|
251
|
+
# handler: `data["version"] = __version__`). That is exactly what #1834
|
|
252
|
+
# means by "verify the running process, not the venv" — unlike
|
|
253
|
+
# `coord-agent spawns` above, which resolves a *fresh* `coord --version`
|
|
254
|
+
# subprocess through the service PATH and therefore reports the new
|
|
255
|
+
# version the instant a blue/green swap flips `~/.coord-venv`, whether or
|
|
256
|
+
# not the agent that would spawn it has itself restarted.
|
|
257
|
+
#
|
|
258
|
+
# That distinction is cosmetic almost everywhere, because the agent
|
|
259
|
+
# self-restarts on an idle swap (`_idle_restart_target`) and the two
|
|
260
|
+
# lanes reconverge within one poll cycle. It stops being cosmetic on the
|
|
261
|
+
# daemon host: `_idle_restart_target` deliberately returns `None` there
|
|
262
|
+
# (a self-restarted agent would out-rank the `coord-serve` sitting next
|
|
263
|
+
# to it — see that function's docstring), so the daemon host's agent is
|
|
264
|
+
# the one case where nothing but this lane ever reads a staged-but-
|
|
265
|
+
# unrestarted swap as behind. #2069 gave `coord-serve` a `process` lane
|
|
266
|
+
# for the identical reason; this is that fix one unit over, for
|
|
267
|
+
# `coord-agent`.
|
|
268
|
+
if health is not None and "version" in health:
|
|
269
|
+
lanes.append(
|
|
270
|
+
Lane(
|
|
271
|
+
host=host,
|
|
272
|
+
lane="coord-agent process",
|
|
273
|
+
version=health.get("version") or None,
|
|
274
|
+
process=True,
|
|
275
|
+
)
|
|
276
|
+
)
|
|
277
|
+
|
|
248
278
|
return lanes
|
|
249
279
|
|
|
250
280
|
|
|
@@ -81,11 +81,44 @@ terminates with a clear reason rather than spinning.
|
|
|
81
81
|
|
|
82
82
|
OPT-IN, ALWAYS
|
|
83
83
|
--------------
|
|
84
|
-
None of this
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
84
|
+
None of *this module's own functions* start running on a schedule — ``coord
|
|
85
|
+
merge --revalidate`` is the only caller that invokes :func:`revalidate` /
|
|
86
|
+
:func:`revalidate_group` directly, and the daemon's ``_auto_drain_tick``
|
|
87
|
+
passes ``revalidate=False`` permanently, exactly as before.
|
|
88
|
+
|
|
89
|
+
#2829 adds a SIBLING unattended caller instead of changing that:
|
|
90
|
+
:func:`coord.serve_app._auto_revalidate_tick`, gated on its own
|
|
91
|
+
``merge.auto_revalidate`` flag (default ``false``, its own trust bar in
|
|
92
|
+
``docs/MERGE_AUTO_DRAIN_TRUST_BAR.md``). The argument for treating this
|
|
93
|
+
differently from the 2026-06-07 token-burn shape that keeps ``auto_drain``
|
|
94
|
+
off: nothing here dispatches a worker or spends a token either way — see the
|
|
95
|
+
module-level paragraph above — so the guard that incident justifies does not
|
|
96
|
+
apply to this code path. What DOES apply, and what makes this "not a
|
|
97
|
+
one-line flag flip", is the lock-hold hazard: calling ``coord merge
|
|
98
|
+
--revalidate``'s existing plumbing (``_apply_revalidation`` →
|
|
99
|
+
``revalidate_group`` → ``process()``, all under ``_merge_lock`` on the daemon
|
|
100
|
+
route) from an unattended tick would hold that lock for up to
|
|
101
|
+
``DEFAULT_TIMEOUT_SECONDS × (1 + N)`` on every tick, wedging every other
|
|
102
|
+
merge in the fleet for as long as a sleeping operator doesn't notice.
|
|
103
|
+
``_auto_revalidate_tick`` therefore does NOT reuse that call chain — it runs
|
|
104
|
+
:func:`revalidate_group` with **no lock held at all**, and takes
|
|
105
|
+
``_merge_lock`` only immediately before merging, after
|
|
106
|
+
:func:`revalidated_base_still_current` confirms the base the composite
|
|
107
|
+
validated is still current. See that function's docstring for why the
|
|
108
|
+
recheck is the correctness crux, not an optional extra.
|
|
109
|
+
|
|
110
|
+
Acknowledged, not fixed (#2829 review round 1, non-blocking): with no lock
|
|
111
|
+
held at all, this function's own ``git fetch``/``git worktree add`` against
|
|
112
|
+
the shared, non-throwaway ``repo_dir`` (below) can now run at the same moment
|
|
113
|
+
an attended ``coord merge --revalidate`` (still under ``_merge_lock`` for its
|
|
114
|
+
whole duration) does the same thing against that identical checkout — an
|
|
115
|
+
overlap that could never happen before this module had two independent
|
|
116
|
+
unlocked callers. Git's own locking (``index.lock``, ref locks) generally
|
|
117
|
+
turns a clash into a clean failure rather than corruption, and this class of
|
|
118
|
+
unguarded concurrent local-checkout access already exists elsewhere in this
|
|
119
|
+
codebase (``coord test`` via ``confirm_test.py``), so it is left unguarded
|
|
120
|
+
here too — a repo-scoped mutex around the checkout is the fix if it ever
|
|
121
|
+
bites in practice.
|
|
89
122
|
"""
|
|
90
123
|
|
|
91
124
|
from __future__ import annotations
|
|
@@ -348,6 +381,15 @@ class RevalidationResult:
|
|
|
348
381
|
|
|
349
382
|
``kind`` classifies a failure (#1715) so :func:`revalidate_group` can tell
|
|
350
383
|
"this branch broke it" from "nothing here could ever have run".
|
|
384
|
+
|
|
385
|
+
``validated_base_sha`` (#2829) is ``origin/<target_branch>``'s SHA at the
|
|
386
|
+
moment this run's worktree was built — ``None`` when no worktree was ever
|
|
387
|
+
created (every :data:`KIND_SETUP` return). It is the anchor an unattended
|
|
388
|
+
caller re-checks immediately before merging (see
|
|
389
|
+
:func:`revalidated_base_still_current`): a caller that takes no lock
|
|
390
|
+
while the suite runs must confirm, right before it acts on ``recorded``,
|
|
391
|
+
that this SHA is still what the base actually is — otherwise it would be
|
|
392
|
+
merging a tree the suite never validated.
|
|
351
393
|
"""
|
|
352
394
|
|
|
353
395
|
ok: bool
|
|
@@ -357,6 +399,7 @@ class RevalidationResult:
|
|
|
357
399
|
recorded: list[str] = field(default_factory=list)
|
|
358
400
|
worktree: Path | None = None
|
|
359
401
|
kind: str = KIND_OK
|
|
402
|
+
validated_base_sha: str | None = None
|
|
360
403
|
|
|
361
404
|
def __bool__(self) -> bool: # pragma: no cover — convenience only
|
|
362
405
|
return self.ok
|
|
@@ -746,6 +789,15 @@ def revalidate(
|
|
|
746
789
|
),
|
|
747
790
|
)
|
|
748
791
|
|
|
792
|
+
# #2829: the base every return from here on actually validated against —
|
|
793
|
+
# stamped on every `RevalidationResult` below (success or failure) so an
|
|
794
|
+
# unattended caller that runs this whole function with no lock held can,
|
|
795
|
+
# right before it acts on a green result, re-check this SHA is still
|
|
796
|
+
# current (see `revalidated_base_still_current`). Read once, right after
|
|
797
|
+
# the worktree is built from it, rather than re-derived later — this IS
|
|
798
|
+
# the base the composed tree and the suite run actually saw.
|
|
799
|
+
base_sha = _rev_parse(repo_dir, f"origin/{target_branch}")
|
|
800
|
+
|
|
749
801
|
composed: list[str] = []
|
|
750
802
|
# `git merge` (not rebase) with an explicit commit: we only need a tree
|
|
751
803
|
# that contains every candidate's content on top of the current base.
|
|
@@ -769,6 +821,7 @@ def revalidate(
|
|
|
769
821
|
output=_tail(merged.stdout + "\n" + merged.stderr),
|
|
770
822
|
composed=list(composed),
|
|
771
823
|
worktree=wt_path,
|
|
824
|
+
validated_base_sha=base_sha,
|
|
772
825
|
)
|
|
773
826
|
composed.append(branch)
|
|
774
827
|
echo(f" composed {branch}")
|
|
@@ -786,6 +839,7 @@ def revalidate(
|
|
|
786
839
|
reason=f"revalidation build timed out after {timeout}s",
|
|
787
840
|
composed=list(composed),
|
|
788
841
|
worktree=wt_path,
|
|
842
|
+
validated_base_sha=base_sha,
|
|
789
843
|
)
|
|
790
844
|
if built.returncode != 0:
|
|
791
845
|
build_output = (built.stdout or "") + "\n" + (built.stderr or "")
|
|
@@ -814,6 +868,7 @@ def revalidate(
|
|
|
814
868
|
output=_tail(build_output),
|
|
815
869
|
composed=list(composed),
|
|
816
870
|
worktree=wt_path,
|
|
871
|
+
validated_base_sha=base_sha,
|
|
817
872
|
)
|
|
818
873
|
|
|
819
874
|
echo(f" running tests: {test_command}")
|
|
@@ -826,6 +881,7 @@ def revalidate(
|
|
|
826
881
|
reason=f"revalidation suite timed out after {timeout}s",
|
|
827
882
|
composed=list(composed),
|
|
828
883
|
worktree=wt_path,
|
|
884
|
+
validated_base_sha=base_sha,
|
|
829
885
|
)
|
|
830
886
|
if tested.returncode != 0:
|
|
831
887
|
test_output = (tested.stdout or "") + "\n" + (tested.stderr or "")
|
|
@@ -854,6 +910,7 @@ def revalidate(
|
|
|
854
910
|
output=_tail(test_output),
|
|
855
911
|
composed=list(composed),
|
|
856
912
|
worktree=wt_path,
|
|
913
|
+
validated_base_sha=base_sha,
|
|
857
914
|
)
|
|
858
915
|
|
|
859
916
|
# ── Suite green: record the fresh verdicts ──────────────────────────────
|
|
@@ -862,8 +919,11 @@ def revalidate(
|
|
|
862
919
|
# The commits this run ACTUALLY validated, read from the local refs the
|
|
863
920
|
# worktree was built from — not re-discovered from GitHub afterwards. See
|
|
864
921
|
# `record_test_staleness_anchor`'s docstring for why that distinction is
|
|
865
|
-
# load-bearing rather than an optimisation.
|
|
866
|
-
|
|
922
|
+
# load-bearing rather than an optimisation. Same value as `base_sha`
|
|
923
|
+
# above (nothing has fetched again since); reuse it rather than
|
|
924
|
+
# re-deriving so the RESULT's `validated_base_sha` and the ANCHOR written
|
|
925
|
+
# to the DB can never disagree.
|
|
926
|
+
validated_base_sha = base_sha
|
|
867
927
|
|
|
868
928
|
recorded: list[str] = []
|
|
869
929
|
composite_note = (
|
|
@@ -903,6 +963,7 @@ def revalidate(
|
|
|
903
963
|
composed=composed,
|
|
904
964
|
recorded=recorded,
|
|
905
965
|
worktree=None,
|
|
966
|
+
validated_base_sha=validated_base_sha,
|
|
906
967
|
)
|
|
907
968
|
|
|
908
969
|
|
|
@@ -1074,6 +1135,97 @@ def revalidate_group(
|
|
|
1074
1135
|
return batch
|
|
1075
1136
|
|
|
1076
1137
|
|
|
1138
|
+
def recorded_validated_base_shas(
|
|
1139
|
+
batch: BatchRevalidationResult,
|
|
1140
|
+
candidates: list[RevalidationCandidate],
|
|
1141
|
+
) -> dict[str, str | None]:
|
|
1142
|
+
"""Map each RECORDED candidate to the base SHA the run that actually
|
|
1143
|
+
cleared it validated against (#2829).
|
|
1144
|
+
|
|
1145
|
+
Only :data:`coord.serve_app._auto_revalidate_tick` — the unattended
|
|
1146
|
+
caller — needs this: an attended ``coord merge --revalidate`` acts on
|
|
1147
|
+
``batch.recorded`` immediately, under the same lock the whole call was
|
|
1148
|
+
already made under, so there is no gap for the base to move in. The
|
|
1149
|
+
unattended tick runs the composite (and any per-entry fallback) with NO
|
|
1150
|
+
lock held at all, so before it merges anything it must re-confirm, via
|
|
1151
|
+
:func:`revalidated_base_still_current`, that each recorded id's base is
|
|
1152
|
+
still what THIS mapping says was validated.
|
|
1153
|
+
|
|
1154
|
+
A clean composite validates every candidate against the SAME base
|
|
1155
|
+
(``batch.composite.validated_base_sha``). A composite that fell back to
|
|
1156
|
+
per-entry narrowing (#1715) took one run per candidate, each
|
|
1157
|
+
conceivably (if rarely) against a slightly later ``git fetch`` — so
|
|
1158
|
+
each survivor gets its OWN solo run's SHA instead. ``batch.per_entry``
|
|
1159
|
+
is built by :func:`revalidate_group` iterating *candidates* in order,
|
|
1160
|
+
appending exactly one entry per candidate whether it passed or failed
|
|
1161
|
+
(never skipped, never reordered) — so zipping the two by position
|
|
1162
|
+
recovers the correspondence without re-deriving the ``_label`` string
|
|
1163
|
+
matching :func:`format_batch` uses for display.
|
|
1164
|
+
|
|
1165
|
+
Only recorded (merge-eligible) candidates appear in the result — a
|
|
1166
|
+
candidate that never got a fresh verdict has nothing for a caller to
|
|
1167
|
+
gate before merging.
|
|
1168
|
+
"""
|
|
1169
|
+
recorded = set(batch.recorded)
|
|
1170
|
+
result: dict[str, str | None] = {}
|
|
1171
|
+
if not batch.fell_back:
|
|
1172
|
+
for c in candidates:
|
|
1173
|
+
if c.work_assignment_id in recorded:
|
|
1174
|
+
result[c.work_assignment_id] = batch.composite.validated_base_sha
|
|
1175
|
+
return result
|
|
1176
|
+
for c, (_label, solo) in zip(candidates, batch.per_entry):
|
|
1177
|
+
if solo.ok and c.work_assignment_id in recorded:
|
|
1178
|
+
result[c.work_assignment_id] = solo.validated_base_sha
|
|
1179
|
+
return result
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
def revalidated_base_still_current(
|
|
1183
|
+
config, repo_name: str, target_branch: str, validated_base_sha: str | None,
|
|
1184
|
+
) -> bool:
|
|
1185
|
+
"""True when *validated_base_sha* is still ``origin/<target_branch>``'s
|
|
1186
|
+
HEAD — the base-SHA recheck an unattended caller must run immediately
|
|
1187
|
+
before merging anything a lock-free composite just validated (#2829).
|
|
1188
|
+
|
|
1189
|
+
THE CORRECTNESS CRUX. :func:`coord.serve_app._auto_revalidate_tick` runs
|
|
1190
|
+
the (potentially 30-minute) composite with `_merge_lock` released, so
|
|
1191
|
+
another merge can move the base while it runs. A green composite is a
|
|
1192
|
+
claim about the tree it was BUILT from, not about whatever
|
|
1193
|
+
``origin/<target_branch>`` happens to be by the time the suite finishes.
|
|
1194
|
+
Skipping this check would trade the liveness bug (a sleeping fleet
|
|
1195
|
+
wedged for 30+ minutes behind one composite) for a soundness bug
|
|
1196
|
+
(merging a tree the suite never actually ran against) — which is worse,
|
|
1197
|
+
because it fails silently instead of just being slow.
|
|
1198
|
+
|
|
1199
|
+
Fetches fresh (mirrors :func:`revalidate`'s own first step) rather than
|
|
1200
|
+
trusting whatever the caller's board/queue snapshot says, since the
|
|
1201
|
+
whole point is to catch a move that happened AFTER that snapshot was
|
|
1202
|
+
taken. Fail-closed: a ``None`` SHA (nothing was ever validated — e.g. a
|
|
1203
|
+
:data:`KIND_SETUP` result), a missing/unreachable local checkout, or a
|
|
1204
|
+
failed fetch all return ``False``. "Cannot confirm the base is
|
|
1205
|
+
unchanged" must never be treated as "confirmed unchanged" on a path
|
|
1206
|
+
that is about to merge with nobody watching — the caller's response to
|
|
1207
|
+
``False`` is simply to skip merging this tick; the next tick's
|
|
1208
|
+
:func:`coord.merge_queue.plan` will see the recorded verdict's anchor no
|
|
1209
|
+
longer matches the (now different) base, call it stale again, and
|
|
1210
|
+
``_auto_revalidate_tick`` will re-revalidate it against the new base —
|
|
1211
|
+
exactly the "discard the result and let the next tick retry" behaviour
|
|
1212
|
+
the issue calls for, with no explicit revert needed.
|
|
1213
|
+
"""
|
|
1214
|
+
if not validated_base_sha:
|
|
1215
|
+
return False
|
|
1216
|
+
repo_dir = local_repo_dir(config, repo_name)
|
|
1217
|
+
if repo_dir is None or not repo_dir.exists():
|
|
1218
|
+
return False
|
|
1219
|
+
try:
|
|
1220
|
+
fetched = _run(["git", "fetch", "origin", "--prune"], cwd=repo_dir)
|
|
1221
|
+
except (subprocess.SubprocessError, OSError):
|
|
1222
|
+
return False
|
|
1223
|
+
if fetched.returncode != 0:
|
|
1224
|
+
return False
|
|
1225
|
+
current = _rev_parse(repo_dir, f"origin/{target_branch}")
|
|
1226
|
+
return current is not None and current == validated_base_sha
|
|
1227
|
+
|
|
1228
|
+
|
|
1077
1229
|
def compose_conflict_error(entry) -> str:
|
|
1078
1230
|
"""The ``entry.error`` text for a branch that will not compose (#2231).
|
|
1079
1231
|
|
|
@@ -1268,7 +1420,9 @@ __all__ = [
|
|
|
1268
1420
|
"is_baseline_red_failure",
|
|
1269
1421
|
"is_infrastructure_failure",
|
|
1270
1422
|
"local_repo_dir",
|
|
1423
|
+
"recorded_validated_base_shas",
|
|
1271
1424
|
"revalidate",
|
|
1272
1425
|
"revalidate_group",
|
|
1426
|
+
"revalidated_base_still_current",
|
|
1273
1427
|
"revalidation_worktree_path",
|
|
1274
1428
|
]
|