code-coordinator 0.5.203__tar.gz → 0.5.205__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.203 → code_coordinator-0.5.205}/PKG-INFO +1 -1
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/code_coordinator.egg-info/scm_file_list.json +2 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/code_coordinator.egg-info/scm_version.json +2 -2
- code_coordinator-0.5.205/coord/ci_fix.py +209 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/merge.py +88 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/db.py +9 -1
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/merge_queue.py +157 -3
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/mock_author.py +102 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/portal_bridge.py +45 -3
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/portal_sync.py +10 -5
- code_coordinator-0.5.205/tests/test_ci_fix.py +335 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_db.py +53 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_merge_queue.py +200 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_mock_author.py +88 -1
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_portal_bridge.py +38 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_thin_client_board_audit.py +13 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/tests/fixtures/board_sample.json +1 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/.gitignore +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/CLAUDE.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/GOAL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/LICENSE +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/MANIFEST.in +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/README.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/__init__.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/agent.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/audit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/block_log.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/board_service.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/brain.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/claim.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/cli.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/client.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/comments.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/config.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/dao.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/deps.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/drive.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/events.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/filelock.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/freshness.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/gates.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/goal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/context.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/models.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/render.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/health/units.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/hooks.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/interactive.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/models.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/network.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/notify.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/openapi.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/parentage.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/plans.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/progress.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/release_window.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/reports.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/review.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/self_health.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/smoke.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/split_work.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/state.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/test_author.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/test_report.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/usage.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/install-agent.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/pyproject.toml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/setup.cfg +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/__init__.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/conftest.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_config.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_events.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_init.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_models.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_network.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_review.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_session.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_split.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_state.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.203 → code_coordinator-0.5.205}/tui/tests/cli.rs +0 -0
|
@@ -46,6 +46,7 @@ coord/brain.py
|
|
|
46
46
|
coord/branch_model.py
|
|
47
47
|
coord/bug_intake.py
|
|
48
48
|
coord/cargo_cache.py
|
|
49
|
+
coord/ci_fix.py
|
|
49
50
|
coord/ci_github.py
|
|
50
51
|
coord/ci_gitlab.py
|
|
51
52
|
coord/ci_store.py
|
|
@@ -383,6 +384,7 @@ tests/test_build_worker_image_env_update.py
|
|
|
383
384
|
tests/test_cargo_cache.py
|
|
384
385
|
tests/test_check_gh_argv_containment.py
|
|
385
386
|
tests/test_ci_acceptance_gate_1950.py
|
|
387
|
+
tests/test_ci_fix.py
|
|
386
388
|
tests/test_ci_gitlab.py
|
|
387
389
|
tests/test_ci_parity_2091.py
|
|
388
390
|
tests/test_ci_store.py
|
{code_coordinator-0.5.203 → code_coordinator-0.5.205}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"coord/branch_model.py",
|
|
41
41
|
"coord/bug_intake.py",
|
|
42
42
|
"coord/cargo_cache.py",
|
|
43
|
+
"coord/ci_fix.py",
|
|
43
44
|
"coord/ci_github.py",
|
|
44
45
|
"coord/ci_gitlab.py",
|
|
45
46
|
"coord/ci_store.py",
|
|
@@ -445,6 +446,7 @@
|
|
|
445
446
|
"tests/test_cargo_cache.py",
|
|
446
447
|
"tests/test_check_gh_argv_containment.py",
|
|
447
448
|
"tests/test_ci_acceptance_gate_1950.py",
|
|
449
|
+
"tests/test_ci_fix.py",
|
|
448
450
|
"tests/test_ci_gitlab.py",
|
|
449
451
|
"tests/test_ci_parity_2091.py",
|
|
450
452
|
"tests/test_ci_store.py",
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"""Auto-dispatch a fix worker for a CONFIRMED CI check failure at the Merge
|
|
2
|
+
gate (#2510).
|
|
3
|
+
|
|
4
|
+
``coord/merge_queue.py``'s CI gate already classifies a failing check into
|
|
5
|
+
three shapes: a verdictless (infra) failure auto-reruns up to
|
|
6
|
+
``MAX_CI_INFRA_RERUNS``; a verdicted failure gets one flake re-check up to
|
|
7
|
+
``MAX_CI_FLAKY_RERUNS``; and once both budgets are exhausted/inapplicable the
|
|
8
|
+
failure is CONFIRMED — real, not infra, not (as far as one re-run can tell)
|
|
9
|
+
flaky. Both exhaustion points emit a ``"checks_failed"`` :class:`~coord.
|
|
10
|
+
merge_queue.MergeEvent`. Before this module existed that event did nothing
|
|
11
|
+
but set ``entry.error`` — the entry stayed ``PENDING`` in the merge queue
|
|
12
|
+
forever, invisible to any status view that only surfaces ``HUMAN_REQUIRED``
|
|
13
|
+
rows, with no automated path back to a fix.
|
|
14
|
+
|
|
15
|
+
Why a separate module, following ``coord/conflict_fix.py``'s lead: triggered
|
|
16
|
+
by a merge_queue event, not a planner proposal, so it shares little with
|
|
17
|
+
``coord.dispatch``.
|
|
18
|
+
|
|
19
|
+
Unlike a merge CONFLICT (mechanical, content-preserving, handled by a
|
|
20
|
+
dedicated ``type="conflict-fix"`` worker whose success needs no fresh
|
|
21
|
+
Test/Review since the diff is unchanged), a confirmed CI failure needs a
|
|
22
|
+
worker that can genuinely change code — the same shape as a review
|
|
23
|
+
``request-changes`` bounce. So this dispatches via
|
|
24
|
+
:func:`coord.auto_loop._dispatch_fix` itself (not a bespoke HTTP POST): the
|
|
25
|
+
new commit lands on the SAME branch/PR, and the existing generic Work→Test→
|
|
26
|
+
Review pipeline (already built to re-drive Test then Review for any bounced
|
|
27
|
+
``WORK_LIKE_TYPES`` fix) picks the new commit up on its own — no separate
|
|
28
|
+
re-review wiring needed here. The merge queue's own ``branch_head_sha``/
|
|
29
|
+
``branch_patch_id`` staleness check (see ``has_approved_review``) already
|
|
30
|
+
invalidates the stale approval once the new commit lands, so the PR
|
|
31
|
+
naturally cannot merge again until it clears Test + Review + CI fresh.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
import logging
|
|
37
|
+
|
|
38
|
+
import httpx
|
|
39
|
+
|
|
40
|
+
from coord.config import Config
|
|
41
|
+
from coord.merge_queue import QueuedMerge, _chain_work_ids
|
|
42
|
+
from coord.models import Assignment, Board
|
|
43
|
+
|
|
44
|
+
_log = logging.getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# #2510: bounded the same shape as MAX_CI_INFRA_RERUNS/MAX_CI_FLAKY_RERUNS —
|
|
48
|
+
# a couple of genuine attempts is enough to tell "this is fixable by a
|
|
49
|
+
# worker" from "this needs a human"; a higher cap just burns more of the
|
|
50
|
+
# same exhausted budget the way an unbounded conflict-fix retry would.
|
|
51
|
+
MAX_CI_FIX_DISPATCHES = 2
|
|
52
|
+
|
|
53
|
+
# Prefix on the dispatched fix worker's issue_title — mirrors
|
|
54
|
+
# `conflict_fix.SEMANTIC_FIX_TITLE_PREFIX`'s visibility purpose: the TUI
|
|
55
|
+
# Pipeline row and the fix briefing itself both make it obvious WHY this
|
|
56
|
+
# round was dispatched (a CI failure, not a review request-changes bounce).
|
|
57
|
+
CI_FIX_TITLE_PREFIX = "[ci-fix]"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def build_ci_fix_briefing(
|
|
61
|
+
*,
|
|
62
|
+
entry: QueuedMerge,
|
|
63
|
+
checks_summary: str,
|
|
64
|
+
attempt: int,
|
|
65
|
+
) -> str:
|
|
66
|
+
"""Assemble the CI-fix worker's briefing. Pure function — testable."""
|
|
67
|
+
lines: list[str] = [
|
|
68
|
+
f"# CI failure fix: {entry.repo_github} branch `{entry.branch}`",
|
|
69
|
+
"",
|
|
70
|
+
f"Issue #{entry.issue_number} — {entry.issue_title}",
|
|
71
|
+
"",
|
|
72
|
+
"Review already approved this PR and it reached the Merge gate, "
|
|
73
|
+
"where GitHub Actions CI reported a REAL failure (not infra, and "
|
|
74
|
+
"not resolved by one automatic re-run) on the checks below:",
|
|
75
|
+
"",
|
|
76
|
+
f" {checks_summary}",
|
|
77
|
+
"",
|
|
78
|
+
f"This is fix attempt {attempt}/{MAX_CI_FIX_DISPATCHES} for this "
|
|
79
|
+
"failure streak — the coordinator will escalate to a human if this "
|
|
80
|
+
"many attempts don't produce a green run.",
|
|
81
|
+
"",
|
|
82
|
+
"## What to do",
|
|
83
|
+
"",
|
|
84
|
+
"1. You are already on this issue's existing branch — continue on "
|
|
85
|
+
"it, do NOT start a fresh branch.",
|
|
86
|
+
"2. Reproduce the failure locally if the project's test command "
|
|
87
|
+
"covers it (`coord`'s Test stage already runs the same diff-scoped "
|
|
88
|
+
"suite CI reruns in full — a failure CI alone caught may live in a "
|
|
89
|
+
"suite that only runs in CI, e.g. a sealed acceptance suite).",
|
|
90
|
+
"3. Fix the actual regression. Do not edit the failing check's "
|
|
91
|
+
"workflow config to make it pass without fixing the underlying "
|
|
92
|
+
"issue, and do not skip/xfail the failing test unless the test "
|
|
93
|
+
"itself is proven wrong.",
|
|
94
|
+
"4. Commit and push to the SAME branch. The coordinator re-runs "
|
|
95
|
+
"Test, Review, and CI from scratch on the new commit — this is not "
|
|
96
|
+
"a force-merge shortcut.",
|
|
97
|
+
"",
|
|
98
|
+
"You will NOT use `gh` — the coordinator owns PR/issue interaction "
|
|
99
|
+
"and CI status reads.",
|
|
100
|
+
"",
|
|
101
|
+
f"Last merge-gate error: {entry.error or checks_summary}",
|
|
102
|
+
]
|
|
103
|
+
return "\n".join(lines)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _has_active_fix(board: Board, entry: QueuedMerge) -> bool:
|
|
107
|
+
"""True when a WORK_LIKE fix for *entry*'s chain is already running or
|
|
108
|
+
pending — regardless of whether it was dispatched for this CI failure or
|
|
109
|
+
an unrelated review bounce; either way a second dispatch here would race
|
|
110
|
+
it onto the same branch.
|
|
111
|
+
"""
|
|
112
|
+
pool = list(board.completed) + list(board.active)
|
|
113
|
+
chain_ids = _chain_work_ids(entry, pool)
|
|
114
|
+
active_ids = {
|
|
115
|
+
getattr(a, "assignment_id", None) for a in board.active
|
|
116
|
+
} - {None}
|
|
117
|
+
for a in pool:
|
|
118
|
+
aid = getattr(a, "assignment_id", None)
|
|
119
|
+
if aid is None or aid not in chain_ids or aid == entry.assignment_id:
|
|
120
|
+
continue
|
|
121
|
+
if aid in active_ids and getattr(a, "status", None) in ("running", "pending"):
|
|
122
|
+
return True
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def dispatch_ci_fix(
|
|
127
|
+
entry: QueuedMerge,
|
|
128
|
+
board: Board,
|
|
129
|
+
config: Config,
|
|
130
|
+
*,
|
|
131
|
+
checks_summary: str | None = None,
|
|
132
|
+
http_client: httpx.Client | None = None,
|
|
133
|
+
) -> Assignment | None:
|
|
134
|
+
"""Dispatch a fix worker for *entry*'s confirmed CI failure.
|
|
135
|
+
|
|
136
|
+
Returns the new ``Assignment``, or ``None`` when dispatch couldn't
|
|
137
|
+
proceed: the retry cap (:data:`MAX_CI_FIX_DISPATCHES`) is already spent,
|
|
138
|
+
a fix for this chain is already in flight, the original work assignment
|
|
139
|
+
can't be found on *board*, or the underlying ``_dispatch_fix`` call
|
|
140
|
+
itself declined (no capable machine, agent unreachable, …). The caller
|
|
141
|
+
(``coord.commands.merge._dispatch_ci_fixes``) is responsible for
|
|
142
|
+
promoting *entry* to ``HUMAN_REQUIRED`` when this returns ``None`` with
|
|
143
|
+
the retry cap exhausted, and for persisting the board/queue.
|
|
144
|
+
|
|
145
|
+
Does NOT increment ``entry.ci_fix_dispatches`` on a ``None`` return —
|
|
146
|
+
only a successful dispatch spends the budget, mirroring how
|
|
147
|
+
``ci_infra_reruns``/``ci_flaky_reruns`` are only bumped when their
|
|
148
|
+
respective remedy actually fired.
|
|
149
|
+
"""
|
|
150
|
+
if entry.ci_fix_dispatches >= MAX_CI_FIX_DISPATCHES:
|
|
151
|
+
return None
|
|
152
|
+
if _has_active_fix(board, entry):
|
|
153
|
+
return None
|
|
154
|
+
if entry.assignment_id is None:
|
|
155
|
+
return None
|
|
156
|
+
work = board.find_by_id(entry.assignment_id)
|
|
157
|
+
if work is None:
|
|
158
|
+
_log.warning(
|
|
159
|
+
"ci_fix: cannot find original work assignment %s for %s#%d — "
|
|
160
|
+
"no fix dispatched",
|
|
161
|
+
entry.assignment_id, entry.repo_name, entry.issue_number,
|
|
162
|
+
)
|
|
163
|
+
return None
|
|
164
|
+
|
|
165
|
+
summary = checks_summary or entry.error or "CI checks failed"
|
|
166
|
+
briefing = build_ci_fix_briefing(
|
|
167
|
+
entry=entry, checks_summary=summary, attempt=entry.ci_fix_dispatches + 1,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
from coord.auto_loop import _dispatch_fix # noqa: PLC0415
|
|
171
|
+
|
|
172
|
+
fix = _dispatch_fix(
|
|
173
|
+
work, briefing, board, config, entry.ci_fix_dispatches + 1,
|
|
174
|
+
http_client=http_client,
|
|
175
|
+
)
|
|
176
|
+
if fix is None:
|
|
177
|
+
return None
|
|
178
|
+
|
|
179
|
+
# #2510 visibility: mark the row so the TUI/board can tell a CI-triggered
|
|
180
|
+
# round apart from an ordinary review-bounce fix at a glance, same
|
|
181
|
+
# purpose as conflict_fix's SEMANTIC_FIX_TITLE_PREFIX.
|
|
182
|
+
fix.issue_title = f"{CI_FIX_TITLE_PREFIX} {work.issue_title}"
|
|
183
|
+
|
|
184
|
+
entry.ci_fix_dispatches += 1
|
|
185
|
+
|
|
186
|
+
from coord.audit import record_audit # noqa: PLC0415
|
|
187
|
+
|
|
188
|
+
record_audit(
|
|
189
|
+
tier="operational",
|
|
190
|
+
category="merge",
|
|
191
|
+
event_type="ci_fix_dispatched",
|
|
192
|
+
actor="daemon",
|
|
193
|
+
summary=(
|
|
194
|
+
f"ci-fix dispatched ({entry.ci_fix_dispatches}/"
|
|
195
|
+
f"{MAX_CI_FIX_DISPATCHES}): {entry.repo_name}#{entry.issue_number} "
|
|
196
|
+
f"-> {fix.machine_name}"
|
|
197
|
+
),
|
|
198
|
+
repo=entry.repo_name,
|
|
199
|
+
issue=entry.issue_number,
|
|
200
|
+
assignment_id=fix.assignment_id,
|
|
201
|
+
machine=fix.machine_name,
|
|
202
|
+
details={
|
|
203
|
+
"merge_entry_id": entry.assignment_id,
|
|
204
|
+
"ci_fix_dispatches": entry.ci_fix_dispatches,
|
|
205
|
+
"checks_summary": summary,
|
|
206
|
+
},
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
return fix
|
|
@@ -539,6 +539,85 @@ def _dispatch_conflict_fixes(events, config, *, dry_run: bool) -> None:
|
|
|
539
539
|
save_board(fix_board)
|
|
540
540
|
|
|
541
541
|
|
|
542
|
+
def _dispatch_ci_fixes(events, config, *, dry_run: bool) -> None:
|
|
543
|
+
"""#2510: classify any CONFIRMED ``checks_failed`` events and dispatch a
|
|
544
|
+
bounded CI-fix worker for the eligible ones, escalating to
|
|
545
|
+
``HUMAN_REQUIRED`` once the retry cap (``coord.ci_fix.
|
|
546
|
+
MAX_CI_FIX_DISPATCHES``) is spent.
|
|
547
|
+
|
|
548
|
+
Mutates each qualifying event's ``ev.entry.state``/``ev.entry.error`` in
|
|
549
|
+
place — same shape as :func:`_dispatch_conflict_fixes` — so the caller's
|
|
550
|
+
own subsequent save-queue step picks the mutation up naturally.
|
|
551
|
+
|
|
552
|
+
``process()`` emits a bare ``"checks_failed"`` event kind at exactly two
|
|
553
|
+
points, both reached only once the OTHER auto-remedies (the #1892 infra
|
|
554
|
+
rerun budget, the #2252 one-shot flake re-check) are exhausted or
|
|
555
|
+
inapplicable — i.e. both ARE the "confirmed real failure" case this leg
|
|
556
|
+
exists for (see ``coord.ci_fix``'s module docstring). Every other CI
|
|
557
|
+
outcome (``checks_pending``, ``ci_infra_rerun``, ``ci_flaky_rerun``,
|
|
558
|
+
``checks_unreadable``, ``checks_stale``) is still self-healing or
|
|
559
|
+
mid-retry and must not be touched here.
|
|
560
|
+
|
|
561
|
+
Shared by the whole-queue path and the ``--only`` surgical path, same
|
|
562
|
+
reasoning as ``_dispatch_conflict_fixes``: a bare ``checks_failed`` entry
|
|
563
|
+
is never reprocessed by a later ``process()`` call (it only acts on
|
|
564
|
+
``PENDING`` entries) so whichever caller sees the event first must also
|
|
565
|
+
be the one to act on it.
|
|
566
|
+
"""
|
|
567
|
+
ci_events = [ev for ev in events if ev.kind == "checks_failed"]
|
|
568
|
+
if not ci_events or dry_run:
|
|
569
|
+
return
|
|
570
|
+
|
|
571
|
+
from coord.audit import record_audit # noqa: PLC0415
|
|
572
|
+
from coord.ci_fix import MAX_CI_FIX_DISPATCHES, dispatch_ci_fix # noqa: PLC0415
|
|
573
|
+
from coord.merge_queue import HUMAN_REQUIRED # noqa: PLC0415
|
|
574
|
+
from coord.state import load_board, save_board # noqa: PLC0415
|
|
575
|
+
|
|
576
|
+
fix_board = load_board()
|
|
577
|
+
if fix_board is None:
|
|
578
|
+
return
|
|
579
|
+
dispatched_any = False
|
|
580
|
+
for ev in ci_events:
|
|
581
|
+
entry = ev.entry
|
|
582
|
+
fix = dispatch_ci_fix(entry, fix_board, config, checks_summary=ev.message)
|
|
583
|
+
if fix is not None:
|
|
584
|
+
click.echo(
|
|
585
|
+
f" {entry.repo_name} #{entry.issue_number}: "
|
|
586
|
+
f"ci-fix dispatched to {fix.machine_name} "
|
|
587
|
+
f"({entry.ci_fix_dispatches}/{MAX_CI_FIX_DISPATCHES})"
|
|
588
|
+
)
|
|
589
|
+
dispatched_any = True
|
|
590
|
+
continue
|
|
591
|
+
if entry.ci_fix_dispatches >= MAX_CI_FIX_DISPATCHES:
|
|
592
|
+
entry.state = HUMAN_REQUIRED
|
|
593
|
+
click.echo(
|
|
594
|
+
f" {entry.repo_name} #{entry.issue_number}: "
|
|
595
|
+
f"ci-fix retry cap hit ({entry.ci_fix_dispatches}/"
|
|
596
|
+
f"{MAX_CI_FIX_DISPATCHES}) — manual resolution required"
|
|
597
|
+
)
|
|
598
|
+
record_audit(
|
|
599
|
+
tier="operational",
|
|
600
|
+
category="merge",
|
|
601
|
+
event_type="ci_fix_human_required",
|
|
602
|
+
actor="daemon",
|
|
603
|
+
summary=(
|
|
604
|
+
f"ci-fix retry cap hit: {entry.repo_name}#"
|
|
605
|
+
f"{entry.issue_number} — manual resolution required"
|
|
606
|
+
),
|
|
607
|
+
repo=entry.repo_name,
|
|
608
|
+
issue=entry.issue_number,
|
|
609
|
+
assignment_id=entry.assignment_id,
|
|
610
|
+
details={"reason": "ci_fix_retry_cap", "error": entry.error},
|
|
611
|
+
)
|
|
612
|
+
dispatched_any = True # the HUMAN_REQUIRED mutation needs saving
|
|
613
|
+
# else: budget remains but dispatch declined for another reason (no
|
|
614
|
+
# machine, an unrelated fix already in flight, agent unreachable) —
|
|
615
|
+
# leave the entry PENDING for the next tick to retry, exactly like a
|
|
616
|
+
# declined conflict-fix dispatch does.
|
|
617
|
+
if dispatched_any:
|
|
618
|
+
save_board(fix_board)
|
|
619
|
+
|
|
620
|
+
|
|
542
621
|
@click.command(
|
|
543
622
|
"verify-merge",
|
|
544
623
|
help=(
|
|
@@ -1927,6 +2006,10 @@ def merge(
|
|
|
1927
2006
|
# before the save below so a retry-cap/non-rebaseable HUMAN_REQUIRED
|
|
1928
2007
|
# mutation on only_entry.state is persisted, not lost.
|
|
1929
2008
|
_dispatch_conflict_fixes(events_only, cfg_only, dry_run=dry_run)
|
|
2009
|
+
# #2510: same reasoning, for a CONFIRMED checks_failed event — dispatch
|
|
2010
|
+
# a bounded ci-fix worker or escalate to HUMAN_REQUIRED before the
|
|
2011
|
+
# save below, so the mutation on only_entry.state is persisted too.
|
|
2012
|
+
_dispatch_ci_fixes(events_only, cfg_only, dry_run=dry_run)
|
|
1930
2013
|
# #2246: `--only` merges one entry, but the branch it just moved is
|
|
1931
2014
|
# shared — every OTHER queued PR based on it may have become
|
|
1932
2015
|
# CONFLICTING a second ago. This is the drive-queue's path (`coord
|
|
@@ -2251,6 +2334,11 @@ def merge(
|
|
|
2251
2334
|
# review, so the --only path below can share it).
|
|
2252
2335
|
_dispatch_conflict_fixes(events, cfg, dry_run=dry_run)
|
|
2253
2336
|
|
|
2337
|
+
# #2510: classify any CONFIRMED checks_failed events and dispatch a
|
|
2338
|
+
# bounded ci-fix worker for the eligible ones, escalating to
|
|
2339
|
+
# HUMAN_REQUIRED once the retry cap is spent.
|
|
2340
|
+
_dispatch_ci_fixes(events, cfg, dry_run=dry_run)
|
|
2341
|
+
|
|
2254
2342
|
# #2246: whatever just landed may have invalidated its siblings — ask
|
|
2255
2343
|
# GitHub now, while the merge that caused it is still the obvious
|
|
2256
2344
|
# explanation, rather than letting the next drive attempt discover it as
|
|
@@ -192,7 +192,8 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
|
|
|
192
192
|
ci_stale_reruns INTEGER NOT NULL DEFAULT 0,
|
|
193
193
|
ci_flaky_reruns INTEGER NOT NULL DEFAULT 0,
|
|
194
194
|
ci_flaky_pending TEXT NOT NULL DEFAULT '',
|
|
195
|
-
ci_unreadable_reruns INTEGER NOT NULL DEFAULT 0
|
|
195
|
+
ci_unreadable_reruns INTEGER NOT NULL DEFAULT 0,
|
|
196
|
+
ci_fix_dispatches INTEGER NOT NULL DEFAULT 0
|
|
196
197
|
);
|
|
197
198
|
|
|
198
199
|
CREATE TABLE IF NOT EXISTS plans (
|
|
@@ -934,6 +935,13 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
|
|
|
934
935
|
# NULL for a hand dispatch, a coordinator/brain-proposed dispatch,
|
|
935
936
|
# and every row predating this column.
|
|
936
937
|
"ALTER TABLE assignments ADD COLUMN dispatched_by_assignment_id TEXT",
|
|
938
|
+
# #2510: count of `coord.ci_fix.dispatch_ci_fix` fix-worker dispatches
|
|
939
|
+
# issued for this entry's CURRENT confirmed (non-infra, non-first-
|
|
940
|
+
# flake) `checks_failed` streak — see `QueuedMerge.ci_fix_dispatches`'s
|
|
941
|
+
# docstring and `coord.ci_fix.MAX_CI_FIX_DISPATCHES`. 0 for every row
|
|
942
|
+
# predating this migration, same as the column's own default for a
|
|
943
|
+
# freshly-enqueued entry.
|
|
944
|
+
"ALTER TABLE merge_queue ADD COLUMN ci_fix_dispatches INTEGER NOT NULL DEFAULT 0",
|
|
937
945
|
]
|
|
938
946
|
for sql in migrations:
|
|
939
947
|
try:
|
|
@@ -2524,6 +2524,29 @@ class QueuedMerge:
|
|
|
2524
2524
|
# any of the other three ("what did CI say?"). 0 for every entry that
|
|
2525
2525
|
# has never hit a fetch failure, and for rows predating this column.
|
|
2526
2526
|
ci_unreadable_reruns: int = 0
|
|
2527
|
+
# #2510: count of `type="ci-fix"`-shaped fix-worker dispatches the
|
|
2528
|
+
# coordinator has issued for this entry's confirmed (non-infra,
|
|
2529
|
+
# non-first-flake) `checks_failed` streak — capped at
|
|
2530
|
+
# `coord.ci_fix.MAX_CI_FIX_DISPATCHES`. A CONFIRMED failure (see
|
|
2531
|
+
# `process()`'s `msg = f"checks failed: {summary}"` block, reached only
|
|
2532
|
+
# once the infra/flaky retry budgets above are exhausted or
|
|
2533
|
+
# inapplicable) used to just leave the entry `PENDING` forever with no
|
|
2534
|
+
# path back to a fix — this is the durable ceiling that lets
|
|
2535
|
+
# `coord.commands.merge._dispatch_ci_fixes` dispatch a bounded number of
|
|
2536
|
+
# fix attempts before giving up and promoting the entry to
|
|
2537
|
+
# `HUMAN_REQUIRED`, mirroring how `ci_infra_reruns`/`ci_flaky_reruns`
|
|
2538
|
+
# bound their own auto-remedies. 0 for every entry that has never hit a
|
|
2539
|
+
# confirmed CI failure, and for rows predating this column. Unlike the
|
|
2540
|
+
# rerun counters above (which reset once CI resolves cleanly — see the
|
|
2541
|
+
# "genuinely resolved" reset block later in `process()`), this one is
|
|
2542
|
+
# intentionally NOT auto-reset there: a fix dispatch's payoff is a FUTURE
|
|
2543
|
+
# green run on a NEW commit, which as a side effect also resets
|
|
2544
|
+
# ci_infra_reruns/ci_flaky_reruns/ci_unreadable_reruns — so by the time
|
|
2545
|
+
# this entry could reach that reset block again, the fix either worked
|
|
2546
|
+
# (merge proceeds, entry leaves the queue) or the retry budget is what
|
|
2547
|
+
# stopped the loop; resetting it on an unrelated green tick would just
|
|
2548
|
+
# reopen a budget a still-broken PR could re-exhaust forever.
|
|
2549
|
+
ci_fix_dispatches: int = 0
|
|
2527
2550
|
|
|
2528
2551
|
|
|
2529
2552
|
class GhOps(Protocol):
|
|
@@ -2848,6 +2871,10 @@ def load_queue() -> list[QueuedMerge]:
|
|
|
2848
2871
|
# #2347: same NULL-to-0 decoding as ci_infra_reruns above, for
|
|
2849
2872
|
# rows predating this column.
|
|
2850
2873
|
ci_unreadable_reruns=row["ci_unreadable_reruns"] or 0,
|
|
2874
|
+
# #2510: column added via migration; NULL (pre-migration rows)
|
|
2875
|
+
# decodes to 0 — no CI-fix dispatches spent yet, same as a fresh
|
|
2876
|
+
# entry.
|
|
2877
|
+
ci_fix_dispatches=row["ci_fix_dispatches"] or 0,
|
|
2851
2878
|
)
|
|
2852
2879
|
for row in rows
|
|
2853
2880
|
]
|
|
@@ -2866,8 +2893,8 @@ def save_queue(items: list[QueuedMerge]) -> None:
|
|
|
2866
2893
|
pr_number, pr_url, size, last_attempt, error, enqueued_at,
|
|
2867
2894
|
assignment_type, required_gates, ci_infra_reruns,
|
|
2868
2895
|
ci_stale_reruns, ci_flaky_reruns, ci_flaky_pending,
|
|
2869
|
-
ci_unreadable_reruns
|
|
2870
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
2896
|
+
ci_unreadable_reruns, ci_fix_dispatches
|
|
2897
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
2871
2898
|
(
|
|
2872
2899
|
item.assignment_id, item.repo_name, item.repo_github,
|
|
2873
2900
|
item.branch, item.target_branch, item.issue_number,
|
|
@@ -2876,7 +2903,7 @@ def save_queue(items: list[QueuedMerge]) -> None:
|
|
|
2876
2903
|
item.assignment_type, json.dumps(list(item.required_gates or [])),
|
|
2877
2904
|
item.ci_infra_reruns, item.ci_stale_reruns,
|
|
2878
2905
|
item.ci_flaky_reruns, item.ci_flaky_pending,
|
|
2879
|
-
item.ci_unreadable_reruns,
|
|
2906
|
+
item.ci_unreadable_reruns, item.ci_fix_dispatches,
|
|
2880
2907
|
),
|
|
2881
2908
|
)
|
|
2882
2909
|
|
|
@@ -4981,6 +5008,119 @@ def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> Merge
|
|
|
4981
5008
|
return MergeEvent(entry, event_type, msg)
|
|
4982
5009
|
|
|
4983
5010
|
|
|
5011
|
+
def _maybe_push_design_round(
|
|
5012
|
+
entry: QueuedMerge, config, gh_ops: GhOps
|
|
5013
|
+
) -> "MergeEvent | None":
|
|
5014
|
+
"""PDR-3 (#2508): right after a `type="mock-author"` (Gate A) PR has
|
|
5015
|
+
actually merged into ``entry.target_branch``, push its rendered mock
|
|
5016
|
+
bundle + contract to the portal as a design round — the epic-#2506
|
|
5017
|
+
bridge's third leg, wiring PDR-1's link (``coord portal link``,
|
|
5018
|
+
#2507) and PDR-2's upload route (coord-portal#120) into the one signal
|
|
5019
|
+
``coord/merge_queue.py`` already fires for any assignment type: a real
|
|
5020
|
+
merge.
|
|
5021
|
+
|
|
5022
|
+
Returns ``None`` for every "nothing to do" reason — not a `mock-author`
|
|
5023
|
+
entry, no ``portal:`` block configured, the tracking issue isn't under
|
|
5024
|
+
a milestone, or (the common case pre-#2508) the milestone has no portal
|
|
5025
|
+
link on file. That last one is the fail-open posture
|
|
5026
|
+
``coord.portal_bridge``'s module docstring already states for the rest
|
|
5027
|
+
of this bridge: "a portal outage must never block a merge or a
|
|
5028
|
+
dispatch" applies just as much to "there's simply no portal submission
|
|
5029
|
+
for this milestone yet" — until an operator runs ``coord portal link``,
|
|
5030
|
+
this is silently, correctly, a no-op. Every other failure (can't fetch
|
|
5031
|
+
the tracking issue, can't collect the bundle, upload/enqueue rejected)
|
|
5032
|
+
degrades to a ``design_round_push_failed`` event rather than raising —
|
|
5033
|
+
called from ``process()`` inside its own try/except, same discipline as
|
|
5034
|
+
:func:`_maybe_clear_expected_red` right above it, but belt-and-braces
|
|
5035
|
+
here too since this reaches out to two different externals (GitHub's
|
|
5036
|
+
Contents API and the portal itself).
|
|
5037
|
+
"""
|
|
5038
|
+
if entry.assignment_type != "mock-author":
|
|
5039
|
+
return None
|
|
5040
|
+
portal_cfg = getattr(config, "portal", None)
|
|
5041
|
+
if portal_cfg is None or not portal_cfg.enabled:
|
|
5042
|
+
return None
|
|
5043
|
+
|
|
5044
|
+
# #1467-style optional probe: `get_issue` isn't part of the GhOps
|
|
5045
|
+
# Protocol proper (most stubs in tests never need it), so a stub that
|
|
5046
|
+
# doesn't implement it degrades to "nothing to do" rather than an
|
|
5047
|
+
# AttributeError — mirrors `branch_has_merge_commit`'s optional-probe
|
|
5048
|
+
# pattern used for the rebase→squash fallback above.
|
|
5049
|
+
get_issue = getattr(gh_ops, "get_issue", None)
|
|
5050
|
+
if get_issue is None:
|
|
5051
|
+
return None
|
|
5052
|
+
try:
|
|
5053
|
+
issue_data = get_issue(entry.repo_github, entry.issue_number)
|
|
5054
|
+
except Exception as e: # noqa: BLE001 — best-effort, see docstring
|
|
5055
|
+
return MergeEvent(
|
|
5056
|
+
entry, "design_round_push_failed",
|
|
5057
|
+
f"could not fetch tracking issue #{entry.issue_number}: {e}",
|
|
5058
|
+
)
|
|
5059
|
+
milestone = (issue_data or {}).get("milestone") or {}
|
|
5060
|
+
milestone_number = milestone.get("number")
|
|
5061
|
+
if milestone_number is None:
|
|
5062
|
+
# A "mock-author" entry not scoped to a milestone at all (shouldn't
|
|
5063
|
+
# happen via `coord acceptance mock`, which always resolves one —
|
|
5064
|
+
# but this hook must survive a hand-dispatched entry that skips it).
|
|
5065
|
+
return None
|
|
5066
|
+
|
|
5067
|
+
from coord import portal_store # noqa: PLC0415
|
|
5068
|
+
|
|
5069
|
+
link = portal_store.get_milestone_link(
|
|
5070
|
+
repo_name=entry.repo_name, milestone_number=milestone_number
|
|
5071
|
+
)
|
|
5072
|
+
if link is None:
|
|
5073
|
+
# PDR-1: no `coord portal link` recorded for this milestone yet —
|
|
5074
|
+
# the whole point of the fail-open posture (see docstring above).
|
|
5075
|
+
return None
|
|
5076
|
+
|
|
5077
|
+
from coord.mock_author import build_design_round, collect_mock_bundle_files # noqa: PLC0415
|
|
5078
|
+
from coord.portal_bridge import PortalBridgeError, client_from_config # noqa: PLC0415
|
|
5079
|
+
from coord.portal_sync import PortalSyncError, enqueue_design_round # noqa: PLC0415
|
|
5080
|
+
|
|
5081
|
+
client = client_from_config(portal_cfg)
|
|
5082
|
+
if client is None:
|
|
5083
|
+
return None
|
|
5084
|
+
|
|
5085
|
+
try:
|
|
5086
|
+
files = collect_mock_bundle_files(
|
|
5087
|
+
entry.repo_github, milestone_number, entry.target_branch
|
|
5088
|
+
)
|
|
5089
|
+
except Exception as e: # noqa: BLE001 — best-effort, see docstring
|
|
5090
|
+
return MergeEvent(
|
|
5091
|
+
entry, "design_round_push_failed",
|
|
5092
|
+
f"could not collect mock bundle: {e}",
|
|
5093
|
+
)
|
|
5094
|
+
if not files:
|
|
5095
|
+
return MergeEvent(
|
|
5096
|
+
entry, "design_round_push_skipped",
|
|
5097
|
+
f"no rendered mock bundle found on {entry.target_branch} for "
|
|
5098
|
+
f"ms-{milestone_number} — nothing to push",
|
|
5099
|
+
)
|
|
5100
|
+
|
|
5101
|
+
try:
|
|
5102
|
+
bundle_key = client.upload_bundle(link.submission_id, files)
|
|
5103
|
+
except PortalBridgeError as e:
|
|
5104
|
+
return MergeEvent(entry, "design_round_push_failed", f"bundle upload failed: {e}")
|
|
5105
|
+
|
|
5106
|
+
design_round = build_design_round(
|
|
5107
|
+
milestone_title=milestone.get("title") or f"ms-{milestone_number}",
|
|
5108
|
+
tracking_issue_title=issue_data.get("title") or "",
|
|
5109
|
+
tracking_issue_body=issue_data.get("body") or "",
|
|
5110
|
+
bundle_key=bundle_key,
|
|
5111
|
+
)
|
|
5112
|
+
try:
|
|
5113
|
+
row = enqueue_design_round(link.submission_id, design_round)
|
|
5114
|
+
except PortalSyncError as e:
|
|
5115
|
+
return MergeEvent(entry, "design_round_push_failed", f"enqueue failed: {e}")
|
|
5116
|
+
|
|
5117
|
+
return MergeEvent(
|
|
5118
|
+
entry, "design_round_queued",
|
|
5119
|
+
f"queued design round for portal submission {link.submission_id} "
|
|
5120
|
+
f"(seq={row.seq}, bundle_key={bundle_key})",
|
|
5121
|
+
)
|
|
5122
|
+
|
|
5123
|
+
|
|
4984
5124
|
def process(
|
|
4985
5125
|
items: list[QueuedMerge],
|
|
4986
5126
|
gh_ops: GhOps,
|
|
@@ -6205,6 +6345,20 @@ def process(
|
|
|
6205
6345
|
clear_event = MergeEvent(entry, "expected_red_clear_failed", str(e))
|
|
6206
6346
|
if clear_event is not None:
|
|
6207
6347
|
events.append(clear_event)
|
|
6348
|
+
# PDR-3 (#2508): a merged Gate-A (`type="mock-author"`)
|
|
6349
|
+
# branch auto-pushes a design round to the portal, if (and
|
|
6350
|
+
# only if) its milestone has a portal link on file. Best
|
|
6351
|
+
# effort, same as the expected_red clear above — a portal
|
|
6352
|
+
# outage, or simply no `coord portal link` recorded, must
|
|
6353
|
+
# never undo a real merge.
|
|
6354
|
+
try:
|
|
6355
|
+
design_round_event = _maybe_push_design_round(entry, config, gh_ops)
|
|
6356
|
+
except Exception as e: # noqa: BLE001 — bookkeeping, never undoes a real merge
|
|
6357
|
+
design_round_event = MergeEvent(
|
|
6358
|
+
entry, "design_round_push_failed", str(e)
|
|
6359
|
+
)
|
|
6360
|
+
if design_round_event is not None:
|
|
6361
|
+
events.append(design_round_event)
|
|
6208
6362
|
continue
|
|
6209
6363
|
entry.state = CONFLICT
|
|
6210
6364
|
entry.error = msg
|