code-coordinator 0.5.329__tar.gz → 0.5.331__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.329 → code_coordinator-0.5.331}/PKG-INFO +1 -1
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/drive_queue.py +38 -3
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/drive_queue.py +69 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/serve_app.py +27 -2
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/stage_projection.py +198 -3
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_drive_queue.py +72 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue.py +82 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stage_projection.py +284 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.gitignore +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/CLAUDE.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/GOAL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/LICENSE +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/MANIFEST.in +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/README.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/__init__.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agent.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/audit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/block_log.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/board_service.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/brain.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/claim.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/cli.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/client.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/comments.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/config.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dao.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/db.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deps.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/drive.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/events.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/filelock.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/freshness.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/gates.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/goal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/context.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/models.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/render.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/units.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/hooks.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/interactive.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/models.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/network.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notify.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/openapi.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/parentage.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/plans.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/progress.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/release_window.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/reports.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/review.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/self_health.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/smoke.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/split_work.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/sql.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/state.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/test_author.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/test_report.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/usage.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/install-agent.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/pyproject.toml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/setup.cfg +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/__init__.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/backends.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/conftest.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_db.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_events.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_init.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_models.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_network.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_session.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_split.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_state.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/write_parity.py +0 -0
|
@@ -80,9 +80,12 @@ from coord.drive_queue import (
|
|
|
80
80
|
find_cycle,
|
|
81
81
|
fired_holds,
|
|
82
82
|
is_dispatch_failure_reason,
|
|
83
|
+
is_merge_gate_block_reason,
|
|
83
84
|
is_permanent_block_reason,
|
|
84
85
|
is_pre_dispatch_block_reason,
|
|
85
86
|
is_unsatisfiable_prereq_reason,
|
|
87
|
+
merge_gate_remedy_command,
|
|
88
|
+
merge_plan_inspect_command,
|
|
86
89
|
parse_after_spec,
|
|
87
90
|
parse_key,
|
|
88
91
|
pending_probe_targets,
|
|
@@ -4526,6 +4529,30 @@ def _requeue_command(entry: QueueEntry | None, key: str) -> str:
|
|
|
4526
4529
|
)
|
|
4527
4530
|
|
|
4528
4531
|
|
|
4532
|
+
def _blocked_escalation_command(entry: QueueEntry | None, key: str, reason: str) -> str:
|
|
4533
|
+
"""The command a `blocked`/`oscillating` escalation should propose
|
|
4534
|
+
(#3016) — `_requeue_command` ONLY for a genuinely never-dispatched entry;
|
|
4535
|
+
a gate-specific remedy (or the safe read-only inspect fallback) whenever
|
|
4536
|
+
*reason* already names a merge-gate block.
|
|
4537
|
+
|
|
4538
|
+
`_requeue_command` is right exactly once: nothing was ever dispatched
|
|
4539
|
+
for this row (or every dispatch attempt died before an assignment
|
|
4540
|
+
existed), so there is nothing left to lose by dropping and re-adding it.
|
|
4541
|
+
But `is_merge_gate_block_reason` names the other shape — Work/Test/
|
|
4542
|
+
Review already completed and it is the MERGE stage that is stuck — where
|
|
4543
|
+
the same requeue would discard that completed cycle instead of fixing
|
|
4544
|
+
the one gate actually blocking it. `merge_gate_remedy_command` is the
|
|
4545
|
+
one place that maps a merge-gate reason to its safe one-line fix (or, if
|
|
4546
|
+
none is known blind, the inspect command); this only decides WHICH of
|
|
4547
|
+
the two families applies.
|
|
4548
|
+
"""
|
|
4549
|
+
if is_merge_gate_block_reason(reason):
|
|
4550
|
+
parsed = parse_key(key)
|
|
4551
|
+
if parsed is not None:
|
|
4552
|
+
return merge_gate_remedy_command(reason, parsed[0], parsed[1])
|
|
4553
|
+
return _requeue_command(entry, key)
|
|
4554
|
+
|
|
4555
|
+
|
|
4529
4556
|
@drive_queue_group.command("tick")
|
|
4530
4557
|
@click.option(
|
|
4531
4558
|
"--max-parallel",
|
|
@@ -5071,7 +5098,7 @@ def drive_queue_tick(
|
|
|
5071
5098
|
f"{entry.position if entry else '?'} | after="
|
|
5072
5099
|
f"{','.join(entry.after) if entry and entry.after else '(none)'}"
|
|
5073
5100
|
),
|
|
5074
|
-
command=
|
|
5101
|
+
command=_blocked_escalation_command(entry, item.key, item.reason),
|
|
5075
5102
|
)
|
|
5076
5103
|
|
|
5077
5104
|
# #2230: an entry #2230's sweep would have resumed, but has already
|
|
@@ -5098,7 +5125,7 @@ def drive_queue_tick(
|
|
|
5098
5125
|
f"/{MAX_BLOCKED_RESUMES} | position="
|
|
5099
5126
|
f"{entry.position if entry else '?'}"
|
|
5100
5127
|
),
|
|
5101
|
-
command=
|
|
5128
|
+
command=_blocked_escalation_command(entry, item.key, item.reason),
|
|
5102
5129
|
)
|
|
5103
5130
|
|
|
5104
5131
|
# #2806: a `blocked` entry #2230's sweep targeted this tick, but whose
|
|
@@ -5117,6 +5144,14 @@ def drive_queue_tick(
|
|
|
5117
5144
|
if parsed is None:
|
|
5118
5145
|
continue
|
|
5119
5146
|
entry = by_key.get(item.key)
|
|
5147
|
+
# #3016: NEVER the `remove && add` requeue here — `item.reason`
|
|
5148
|
+
# already says "the next tick re-probes rather than guessing"
|
|
5149
|
+
# (#2806); a destructive requeue directly contradicts that, and
|
|
5150
|
+
# would additionally discard a completed Work/Test/Review cycle
|
|
5151
|
+
# for no reason connected to what actually failed (a probe, not
|
|
5152
|
+
# a gate). The read-only inspect command is the only thing safe
|
|
5153
|
+
# to propose when the tick itself does not yet know what shape
|
|
5154
|
+
# this block is.
|
|
5120
5155
|
_escalate(
|
|
5121
5156
|
parsed[0],
|
|
5122
5157
|
parsed[1],
|
|
@@ -5125,7 +5160,7 @@ def drive_queue_tick(
|
|
|
5125
5160
|
f"queue_state=blocked | gate_reading=unreadable | "
|
|
5126
5161
|
f"position={entry.position if entry else '?'}"
|
|
5127
5162
|
),
|
|
5128
|
-
command=
|
|
5163
|
+
command=merge_plan_inspect_command(parsed[0]),
|
|
5129
5164
|
)
|
|
5130
5165
|
|
|
5131
5166
|
if plan.alert is not None:
|
|
@@ -94,6 +94,7 @@ from coord.gate_a import is_gate_a_refusal_reason
|
|
|
94
94
|
from coord.github_ops import is_throttle_skip_reason, parse_throttle_skip_until
|
|
95
95
|
from coord.issues_sync_status import STALENESS_WARN_SECONDS as ISSUE_CACHE_STALE_CEILING_S
|
|
96
96
|
from coord.merge_queue import (
|
|
97
|
+
CI_STALE_PREFIX,
|
|
97
98
|
PLAN_READY,
|
|
98
99
|
ci_rollup_all_clear,
|
|
99
100
|
is_ci_flaky_reason,
|
|
@@ -2746,6 +2747,74 @@ def _is_merge_gate_block_reason(reason: str | None) -> bool:
|
|
|
2746
2747
|
return "merge_status=" in lowered
|
|
2747
2748
|
|
|
2748
2749
|
|
|
2750
|
+
def merge_plan_inspect_command(repo: str) -> str:
|
|
2751
|
+
"""The read-only ``coord merge --plan`` fallback (#3016) — safe to
|
|
2752
|
+
propose whenever no specific, blind-runnable remedy is known, because it
|
|
2753
|
+
never mutates anything. Used both as :func:`merge_gate_remedy_command`'s
|
|
2754
|
+
own fallback and directly by callers escalating a #2806 ``gate_unreadable``
|
|
2755
|
+
outcome, whose reason text already says "the next tick re-probes" — the
|
|
2756
|
+
destructive `remove && add` requeue would directly contradict that.
|
|
2757
|
+
"""
|
|
2758
|
+
return f"coord merge --plan --repo {repo}"
|
|
2759
|
+
|
|
2760
|
+
|
|
2761
|
+
def merge_gate_remedy_command(reason: str | None, repo: str, issue: int) -> str:
|
|
2762
|
+
"""The gate-specific one-line fix for a `_is_merge_gate_block_reason`
|
|
2763
|
+
block (#3016) — never the blanket ``drive-queue remove && add`` requeue
|
|
2764
|
+
a synthetic escalation writer would otherwise reach for by default.
|
|
2765
|
+
|
|
2766
|
+
A requeue is not merely useless for a merge-gate block, it is actively
|
|
2767
|
+
destructive: it discards a completed Work/Test/Review cycle to re-run it
|
|
2768
|
+
from scratch, when the real fix is a single, targeted merge-lane command
|
|
2769
|
+
— exactly the misdirection `_is_merge_gate_block_reason`'s own docstring
|
|
2770
|
+
already names two live escalations (claude-coordinator#2405, coord-web#2)
|
|
2771
|
+
as having produced, and #2424 only fixed on the prose (``reason``) side,
|
|
2772
|
+
leaving this — the field a one-click "Run proposed fix" menu actually
|
|
2773
|
+
executes — untouched.
|
|
2774
|
+
|
|
2775
|
+
Only the CI-stale / stale-but-passed-smoke shape has a remedy that is
|
|
2776
|
+
both KNOWN and SAFE to run blind: ``coord merge --revalidate --only
|
|
2777
|
+
<repo>#<issue>``, the exact command :func:`coord.merge_queue.
|
|
2778
|
+
ci_stale_reason`'s own prose already tells the operator to run (matched
|
|
2779
|
+
textually here — via :data:`coord.merge_queue.CI_STALE_PREFIX` and
|
|
2780
|
+
:func:`is_stale_smoke_reason` — rather than re-derived, so the two can
|
|
2781
|
+
never diverge on what "CI stale" means).
|
|
2782
|
+
|
|
2783
|
+
Every other shape this matches — red CI (``checks failed``), a
|
|
2784
|
+
review/smoke gate divergence (``review_required —``/``smoke_required
|
|
2785
|
+
—``), an opaque terminal ``merge_status=`` — has no single command that
|
|
2786
|
+
is always both correct and safe to run without a human first reading
|
|
2787
|
+
the actual gate state (fixing a named CI check, recovering or re-running
|
|
2788
|
+
a review, deciding a UAT verdict). Guessing wrong there is worse than
|
|
2789
|
+
not guessing: the menu this feeds runs the command on one click. So
|
|
2790
|
+
every one of those falls back to the read-only inspect command instead
|
|
2791
|
+
— see #3016's design note ("a wrong 'Recommended' is worse than no
|
|
2792
|
+
recommendation").
|
|
2793
|
+
|
|
2794
|
+
Callers are expected to gate on :func:`_is_merge_gate_block_reason`
|
|
2795
|
+
first; called on a reason that ISN'T a merge-gate block at all, this
|
|
2796
|
+
still returns the safe inspect fallback rather than raising — there is
|
|
2797
|
+
no reason this text-matching helper needs to enforce that precondition
|
|
2798
|
+
itself when a wrong answer here is never destructive.
|
|
2799
|
+
"""
|
|
2800
|
+
if reason and (
|
|
2801
|
+
CI_STALE_PREFIX.lower() in reason.lower() or is_stale_smoke_reason(reason)
|
|
2802
|
+
):
|
|
2803
|
+
return f"coord merge --revalidate --only {entry_key(repo, issue)}"
|
|
2804
|
+
return merge_plan_inspect_command(repo)
|
|
2805
|
+
|
|
2806
|
+
|
|
2807
|
+
def is_merge_gate_block_reason(reason: str | None) -> bool:
|
|
2808
|
+
"""Public alias for :func:`_is_merge_gate_block_reason` (#3016).
|
|
2809
|
+
|
|
2810
|
+
Same convention as ``is_empty_branch_death_reason``/
|
|
2811
|
+
``is_unsatisfiable_prereq_reason``: the classifier is shared with the
|
|
2812
|
+
synthetic escalation writers in ``coord.commands.drive_queue``, so it
|
|
2813
|
+
gets a non-underscored name rather than a second copy of the text match.
|
|
2814
|
+
"""
|
|
2815
|
+
return _is_merge_gate_block_reason(reason)
|
|
2816
|
+
|
|
2817
|
+
|
|
2749
2818
|
def _is_empty_branch_death_reason(reason: str | None) -> bool:
|
|
2750
2819
|
"""#2363: does *reason* name the "claimed success, wrote nothing"
|
|
2751
2820
|
signature — an acceptance-author or plain work session that exited
|
|
@@ -2547,7 +2547,8 @@ def _board_response_schema(components: dict) -> dict:
|
|
|
2547
2547
|
"#550: server-computed per-issue stage/gate badges "
|
|
2548
2548
|
"(work/review/smoke/test/merge status, has_approved_review) — "
|
|
2549
2549
|
"generalizes the #776/#778 pattern so coord-tui's "
|
|
2550
|
-
"pipeline.rs stops re-deriving this from raw rows"
|
|
2550
|
+
"pipeline.rs stops re-deriving this from raw rows. #3013 adds "
|
|
2551
|
+
"a per-stage leg count (`stage_counts`) alongside the status."
|
|
2551
2552
|
),
|
|
2552
2553
|
"items": {
|
|
2553
2554
|
"type": "object",
|
|
@@ -2560,6 +2561,24 @@ def _board_response_schema(components: dict) -> dict:
|
|
|
2560
2561
|
"description": "stage name -> pending|active|done|failed|stale|skipped",
|
|
2561
2562
|
"additionalProperties": {"type": "string"},
|
|
2562
2563
|
},
|
|
2564
|
+
"stage_counts": {
|
|
2565
|
+
"type": "object",
|
|
2566
|
+
"description": (
|
|
2567
|
+
"#3013: stage name -> count of separate dispatched "
|
|
2568
|
+
"legs at that stage (e.g. a stage re-dispatched 4 "
|
|
2569
|
+
"times reads 4, not 1) — lets a client render "
|
|
2570
|
+
"'Work (2)' / 'Review (5)' and suppress the suffix "
|
|
2571
|
+
"at 1. Same key set as `stages` (including "
|
|
2572
|
+
"`acceptance`). Caveat: `merge` uses a different "
|
|
2573
|
+
"convention from every other key — it counts "
|
|
2574
|
+
"conflict-fix RETRIES (0 for a clean single merge, "
|
|
2575
|
+
"not 1 for 'one attempt happened'), so a uniform "
|
|
2576
|
+
"'suppress at <= 1' rule will also suppress a "
|
|
2577
|
+
"single conflict-fix retry, which is usually the "
|
|
2578
|
+
"most useful count to surface."
|
|
2579
|
+
),
|
|
2580
|
+
"additionalProperties": {"type": "integer"},
|
|
2581
|
+
},
|
|
2563
2582
|
"has_approved_review": {"type": "boolean"},
|
|
2564
2583
|
"uat_preview_url": {
|
|
2565
2584
|
"type": ["string", "null"],
|
|
@@ -2571,7 +2590,13 @@ def _board_response_schema(components: dict) -> dict:
|
|
|
2571
2590
|
),
|
|
2572
2591
|
},
|
|
2573
2592
|
},
|
|
2574
|
-
"required": [
|
|
2593
|
+
"required": [
|
|
2594
|
+
"repo_name",
|
|
2595
|
+
"issue_number",
|
|
2596
|
+
"stages",
|
|
2597
|
+
"stage_counts",
|
|
2598
|
+
"has_approved_review",
|
|
2599
|
+
],
|
|
2575
2600
|
},
|
|
2576
2601
|
},
|
|
2577
2602
|
"plan_roster": {
|
|
@@ -31,9 +31,10 @@ plain values — no I/O, no side effects.
|
|
|
31
31
|
|
|
32
32
|
from __future__ import annotations
|
|
33
33
|
|
|
34
|
+
import dataclasses
|
|
34
35
|
from typing import Any, Protocol, runtime_checkable
|
|
35
36
|
|
|
36
|
-
from coord.models import CLOSES_ISSUE_TYPES
|
|
37
|
+
from coord.models import CLOSES_ISSUE_TYPES, WORK_LIKE_TYPES, effective_issue_number
|
|
37
38
|
|
|
38
39
|
# ── Stage-status vocabulary — mirrors tui/src/app/pipeline.rs::StageStatus ──
|
|
39
40
|
PENDING = "pending"
|
|
@@ -172,6 +173,102 @@ def assignments_for_stage(
|
|
|
172
173
|
return out
|
|
173
174
|
|
|
174
175
|
|
|
176
|
+
def _leg_count_for_stage(
|
|
177
|
+
assignments_for_issue: list,
|
|
178
|
+
stage: str,
|
|
179
|
+
*,
|
|
180
|
+
require_plan: bool,
|
|
181
|
+
) -> int:
|
|
182
|
+
"""How many separate dispatched attempts ("legs") this issue has had at
|
|
183
|
+
*stage* (#3013) — "attempts a human would recognise as separate", not a
|
|
184
|
+
raw row count. Each retry/redispatch is already its own board row (a
|
|
185
|
+
retry dispatches a fresh assignment id rather than mutating the failed
|
|
186
|
+
one, see ``coord.reconcile._reassign``), so counting rows already gives
|
|
187
|
+
the right number for stages backed by their own dedicated assignment
|
|
188
|
+
``type`` — this only needs to special-case the stages that aren't:
|
|
189
|
+
|
|
190
|
+
* ``"work"`` is widened from a literal ``type == "work"`` (plus the
|
|
191
|
+
existing plan-fold) to the full :data:`WORK_LIKE_TYPES` — an
|
|
192
|
+
oracle-loop acceptance slice's repeated ``test-author``/``mock-author``
|
|
193
|
+
legs (#3013's coord-portal#164 example: 4 ``test-author`` legs, 5
|
|
194
|
+
``review`` legs on one branch) are exactly the kind of repetition this
|
|
195
|
+
field exists to surface, and a strict ``type == "work"`` match would
|
|
196
|
+
never see them.
|
|
197
|
+
* ``"test"`` has no ``type="test"`` assignment — the Test-stage's
|
|
198
|
+
dispatched worker is ``type="smoke"`` (``coord.smoke``).
|
|
199
|
+
* ``"merge"`` has no ``type="merge"`` assignment either — repeated
|
|
200
|
+
landing attempts show up as ``type="conflict-fix"`` legs (#241). Note
|
|
201
|
+
the counting convention this implies differs from every other stage:
|
|
202
|
+
a clean single merge with no conflict reports ``0`` (no *retry* was
|
|
203
|
+
needed), whereas one ordinary ``"work"``/``"review"``/``"test"`` leg
|
|
204
|
+
reports ``1`` (one attempt happened). A client applying one uniform
|
|
205
|
+
"suppress the number at <= 1" rule across every stage — as the
|
|
206
|
+
``/board`` schema description implies — will suppress a single
|
|
207
|
+
conflict-fix leg (``count == 1``, arguably the most useful case to
|
|
208
|
+
surface: "this needed a rebase") exactly like "no problem at all". No
|
|
209
|
+
code path here can distinguish the two without a wire-schema change,
|
|
210
|
+
so this is flagged for the client rather than fixed on this side.
|
|
211
|
+
* ``"acceptance"`` (review fix, #3013) has no dedicated assignment type
|
|
212
|
+
either — like ``test_state``/``uat_state``, ``acceptance_state`` is
|
|
213
|
+
stamped directly onto the ``type="work"`` row a
|
|
214
|
+
``coord acceptance record`` verdict belongs to (see
|
|
215
|
+
:func:`acceptance_stage_status_for`, which reads the same rows), so a
|
|
216
|
+
generic ``assignments_for_stage(..., "acceptance", ...)`` scan would
|
|
217
|
+
always return zero.
|
|
218
|
+
|
|
219
|
+
Every other stage (``"plan"``, ``"review"``, ``"uat"``, ...) already has
|
|
220
|
+
a 1:1 assignment ``type``, so :func:`assignments_for_stage` alone gives
|
|
221
|
+
the right count.
|
|
222
|
+
"""
|
|
223
|
+
if stage == "work":
|
|
224
|
+
matching = assignments_for_stage(assignments_for_issue, "work", require_plan=require_plan)
|
|
225
|
+
seen = {id(a) for a in matching}
|
|
226
|
+
extra = [
|
|
227
|
+
a
|
|
228
|
+
for a in assignments_for_issue
|
|
229
|
+
if id(a) not in seen and (a.type or "work") in WORK_LIKE_TYPES
|
|
230
|
+
]
|
|
231
|
+
return len(matching) + len(extra)
|
|
232
|
+
if stage == "test":
|
|
233
|
+
return sum(1 for a in assignments_for_issue if (a.type or "work") == "smoke")
|
|
234
|
+
if stage == "merge":
|
|
235
|
+
return sum(1 for a in assignments_for_issue if (a.type or "work") == "conflict-fix")
|
|
236
|
+
if stage == "acceptance":
|
|
237
|
+
return sum(
|
|
238
|
+
1
|
|
239
|
+
for a in assignments_for_issue
|
|
240
|
+
if (a.type or "work") == "work" and (a.acceptance_state or "") != ""
|
|
241
|
+
)
|
|
242
|
+
return len(assignments_for_stage(assignments_for_issue, stage, require_plan=require_plan))
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def _widen_work_like_types(assignments: list) -> list:
|
|
246
|
+
"""Return *assignments* with every :data:`WORK_LIKE_TYPES` row (#3013:
|
|
247
|
+
``mock-author``/``test-author``, not just literal ``type="work"``)
|
|
248
|
+
presented as ``type="work"`` to the generic per-stage dispatcher
|
|
249
|
+
(:func:`stage_status_for`, :func:`assignments_for_stage`,
|
|
250
|
+
:func:`acceptance_stage_status_for`, ...), all of which key strictly off
|
|
251
|
+
``a.type``.
|
|
252
|
+
|
|
253
|
+
Used ONLY by :func:`compute_board_stage_projection`'s phantom-entry
|
|
254
|
+
fallback (see that function's docstring) — without it, a slice whose
|
|
255
|
+
only rows are ``test-author``/``mock-author`` legs got
|
|
256
|
+
``stage_counts["work"] == 4`` (via :func:`_leg_count_for_stage`, which
|
|
257
|
+
already widens the same way) sitting next to ``stages["work"] ==
|
|
258
|
+
"pending"`` forever, since the strict-``type`` dispatcher never
|
|
259
|
+
recognised those rows as "work" activity. Every other field (status,
|
|
260
|
+
dispatched_at, test_state, acceptance_state, ...) is preserved
|
|
261
|
+
unchanged — this only relabels the ``type`` a downstream ``==`` check
|
|
262
|
+
sees.
|
|
263
|
+
"""
|
|
264
|
+
out = []
|
|
265
|
+
for a in assignments:
|
|
266
|
+
t = a.type or "work"
|
|
267
|
+
widen = t in WORK_LIKE_TYPES and t != "work"
|
|
268
|
+
out.append(dataclasses.replace(a, type="work") if widen else a)
|
|
269
|
+
return out
|
|
270
|
+
|
|
271
|
+
|
|
175
272
|
def upstream_max_dispatched_at(
|
|
176
273
|
assignments_for_issue: list,
|
|
177
274
|
stage: str,
|
|
@@ -698,6 +795,7 @@ def compute_issue_projection(
|
|
|
698
795
|
ci_store: Any | None = None,
|
|
699
796
|
uat_enabled: bool = False,
|
|
700
797
|
uat_preview_url: str | None = None,
|
|
798
|
+
stage_count_assignments: list | None = None,
|
|
701
799
|
) -> dict[str, Any]:
|
|
702
800
|
"""Compute the full per-issue stage badge dict.
|
|
703
801
|
|
|
@@ -717,6 +815,15 @@ def compute_issue_projection(
|
|
|
717
815
|
carried through unconditionally so a caller can show it next to the
|
|
718
816
|
badge instead of sending the operator to ``coord merge``'s refusal
|
|
719
817
|
message to find it (#2951 item 3).
|
|
818
|
+
|
|
819
|
+
``stage_count_assignments`` (#3013) is the assignment list
|
|
820
|
+
:func:`_leg_count_for_stage` scans to fill ``stage_counts`` — a client
|
|
821
|
+
can then render ``Work (2)`` / ``Review (5)`` next to the status badge
|
|
822
|
+
and suppress the suffix at 1. Defaults to *assignments_for_issue* (the
|
|
823
|
+
same list ``stages`` uses) when omitted, which is correct for an
|
|
824
|
+
ordinary issue; :func:`compute_board_stage_projection` passes a
|
|
825
|
+
separately-keyed list for the #1553 oracle-loop epic/slice case — see
|
|
826
|
+
that function's docstring.
|
|
720
827
|
"""
|
|
721
828
|
names = issue_stage_names(assignments_for_issue, default_gates, uat_enabled=uat_enabled)
|
|
722
829
|
stages: dict[str, str] = {}
|
|
@@ -741,8 +848,29 @@ def compute_issue_projection(
|
|
|
741
848
|
# excluded from the per-issue stage-strip ordering that `default_gates`
|
|
742
849
|
# drives, since it only applies to oracle-loop milestones.
|
|
743
850
|
stages["acceptance"] = acceptance_stage_status_for(assignments_for_issue)
|
|
851
|
+
|
|
852
|
+
count_source = (
|
|
853
|
+
assignments_for_issue if stage_count_assignments is None else stage_count_assignments
|
|
854
|
+
)
|
|
855
|
+
stage_counts: dict[str, int] = {
|
|
856
|
+
name: _leg_count_for_stage(count_source, name, require_plan=require_plan) for name in names
|
|
857
|
+
}
|
|
858
|
+
stage_counts.setdefault(
|
|
859
|
+
"merge", _leg_count_for_stage(count_source, "merge", require_plan=require_plan)
|
|
860
|
+
)
|
|
861
|
+
# Review fix (#3013): `stages` always carries "acceptance" (added
|
|
862
|
+
# unconditionally above, outside `names`/`default_gates`), but
|
|
863
|
+
# `stage_counts` was built only from `names` plus an explicit "merge"
|
|
864
|
+
# fallback — so it silently dropped "acceptance", contradicting the
|
|
865
|
+
# `/board` schema's documented "same key set as `stages`" guarantee
|
|
866
|
+
# (coord/serve_app.py) and leaving a client that indexes `stage_counts`
|
|
867
|
+
# by every key in `stages` with a plain `KeyError`.
|
|
868
|
+
stage_counts.setdefault(
|
|
869
|
+
"acceptance", _leg_count_for_stage(count_source, "acceptance", require_plan=require_plan)
|
|
870
|
+
)
|
|
744
871
|
return {
|
|
745
872
|
"stages": stages,
|
|
873
|
+
"stage_counts": stage_counts,
|
|
746
874
|
"acceptance_progress": acceptance_progress_for(assignments_for_issue),
|
|
747
875
|
"uat_preview_url": uat_preview_url if uat_enabled else None,
|
|
748
876
|
"has_approved_review": issue_has_any_approved_review(
|
|
@@ -779,6 +907,44 @@ def compute_board_stage_projection(
|
|
|
779
907
|
``None`` (the default — e.g. a caller with no config loaded) means no
|
|
780
908
|
repo is treated as opted in, matching :func:`pipeline_stage_names`'s own
|
|
781
909
|
fail-toward-hidden default.
|
|
910
|
+
|
|
911
|
+
``stage_counts`` (#3013) is deliberately built from a SECOND index keyed
|
|
912
|
+
by ``coord.models.effective_issue_number`` rather than the raw
|
|
913
|
+
``assignments_by_key`` below: an oracle-loop acceptance slice's
|
|
914
|
+
``test-author``/``mock-author``/``review`` legs are booked
|
|
915
|
+
(``issue_number``) to the milestone's *tracking* issue, with the child
|
|
916
|
+
they're actually FOR named in ``for_issue_number`` (see
|
|
917
|
+
``coord gates <repo> <slice>``, which resolves the same way). Reusing
|
|
918
|
+
``assignments_by_key`` for the count would leave a slice's own
|
|
919
|
+
``stage_counts`` reading 0 forever — the same keying trap noted in the
|
|
920
|
+
#3013 issue's "drive-queue sweep bug" reference. For an issue that ALSO
|
|
921
|
+
has its own raw-keyed rows, this does NOT touch ``stages``: that stays
|
|
922
|
+
keyed on the raw ``issue_number`` on purpose (#1652 — re-attributing
|
|
923
|
+
status by ``for_issue_number`` moved a false "merged" green from the
|
|
924
|
+
epic onto a child that already had its own, separately-tracked state; a
|
|
925
|
+
leg *count* carries no such false-green risk, so the two fields are
|
|
926
|
+
allowed to disagree on which issue owns which rows in that case).
|
|
927
|
+
|
|
928
|
+
Review fix (#3013): a *phantom* entry — ANY key whose raw-keyed
|
|
929
|
+
assignment list is empty, whether it exists in ``issues`` with no
|
|
930
|
+
assignments of its own (the coord-portal#164 test below: the slice IS
|
|
931
|
+
already synced, but every one of its legs is booked to the tracking
|
|
932
|
+
issue) or exists ONLY via the effective-key union (never synced at all:
|
|
933
|
+
not yet caught up by ``_sync_issues_tick``, or a closed slice pruned
|
|
934
|
+
from ``issues`` after 7 days while assignment retention runs 14, see
|
|
935
|
+
``coord/state.py``) — has nothing raw-keyed to protect from the #1652
|
|
936
|
+
clobber, because there IS no separately-tracked state for it to
|
|
937
|
+
conflict with. Rendering ``stages`` from the empty raw list anyway
|
|
938
|
+
produced a self-contradictory row: every stage PENDING (acceptance
|
|
939
|
+
SKIPPED) right next to a ``stage_counts`` proving real legs ran. So for
|
|
940
|
+
that case only, ``stages``/``acceptance``/``has_approved_review`` fall
|
|
941
|
+
back to the same effective-keyed list ``stage_counts`` already uses,
|
|
942
|
+
widened through :func:`_widen_work_like_types` so a `test-author`/
|
|
943
|
+
`mock-author` leg registers as "work" activity to the generic
|
|
944
|
+
per-stage dispatcher — see the ``projection_assignments`` fallback
|
|
945
|
+
below. ``issue_title`` still reads ``""`` for a phantom entry that
|
|
946
|
+
isn't itself in ``issues`` (genuinely unknown — not fabricated from the
|
|
947
|
+
tracking issue's own title, which would be actively wrong).
|
|
782
948
|
"""
|
|
783
949
|
is_closed_by_key: dict[tuple[str, int], bool] = {
|
|
784
950
|
(i["repo_name"], i["number"]): str(i.get("state", "")).lower() == "closed"
|
|
@@ -794,6 +960,17 @@ def compute_board_stage_projection(
|
|
|
794
960
|
continue
|
|
795
961
|
assignments_by_key.setdefault((a.repo_name, a.issue_number), []).append(a)
|
|
796
962
|
|
|
963
|
+
# #3013: effective-issue-keyed index — see docstring above. Used only to
|
|
964
|
+
# fill `stage_counts`, never `stages`.
|
|
965
|
+
assignments_by_effective_key: dict[tuple[str, int], list] = {}
|
|
966
|
+
for a in assignments:
|
|
967
|
+
if not a.repo_name:
|
|
968
|
+
continue
|
|
969
|
+
eff = effective_issue_number(a)
|
|
970
|
+
if not eff:
|
|
971
|
+
continue
|
|
972
|
+
assignments_by_effective_key.setdefault((a.repo_name, eff), []).append(a)
|
|
973
|
+
|
|
797
974
|
merge_by_key: dict[tuple[str, int], Any] = {}
|
|
798
975
|
for m in merge_queue_items:
|
|
799
976
|
assignment_type = getattr(m, "assignment_type", "work") or "work"
|
|
@@ -815,7 +992,11 @@ def compute_board_stage_projection(
|
|
|
815
992
|
# `load_queue()`/`board_projection()` both order by `id` ascending.
|
|
816
993
|
merge_by_key.setdefault(key, m)
|
|
817
994
|
|
|
818
|
-
|
|
995
|
+
# #3013: also union in the effective-key index so an acceptance slice
|
|
996
|
+
# whose only board rows are booked to the tracking issue (nothing keyed
|
|
997
|
+
# to the slice's own issue_number, e.g. never separately synced) still
|
|
998
|
+
# gets a projection row for stage_counts to land in.
|
|
999
|
+
keys = set(is_closed_by_key) | set(assignments_by_key) | set(assignments_by_effective_key)
|
|
819
1000
|
|
|
820
1001
|
uat_enabled_by_repo: dict[str, bool] = {}
|
|
821
1002
|
|
|
@@ -823,12 +1004,25 @@ def compute_board_stage_projection(
|
|
|
823
1004
|
for repo_name, issue_number in keys:
|
|
824
1005
|
key = (repo_name, issue_number)
|
|
825
1006
|
issue_assignments = assignments_by_key.get(key, [])
|
|
1007
|
+
effective_assignments = assignments_by_effective_key.get(key, [])
|
|
1008
|
+
# Review fix (#3013): a phantom entry (see docstring) has no
|
|
1009
|
+
# raw-keyed rows at all, so falling back to the effective-keyed list
|
|
1010
|
+
# here — instead of leaving `stages` computed from `[]` — keeps
|
|
1011
|
+
# `stages`/`acceptance`/`has_approved_review` consistent with the
|
|
1012
|
+
# non-zero `stage_counts` this same entry reports below. Widened
|
|
1013
|
+
# through `_widen_work_like_types` so a `test-author`/`mock-author`
|
|
1014
|
+
# leg (WORK_LIKE_TYPES, not literal `type="work"`) registers with
|
|
1015
|
+
# the generic per-stage dispatcher's strict `type` check the same
|
|
1016
|
+
# way `_leg_count_for_stage` already widens it for `stage_counts`.
|
|
1017
|
+
# A no-op for every ordinary issue: `issue_assignments or ...` only
|
|
1018
|
+
# reaches the fallback when the raw list is empty.
|
|
1019
|
+
projection_assignments = issue_assignments or _widen_work_like_types(effective_assignments)
|
|
826
1020
|
merge_entry = merge_by_key.get(key)
|
|
827
1021
|
if repo_name not in uat_enabled_by_repo:
|
|
828
1022
|
uat_enabled_by_repo[repo_name] = repo_has_uat_preview(repo_name, config)
|
|
829
1023
|
uat_enabled = uat_enabled_by_repo[repo_name]
|
|
830
1024
|
entry = compute_issue_projection(
|
|
831
|
-
|
|
1025
|
+
projection_assignments,
|
|
832
1026
|
merge_entry,
|
|
833
1027
|
is_closed=is_closed_by_key.get(key, False),
|
|
834
1028
|
require_plan=require_plan,
|
|
@@ -840,6 +1034,7 @@ def compute_board_stage_projection(
|
|
|
840
1034
|
if uat_enabled
|
|
841
1035
|
else None
|
|
842
1036
|
),
|
|
1037
|
+
stage_count_assignments=effective_assignments,
|
|
843
1038
|
)
|
|
844
1039
|
entry["repo_name"] = repo_name
|
|
845
1040
|
entry["issue_number"] = issue_number
|
|
@@ -1987,6 +1987,78 @@ def test_a_dead_drives_own_exit_reason_reaches_the_queue_row(
|
|
|
1987
1987
|
assert state._get_drive_escalation_local(REPO, 1762) is not None
|
|
1988
1988
|
|
|
1989
1989
|
|
|
1990
|
+
def test_exhausted_ci_stale_escalation_proposes_revalidate_not_a_requeue(
|
|
1991
|
+
cli, seed, launches, coord_db, config_file
|
|
1992
|
+
):
|
|
1993
|
+
"""#3016 regression fixture — the exact claude-coordinator#2983 shape
|
|
1994
|
+
(2026-08-31), rendered end-to-end through the real `coord drive-queue
|
|
1995
|
+
tick` -> escalation write -> `coord escalate list` path: a merge-gate
|
|
1996
|
+
death whose OWN reason already names `coord merge --revalidate` as the
|
|
1997
|
+
fix must not have the escalation's `proposed_command` — the ONE field a
|
|
1998
|
+
one-click "Run proposed fix" menu actually runs — propose the blanket
|
|
1999
|
+
`drive-queue remove && add` requeue instead. #2424 already fixed the
|
|
2000
|
+
parallel misdirection in the `reason` prose; this pins the field that
|
|
2001
|
+
executes.
|
|
2002
|
+
"""
|
|
2003
|
+
from coord.audit import record_audit
|
|
2004
|
+
|
|
2005
|
+
seed(issues={2983: "open"})
|
|
2006
|
+
cli("add", REPO, "2983")
|
|
2007
|
+
cli("tick")
|
|
2008
|
+
|
|
2009
|
+
def _own_reason(n: int) -> str:
|
|
2010
|
+
return (
|
|
2011
|
+
f"drive exited for {REPO}#2983 (exit_code=1): merge attempted "
|
|
2012
|
+
f"3 times without landing.\n"
|
|
2013
|
+
" Last board state: status='PENDING' reason='CI stale: checks "
|
|
2014
|
+
"predate the current base (...); auto-rerun budget exhausted "
|
|
2015
|
+
"(2/2) — re-run CI (`coord merge --revalidate`) before merging'"
|
|
2016
|
+
f" (attempt {n})"
|
|
2017
|
+
)
|
|
2018
|
+
|
|
2019
|
+
launched_at = queued(2983)["launched_at"]
|
|
2020
|
+
_backdate(2983, DRIVE_STARTUP_GRACE_SECONDS + 60)
|
|
2021
|
+
record_audit(
|
|
2022
|
+
tier="business", category="drive", event_type="drive_exited",
|
|
2023
|
+
actor="drive", summary=_own_reason(1), repo=REPO, issue=2983,
|
|
2024
|
+
ts=launched_at + 5,
|
|
2025
|
+
)
|
|
2026
|
+
cli("tick")
|
|
2027
|
+
|
|
2028
|
+
_backdate_reason(coord_db, 2983, DRIVE_STARTUP_GRACE_SECONDS + 60)
|
|
2029
|
+
relaunch = cli("tick")
|
|
2030
|
+
assert relaunch.exit_code == 0, relaunch.output
|
|
2031
|
+
assert queued(2983)["state"] == "running"
|
|
2032
|
+
|
|
2033
|
+
launched_at = queued(2983)["launched_at"]
|
|
2034
|
+
_backdate(2983, DRIVE_STARTUP_GRACE_SECONDS + 60)
|
|
2035
|
+
record_audit(
|
|
2036
|
+
tier="business", category="drive", event_type="drive_exited",
|
|
2037
|
+
actor="drive", summary=_own_reason(2), repo=REPO, issue=2983,
|
|
2038
|
+
ts=launched_at + 5,
|
|
2039
|
+
)
|
|
2040
|
+
second_retry = cli("tick")
|
|
2041
|
+
assert second_retry.exit_code == 0, second_retry.output
|
|
2042
|
+
|
|
2043
|
+
entry = queued(2983)
|
|
2044
|
+
assert entry["state"] == "blocked"
|
|
2045
|
+
|
|
2046
|
+
listing = CliRunner().invoke(
|
|
2047
|
+
main, ["escalate", "list", "--config", str(config_file)]
|
|
2048
|
+
)
|
|
2049
|
+
assert listing.exit_code == 0, listing.output
|
|
2050
|
+
assert f"{REPO} #2983" in listing.output
|
|
2051
|
+
assert "coord merge --revalidate" in listing.output
|
|
2052
|
+
assert f"--only {REPO}#2983" in listing.output
|
|
2053
|
+
assert "drive-queue remove" not in listing.output
|
|
2054
|
+
assert "drive-queue add" not in listing.output
|
|
2055
|
+
|
|
2056
|
+
escalation = state._get_drive_escalation_local(REPO, 2983)
|
|
2057
|
+
assert escalation is not None
|
|
2058
|
+
proposed = escalation["proposed_command"]
|
|
2059
|
+
assert proposed == f"coord merge --revalidate --only {REPO}#2983"
|
|
2060
|
+
|
|
2061
|
+
|
|
1990
2062
|
def test_a_permanent_dispatch_refusal_blocks_on_the_first_tick_no_attempt_spent(
|
|
1991
2063
|
cli, seed, launches,
|
|
1992
2064
|
):
|