code-coordinator 0.5.213__tar.gz → 0.5.215__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.213 → code_coordinator-0.5.215}/PKG-INFO +1 -1
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/auto_loop.py +32 -4
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/merge.py +18 -4
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/db.py +53 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notify.py +108 -7
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/state.py +16 -5
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_auto_loop.py +100 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_fix.py +24 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_db.py +79 -1
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_stalled_pipeline.py +272 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_state.py +86 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/.gitignore +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/CLAUDE.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/GOAL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/LICENSE +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/MANIFEST.in +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/README.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/__init__.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agent.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/audit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/block_log.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/board_service.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/brain.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/claim.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/cli.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/client.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/comments.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/config.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dao.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/deps.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/drive.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/events.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/filelock.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/freshness.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/gates.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/goal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/context.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/models.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/render.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/health/units.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/hooks.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/interactive.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/models.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/network.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/openapi.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/parentage.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/plans.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/progress.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/release_window.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/reports.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/review.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/self_health.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/smoke.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/split_work.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/test_author.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/test_report.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/usage.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/install-agent.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/pyproject.toml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/setup.cfg +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/__init__.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/conftest.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_events.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_init.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_models.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_network.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_session.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_split.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.213 → code_coordinator-0.5.215}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -34,6 +34,7 @@ Data model:
|
|
|
34
34
|
from __future__ import annotations
|
|
35
35
|
|
|
36
36
|
import logging
|
|
37
|
+
import sqlite3
|
|
37
38
|
import time
|
|
38
39
|
import uuid
|
|
39
40
|
from dataclasses import dataclass
|
|
@@ -1221,10 +1222,37 @@ def _dispatch_fix(
|
|
|
1221
1222
|
)
|
|
1222
1223
|
board.active.append(fix_assignment)
|
|
1223
1224
|
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1225
|
+
try:
|
|
1226
|
+
record_dispatched_assignment(
|
|
1227
|
+
assignment=fix_assignment,
|
|
1228
|
+
repo_github=repo.github,
|
|
1229
|
+
)
|
|
1230
|
+
except sqlite3.OperationalError as exc:
|
|
1231
|
+
if "database is locked" not in str(exc).lower():
|
|
1232
|
+
# Not the transient contention this guard exists for (#2538) —
|
|
1233
|
+
# a schema mismatch or malformed statement is a real bug and
|
|
1234
|
+
# must not be swallowed as an ordinary declined dispatch.
|
|
1235
|
+
raise
|
|
1236
|
+
# `record_dispatched_assignment` already retries transient
|
|
1237
|
+
# "database is locked" contention itself (coord.db.retry_on_locked,
|
|
1238
|
+
# via coord._record_dispatched_assignment_local) — this is only
|
|
1239
|
+
# reached once that bounded retry budget is exhausted. The fix
|
|
1240
|
+
# worker has already been POSTed to the agent above and is really
|
|
1241
|
+
# running; only the durable board-DB row failed to write. Treat it
|
|
1242
|
+
# the same as any other declined dispatch (no machine, agent
|
|
1243
|
+
# unreachable, …) rather than letting a transient lock crash the
|
|
1244
|
+
# whole caller (`coord merge`'s CI-fix queue, the review auto-loop,
|
|
1245
|
+
# …) — undo the in-memory append so a saved board never carries a
|
|
1246
|
+
# row this call never durably recorded, and let the caller's
|
|
1247
|
+
# existing "dispatch declined" handling take it from here.
|
|
1248
|
+
board.active.remove(fix_assignment)
|
|
1249
|
+
log.warning(
|
|
1250
|
+
"auto_loop: fix dispatch for %s hit persistent DB contention "
|
|
1251
|
+
"recording assignment %s (%s) — treating as not dispatched; "
|
|
1252
|
+
"will retry next run",
|
|
1253
|
+
work.assignment_id, fix_assignment.assignment_id, exc,
|
|
1254
|
+
)
|
|
1255
|
+
return None
|
|
1228
1256
|
return fix_assignment
|
|
1229
1257
|
|
|
1230
1258
|
|
|
@@ -610,10 +610,24 @@ def _dispatch_ci_fixes(events, config, *, dry_run: bool) -> None:
|
|
|
610
610
|
details={"reason": "ci_fix_retry_cap", "error": entry.error},
|
|
611
611
|
)
|
|
612
612
|
dispatched_any = True # the HUMAN_REQUIRED mutation needs saving
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
613
|
+
else:
|
|
614
|
+
# Budget remains but dispatch declined for another reason (no
|
|
615
|
+
# machine, an unrelated fix already in flight, agent
|
|
616
|
+
# unreachable, or — #2538 — `_dispatch_fix` hit persistent
|
|
617
|
+
# "database is locked" contention recording the assignment
|
|
618
|
+
# after its own bounded retry budget was exhausted) — leave the
|
|
619
|
+
# entry PENDING for the next tick to retry, exactly like a
|
|
620
|
+
# declined conflict-fix dispatch does. Echoed (matching
|
|
621
|
+
# `_dispatch_conflict_fixes`'s equivalent branch) so an
|
|
622
|
+
# operator watching `coord merge` isn't left wondering why
|
|
623
|
+
# nothing happened for this entry — and so a transient DB lock
|
|
624
|
+
# collision on ONE entry is visibly a retry, not a silent drop,
|
|
625
|
+
# while every other entry keeps processing normally.
|
|
626
|
+
click.echo(
|
|
627
|
+
f" {entry.repo_name} #{entry.issue_number}: "
|
|
628
|
+
"ci-fix not dispatched (no machine / already in flight / "
|
|
629
|
+
"transient DB contention — will retry next run)"
|
|
630
|
+
)
|
|
617
631
|
if dispatched_any:
|
|
618
632
|
save_board(fix_board)
|
|
619
633
|
|
|
@@ -15,7 +15,9 @@ from __future__ import annotations
|
|
|
15
15
|
import json
|
|
16
16
|
import os
|
|
17
17
|
import sqlite3
|
|
18
|
+
import time
|
|
18
19
|
from pathlib import Path
|
|
20
|
+
from typing import Callable, TypeVar
|
|
19
21
|
|
|
20
22
|
from coord.platform_paths import default_coord_dir
|
|
21
23
|
|
|
@@ -88,6 +90,57 @@ def close() -> None:
|
|
|
88
90
|
_conn = None
|
|
89
91
|
|
|
90
92
|
|
|
93
|
+
_T = TypeVar("_T")
|
|
94
|
+
|
|
95
|
+
# #2538: a handful of consecutive short retries — long enough to ride out a
|
|
96
|
+
# concurrent writer (the daemon's own passive tick, another `coord merge`/
|
|
97
|
+
# `coord notify` invocation) that only holds the DB for a moment, short
|
|
98
|
+
# enough that a genuinely stuck lock still fails fast rather than hanging
|
|
99
|
+
# `coord merge` for a long time.
|
|
100
|
+
_LOCK_RETRY_ATTEMPTS = 5
|
|
101
|
+
_LOCK_RETRY_BASE_DELAY_S = 0.1
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def retry_on_locked(
|
|
105
|
+
write: Callable[[], _T],
|
|
106
|
+
*,
|
|
107
|
+
attempts: int = _LOCK_RETRY_ATTEMPTS,
|
|
108
|
+
base_delay: float = _LOCK_RETRY_BASE_DELAY_S,
|
|
109
|
+
) -> _T:
|
|
110
|
+
"""Run *write* (a zero-arg callable performing one or more SQLite writes),
|
|
111
|
+
retrying with exponential backoff when SQLite raises ``database is
|
|
112
|
+
locked`` (#2538).
|
|
113
|
+
|
|
114
|
+
That error is transient contention — a concurrent writer holding the DB
|
|
115
|
+
at the exact moment this call tries to write, not a real failure — and a
|
|
116
|
+
short wait is very likely to let it clear. ``PRAGMA busy_timeout``
|
|
117
|
+
(set on every connection in :func:`_open`) already makes SQLite itself
|
|
118
|
+
wait before raising, but under sustained contention (several writers in
|
|
119
|
+
a tight loop) that single wait can still be exhausted; this adds a few
|
|
120
|
+
more short, backed-off attempts on top rather than failing on the first
|
|
121
|
+
collision.
|
|
122
|
+
|
|
123
|
+
Any other ``OperationalError`` (schema drift, a malformed statement, …)
|
|
124
|
+
is re-raised immediately without retrying — those are not transient, and
|
|
125
|
+
retrying would only delay surfacing a real bug. After *attempts*
|
|
126
|
+
consecutive ``database is locked`` collisions, re-raises the last
|
|
127
|
+
``sqlite3.OperationalError`` so the caller can decide how to degrade
|
|
128
|
+
(see ``coord.state._record_dispatched_assignment_local``, whose caller —
|
|
129
|
+
``coord.auto_loop._dispatch_fix`` — treats it as a declined dispatch
|
|
130
|
+
rather than letting it crash the whole run).
|
|
131
|
+
"""
|
|
132
|
+
delay = base_delay
|
|
133
|
+
for attempt in range(1, attempts + 1):
|
|
134
|
+
try:
|
|
135
|
+
return write()
|
|
136
|
+
except sqlite3.OperationalError as exc:
|
|
137
|
+
if "database is locked" not in str(exc).lower() or attempt >= attempts:
|
|
138
|
+
raise
|
|
139
|
+
time.sleep(delay)
|
|
140
|
+
delay *= 2
|
|
141
|
+
raise AssertionError("unreachable") # loop above always returns or raises
|
|
142
|
+
|
|
143
|
+
|
|
91
144
|
# ── Schema ────────────────────────────────────────────────────────────────────
|
|
92
145
|
|
|
93
146
|
def _ensure_schema(conn: sqlite3.Connection) -> None:
|
|
@@ -11,6 +11,7 @@ from typing import TYPE_CHECKING
|
|
|
11
11
|
import httpx
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
|
+
from coord.merge_queue import QueuedMerge
|
|
14
15
|
from coord.models import Assignment, Board
|
|
15
16
|
from coord.progress import SmokeVerdict
|
|
16
17
|
|
|
@@ -991,6 +992,14 @@ class StalledDispatchAction:
|
|
|
991
992
|
(#602).
|
|
992
993
|
- ``"skipped_human_required"`` — the conflict-fix retry cap was already
|
|
993
994
|
hit; surfacing to a human, not auto-retrying.
|
|
995
|
+
- ``"skipped_sealed_conflict"`` (#2537) — ``merge_conflict_unresolved``
|
|
996
|
+
on a :data:`coord.models.SEALED_PATH_AUTHOR_TYPES` row whose conflict
|
|
997
|
+
was confirmed (:func:`_conflict_confined_to_sealed_paths`) to be
|
|
998
|
+
confined to the repo's sealed acceptance-oracle paths — a
|
|
999
|
+
conflict-fix worker is guaranteed to self-restrict and push nothing
|
|
1000
|
+
there, so the dispatch was skipped rather than spending a worker
|
|
1001
|
+
session on a known no-op; needs a sealed-path-aware rebase dispatcher
|
|
1002
|
+
(a follow-up issue, not yet implemented).
|
|
994
1003
|
- ``"disabled"`` — ``pipeline.auto_dispatch_stalled`` is
|
|
995
1004
|
off; detection/narration still happened, dispatch did not.
|
|
996
1005
|
"""
|
|
@@ -1044,6 +1053,50 @@ def _stalled_row_has_live_session(board: "Board", work: "Assignment") -> bool:
|
|
|
1044
1053
|
return False
|
|
1045
1054
|
|
|
1046
1055
|
|
|
1056
|
+
def _conflict_confined_to_sealed_paths(
|
|
1057
|
+
entry: "QueuedMerge", config: Config,
|
|
1058
|
+
) -> list[str] | None:
|
|
1059
|
+
"""#2537: best-effort check for whether *entry*'s merge conflict can
|
|
1060
|
+
ONLY be within the repo's sealed acceptance-oracle paths
|
|
1061
|
+
(:meth:`coord.config.AcceptanceConfig.sealed_paths`).
|
|
1062
|
+
|
|
1063
|
+
Returns the entry branch's changed-file list when every file it touches
|
|
1064
|
+
(the three-dot compare of *entry.target_branch*...*entry.branch*, via
|
|
1065
|
+
:func:`coord.github_ops.get_compare_files` — the SAME GitHub-API-only,
|
|
1066
|
+
no-local-checkout seam #1720's dispatch-time overlap fence already uses)
|
|
1067
|
+
falls under a sealed path. GitHub's conflicting-file set is necessarily
|
|
1068
|
+
a SUBSET of this branch's own changed files — a file can only conflict
|
|
1069
|
+
if *this* branch touches it too — so confining the WHOLE branch diff to
|
|
1070
|
+
sealed paths is sufficient to guarantee the conflict is, without needing
|
|
1071
|
+
a local checkout or a `git merge-tree` call.
|
|
1072
|
+
|
|
1073
|
+
Returns ``None`` — "can't confirm confinement, don't skip the ordinary
|
|
1074
|
+
dispatch" — when: the repo has no acceptance driver configured (nothing
|
|
1075
|
+
is sealed); the compare API call fails or reports no files; or anything
|
|
1076
|
+
is touched outside every sealed path. This is a pure availability
|
|
1077
|
+
signal, never a hard "not confined" claim — a caller that gets ``None``
|
|
1078
|
+
falls back to :func:`coord.conflict_fix.dispatch_conflict_fix` exactly
|
|
1079
|
+
as before, which is always safe: a genuinely sealed-confined conflict
|
|
1080
|
+
just makes that dispatch a no-op (the conflict-fix worker self-restricts
|
|
1081
|
+
per CLAUDE.md's own sealed-path rule), so the only cost of a missed
|
|
1082
|
+
detection here is one wasted worker session, never an incorrect action.
|
|
1083
|
+
"""
|
|
1084
|
+
sealed = config.acceptance.sealed_paths(entry.repo_name)
|
|
1085
|
+
if not sealed:
|
|
1086
|
+
return None
|
|
1087
|
+
from coord import github_ops # noqa: PLC0415
|
|
1088
|
+
from coord.review import _path_is_sealed # noqa: PLC0415
|
|
1089
|
+
|
|
1090
|
+
files = github_ops.get_compare_files(
|
|
1091
|
+
entry.repo_github, entry.target_branch, entry.branch,
|
|
1092
|
+
)
|
|
1093
|
+
if not files:
|
|
1094
|
+
return None
|
|
1095
|
+
if all(any(_path_is_sealed(f, s) for s in sealed) for f in files):
|
|
1096
|
+
return files
|
|
1097
|
+
return None
|
|
1098
|
+
|
|
1099
|
+
|
|
1047
1100
|
def dispatch_stalled_pipeline_action(
|
|
1048
1101
|
detection: StalledDetection,
|
|
1049
1102
|
work: "Assignment",
|
|
@@ -1058,11 +1111,12 @@ def dispatch_stalled_pipeline_action(
|
|
|
1058
1111
|
Gated by ``config.pipeline.auto_dispatch_stalled`` (default ``False`` —
|
|
1059
1112
|
detection/narration via :func:`post_stalled_pipeline` is unconditional;
|
|
1060
1113
|
this is the opt-in action half) — EXCEPT for a ``review_request_changes_
|
|
1061
|
-
no_fix`` stall on a
|
|
1062
|
-
(``test-author
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1114
|
+
no_fix`` OR (#2537) ``merge_conflict_unresolved`` stall on a
|
|
1115
|
+
:data:`coord.models.SEALED_PATH_AUTHOR_TYPES` row (``test-author``/
|
|
1116
|
+
``mock-author``), which dispatches regardless of the flag: no loop owns
|
|
1117
|
+
that row (#2302), so the flag would only leave it stalled forever with
|
|
1118
|
+
no alternative dispatcher to race. ``work`` rows under the same reasons
|
|
1119
|
+
keep the opt-in gate — ``coord drive`` owns those.
|
|
1066
1120
|
Mutates *board* in place exactly like
|
|
1067
1121
|
the auto-loop / review-dispatch helpers it delegates to — the caller is
|
|
1068
1122
|
responsible for persisting it.
|
|
@@ -1091,7 +1145,15 @@ def dispatch_stalled_pipeline_action(
|
|
|
1091
1145
|
the same bulk gate-checked enqueue the daemon passive tick already
|
|
1092
1146
|
runs on every interval.
|
|
1093
1147
|
- ``merge_conflict_unresolved`` → :func:`coord.conflict_fix.dispatch_conflict_fix`,
|
|
1094
|
-
the #1474 ``_dispatch_conflict_fixes`` path
|
|
1148
|
+
the #1474 ``_dispatch_conflict_fixes`` path — UNLESS (#2537) *work* is a
|
|
1149
|
+
:data:`coord.models.SEALED_PATH_AUTHOR_TYPES` row AND the conflict can
|
|
1150
|
+
be confirmed (via :func:`_conflict_confined_to_sealed_paths`, a
|
|
1151
|
+
compare-API-only check) to be confined to the repo's sealed
|
|
1152
|
+
acceptance-oracle paths — a conflict-fix worker is REQUIRED by
|
|
1153
|
+
CLAUDE.md's own sealed-path rule to self-restrict from editing those,
|
|
1154
|
+
so it is guaranteed to push nothing; that case returns
|
|
1155
|
+
``"skipped_sealed_conflict"`` instead of spending a worker session on
|
|
1156
|
+
a known no-op.
|
|
1095
1157
|
- ``review_failed_no_verdict`` (#1584) → :func:`coord.review.dispatch_review`
|
|
1096
1158
|
again, the SAME call as ``done_no_review`` — the failed review left no
|
|
1097
1159
|
verdict behind, so recovery is identical to "no review was ever
|
|
@@ -1116,10 +1178,20 @@ def dispatch_stalled_pipeline_action(
|
|
|
1116
1178
|
# no drive run over it at all (see #2289). So this one reason+type
|
|
1117
1179
|
# combination bypasses the flag — every other reason, and `work` rows
|
|
1118
1180
|
# under this same reason, keep the opt-in gate unchanged.
|
|
1181
|
+
#
|
|
1182
|
+
# #2537: a `merge_conflict_unresolved` stall on the SAME row types is the
|
|
1183
|
+
# identical shape — `coord drive` has no conflict-fix arm for
|
|
1184
|
+
# test-author/mock-author rows either (it `_die()`s on them before ever
|
|
1185
|
+
# reaching a merge), and the passive tick only re-enqueues, never
|
|
1186
|
+
# dispatches a conflict-fix. Without this, the row bounces
|
|
1187
|
+
# PENDING → CONFLICT → parked forever with nobody attempting a fix
|
|
1188
|
+
# (observed live: coord-portal#132). So this reason joins the bypass for
|
|
1189
|
+
# these row types too — every other reason, and `work` rows under either
|
|
1190
|
+
# reason, keep the opt-in gate unchanged.
|
|
1119
1191
|
from coord.models import SEALED_PATH_AUTHOR_TYPES # noqa: PLC0415
|
|
1120
1192
|
|
|
1121
1193
|
sealed_author_stall = (
|
|
1122
|
-
detection.reason
|
|
1194
|
+
detection.reason in ("review_request_changes_no_fix", "merge_conflict_unresolved")
|
|
1123
1195
|
and work.type in SEALED_PATH_AUTHOR_TYPES
|
|
1124
1196
|
)
|
|
1125
1197
|
if not config.pipeline.auto_dispatch_stalled and not sealed_author_stall:
|
|
@@ -1423,6 +1495,35 @@ def dispatch_stalled_pipeline_action(
|
|
|
1423
1495
|
kind="skipped_human_required",
|
|
1424
1496
|
detail="conflict-fix already active or its retry cap was already hit",
|
|
1425
1497
|
)
|
|
1498
|
+
# #2537: dispatch_conflict_fix is guaranteed to no-op on a conflict
|
|
1499
|
+
# confined to the repo's sealed acceptance-oracle paths — the
|
|
1500
|
+
# conflict-fix worker is REQUIRED by CLAUDE.md's own sealed-path
|
|
1501
|
+
# rule to self-restrict from editing them (the additive carve-out
|
|
1502
|
+
# applies only to test-author/mock-author dispatches, never
|
|
1503
|
+
# conflict-fix), so it pushes nothing and the entry just re-stalls
|
|
1504
|
+
# next tick. Confirmed live on coord-portal#132/#135: a manually
|
|
1505
|
+
# forced dispatch_conflict_fix restored its worktree clean and
|
|
1506
|
+
# pushed nothing. Skip the known-wasted dispatch when we can
|
|
1507
|
+
# confirm confinement in advance; resolving it for real needs a
|
|
1508
|
+
# sealed-path-aware re-dispatch (tracked as a follow-up issue, not
|
|
1509
|
+
# yet implemented) — dispatch_conflict_fix stays the fallback for
|
|
1510
|
+
# every other case (can't confirm confinement, or genuinely not
|
|
1511
|
+
# confined).
|
|
1512
|
+
if work.type in SEALED_PATH_AUTHOR_TYPES:
|
|
1513
|
+
sealed_files = _conflict_confined_to_sealed_paths(entry, config)
|
|
1514
|
+
if sealed_files is not None:
|
|
1515
|
+
return StalledDispatchAction(
|
|
1516
|
+
kind="skipped_sealed_conflict",
|
|
1517
|
+
detail=(
|
|
1518
|
+
"conflict is confined to sealed acceptance paths ("
|
|
1519
|
+
+ ", ".join(sealed_files)
|
|
1520
|
+
+ ") — a conflict-fix worker is required to "
|
|
1521
|
+
"self-restrict from editing them (CLAUDE.md's "
|
|
1522
|
+
"sealed-path rule) and would push nothing; needs a "
|
|
1523
|
+
"sealed-path-aware rebase dispatcher (follow-up "
|
|
1524
|
+
"issue), not dispatch_conflict_fix"
|
|
1525
|
+
),
|
|
1526
|
+
)
|
|
1426
1527
|
fix = dispatch_conflict_fix(entry, board, config, prefer_machine=work.machine_name)
|
|
1427
1528
|
if fix is None:
|
|
1428
1529
|
return StalledDispatchAction(
|
|
@@ -37,7 +37,7 @@ from coord._board_mapping import (
|
|
|
37
37
|
from coord.audit import record_audit as _record_audit
|
|
38
38
|
from coord.board_service import resolve as _board_service_resolve
|
|
39
39
|
from coord.board_service import route_write as _route_write
|
|
40
|
-
from coord.db import get_connection
|
|
40
|
+
from coord.db import get_connection, retry_on_locked
|
|
41
41
|
from coord.models import (
|
|
42
42
|
WORK_LIKE_TYPES,
|
|
43
43
|
Assignment,
|
|
@@ -1018,8 +1018,17 @@ def _record_dispatched_assignment_local(
|
|
|
1018
1018
|
)
|
|
1019
1019
|
|
|
1020
1020
|
conn = get_connection()
|
|
1021
|
-
|
|
1022
|
-
|
|
1021
|
+
|
|
1022
|
+
# #2538: this INSERT/commit is the one write in this function that's
|
|
1023
|
+
# actually load-bearing (unlike the best-effort `_record_audit` call
|
|
1024
|
+
# below it) — a concurrent writer (the daemon's own passive tick,
|
|
1025
|
+
# another `coord merge`/`coord notify` invocation) holding the DB for a
|
|
1026
|
+
# moment must not crash the caller. The statement is safe to retry
|
|
1027
|
+
# as-is: `assignment_id` is the primary key and the `ON CONFLICT ...
|
|
1028
|
+
# DO UPDATE` makes a re-attempted write idempotent.
|
|
1029
|
+
def _write() -> None:
|
|
1030
|
+
conn.execute(
|
|
1031
|
+
"""INSERT INTO assignments (
|
|
1023
1032
|
assignment_id, machine_name, repo_name, repo_github,
|
|
1024
1033
|
issue_number, issue_title, status, type, briefing,
|
|
1025
1034
|
files_allowed, model, dispatched_at, review_of_assignment_id,
|
|
@@ -1101,8 +1110,10 @@ def _record_dispatched_assignment_local(
|
|
|
1101
1110
|
assignment.driven_by,
|
|
1102
1111
|
assignment.dispatched_by_assignment_id,
|
|
1103
1112
|
),
|
|
1104
|
-
|
|
1105
|
-
|
|
1113
|
+
)
|
|
1114
|
+
conn.commit()
|
|
1115
|
+
|
|
1116
|
+
retry_on_locked(_write)
|
|
1106
1117
|
_record_audit(
|
|
1107
1118
|
tier="business",
|
|
1108
1119
|
category="dispatch",
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import sqlite3
|
|
5
6
|
import uuid
|
|
6
7
|
from dataclasses import replace
|
|
7
8
|
from typing import Any
|
|
@@ -2402,6 +2403,105 @@ class TestDispatchFixRemoteBranchGuard:
|
|
|
2402
2403
|
assert result.machine_name == "server"
|
|
2403
2404
|
|
|
2404
2405
|
|
|
2406
|
+
# ── #2538: persistent "database is locked" must decline, not crash ─────────
|
|
2407
|
+
|
|
2408
|
+
|
|
2409
|
+
class TestDispatchFixDbContention:
|
|
2410
|
+
"""coord-portal#2538: a concurrent writer (the daemon's own passive
|
|
2411
|
+
tick, another `coord merge`/`coord notify` invocation) can hold the DB
|
|
2412
|
+
at the exact moment `record_dispatched_assignment` tries to record a
|
|
2413
|
+
dispatched fix. `coord.state`'s own bounded retry
|
|
2414
|
+
(`coord.db.retry_on_locked`) already rides out a short collision; this
|
|
2415
|
+
covers what happens once that retry budget is well and truly exhausted
|
|
2416
|
+
— `_dispatch_fix` must degrade to its documented "None on failure"
|
|
2417
|
+
contract instead of letting the raw `sqlite3.OperationalError` crash
|
|
2418
|
+
the caller (`coord merge`'s CI-fix queue, the review auto-loop, …)."""
|
|
2419
|
+
|
|
2420
|
+
def _work(self, machine: str = "laptop") -> Assignment:
|
|
2421
|
+
return Assignment(
|
|
2422
|
+
machine_name=machine,
|
|
2423
|
+
repo_name="api",
|
|
2424
|
+
issue_number=5,
|
|
2425
|
+
issue_title="Fix thing",
|
|
2426
|
+
briefing="Original briefing.",
|
|
2427
|
+
assignment_id="work-2538",
|
|
2428
|
+
status="done",
|
|
2429
|
+
branch="issue-5-fix-thing",
|
|
2430
|
+
dispatched_at=0.0,
|
|
2431
|
+
finished_at=1.0,
|
|
2432
|
+
type="work",
|
|
2433
|
+
)
|
|
2434
|
+
|
|
2435
|
+
def test_persistent_lock_contention_returns_none_without_crashing(
|
|
2436
|
+
self,
|
|
2437
|
+
) -> None:
|
|
2438
|
+
cfg = _two_machine_config()
|
|
2439
|
+
work = self._work()
|
|
2440
|
+
board = Board(completed=[work])
|
|
2441
|
+
mock_http = MagicMock()
|
|
2442
|
+
mock_http.post.return_value.json.return_value = {"id": "fix-2538-a"}
|
|
2443
|
+
mock_http.post.return_value.raise_for_status = MagicMock()
|
|
2444
|
+
|
|
2445
|
+
with patch(
|
|
2446
|
+
"coord.auto_loop.record_dispatched_assignment",
|
|
2447
|
+
side_effect=sqlite3.OperationalError("database is locked"),
|
|
2448
|
+
):
|
|
2449
|
+
result = _dispatch_fix(
|
|
2450
|
+
work, "Fix briefing.", board, cfg, iteration=1,
|
|
2451
|
+
http_client=mock_http,
|
|
2452
|
+
)
|
|
2453
|
+
|
|
2454
|
+
assert result is None
|
|
2455
|
+
|
|
2456
|
+
def test_persistent_lock_contention_rolls_back_the_board_append(
|
|
2457
|
+
self,
|
|
2458
|
+
) -> None:
|
|
2459
|
+
"""The fix assignment is appended to `board.active` before the DB
|
|
2460
|
+
write is attempted (so a fully successful dispatch needs no extra
|
|
2461
|
+
round trip) — a failed write must undo that append, or a later
|
|
2462
|
+
`save_board` call (triggered by some OTHER entry succeeding in the
|
|
2463
|
+
same `coord merge` tick) would persist a phantom row that was never
|
|
2464
|
+
actually recorded."""
|
|
2465
|
+
cfg = _two_machine_config()
|
|
2466
|
+
work = self._work()
|
|
2467
|
+
board = Board(completed=[work])
|
|
2468
|
+
mock_http = MagicMock()
|
|
2469
|
+
mock_http.post.return_value.json.return_value = {"id": "fix-2538-b"}
|
|
2470
|
+
mock_http.post.return_value.raise_for_status = MagicMock()
|
|
2471
|
+
|
|
2472
|
+
with patch(
|
|
2473
|
+
"coord.auto_loop.record_dispatched_assignment",
|
|
2474
|
+
side_effect=sqlite3.OperationalError("database is locked"),
|
|
2475
|
+
):
|
|
2476
|
+
_dispatch_fix(
|
|
2477
|
+
work, "Fix briefing.", board, cfg, iteration=1,
|
|
2478
|
+
http_client=mock_http,
|
|
2479
|
+
)
|
|
2480
|
+
|
|
2481
|
+
assert board.active == []
|
|
2482
|
+
|
|
2483
|
+
def test_unrelated_operational_error_still_propagates(self) -> None:
|
|
2484
|
+
"""A genuine bug (schema drift, a malformed statement) must not be
|
|
2485
|
+
swallowed as if it were routine transient contention — only the
|
|
2486
|
+
specific `database is locked` message is treated as declinable."""
|
|
2487
|
+
cfg = _two_machine_config()
|
|
2488
|
+
work = self._work()
|
|
2489
|
+
board = Board(completed=[work])
|
|
2490
|
+
mock_http = MagicMock()
|
|
2491
|
+
mock_http.post.return_value.json.return_value = {"id": "fix-2538-c"}
|
|
2492
|
+
mock_http.post.return_value.raise_for_status = MagicMock()
|
|
2493
|
+
|
|
2494
|
+
with patch(
|
|
2495
|
+
"coord.auto_loop.record_dispatched_assignment",
|
|
2496
|
+
side_effect=sqlite3.OperationalError("no such column: bogus"),
|
|
2497
|
+
):
|
|
2498
|
+
with pytest.raises(sqlite3.OperationalError, match="no such column"):
|
|
2499
|
+
_dispatch_fix(
|
|
2500
|
+
work, "Fix briefing.", board, cfg, iteration=1,
|
|
2501
|
+
http_client=mock_http,
|
|
2502
|
+
)
|
|
2503
|
+
|
|
2504
|
+
|
|
2405
2505
|
# ── #1176: test-author bounce gets a type="test-author" fix, not "work" ─────
|
|
2406
2506
|
|
|
2407
2507
|
|
|
@@ -333,3 +333,27 @@ class TestDispatchCiFixesWrapper:
|
|
|
333
333
|
merge_cmd._dispatch_ci_fixes(events, two_machine_config, dry_run=False)
|
|
334
334
|
|
|
335
335
|
assert entry.state == PENDING
|
|
336
|
+
|
|
337
|
+
def test_declined_dispatch_under_budget_is_echoed(
|
|
338
|
+
self, two_machine_config: Config, coord_db, capsys,
|
|
339
|
+
) -> None:
|
|
340
|
+
"""#2538: a declined dispatch (including `_dispatch_fix` hitting
|
|
341
|
+
persistent DB-lock contention, which surfaces exactly like any
|
|
342
|
+
other decline — see coord.auto_loop._dispatch_fix) must be visible
|
|
343
|
+
in `coord merge` output, not silently dropped — otherwise an
|
|
344
|
+
operator watching the run has no idea this entry didn't advance."""
|
|
345
|
+
from coord.commands import merge as merge_cmd
|
|
346
|
+
from coord.state import save_board
|
|
347
|
+
|
|
348
|
+
board = Board()
|
|
349
|
+
save_board(board)
|
|
350
|
+
|
|
351
|
+
entry = _entry()
|
|
352
|
+
events = [self._checks_failed_event(entry)]
|
|
353
|
+
|
|
354
|
+
with patch("coord.ci_fix.dispatch_ci_fix", return_value=None):
|
|
355
|
+
merge_cmd._dispatch_ci_fixes(events, two_machine_config, dry_run=False)
|
|
356
|
+
|
|
357
|
+
out = capsys.readouterr().out
|
|
358
|
+
assert "ci-fix not dispatched" in out
|
|
359
|
+
assert f"#{entry.issue_number}" in out
|
|
@@ -9,7 +9,13 @@ from pathlib import Path
|
|
|
9
9
|
import pytest
|
|
10
10
|
|
|
11
11
|
from coord import db as db_mod
|
|
12
|
-
from coord.db import
|
|
12
|
+
from coord.db import (
|
|
13
|
+
_ensure_schema,
|
|
14
|
+
override_connection,
|
|
15
|
+
close,
|
|
16
|
+
_migrate_gate_order,
|
|
17
|
+
retry_on_locked,
|
|
18
|
+
)
|
|
13
19
|
|
|
14
20
|
|
|
15
21
|
# ── Fixtures ──────────────────────────────────────────────────────────────────
|
|
@@ -724,6 +730,78 @@ class TestMergeQueueCiFixDispatchesColumn:
|
|
|
724
730
|
conn.close()
|
|
725
731
|
|
|
726
732
|
|
|
733
|
+
# ── retry_on_locked (#2538) ─────────────────────────────────────────────────
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
class TestRetryOnLocked:
|
|
737
|
+
"""#2538: `coord merge` crashed the whole run on a transient
|
|
738
|
+
`sqlite3.OperationalError: database is locked` raised while recording a
|
|
739
|
+
dispatched CI-fix assignment. `retry_on_locked` gives a momentary
|
|
740
|
+
collision (the daemon's own passive tick, another `coord merge`/`coord
|
|
741
|
+
notify` invocation holding the DB) a few short, backed-off attempts to
|
|
742
|
+
clear before it becomes the caller's problem.
|
|
743
|
+
"""
|
|
744
|
+
|
|
745
|
+
def test_succeeds_immediately_when_no_contention(self) -> None:
|
|
746
|
+
calls = []
|
|
747
|
+
|
|
748
|
+
def _write() -> str:
|
|
749
|
+
calls.append(1)
|
|
750
|
+
return "ok"
|
|
751
|
+
|
|
752
|
+
assert retry_on_locked(_write) == "ok"
|
|
753
|
+
assert len(calls) == 1
|
|
754
|
+
|
|
755
|
+
def test_retries_through_transient_lock_then_succeeds(
|
|
756
|
+
self, monkeypatch: pytest.MonkeyPatch
|
|
757
|
+
) -> None:
|
|
758
|
+
sleeps: list[float] = []
|
|
759
|
+
monkeypatch.setattr(db_mod.time, "sleep", lambda s: sleeps.append(s))
|
|
760
|
+
|
|
761
|
+
attempts = {"n": 0}
|
|
762
|
+
|
|
763
|
+
def _write() -> str:
|
|
764
|
+
attempts["n"] += 1
|
|
765
|
+
if attempts["n"] < 3:
|
|
766
|
+
raise sqlite3.OperationalError("database is locked")
|
|
767
|
+
return "ok"
|
|
768
|
+
|
|
769
|
+
result = retry_on_locked(_write)
|
|
770
|
+
|
|
771
|
+
assert result == "ok"
|
|
772
|
+
assert attempts["n"] == 3
|
|
773
|
+
# Two collisions before the third, successful attempt — backed off
|
|
774
|
+
# (each wait longer than the last), never a busy-loop.
|
|
775
|
+
assert len(sleeps) == 2
|
|
776
|
+
assert sleeps[1] > sleeps[0]
|
|
777
|
+
|
|
778
|
+
def test_raises_after_exhausting_the_retry_budget(
|
|
779
|
+
self, monkeypatch: pytest.MonkeyPatch
|
|
780
|
+
) -> None:
|
|
781
|
+
monkeypatch.setattr(db_mod.time, "sleep", lambda s: None)
|
|
782
|
+
|
|
783
|
+
def _write() -> None:
|
|
784
|
+
raise sqlite3.OperationalError("database is locked")
|
|
785
|
+
|
|
786
|
+
with pytest.raises(sqlite3.OperationalError, match="database is locked"):
|
|
787
|
+
retry_on_locked(_write, attempts=3, base_delay=0.0)
|
|
788
|
+
|
|
789
|
+
def test_unrelated_operational_error_is_not_retried(self) -> None:
|
|
790
|
+
"""A schema/statement bug is a real failure, not transient
|
|
791
|
+
contention — it must surface on the very first attempt rather than
|
|
792
|
+
being retried (and delayed) as if it were lock contention."""
|
|
793
|
+
calls = []
|
|
794
|
+
|
|
795
|
+
def _write() -> None:
|
|
796
|
+
calls.append(1)
|
|
797
|
+
raise sqlite3.OperationalError("no such table: bogus")
|
|
798
|
+
|
|
799
|
+
with pytest.raises(sqlite3.OperationalError, match="no such table"):
|
|
800
|
+
retry_on_locked(_write)
|
|
801
|
+
|
|
802
|
+
assert len(calls) == 1
|
|
803
|
+
|
|
804
|
+
|
|
727
805
|
# ── override_connection ────────────────────────────────────────────────────────
|
|
728
806
|
|
|
729
807
|
class TestOverrideConnection:
|