code-coordinator 0.5.496__tar.gz → 0.5.498__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.496 → code_coordinator-0.5.498}/PKG-INFO +1 -1
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/drive_queue.py +287 -5
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/release.py +55 -3
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/overlap_predict.py +86 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/release_propagate.py +49 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_drive_queue.py +149 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_release_propagate.py +148 -2
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_overlap_predict.py +56 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_propagate.py +62 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.gitignore +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/CLAUDE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/GOAL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/LICENSE +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/MANIFEST.in +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/README.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agent.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/backup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/block_log.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/board_service.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/brain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/claim.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/client.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/codegen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/comments.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dao.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/db.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deps.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/drive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/events.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/filelock.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/freshness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gates.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/goal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/context.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/models.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/render.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/units.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/hooks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/interactive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/models.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/network.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/openapi.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/parentage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/plans.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/progress.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/release_window.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/reports.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/review.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/self_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/smoke.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/split_work.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/sql.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/test_author.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/test_report.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/usage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/install-agent.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/pyproject.toml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/setup.cfg +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/backends.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/conftest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_client.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_db.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_max_parallel_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_events.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_init.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_models.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_network.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_session.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_split.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/write_parity.py +0 -0
|
@@ -35,7 +35,7 @@ import socket
|
|
|
35
35
|
import subprocess
|
|
36
36
|
import time
|
|
37
37
|
from pathlib import Path
|
|
38
|
-
from typing import TYPE_CHECKING, Any, Mapping
|
|
38
|
+
from typing import TYPE_CHECKING, Any, Mapping, Sequence
|
|
39
39
|
|
|
40
40
|
import click
|
|
41
41
|
|
|
@@ -111,6 +111,7 @@ from coord.overlap_predict import (
|
|
|
111
111
|
EVENT_SCORED,
|
|
112
112
|
OUTCOME_UNKNOWN,
|
|
113
113
|
SOURCE_DECLARED,
|
|
114
|
+
Overlap,
|
|
114
115
|
Prediction,
|
|
115
116
|
classify_outcome,
|
|
116
117
|
collect_candidate_files,
|
|
@@ -118,6 +119,7 @@ from coord.overlap_predict import (
|
|
|
118
119
|
fanout_warnings,
|
|
119
120
|
inflight_footprints,
|
|
120
121
|
malformed_files_warning,
|
|
122
|
+
overlap_would_run_before,
|
|
121
123
|
parse_declared_files,
|
|
122
124
|
predict_overlap,
|
|
123
125
|
predictions_from_audit,
|
|
@@ -465,12 +467,38 @@ def drive_queue_add(
|
|
|
465
467
|
malformed_note = ""
|
|
466
468
|
auto_after: list[str] = []
|
|
467
469
|
rejected_after: list[str] = []
|
|
470
|
+
# #3395 rule 2: overlaps against an already-queued, not-yet-dispatched
|
|
471
|
+
# entry that THIS add is positioning ahead of — the edge for those goes
|
|
472
|
+
# on the INCUMBENT (`entry --after this add`), applied further down once
|
|
473
|
+
# this add's own row exists, never on `after` above (that would chain
|
|
474
|
+
# this add behind an entry it is about to run in front of).
|
|
475
|
+
reverse_candidates: list[tuple[QueueEntry, Overlap]] = []
|
|
476
|
+
reverse_rejected: list[str] = []
|
|
468
477
|
if not no_predict_overlap:
|
|
469
478
|
prediction, staleness_note, malformed_note = _predict_overlap(
|
|
470
479
|
config_path, repo, issue, existing_entries
|
|
471
480
|
)
|
|
481
|
+
effective_position = _resolve_effective_new_position(position, previous)
|
|
482
|
+
forward_keys, all_reverse = _partition_overlap_after(
|
|
483
|
+
existing_entries,
|
|
484
|
+
effective_position,
|
|
485
|
+
prediction,
|
|
486
|
+
previous_position=previous.position if previous is not None else None,
|
|
487
|
+
)
|
|
488
|
+
# #2603's --reject-after is the same narrower escape hatch for a
|
|
489
|
+
# REVERSED edge too — it names the OTHER entry's key either way, so
|
|
490
|
+
# an operator does not need to know which direction rule 2 picked to
|
|
491
|
+
# veto it.
|
|
492
|
+
reverse_candidates = [
|
|
493
|
+
(entry, overlap) for entry, overlap in all_reverse
|
|
494
|
+
if entry.key not in reject_after
|
|
495
|
+
]
|
|
496
|
+
reverse_rejected = [
|
|
497
|
+
entry.key for entry, _overlap in all_reverse if entry.key in reject_after
|
|
498
|
+
]
|
|
472
499
|
candidate_after = _applicable_auto_after(
|
|
473
|
-
existing_entries, repo, issue, after, prediction
|
|
500
|
+
existing_entries, repo, issue, after, prediction,
|
|
501
|
+
candidate_keys=forward_keys,
|
|
474
502
|
)
|
|
475
503
|
# #2603: --reject-after is the narrower escape hatch — it drops only
|
|
476
504
|
# the named edge(s) from what actually gets applied, never the whole
|
|
@@ -493,6 +521,18 @@ def drive_queue_add(
|
|
|
493
521
|
no_acceptance=no_acceptance,
|
|
494
522
|
plan_destructive=plan_destructive,
|
|
495
523
|
)
|
|
524
|
+
# #3395: apply the REVERSED edges rule 2 selected — writing to the
|
|
525
|
+
# INCUMBENT entry's own row, now that this add's row exists to name as
|
|
526
|
+
# its `--after`. Must run after the write above: it names `entry_key
|
|
527
|
+
# (repo, issue)` as a pre-req, and while nothing here checks the row for
|
|
528
|
+
# existence, doing this first keeps the audit trail (both events land in
|
|
529
|
+
# enqueue order, not out of order relative to `queued ...`) intuitive to
|
|
530
|
+
# read back.
|
|
531
|
+
reverse_applied: list[tuple[QueueEntry, Overlap]] = []
|
|
532
|
+
if reverse_candidates:
|
|
533
|
+
reverse_applied = _apply_reversed_overlap_after(
|
|
534
|
+
existing_entries, entry_key(repo, issue), after, reverse_candidates,
|
|
535
|
+
)
|
|
496
536
|
# #2839: queueing a drive is a strictly STRONGER statement than "send to
|
|
497
537
|
# Pipeline" (`coord track`), so it must never leave the issue in a
|
|
498
538
|
# weaker label state — apply the same `coord` + `status:ready` labels
|
|
@@ -542,13 +582,22 @@ def drive_queue_add(
|
|
|
542
582
|
# --reject-after confirmation above: an author who wrote a declaration
|
|
543
583
|
# that never took must not see output byte-identical to "declared
|
|
544
584
|
# nothing".
|
|
585
|
+
# #3395: plus, for every REVERSED edge rule 2 applied, a line naming the
|
|
586
|
+
# INCUMBENT entry and why the direction is flipped from #2247's usual
|
|
587
|
+
# "ordered --after" reading — an unexplained edge on a row OTHER than
|
|
588
|
+
# the one this `add` named is exactly the kind of surprise an operator
|
|
589
|
+
# needs the reason for immediately, not by going and reading that row's
|
|
590
|
+
# own `last_reason` separately.
|
|
545
591
|
overlap_notes: list[str] = []
|
|
546
592
|
if auto_after:
|
|
547
593
|
overlap_notes.append(prediction.reason)
|
|
548
594
|
overlap_notes.extend(_declared_overlap_age_notes(prediction, auto_after))
|
|
549
|
-
|
|
595
|
+
for entry, overlap in reverse_applied:
|
|
596
|
+
overlap_notes.append(_reverse_overlap_reason(entry_key(repo, issue), overlap))
|
|
597
|
+
all_rejected = [*rejected_after, *reverse_rejected]
|
|
598
|
+
if all_rejected:
|
|
550
599
|
overlap_notes.append(
|
|
551
|
-
"rejected via --reject-after (not applied): " + ", ".join(
|
|
600
|
+
"rejected via --reject-after (not applied): " + ", ".join(all_rejected)
|
|
552
601
|
)
|
|
553
602
|
overlap_notes.extend(fanout_warnings(prediction))
|
|
554
603
|
if malformed_note:
|
|
@@ -925,6 +974,8 @@ def _applicable_auto_after(
|
|
|
925
974
|
issue: int,
|
|
926
975
|
after: list[str],
|
|
927
976
|
prediction: Prediction,
|
|
977
|
+
*,
|
|
978
|
+
candidate_keys: Sequence[str] | None = None,
|
|
928
979
|
) -> list[str]:
|
|
929
980
|
"""The predicted pre-reqs that are actually safe to add.
|
|
930
981
|
|
|
@@ -933,9 +984,20 @@ def _applicable_auto_after(
|
|
|
933
984
|
dropped if it would self-edge or close a cycle — the opposite posture to
|
|
934
985
|
`validate_enqueue`'s treatment of an operator-declared `--after`, which is
|
|
935
986
|
a typo worth reporting.
|
|
987
|
+
|
|
988
|
+
#3395: *candidate_keys* narrows which of `prediction.after_keys` this
|
|
989
|
+
call even considers — `None` (the default, unused by `drive_queue_add`'s
|
|
990
|
+
own call today but kept for a caller that wants pre-#3395 behaviour, or
|
|
991
|
+
a future direct test) keeps the pre-#3395 behaviour of trying all of
|
|
992
|
+
them. `drive_queue_add` passes the FORWARD subset only:
|
|
993
|
+
`_partition_overlap_after` has already routed the REVERSED ones (a
|
|
994
|
+
newcomer positioned ahead of an overlapping, not-yet-dispatched entry) to
|
|
995
|
+
`_apply_reversed_overlap_after` instead, and chaining this entry after
|
|
996
|
+
them TOO would apply rule 2's edge twice, in both directions.
|
|
936
997
|
"""
|
|
998
|
+
keys = prediction.after_keys if candidate_keys is None else tuple(candidate_keys)
|
|
937
999
|
applied: list[str] = []
|
|
938
|
-
for candidate_key in
|
|
1000
|
+
for candidate_key in keys:
|
|
939
1001
|
if candidate_key in after or candidate_key in applied:
|
|
940
1002
|
continue
|
|
941
1003
|
try:
|
|
@@ -948,6 +1010,226 @@ def _applicable_auto_after(
|
|
|
948
1010
|
return applied
|
|
949
1011
|
|
|
950
1012
|
|
|
1013
|
+
def _resolve_effective_new_position(
|
|
1014
|
+
position: int | None, previous: QueueEntry | None,
|
|
1015
|
+
) -> int | None:
|
|
1016
|
+
"""#3395: the position this `add` actually leaves the entry at, for
|
|
1017
|
+
:func:`coord.overlap_predict.overlap_would_run_before` to compare against.
|
|
1018
|
+
|
|
1019
|
+
An explicit ``--position`` wins outright. Otherwise, re-adding an
|
|
1020
|
+
already-queued entry keeps its CURRENT position — `enqueue_drive_queue`
|
|
1021
|
+
never moves a row unless `position` is given — so that position is what
|
|
1022
|
+
the entry will actually run at. A brand-new entry with no `--position`
|
|
1023
|
+
appends at the tail (``None``, `overlap_would_run_before`'s own "never
|
|
1024
|
+
ahead of anything" case) — there is no meaningful position yet.
|
|
1025
|
+
"""
|
|
1026
|
+
if position is not None:
|
|
1027
|
+
return position
|
|
1028
|
+
if previous is not None:
|
|
1029
|
+
return previous.position
|
|
1030
|
+
return None
|
|
1031
|
+
|
|
1032
|
+
|
|
1033
|
+
def _partition_overlap_after(
|
|
1034
|
+
existing_entries: list[QueueEntry],
|
|
1035
|
+
effective_position: int | None,
|
|
1036
|
+
prediction: Prediction,
|
|
1037
|
+
*,
|
|
1038
|
+
previous_position: int | None = None,
|
|
1039
|
+
) -> tuple[list[str], list[tuple[QueueEntry, Overlap]]]:
|
|
1040
|
+
"""#3395 rule 2: split predicted overlaps by which direction the
|
|
1041
|
+
``--after`` edge belongs in.
|
|
1042
|
+
|
|
1043
|
+
FORWARD (returned as plain keys, same shape `_applicable_auto_after`
|
|
1044
|
+
always took) is correct whenever the other side either is already
|
|
1045
|
+
running (`[branch]` — it started before this `add` regardless of queue
|
|
1046
|
+
position) or is queued but will still dispatch no earlier than this
|
|
1047
|
+
newcomer. REVERSE (returned paired with the other side's own
|
|
1048
|
+
`QueueEntry`, since applying it means writing to THAT row, not this one)
|
|
1049
|
+
is the case the issue is about: a `[declared]` overlap against an entry
|
|
1050
|
+
that is still queued but is about to be pushed BEHIND this newcomer in
|
|
1051
|
+
dispatch order. Chaining the newcomer after it there would force the
|
|
1052
|
+
newcomer to run last despite the operator's own `--position`, while the
|
|
1053
|
+
incumbent — now scheduled first — would carry no edge stopping it from
|
|
1054
|
+
colliding with the newcomer's fresher files.
|
|
1055
|
+
|
|
1056
|
+
An overlap naming a key with no matching `QueueEntry` (the declared
|
|
1057
|
+
footprint disappeared between prediction and this call — a `remove` race,
|
|
1058
|
+
vanishingly rare) falls back to FORWARD: the safe, pre-#3395 default.
|
|
1059
|
+
|
|
1060
|
+
``previous_position`` is the target's OWN position before this call —
|
|
1061
|
+
`None` for a brand-new entry, the row's current position when this
|
|
1062
|
+
`add` is REPOSITIONING an already-queued entry. Passed straight through
|
|
1063
|
+
to `overlap_would_run_before`, which needs it to account for
|
|
1064
|
+
`_move_drive_queue_entry_local`'s remove-then-reinsert shift: without
|
|
1065
|
+
it, the direction decision compares `other`'s stale pre-removal
|
|
1066
|
+
position and can pick the REVERSE edge when FORWARD is actually correct
|
|
1067
|
+
(or vice versa) — see that function's docstring for the full case
|
|
1068
|
+
analysis.
|
|
1069
|
+
"""
|
|
1070
|
+
entries_by_key = {e.key: e for e in existing_entries}
|
|
1071
|
+
forward: list[str] = []
|
|
1072
|
+
reverse: list[tuple[QueueEntry, Overlap]] = []
|
|
1073
|
+
for overlap in prediction.overlaps:
|
|
1074
|
+
other = entries_by_key.get(overlap.key)
|
|
1075
|
+
if (
|
|
1076
|
+
overlap.source == SOURCE_DECLARED
|
|
1077
|
+
and other is not None
|
|
1078
|
+
and overlap_would_run_before(
|
|
1079
|
+
effective_position,
|
|
1080
|
+
other.position,
|
|
1081
|
+
previous_position=previous_position,
|
|
1082
|
+
)
|
|
1083
|
+
):
|
|
1084
|
+
reverse.append((other, overlap))
|
|
1085
|
+
else:
|
|
1086
|
+
forward.append(overlap.key)
|
|
1087
|
+
return forward, reverse
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
def _apply_reversed_overlap_after(
|
|
1091
|
+
existing_entries: list[QueueEntry],
|
|
1092
|
+
new_key: str,
|
|
1093
|
+
new_key_after: Sequence[str],
|
|
1094
|
+
reverse_candidates: list[tuple[QueueEntry, Overlap]],
|
|
1095
|
+
) -> list[tuple[QueueEntry, Overlap]]:
|
|
1096
|
+
"""#3395: apply the REVERSED edges `_partition_overlap_after` identified
|
|
1097
|
+
— chain each incumbent entry ``--after`` the newcomer, since the
|
|
1098
|
+
newcomer is the one that will actually dispatch first.
|
|
1099
|
+
|
|
1100
|
+
Same fail-safe posture as `_applicable_auto_after`: a would-be cycle is
|
|
1101
|
+
silently dropped rather than failing this `add` (an INFERRED edge must
|
|
1102
|
+
never be able to refuse an operator's own `--position`), and an edge that
|
|
1103
|
+
already exists on the incumbent is left alone (no redundant write).
|
|
1104
|
+
Every OTHER operator-declared field on the incumbent's row (`machine`,
|
|
1105
|
+
the hold gate, `max_fix_rounds`, ...) is carried through unchanged —
|
|
1106
|
+
`enqueue_drive_queue` fully replaces those columns on every call, so
|
|
1107
|
+
omitting one here would silently clear it off a row this `add` was never
|
|
1108
|
+
asked to touch.
|
|
1109
|
+
|
|
1110
|
+
``new_key_after`` is the newcomer's OWN final ``--after`` list from this
|
|
1111
|
+
same `add` (operator-declared plus rule 1's forward auto-chains). The
|
|
1112
|
+
cycle check below builds its own edge graph rather than reusing
|
|
1113
|
+
`validate_enqueue` directly, because `existing_entries` is the pre-write
|
|
1114
|
+
snapshot: it never contains the newcomer's row (a brand-new entry) and,
|
|
1115
|
+
on a reposition, contains only its STALE pre-`add` edges — so a
|
|
1116
|
+
`validate_enqueue` call scoped to just the incumbent's candidate edge
|
|
1117
|
+
cannot see the newcomer's own outgoing edges and would miss a two-node
|
|
1118
|
+
cycle this single `add` invocation introduces (rule 1 chains the
|
|
1119
|
+
newcomer after an overlapping incumbent, rule 2 separately wants that
|
|
1120
|
+
same incumbent chained after the newcomer). Including `new_key_after` as
|
|
1121
|
+
the newcomer's node in the graph here closes that gap; the tick's own
|
|
1122
|
+
full-graph `find_cycle` would otherwise be the only thing to catch it,
|
|
1123
|
+
after the fact.
|
|
1124
|
+
"""
|
|
1125
|
+
from coord.state import enqueue_drive_queue # noqa: PLC0415
|
|
1126
|
+
|
|
1127
|
+
applied: list[tuple[QueueEntry, Overlap]] = []
|
|
1128
|
+
base_edges: dict[str, list[str]] = {
|
|
1129
|
+
e.key: list(e.after) for e in existing_entries if e.key != new_key
|
|
1130
|
+
}
|
|
1131
|
+
base_edges[new_key] = [str(a) for a in new_key_after]
|
|
1132
|
+
for entry, overlap in reverse_candidates:
|
|
1133
|
+
if new_key in entry.after:
|
|
1134
|
+
applied.append((entry, overlap))
|
|
1135
|
+
continue
|
|
1136
|
+
new_after = [*entry.after, new_key]
|
|
1137
|
+
trial_edges = dict(base_edges)
|
|
1138
|
+
trial_edges[entry.key] = new_after
|
|
1139
|
+
if find_cycle(trial_edges) is not None:
|
|
1140
|
+
continue
|
|
1141
|
+
enqueue_drive_queue(
|
|
1142
|
+
entry.repo,
|
|
1143
|
+
entry.issue,
|
|
1144
|
+
machine=entry.machine or None,
|
|
1145
|
+
after=new_after,
|
|
1146
|
+
position=None,
|
|
1147
|
+
hold_after=entry.hold_after,
|
|
1148
|
+
hold_reason=entry.hold_reason,
|
|
1149
|
+
resume_when=entry.resume_when,
|
|
1150
|
+
hold_scope=entry.hold_scope,
|
|
1151
|
+
max_fix_rounds=entry.max_fix_rounds,
|
|
1152
|
+
no_acceptance=entry.no_acceptance,
|
|
1153
|
+
plan_destructive=entry.plan_destructive,
|
|
1154
|
+
)
|
|
1155
|
+
applied.append((entry, overlap))
|
|
1156
|
+
_record_reverse_overlap_prediction(entry.repo, entry.issue, new_key, overlap)
|
|
1157
|
+
return applied
|
|
1158
|
+
|
|
1159
|
+
|
|
1160
|
+
def _reverse_overlap_reason(new_key: str, overlap: Overlap) -> str:
|
|
1161
|
+
"""#3395: the one sentence shared by `add`'s stdout, the audit summary,
|
|
1162
|
+
and the INCUMBENT's own `last_reason` for a REVERSED edge — so all three
|
|
1163
|
+
surfaces agree on why a row this `add` never named got a new `after=`.
|
|
1164
|
+
"""
|
|
1165
|
+
return (
|
|
1166
|
+
"predicted file overlap (#2247) — ordered "
|
|
1167
|
+
+ overlap.describe_reversed(new_key)
|
|
1168
|
+
+ " (#3395: this add was positioned ahead of an existing queued entry)"
|
|
1169
|
+
)
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
def _record_reverse_overlap_prediction(
|
|
1173
|
+
repo: str, issue: int, new_key: str, overlap: Overlap,
|
|
1174
|
+
) -> None:
|
|
1175
|
+
"""#3395: the audit + `last_reason` twin of `_record_overlap_prediction`
|
|
1176
|
+
for a REVERSED edge — recorded against *repo*/*issue*, the INCUMBENT
|
|
1177
|
+
entry that actually got the new `after=` write, not the entry `add` was
|
|
1178
|
+
called for. Mirrors `_record_overlap_prediction`'s two sinks (a durable
|
|
1179
|
+
audit row, plus the `last_reason` column an operator reading `coord
|
|
1180
|
+
drive-queue list` sees immediately) for the same reason: a `last_reason`
|
|
1181
|
+
the next tick attempt will overwrite is not durable, so the claim also
|
|
1182
|
+
needs a permanent home to be scored later.
|
|
1183
|
+
|
|
1184
|
+
Kept as its own event rather than reusing `Prediction.audit_details()`
|
|
1185
|
+
verbatim: that payload's `after` list and `predicted_files` are framed
|
|
1186
|
+
from the CANDIDATE's point of view (`_predict_overlap` computed them
|
|
1187
|
+
that way), and reusing it here unedited would misrepresent whose files
|
|
1188
|
+
were actually being ordered against whose.
|
|
1189
|
+
"""
|
|
1190
|
+
reason = _reverse_overlap_reason(new_key, overlap)
|
|
1191
|
+
details = {
|
|
1192
|
+
"predicted_files": list(overlap.files),
|
|
1193
|
+
"overlaps": [
|
|
1194
|
+
{
|
|
1195
|
+
"key": new_key,
|
|
1196
|
+
"source": overlap.source,
|
|
1197
|
+
"branch": overlap.branch,
|
|
1198
|
+
"head_sha": overlap.head_sha,
|
|
1199
|
+
"synced_at": overlap.synced_at,
|
|
1200
|
+
"liveness_checked": overlap.liveness_checked,
|
|
1201
|
+
"files": list(overlap.files),
|
|
1202
|
+
}
|
|
1203
|
+
],
|
|
1204
|
+
"after": [new_key],
|
|
1205
|
+
# #3395: the one field with no forward-edge equivalent — lets a later
|
|
1206
|
+
# reader (a human, `overlap-report`) tell this row's `after=` was
|
|
1207
|
+
# rule 2's reversal, not an ordinary same-direction prediction.
|
|
1208
|
+
"reversed": True,
|
|
1209
|
+
}
|
|
1210
|
+
try:
|
|
1211
|
+
from coord.audit import record_audit # noqa: PLC0415
|
|
1212
|
+
|
|
1213
|
+
record_audit(
|
|
1214
|
+
tier="business",
|
|
1215
|
+
category=AUDIT_CATEGORY,
|
|
1216
|
+
event_type=EVENT_PREDICTED,
|
|
1217
|
+
actor="drive-queue",
|
|
1218
|
+
summary=reason,
|
|
1219
|
+
repo=repo,
|
|
1220
|
+
issue=issue,
|
|
1221
|
+
details=details,
|
|
1222
|
+
)
|
|
1223
|
+
except Exception: # noqa: BLE001 — recording must never fail the enqueue
|
|
1224
|
+
pass
|
|
1225
|
+
try:
|
|
1226
|
+
from coord.state import update_drive_queue_entry # noqa: PLC0415
|
|
1227
|
+
|
|
1228
|
+
update_drive_queue_entry(repo, issue, last_reason=reason)
|
|
1229
|
+
except Exception: # noqa: BLE001 — same
|
|
1230
|
+
pass
|
|
1231
|
+
|
|
1232
|
+
|
|
951
1233
|
def _record_overlap_prediction(
|
|
952
1234
|
repo: str, issue: int, prediction: Prediction, applied: list[str],
|
|
953
1235
|
) -> None:
|
|
@@ -1722,8 +1722,32 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
1722
1722
|
# never touched would undo somebody else's deliberate state.
|
|
1723
1723
|
from coord.agent_update import cli_initiator # noqa: PLC0415
|
|
1724
1724
|
|
|
1725
|
+
# #3364: narrow further, to the hosts the RED GATE ITSELF names.
|
|
1726
|
+
# `--rollback-on-red` used to revert every host this run updated
|
|
1727
|
+
# the moment ANY of them went red — four hosts that rolled and
|
|
1728
|
+
# verified clean, reverted because a fifth could not roll at all.
|
|
1729
|
+
# A host that rolled and verified is not part of the failure just
|
|
1730
|
+
# because a sibling host's roll was; partial fleet convergence is
|
|
1731
|
+
# strictly better than reverting everyone plus the fifth's own
|
|
1732
|
+
# damage. `blocking_hosts` is `None` when the gate cannot attribute
|
|
1733
|
+
# to specific hosts (a fleet-wide finding) — that must fail toward
|
|
1734
|
+
# rolling back every updated host, the previous (safe) behavior,
|
|
1735
|
+
# never toward rolling back none of them.
|
|
1736
|
+
implicated = gate.blocking_hosts
|
|
1737
|
+
targets = (
|
|
1738
|
+
updated_hosts if implicated is None
|
|
1739
|
+
else [h for h in updated_hosts if h in implicated]
|
|
1740
|
+
)
|
|
1741
|
+
spared = [h for h in updated_hosts if h not in targets]
|
|
1742
|
+
if spared:
|
|
1743
|
+
record.spared_rollback = spared
|
|
1744
|
+
_out(
|
|
1745
|
+
" spared (rolled and verified, not named by the red gate): "
|
|
1746
|
+
+ ", ".join(spared)
|
|
1747
|
+
)
|
|
1748
|
+
|
|
1725
1749
|
down: list[str] = []
|
|
1726
|
-
for host in
|
|
1750
|
+
for host in targets:
|
|
1727
1751
|
machine = by_name.get(host)
|
|
1728
1752
|
if machine is None:
|
|
1729
1753
|
continue
|
|
@@ -2948,6 +2972,20 @@ def _rollback_host(
|
|
|
2948
2972
|
take under systemd), and only then gives up — loudly, naming the host as
|
|
2949
2973
|
DOWN rather than reporting a tidy "rolling back".
|
|
2950
2974
|
|
|
2975
|
+
#3364: the agent answering ``/health`` again is not the end of the job
|
|
2976
|
+
either. ``POST /rollback`` (``agent_app.py``'s ``rollback`` handler)
|
|
2977
|
+
flips ``~/.coord-venv`` back and re-execs the AGENT — and, same gap
|
|
2978
|
+
#2069 closed for the forward ``/update`` path, nothing about that
|
|
2979
|
+
restarts ``coord-serve``/``coord-web``/``coord-drive-queue``. Left as
|
|
2980
|
+
they were, those siblings keep running out of the slot the rollback
|
|
2981
|
+
just deactivated — permanently orphaned on the slot the next ``/update``
|
|
2982
|
+
must delete and rebuild, which is exactly the #2121 occupied-slot
|
|
2983
|
+
deadlock this issue is about. So a confirmed agent restart here also
|
|
2984
|
+
triggers the same ``_restart_sibling_services`` call `_roll_python` uses,
|
|
2985
|
+
and a sibling that fails to come back on the reverted slot fails this
|
|
2986
|
+
rollback's own verdict — "the venv flipped back" is not "the host is
|
|
2987
|
+
back", same reasoning as #2095 for the forward roll.
|
|
2988
|
+
|
|
2951
2989
|
#2121: *initiator* names this call on the target host's audit trail, the
|
|
2952
2990
|
same as ``_roll_python``'s own ``/update`` POST a few lines up — both are
|
|
2953
2991
|
automation that fires during a fleet roll with nobody at a keyboard, so
|
|
@@ -2968,9 +3006,23 @@ def _rollback_host(
|
|
|
2968
3006
|
if status != 202:
|
|
2969
3007
|
return False, str(body.get("error") or f"HTTP {status}")
|
|
2970
3008
|
|
|
3009
|
+
def _back_on_target(note: str) -> tuple[bool, str]:
|
|
3010
|
+
"""The agent answered ``/health`` on the reverted slot — re-home the
|
|
3011
|
+
siblings onto it too (#3364) before this counts as done."""
|
|
3012
|
+
sib_ok, sib_detail, _sib_failed = _restart_sibling_services(
|
|
3013
|
+
machine, agent_port=agent_port
|
|
3014
|
+
)
|
|
3015
|
+
if sib_ok is False:
|
|
3016
|
+
return False, f"{note}, but {sib_detail}"
|
|
3017
|
+
# True (nothing failed) and None (this agent predates
|
|
3018
|
+
# /restart-services — no channel to have restarted anything
|
|
3019
|
+
# through) both still count as a rollback success: neither is a
|
|
3020
|
+
# service THIS call took down.
|
|
3021
|
+
return True, f"{note}; {sib_detail}"
|
|
3022
|
+
|
|
2971
3023
|
back, version = _wait_agent_back(machine, agent_port=agent_port, timeout=timeout)
|
|
2972
3024
|
if back:
|
|
2973
|
-
return
|
|
3025
|
+
return _back_on_target(f"rolled back; agent is serving again on v{version}")
|
|
2974
3026
|
|
|
2975
3027
|
# The re-exec did not take. This is the documented systemd stall, and it
|
|
2976
3028
|
# has a documented fix — apply it rather than handing the operator a
|
|
@@ -2981,7 +3033,7 @@ def _rollback_host(
|
|
|
2981
3033
|
machine, agent_port=agent_port, timeout=min(timeout, 60.0)
|
|
2982
3034
|
)
|
|
2983
3035
|
if back:
|
|
2984
|
-
return
|
|
3036
|
+
return _back_on_target(
|
|
2985
3037
|
f"rolled back; agent needed an SSH `systemctl --user restart "
|
|
2986
3038
|
f"coord-agent` but is serving again on v{version}"
|
|
2987
3039
|
)
|
|
@@ -92,6 +92,23 @@ detail because it is pure data with no wall-clock dependency; the cached-body
|
|
|
92
92
|
age is a relative-time string and is therefore the CLI layer's job (see
|
|
93
93
|
``coord.commands.drive_queue``), the same split that module already draws
|
|
94
94
|
for the candidate's own staleness note.
|
|
95
|
+
|
|
96
|
+
#3395: this module already predicted against every non-terminal QUEUED entry,
|
|
97
|
+
not just in-flight branches (:func:`coord.commands.drive_queue._predict_overlap`
|
|
98
|
+
builds :class:`Footprint`\\ s from both) — the gap was DIRECTION, not
|
|
99
|
+
coverage. Chaining every overlap the newcomer's own ``--after`` is only
|
|
100
|
+
correct when the newcomer runs SECOND. When it is inserted ahead of an
|
|
101
|
+
already-queued, not-yet-dispatched entry it overlaps with (``--position``
|
|
102
|
+
placing it before that entry's slot), chaining it after that entry as well
|
|
103
|
+
would force it to run LAST despite the operator's own ordering — while the
|
|
104
|
+
incumbent, now scheduled to run FIRST, sails past the newcomer's fresher
|
|
105
|
+
files with no edge stopping it, exactly vimcode#1117/#1090's shape.
|
|
106
|
+
:func:`overlap_would_run_before` answers "who runs first" as a pure position
|
|
107
|
+
comparison; :meth:`Overlap.describe_reversed` renders the edge the other way
|
|
108
|
+
round when the answer says to reverse it. The decision of WHICH overlaps to
|
|
109
|
+
reverse still lives in ``coord.commands.drive_queue`` (it needs the queue's
|
|
110
|
+
positions and the write path to apply an edge onto an entry other than the
|
|
111
|
+
one being added), so this module only supplies the pure primitives.
|
|
95
112
|
"""
|
|
96
113
|
|
|
97
114
|
from __future__ import annotations
|
|
@@ -444,6 +461,24 @@ class Overlap:
|
|
|
444
461
|
stale = ", liveness check failed" if not self.liveness_checked else ""
|
|
445
462
|
return f" ({self.branch}{sha}{stale})"
|
|
446
463
|
|
|
464
|
+
def describe_reversed(self, new_key: str) -> str:
|
|
465
|
+
"""#3395: the same rendering as :meth:`describe`, but for the
|
|
466
|
+
REVERSED chaining direction rule 2 requires when a newcomer is
|
|
467
|
+
positioned AHEAD of the entry this overlap names.
|
|
468
|
+
|
|
469
|
+
:meth:`describe` reads as "the OTHER entry, which the candidate is
|
|
470
|
+
chained after" — correct when the candidate runs second. Here it is
|
|
471
|
+
the other way around: ``self.key`` (the entry already sitting in the
|
|
472
|
+
queue) is the one that must now wait, and *new_key* is the newcomer
|
|
473
|
+
it waits ON. Only ever called for a :data:`SOURCE_DECLARED` overlap
|
|
474
|
+
(see :func:`overlap_would_run_before`'s caller) — a `[branch]` edge
|
|
475
|
+
is already running and can never be the one reversed.
|
|
476
|
+
"""
|
|
477
|
+
shown = ", ".join(f"`{f}`" for f in self.files[:3])
|
|
478
|
+
if len(self.files) > 3:
|
|
479
|
+
shown += f" (+{len(self.files) - 3} more)"
|
|
480
|
+
return f"{self.key} --after {new_key} [{self.source}]{self._provenance()}: {shown}"
|
|
481
|
+
|
|
447
482
|
|
|
448
483
|
@dataclass(frozen=True)
|
|
449
484
|
class Prediction:
|
|
@@ -528,6 +563,57 @@ def paths_overlap(left: str, right: str) -> bool:
|
|
|
528
563
|
return bool(right.endswith("/") and left.startswith(right))
|
|
529
564
|
|
|
530
565
|
|
|
566
|
+
def overlap_would_run_before(
|
|
567
|
+
new_position: int | None,
|
|
568
|
+
other_position: int,
|
|
569
|
+
*,
|
|
570
|
+
previous_position: int | None = None,
|
|
571
|
+
) -> bool:
|
|
572
|
+
"""#3395: would the entry landing at *new_position* dispatch BEFORE the
|
|
573
|
+
already-queued entry sitting at *other_position*?
|
|
574
|
+
|
|
575
|
+
This is rule 2 of the issue's fix, in its testable pure form: an overlap
|
|
576
|
+
against a `[declared]` (still-queued, not-yet-dispatched) entry must be
|
|
577
|
+
chained the NORMAL way (newcomer ``--after`` the incumbent) UNLESS the
|
|
578
|
+
newcomer is being inserted ahead of it in queue order — in which case the
|
|
579
|
+
edge has to run the other way, or the incumbent's stale files would
|
|
580
|
+
collide with a newcomer that starts first. The caller
|
|
581
|
+
(`coord.commands.drive_queue._partition_overlap_after`) is what decides
|
|
582
|
+
WHICH direction to apply based on this answer; this function only answers
|
|
583
|
+
"who runs first".
|
|
584
|
+
|
|
585
|
+
``new_position=None`` means "appends at the tail" — `coord.state.
|
|
586
|
+
enqueue_drive_queue`'s own contract for an omitted ``--position`` — which
|
|
587
|
+
can never be ahead of anything already queued, so this is unconditionally
|
|
588
|
+
``False``. A tie (``new_position == other_position``) resolves to
|
|
589
|
+
``True``: inserting AT an occupied slot pushes the incumbent back one
|
|
590
|
+
(`coord.state._move_drive_queue_entry_local`'s renumbering), so the
|
|
591
|
+
newcomer is the one that ends up running first.
|
|
592
|
+
|
|
593
|
+
``previous_position`` is the entry's OWN position before this call, when
|
|
594
|
+
it is already queued and being repositioned (``None`` for a brand-new
|
|
595
|
+
entry). `_move_drive_queue_entry_local` implements a reposition as
|
|
596
|
+
remove-then-reinsert: removing the entry from its old slot shifts every
|
|
597
|
+
entry that was originally AFTER it down by one index, before the entry
|
|
598
|
+
is reinserted at the clamped destination. `other_position` (taken from
|
|
599
|
+
the pre-write snapshot) does not reflect that shift, so comparing it
|
|
600
|
+
directly against `new_position` is only correct when nothing was
|
|
601
|
+
removed first — i.e. a brand-new entry, where `previous_position` is
|
|
602
|
+
`None`. When repositioning, and `other_position` was originally after
|
|
603
|
+
`previous_position` (the entry's own old slot), the removal already
|
|
604
|
+
moved `other` one slot earlier — accounted for here by comparing against
|
|
605
|
+
``other_position - 1`` instead. Getting this backwards does not just
|
|
606
|
+
miss an edge (the pre-#3395 failure mode) — it applies the REVERSE edge,
|
|
607
|
+
ordering the entry that will actually dispatch first to wait on the one
|
|
608
|
+
that dispatches second.
|
|
609
|
+
"""
|
|
610
|
+
if new_position is None:
|
|
611
|
+
return False
|
|
612
|
+
if previous_position is not None and other_position > previous_position:
|
|
613
|
+
other_position -= 1
|
|
614
|
+
return int(new_position) <= int(other_position)
|
|
615
|
+
|
|
616
|
+
|
|
531
617
|
def _intersect(candidate: Sequence[str], other: Sequence[str]) -> tuple[str, ...]:
|
|
532
618
|
hits: list[str] = []
|
|
533
619
|
for path in candidate:
|
|
@@ -419,6 +419,14 @@ OUT_OF_REACH_LANES: frozenset[str] = frozenset({"~/.coord-cli-venv", "webapp bun
|
|
|
419
419
|
#: for a lane, and the only form a grouped finding names its lanes by.
|
|
420
420
|
_LANE_LABEL = re.compile(r"^(?P<lane>.+?)\s+\((?P<host>[^()]+)\)$")
|
|
421
421
|
|
|
422
|
+
#: The pseudo-host ``coord/release_verify.py``'s ``verify()`` stamps on a
|
|
423
|
+
#: finding it cannot pin to one machine (a fleet-wide version-skew or
|
|
424
|
+
#: no-data finding — every ``host="(fleet)"`` call there). Named here so
|
|
425
|
+
#: :attr:`GateVerdict.blocking_hosts` recognises it as "not a real host" the
|
|
426
|
+
#: same way :func:`lane_is_out_of_reach`'s allow-list keeps a lane's gaps
|
|
427
|
+
#: explicit rather than inferred.
|
|
428
|
+
_UNATTRIBUTABLE_HOST = "(fleet)"
|
|
429
|
+
|
|
422
430
|
|
|
423
431
|
def parse_lane_label(label: str) -> tuple[str, str] | None:
|
|
424
432
|
"""``"~/.coord-venv (precision)"`` -> ``("precision", "~/.coord-venv")``.
|
|
@@ -487,6 +495,36 @@ class GateVerdict:
|
|
|
487
495
|
def red(self) -> bool:
|
|
488
496
|
return self.severity == "crit"
|
|
489
497
|
|
|
498
|
+
@property
|
|
499
|
+
def blocking_hosts(self) -> frozenset[str] | None:
|
|
500
|
+
"""Real hosts a BLOCKING finding actually names (#3364).
|
|
501
|
+
|
|
502
|
+
``--rollback-on-red`` used to revert every host a run updated the
|
|
503
|
+
instant ANY of them went red — a fifth host's failure rolling back
|
|
504
|
+
four that verified clean. This is what lets a caller narrow to just
|
|
505
|
+
the hosts the red gate is actually about, the same way
|
|
506
|
+
:func:`attempted_scope` already narrows which lanes count.
|
|
507
|
+
|
|
508
|
+
``None`` means "could not attribute to specific hosts" — a
|
|
509
|
+
fleet-wide finding like the no-``--expected``-given skew case
|
|
510
|
+
(``host="(fleet)"``, see ``coord/release_verify.py``'s ``verify()``)
|
|
511
|
+
or a finding with no host at all. A caller must fail toward that
|
|
512
|
+
meaning "implicates everyone this run touched", never toward
|
|
513
|
+
"implicates nobody" — the same "an unattributable signal blocks
|
|
514
|
+
every host, never none of them" rule :attr:`Quiescence.
|
|
515
|
+
fleet_wide_busy` already follows for busy signals. A concrete
|
|
516
|
+
(possibly empty, when there are no blocking findings at all) set
|
|
517
|
+
means every blocking finding named a real host, and rollback may
|
|
518
|
+
scope to exactly those.
|
|
519
|
+
"""
|
|
520
|
+
hosts: set[str] = set()
|
|
521
|
+
for finding in self.blocking:
|
|
522
|
+
for host, _lane in _finding_pairs(finding):
|
|
523
|
+
if not host or host == _UNATTRIBUTABLE_HOST:
|
|
524
|
+
return None
|
|
525
|
+
hosts.add(host)
|
|
526
|
+
return frozenset(hosts)
|
|
527
|
+
|
|
490
528
|
def to_dict(self) -> dict:
|
|
491
529
|
return {
|
|
492
530
|
"severity": self.severity,
|
|
@@ -1485,6 +1523,12 @@ class PropagationRecord:
|
|
|
1485
1523
|
#: done so, or the resulting quiet fleet is indistinguishable from #2082.
|
|
1486
1524
|
cordons: dict = field(default_factory=dict)
|
|
1487
1525
|
rolled_back: list[str] = field(default_factory=list)
|
|
1526
|
+
#: #3364: hosts this run updated and verified clean but did NOT roll back
|
|
1527
|
+
#: even though the gate went red — because the red gate's blocking
|
|
1528
|
+
#: findings (:attr:`GateVerdict.blocking_hosts`) named some OTHER host,
|
|
1529
|
+
#: not this one. A host that rolled and verified is not part of the
|
|
1530
|
+
#: failure just because a sibling host's roll was.
|
|
1531
|
+
spared_rollback: list[str] = field(default_factory=list)
|
|
1488
1532
|
released_holds: list[str] = field(default_factory=list)
|
|
1489
1533
|
#: #2583: the min-releases-behind gate's own readings for this run —
|
|
1490
1534
|
#: ``min_releases_behind`` is whatever this run resolved (flag > config >
|
|
@@ -1763,6 +1807,11 @@ def render_record(record: PropagationRecord | Mapping[str, Any]) -> list[str]:
|
|
|
1763
1807
|
|
|
1764
1808
|
if data.get("rolled_back"):
|
|
1765
1809
|
lines.append(f" rolled back: {', '.join(data['rolled_back'])}")
|
|
1810
|
+
if data.get("spared_rollback"):
|
|
1811
|
+
lines.append(
|
|
1812
|
+
" spared (rolled and verified, not named by the red gate): "
|
|
1813
|
+
+ ", ".join(data["spared_rollback"])
|
|
1814
|
+
)
|
|
1766
1815
|
if data.get("released_holds"):
|
|
1767
1816
|
lines.append(f" released deploy gates: {', '.join(data['released_holds'])}")
|
|
1768
1817
|
if data.get("error"):
|