code-coordinator 0.5.496__tar.gz → 0.5.497__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.497}/PKG-INFO +1 -1
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/drive_queue.py +287 -5
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/overlap_predict.py +86 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_drive_queue.py +149 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_overlap_predict.py +56 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.gitignore +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/CLAUDE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/GOAL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/LICENSE +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/MANIFEST.in +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/README.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agent.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/backup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/block_log.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/board_service.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/brain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/claim.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/client.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/codegen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/comments.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dao.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/db.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deps.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/drive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/events.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/filelock.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/freshness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gates.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/goal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/context.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/models.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/render.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/units.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/hooks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/interactive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/models.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/network.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/openapi.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/parentage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/plans.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/progress.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/release_window.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/reports.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/review.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/self_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/smoke.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/split_work.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/sql.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/test_author.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/test_report.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/usage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/install-agent.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/pyproject.toml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/setup.cfg +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/__init__.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/backends.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/conftest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_client.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_db.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_max_parallel_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_events.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_init.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_models.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_network.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_session.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_split.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_state.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.496 → code_coordinator-0.5.497}/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:
|
|
@@ -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:
|
|
@@ -6097,3 +6097,152 @@ def test_diagnose_does_not_call_a_never_polled_machine_unreachable(
|
|
|
6097
6097
|
assert "agent-unreachable" not in result.output
|
|
6098
6098
|
assert "dead-leg" not in result.output
|
|
6099
6099
|
assert "/health dellserver: not read" in result.output
|
|
6100
|
+
|
|
6101
|
+
|
|
6102
|
+
# ── #3395: direction-aware overlap ordering against a QUEUED entry ──────────
|
|
6103
|
+
#
|
|
6104
|
+
# vimcode#1117 / vimcode#1090: both declared `src/harness.rs` and
|
|
6105
|
+
# `src/tui_main/shell_app.rs`. #1090 was queued first and sat `waiting`
|
|
6106
|
+
# behind a chain; #1117 was added later at `--position 0`, ahead of it. The
|
|
6107
|
+
# predictor found the overlap but chained #1117 `--after` #1090 — the normal
|
|
6108
|
+
# direction, correct only when the newcomer runs SECOND. Here it runs FIRST
|
|
6109
|
+
# (that is the whole point of `--position 0`), so #1090 carried no edge
|
|
6110
|
+
# naming #1117 and both ran concurrently: #1117 merged first and emptied a
|
|
6111
|
+
# list in `src/harness.rs`; #1090's stale copy conflicted on merge (PR #1121,
|
|
6112
|
+
# `HUMAN_REQUIRED`). These assert the edge lands on the INCUMBENT (#1090)
|
|
6113
|
+
# instead, fixing the direction rather than merely detecting the collision
|
|
6114
|
+
# (which unfixed `main` already does — see the module docstring's #3395
|
|
6115
|
+
# paragraph).
|
|
6116
|
+
|
|
6117
|
+
|
|
6118
|
+
def test_inserting_ahead_of_a_queued_overlap_orders_the_incumbent_after_it(
|
|
6119
|
+
cli, declare,
|
|
6120
|
+
):
|
|
6121
|
+
# Queue A (files X, Y) — queued first, sits at position 0.
|
|
6122
|
+
declare(1090, "src/harness.rs", "src/tui_main/shell_app.rs")
|
|
6123
|
+
assert cli("add", REPO, "1090").exit_code == 0
|
|
6124
|
+
|
|
6125
|
+
# Queue B (files X, Z) at --position 0, ahead of A. Fails against
|
|
6126
|
+
# unfixed main: the edge previously landed on B (`1117 after 1090`), not
|
|
6127
|
+
# on A — the newcomer positioned to run FIRST was the one made to wait.
|
|
6128
|
+
declare(1117, "src/harness.rs", "src/tui_main/shell_app.rs")
|
|
6129
|
+
result = cli("add", REPO, "1117", "--position", "0")
|
|
6130
|
+
|
|
6131
|
+
assert result.exit_code == 0, result.output
|
|
6132
|
+
# The edge exists, and on the correct side: A (already queued, now
|
|
6133
|
+
# pushed behind B in dispatch order) waits on B, not the other way
|
|
6134
|
+
# around.
|
|
6135
|
+
assert queued(1090)["after_json"] == [f"{REPO}#1117"]
|
|
6136
|
+
assert queued(1117)["after_json"] == []
|
|
6137
|
+
# B is genuinely positioned first.
|
|
6138
|
+
positions = {r["issue_number"]: r["position"] for r in state._list_drive_queue_local()}
|
|
6139
|
+
assert positions[1117] < positions[1090]
|
|
6140
|
+
# The reason is recorded on the row that actually changed, and names why
|
|
6141
|
+
# the direction is reversed.
|
|
6142
|
+
assert "predicted file overlap (#2247)" in result.output
|
|
6143
|
+
assert f"ordered {REPO}#1090 --after {REPO}#1117" in result.output
|
|
6144
|
+
assert "positioned ahead of an existing queued entry" in result.output
|
|
6145
|
+
assert "predicted file overlap (#2247)" in queued(1090)["last_reason"]
|
|
6146
|
+
|
|
6147
|
+
|
|
6148
|
+
def test_appending_after_a_queued_overlap_keeps_the_normal_forward_direction(
|
|
6149
|
+
cli, declare,
|
|
6150
|
+
):
|
|
6151
|
+
# Same two declarations, but B appended at the tail (no --position) —
|
|
6152
|
+
# the ordinary case #2247's original tests already cover. Direction must
|
|
6153
|
+
# stay forward: B waits on A, since B genuinely runs second.
|
|
6154
|
+
declare(1090, "src/harness.rs", "src/tui_main/shell_app.rs")
|
|
6155
|
+
assert cli("add", REPO, "1090").exit_code == 0
|
|
6156
|
+
|
|
6157
|
+
declare(1117, "src/harness.rs", "src/tui_main/shell_app.rs")
|
|
6158
|
+
result = cli("add", REPO, "1117")
|
|
6159
|
+
|
|
6160
|
+
assert result.exit_code == 0, result.output
|
|
6161
|
+
assert queued(1117)["after_json"] == [f"{REPO}#1090"]
|
|
6162
|
+
assert queued(1090)["after_json"] == []
|
|
6163
|
+
|
|
6164
|
+
|
|
6165
|
+
def test_reject_after_drops_a_reversed_edge_too(cli, declare):
|
|
6166
|
+
declare(1090, "src/harness.rs")
|
|
6167
|
+
assert cli("add", REPO, "1090").exit_code == 0
|
|
6168
|
+
|
|
6169
|
+
declare(1117, "src/harness.rs")
|
|
6170
|
+
result = cli(
|
|
6171
|
+
"add", REPO, "1117", "--position", "0", "--reject-after", "1090",
|
|
6172
|
+
)
|
|
6173
|
+
|
|
6174
|
+
assert result.exit_code == 0, result.output
|
|
6175
|
+
# Named by the OTHER entry's key either way — the operator doesn't need
|
|
6176
|
+
# to know which direction rule 2 picked to veto it.
|
|
6177
|
+
assert queued(1090)["after_json"] == []
|
|
6178
|
+
assert queued(1117)["after_json"] == []
|
|
6179
|
+
assert f"rejected via --reject-after (not applied): {REPO}#1090" in result.output
|
|
6180
|
+
|
|
6181
|
+
|
|
6182
|
+
def test_repositioning_an_already_queued_entry_reevaluates_the_direction(
|
|
6183
|
+
cli, declare,
|
|
6184
|
+
):
|
|
6185
|
+
# #3395 review: none of the tests above reposition an entry that is
|
|
6186
|
+
# ALREADY queued — they only insert a brand-new one at `--position 0`,
|
|
6187
|
+
# where there is nothing to remove first. Repositioning is exactly rule
|
|
6188
|
+
# 3's case, and it needs its own comparison: `_move_drive_queue_entry_
|
|
6189
|
+
# local` removes the target from its OLD slot before reinserting it,
|
|
6190
|
+
# shifting every entry originally after it down by one — a comparison
|
|
6191
|
+
# against the other entry's STALE, pre-removal position picks the WRONG
|
|
6192
|
+
# direction here.
|
|
6193
|
+
#
|
|
6194
|
+
# T queued first (position 0), O queued second (position 1), same
|
|
6195
|
+
# declared file. O's own `add` would normally auto-chain `O --after T`
|
|
6196
|
+
# (the ordinary forward case, correct at the time — T ran first) —
|
|
6197
|
+
# `--reject-after` skips that here so the queue starts with NO edge
|
|
6198
|
+
# between them, isolating what this test is actually about: the
|
|
6199
|
+
# direction rule 2 picks when T is repositioned, not whatever edge O's
|
|
6200
|
+
# own earlier `add` happened to leave behind.
|
|
6201
|
+
#
|
|
6202
|
+
# Re-adding T with `--position 1` is a SWAP, not "T stays ahead of O": O
|
|
6203
|
+
# ends up dispatching FIRST, T SECOND. The correct edge is therefore the
|
|
6204
|
+
# ordinary forward one (T --after O). Unfixed code compares T's
|
|
6205
|
+
# requested --position (1) against O's raw pre-move position (also 1),
|
|
6206
|
+
# calls that a tie, and reverses it (O --after T) — ordering the entry
|
|
6207
|
+
# that actually dispatches first to wait on the one that actually
|
|
6208
|
+
# dispatches second.
|
|
6209
|
+
declare(2001, "src/shared.rs")
|
|
6210
|
+
assert cli("add", REPO, "2001").exit_code == 0 # T, lands at position 0
|
|
6211
|
+
|
|
6212
|
+
declare(2002, "src/shared.rs")
|
|
6213
|
+
assert (
|
|
6214
|
+
cli("add", REPO, "2002", "--reject-after", "2001").exit_code == 0
|
|
6215
|
+
) # O, lands at position 1, no edge yet
|
|
6216
|
+
|
|
6217
|
+
result = cli("add", REPO, "2001", "--position", "1")
|
|
6218
|
+
|
|
6219
|
+
assert result.exit_code == 0, result.output
|
|
6220
|
+
positions = {r["issue_number"]: r["position"] for r in state._list_drive_queue_local()}
|
|
6221
|
+
assert positions[2002] < positions[2001] # O genuinely runs first now
|
|
6222
|
+
assert queued(2001)["after_json"] == [f"{REPO}#2002"] # forward: T after O
|
|
6223
|
+
assert queued(2002)["after_json"] == []
|
|
6224
|
+
|
|
6225
|
+
|
|
6226
|
+
def test_a_reversed_edge_is_never_applied_against_an_in_flight_branch(
|
|
6227
|
+
cli, declare, seed, branch_diff,
|
|
6228
|
+
):
|
|
6229
|
+
# A `[branch]` overlap (already running) must never reverse — it started
|
|
6230
|
+
# before this add regardless of queue position, so the newcomer always
|
|
6231
|
+
# waits on it, exactly like before #3395.
|
|
6232
|
+
seed(
|
|
6233
|
+
issues={2230: "open"},
|
|
6234
|
+
assignments=[{"issue_number": 2230, "status": "running"}],
|
|
6235
|
+
)
|
|
6236
|
+
from coord.db import get_connection
|
|
6237
|
+
|
|
6238
|
+
get_connection().execute(
|
|
6239
|
+
"UPDATE assignments SET branch = 'issue-2230' WHERE issue_number = 2230"
|
|
6240
|
+
)
|
|
6241
|
+
get_connection().commit()
|
|
6242
|
+
branch_diff({"issue-2230": ["coord/drive_queue.py"]})
|
|
6243
|
+
declare(2234, "coord/drive_queue.py")
|
|
6244
|
+
|
|
6245
|
+
result = cli("add", REPO, "2234", "--position", "0")
|
|
6246
|
+
|
|
6247
|
+
assert result.exit_code == 0, result.output
|
|
6248
|
+
assert queued(2234)["after_json"] == [f"{REPO}#2230"]
|