code-coordinator 0.5.239__tar.gz → 0.5.241__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.239 → code_coordinator-0.5.241}/PKG-INFO +1 -1
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/audit.py +156 -24
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/auto_loop.py +2 -1
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/drive_queue.py +147 -6
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/merge.py +60 -2
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/milestone.py +12 -2
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/db.py +27 -4
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/overlap_predict.py +51 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/serve_app.py +19 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/state.py +27 -8
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_audit_log.py +213 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_drive_queue.py +99 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_merge.py +138 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_db.py +67 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_overlap_predict.py +50 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_state.py +134 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/.gitignore +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/CLAUDE.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/GOAL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/LICENSE +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/MANIFEST.in +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/README.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/__init__.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agent.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/block_log.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/board_service.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/brain.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/claim.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/cli.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/client.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/comments.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/config.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dao.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/deps.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/drive.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/events.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/filelock.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/freshness.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/gates.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/goal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/context.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/models.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/render.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/health/units.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/hooks.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/interactive.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/models.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/network.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/notify.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/openapi.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/parentage.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/plans.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/progress.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/release_window.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/reports.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/review.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/self_health.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/smoke.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/split_work.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/test_author.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/test_report.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/usage.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/install-agent.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/pyproject.toml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/setup.cfg +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/__init__.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/conftest.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_events.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_init.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_models.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_network.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_session.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_split.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.239 → code_coordinator-0.5.241}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -22,16 +22,24 @@ row is best-effort observability on top of it.
|
|
|
22
22
|
|
|
23
23
|
from __future__ import annotations
|
|
24
24
|
|
|
25
|
+
import atexit
|
|
25
26
|
import json
|
|
26
27
|
import logging
|
|
28
|
+
import sqlite3
|
|
29
|
+
import threading
|
|
27
30
|
import time
|
|
28
31
|
from typing import Any
|
|
29
32
|
|
|
30
|
-
from coord.db import get_connection
|
|
33
|
+
from coord.db import get_connection, is_lock_contention_error, retry_on_locked
|
|
31
34
|
|
|
32
35
|
_log = logging.getLogger(__name__)
|
|
33
36
|
|
|
34
|
-
__all__ = [
|
|
37
|
+
__all__ = [
|
|
38
|
+
"record_audit",
|
|
39
|
+
"query_audit_log",
|
|
40
|
+
"audit_lock_contention_losses",
|
|
41
|
+
"flush_lock_contention_summary",
|
|
42
|
+
]
|
|
35
43
|
|
|
36
44
|
# Valid values are documented in the issue but not enforced here — callers
|
|
37
45
|
# are all internal (coord.state / coord.issue_store), and rejecting an
|
|
@@ -94,7 +102,19 @@ def record_audit(
|
|
|
94
102
|
details=details,
|
|
95
103
|
)
|
|
96
104
|
except Exception as exc: # noqa: BLE001 — audit logging must never break the caller
|
|
97
|
-
|
|
105
|
+
if is_lock_contention_error(exc):
|
|
106
|
+
# #2597: `_record_audit_unsafe` already retried this write
|
|
107
|
+
# several times (`retry_on_locked`) before this was reached —
|
|
108
|
+
# sustained contention, not a momentary collision. Still
|
|
109
|
+
# best-effort (never raises into the caller), but a WARNING per
|
|
110
|
+
# occurrence is exactly the flood #2597 measured (1,804/day on
|
|
111
|
+
# dellserver, one indistinguishable line each) — count it
|
|
112
|
+
# instead and let `_flush_lock_contention_summary` report the
|
|
113
|
+
# aggregate once per run.
|
|
114
|
+
_record_lock_contention_loss()
|
|
115
|
+
_log.debug("record_audit: write lost to lock contention: %s", exc)
|
|
116
|
+
else:
|
|
117
|
+
_log.warning("record_audit: best-effort write failed: %s", exc)
|
|
98
118
|
|
|
99
119
|
|
|
100
120
|
def _record_audit_unsafe(
|
|
@@ -115,27 +135,139 @@ def _record_audit_unsafe(
|
|
|
115
135
|
try/except wrapper is the ONLY thing between this and the caller —
|
|
116
136
|
keeps the swallow-and-log behavior in one obvious place."""
|
|
117
137
|
conn = get_connection()
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
138
|
+
|
|
139
|
+
def _write() -> None:
|
|
140
|
+
conn.execute(
|
|
141
|
+
"""INSERT INTO audit_log (
|
|
142
|
+
ts, tier, category, event_type, actor,
|
|
143
|
+
repo, issue, assignment_id, machine, summary, details_json
|
|
144
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
145
|
+
(
|
|
146
|
+
ts if ts is not None else time.time(),
|
|
147
|
+
tier,
|
|
148
|
+
category,
|
|
149
|
+
event_type,
|
|
150
|
+
actor,
|
|
151
|
+
repo,
|
|
152
|
+
issue,
|
|
153
|
+
assignment_id,
|
|
154
|
+
machine,
|
|
155
|
+
summary,
|
|
156
|
+
json.dumps(details) if details is not None else None,
|
|
157
|
+
),
|
|
158
|
+
)
|
|
159
|
+
conn.commit()
|
|
160
|
+
|
|
161
|
+
# #2597: this table is the coordinator's primary diagnostic surface —
|
|
162
|
+
# "coord audit" — and 1,804 rows/24h were measured lost to ordinary,
|
|
163
|
+
# momentary lock contention (a concurrent writer holding the DB for a
|
|
164
|
+
# beat) on dellserver, indistinguishable from a real gap in the trail.
|
|
165
|
+
# Give this write the same short, backed-off retry every other
|
|
166
|
+
# load-bearing write in this codebase already gets before falling
|
|
167
|
+
# through to record_audit's best-effort swallow.
|
|
168
|
+
retry_on_locked(_write)
|
|
169
|
+
# #2597-review: the trim below is opportunistic housekeeping over rows
|
|
170
|
+
# that are already durably committed above — isolate its own retry/
|
|
171
|
+
# failure from the insert's. Left unguarded, a `DELETE` that hits lock
|
|
172
|
+
# contention here would propagate out to `record_audit`'s except clause
|
|
173
|
+
# and get classified (by `is_lock_contention_error` alone, with no way
|
|
174
|
+
# to tell "the row itself didn't write" apart from "the row wrote fine
|
|
175
|
+
# but the trim afterward didn't run") as a *lost audit write* — over-
|
|
176
|
+
# counting genuine data loss for a row that made it into audit_log just
|
|
177
|
+
# fine. Give the trim the same retry budget as any other write, but
|
|
178
|
+
# keep a trim-only failure from ever touching that counter.
|
|
179
|
+
try:
|
|
180
|
+
retry_on_locked(lambda: _maybe_trim(conn))
|
|
181
|
+
except sqlite3.OperationalError as exc:
|
|
182
|
+
if not is_lock_contention_error(exc):
|
|
183
|
+
raise
|
|
184
|
+
_log.debug(
|
|
185
|
+
"record_audit: audit_log trim skipped due to lock contention "
|
|
186
|
+
"(row itself was already written): %s", exc,
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
# ── Lock-contention loss counter (#2597) ────────────────────────────────────
|
|
191
|
+
#
|
|
192
|
+
# `retry_on_locked` above turns most lock collisions into a successful write
|
|
193
|
+
# a few hundred milliseconds later, so a write reaching `record_audit`'s
|
|
194
|
+
# `except` clause with `is_lock_contention_error(exc)` true means sustained
|
|
195
|
+
# contention outlasted that whole retry budget — rare, but not impossible
|
|
196
|
+
# under a genuinely busy DB. Logging each occurrence at WARNING is exactly
|
|
197
|
+
# the flood #2597 measured (1,804 identical lines/day) — count them instead
|
|
198
|
+
# and report ONE aggregated warning per process (`atexit`, so it fires for a
|
|
199
|
+
# short-lived CLI invocation like `coord merge` and, if it ever shuts down
|
|
200
|
+
# cleanly, the long-running daemon too) rather than leaving the loss
|
|
201
|
+
# invisible or drowning the log in duplicates.
|
|
202
|
+
|
|
203
|
+
_lock_contention_losses = 0
|
|
204
|
+
_summary_flush_registered = False
|
|
205
|
+
# #2597-review: `coord serve` calls `record_audit` from multiple
|
|
206
|
+
# threads/greenlets (the tick loop's `run_in_threadpool` calls, concurrent
|
|
207
|
+
# request handlers) — a bare `+= 1` on a module global can lose increments
|
|
208
|
+
# under concurrent contention (read-modify-write race). The counter is
|
|
209
|
+
# purely diagnostic (never gates a decision), but the whole point of it is
|
|
210
|
+
# to make the loss rate trustworthy, so it should not itself be lossy.
|
|
211
|
+
_lock_contention_lock = threading.Lock()
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _record_lock_contention_loss() -> None:
|
|
215
|
+
"""Bump the run-scoped lost-write counter and arrange for the aggregate
|
|
216
|
+
to be reported once this process exits (see
|
|
217
|
+
:func:`_flush_lock_contention_summary`)."""
|
|
218
|
+
global _lock_contention_losses, _summary_flush_registered
|
|
219
|
+
with _lock_contention_lock:
|
|
220
|
+
_lock_contention_losses += 1
|
|
221
|
+
register = not _summary_flush_registered
|
|
222
|
+
_summary_flush_registered = True
|
|
223
|
+
if register:
|
|
224
|
+
atexit.register(_flush_lock_contention_summary)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _flush_lock_contention_summary() -> None:
|
|
228
|
+
"""Emit ONE aggregated warning for this run's audit writes lost to
|
|
229
|
+
sustained lock contention, if any, and reset the counter.
|
|
230
|
+
|
|
231
|
+
Registered via :func:`atexit.register` the first time a write is lost
|
|
232
|
+
(see :func:`_record_lock_contention_loss`) rather than called from a
|
|
233
|
+
fixed call site, so it fires for every entry point — `coord merge`,
|
|
234
|
+
`coord notify`, the daemon — without each one needing its own hook.
|
|
235
|
+
Also callable directly (tests; a caller that wants to flush mid-run
|
|
236
|
+
without waiting for process exit).
|
|
237
|
+
"""
|
|
238
|
+
global _lock_contention_losses
|
|
239
|
+
with _lock_contention_lock:
|
|
240
|
+
pending = _lock_contention_losses
|
|
241
|
+
_lock_contention_losses = 0
|
|
242
|
+
if pending:
|
|
243
|
+
_log.warning("audit: %d writes lost to lock contention", pending)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def audit_lock_contention_losses() -> int:
|
|
247
|
+
"""Current count of audit writes lost to sustained lock contention this
|
|
248
|
+
run, not yet flushed by :func:`_flush_lock_contention_summary`.
|
|
249
|
+
|
|
250
|
+
Exposed for tests and diagnostics — advisory only, like the rest of the
|
|
251
|
+
audit log; nothing gates dispatch/review/merge decisions on this value.
|
|
252
|
+
"""
|
|
253
|
+
with _lock_contention_lock:
|
|
254
|
+
return _lock_contention_losses
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def flush_lock_contention_summary() -> None:
|
|
258
|
+
"""Public entry point for :func:`_flush_lock_contention_summary`.
|
|
259
|
+
|
|
260
|
+
#2597-review: the `atexit` registration above is the right default for
|
|
261
|
+
a short-lived CLI invocation (`coord merge`, `coord notify`) — it always
|
|
262
|
+
fires exactly once, at exit. It is a much weaker guarantee for a
|
|
263
|
+
long-running process (`coord serve`), which the code's own comment
|
|
264
|
+
already conceded only flushes "if it ever shuts down cleanly" — for a
|
|
265
|
+
daemon that runs for days between restarts, losses can accumulate for
|
|
266
|
+
its entire uptime with zero visibility. Call this on a periodic cadence
|
|
267
|
+
(e.g. once per daemon tick) to close that gap; it is a no-op cost-wise
|
|
268
|
+
when there is nothing pending (see :func:`_flush_lock_contention_summary`).
|
|
269
|
+
"""
|
|
270
|
+
_flush_lock_contention_summary()
|
|
139
271
|
|
|
140
272
|
|
|
141
273
|
def _maybe_trim(conn) -> None:
|
|
@@ -42,6 +42,7 @@ from dataclasses import dataclass
|
|
|
42
42
|
import httpx
|
|
43
43
|
|
|
44
44
|
from coord.config import Config
|
|
45
|
+
from coord.db import is_lock_contention_error
|
|
45
46
|
from coord.dispatch import AGENT_PORT
|
|
46
47
|
from coord import github_ops
|
|
47
48
|
from coord.models import SEALED_PATH_AUTHOR_TYPES, Assignment, Board
|
|
@@ -1228,7 +1229,7 @@ def _dispatch_fix(
|
|
|
1228
1229
|
repo_github=repo.github,
|
|
1229
1230
|
)
|
|
1230
1231
|
except sqlite3.OperationalError as exc:
|
|
1231
|
-
if
|
|
1232
|
+
if not is_lock_contention_error(exc):
|
|
1232
1233
|
# Not the transient contention this guard exists for (#2538) —
|
|
1233
1234
|
# a schema mismatch or malformed statement is a real bug and
|
|
1234
1235
|
# must not be swallowed as an ordinary declined dispatch.
|
|
@@ -91,7 +91,9 @@ from coord.overlap_predict import (
|
|
|
91
91
|
classify_outcome,
|
|
92
92
|
collect_candidate_files,
|
|
93
93
|
declared_footprints,
|
|
94
|
+
fanout_warnings,
|
|
94
95
|
inflight_footprints,
|
|
96
|
+
parse_declared_files,
|
|
95
97
|
predict_overlap,
|
|
96
98
|
predictions_from_audit,
|
|
97
99
|
tally,
|
|
@@ -296,9 +298,12 @@ def drive_queue_add(
|
|
|
296
298
|
# yields an empty prediction and this add behaves exactly as it did before
|
|
297
299
|
# the feature existed.
|
|
298
300
|
prediction = Prediction()
|
|
301
|
+
staleness_note = ""
|
|
299
302
|
auto_after: list[str] = []
|
|
300
303
|
if not no_predict_overlap:
|
|
301
|
-
prediction = _predict_overlap(
|
|
304
|
+
prediction, staleness_note = _predict_overlap(
|
|
305
|
+
config_path, repo, issue, existing_entries
|
|
306
|
+
)
|
|
302
307
|
auto_after = _applicable_auto_after(
|
|
303
308
|
existing_entries, repo, issue, after, prediction
|
|
304
309
|
)
|
|
@@ -326,7 +331,17 @@ def drive_queue_add(
|
|
|
326
331
|
gate += " (fleet-wide — nothing anywhere launches)"
|
|
327
332
|
if resume_when:
|
|
328
333
|
gate += f" (auto-resume when `{resume_when}` passes)"
|
|
329
|
-
|
|
334
|
+
# #2601: the reason (if an edge was actually applied), any high-fanout
|
|
335
|
+
# directory-token warning (independent of whether the edge stuck — a
|
|
336
|
+
# cycle-dropped edge's token is just as worth narrowing), and a staleness
|
|
337
|
+
# note when the candidate's own body could only be read from cache.
|
|
338
|
+
overlap_notes: list[str] = []
|
|
339
|
+
if auto_after:
|
|
340
|
+
overlap_notes.append(prediction.reason)
|
|
341
|
+
overlap_notes.extend(fanout_warnings(prediction))
|
|
342
|
+
if staleness_note:
|
|
343
|
+
overlap_notes.append(staleness_note)
|
|
344
|
+
overlap_note = ("\n" + "\n".join(overlap_notes)) if overlap_notes else ""
|
|
330
345
|
click.echo(
|
|
331
346
|
f"queued {entry_key(repo, issue)}{pinned}{suffix}{gate}"
|
|
332
347
|
f"{scope_downgrade_warning}{overlap_note}"
|
|
@@ -372,6 +387,121 @@ def _issue_body(repo_name: str, issue_number: int) -> str:
|
|
|
372
387
|
return ""
|
|
373
388
|
|
|
374
389
|
|
|
390
|
+
def _live_issue_body(repo_github: str, issue_number: int) -> str | None:
|
|
391
|
+
"""A live ``gh issue view`` body for the ONE entry actually being enqueued.
|
|
392
|
+
|
|
393
|
+
#2601: `_issue_body` above is a cache read by design — cheap, and correct
|
|
394
|
+
for the overwhelmingly common case (no ``## Files`` block at all) and for
|
|
395
|
+
every OTHER issue's declaration this module consults for a footprint. But
|
|
396
|
+
that same design let a `gh issue edit` made directly against the
|
|
397
|
+
tracker — bypassing `coord.state.edit_issue_content`'s cache mirror — go
|
|
398
|
+
unnoticed: the predictor kept citing the removed line forever, because
|
|
399
|
+
nothing had ever told the cache the edit happened.
|
|
400
|
+
|
|
401
|
+
Called ONLY for the candidate (see `_candidate_body`), and only when its
|
|
402
|
+
cached body already parses to a declaration — never on the common
|
|
403
|
+
empty-declaration path, so this does not reintroduce the per-``add``
|
|
404
|
+
GitHub round-trip the module was built to avoid.
|
|
405
|
+
|
|
406
|
+
Fails open like every other fetch here: ``None`` on any error, and the
|
|
407
|
+
caller falls back to the cached body.
|
|
408
|
+
"""
|
|
409
|
+
if not repo_github:
|
|
410
|
+
return None
|
|
411
|
+
try:
|
|
412
|
+
from coord import github_ops # noqa: PLC0415
|
|
413
|
+
|
|
414
|
+
data = github_ops.get_issue(repo_github, int(issue_number))
|
|
415
|
+
except Exception: # noqa: BLE001 — see docstring
|
|
416
|
+
return None
|
|
417
|
+
if not data:
|
|
418
|
+
return None
|
|
419
|
+
return str(data.get("body") or "")
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
def _mirror_issue_body(repo_name: str, issue_number: int, body: str) -> None:
|
|
423
|
+
"""Write a freshly live-fetched body back into the local cache (#2601).
|
|
424
|
+
|
|
425
|
+
Best-effort, mirroring `_edit_issue_content_local`'s own cache write: the
|
|
426
|
+
live fetch above is authoritative, this only makes the freshness outlive
|
|
427
|
+
the one predict call it was fetched for — a later `add` for a DIFFERENT
|
|
428
|
+
issue that compares declaration-to-declaration against this one, or
|
|
429
|
+
`overlap-report`, should see the same answer without a second round-trip.
|
|
430
|
+
"""
|
|
431
|
+
try:
|
|
432
|
+
from coord.db import get_connection # noqa: PLC0415
|
|
433
|
+
|
|
434
|
+
conn = get_connection()
|
|
435
|
+
conn.execute(
|
|
436
|
+
"UPDATE issues SET body = ?, synced_at = ? "
|
|
437
|
+
"WHERE repo_name = ? AND number = ?",
|
|
438
|
+
(body, time.time(), repo_name, int(issue_number)),
|
|
439
|
+
)
|
|
440
|
+
conn.commit()
|
|
441
|
+
except Exception: # noqa: BLE001 — the cache write is advisory
|
|
442
|
+
pass
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
def _cached_body_age_note(repo_name: str, issue_number: int) -> str:
|
|
446
|
+
"""#2601 point 1's fallback: when a live re-read wasn't possible, say how
|
|
447
|
+
old the cached body actually is, so a stale prediction is at least
|
|
448
|
+
visible instead of silently trusted.
|
|
449
|
+
"""
|
|
450
|
+
row = None
|
|
451
|
+
try:
|
|
452
|
+
from coord.db import get_connection # noqa: PLC0415
|
|
453
|
+
|
|
454
|
+
row = get_connection().execute(
|
|
455
|
+
"SELECT synced_at FROM issues WHERE repo_name = ? AND number = ?",
|
|
456
|
+
(repo_name, int(issue_number)),
|
|
457
|
+
).fetchone()
|
|
458
|
+
except Exception: # noqa: BLE001 — an unreadable age is still worth flagging
|
|
459
|
+
pass
|
|
460
|
+
synced_at = row["synced_at"] if row is not None else None
|
|
461
|
+
if not synced_at:
|
|
462
|
+
return (
|
|
463
|
+
"note: predicted from a cached issue body of unknown age "
|
|
464
|
+
"(live refresh failed) — the declaration may be stale"
|
|
465
|
+
)
|
|
466
|
+
age = _age_str(max(0.0, time.time() - float(synced_at)))
|
|
467
|
+
return (
|
|
468
|
+
f"note: predicted from a cached issue body synced {age} ago "
|
|
469
|
+
"(live refresh failed) — the declaration may be stale"
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
def _candidate_body(
|
|
474
|
+
repo_name: str, issue_number: int, repo_github: str,
|
|
475
|
+
) -> tuple[str, str]:
|
|
476
|
+
"""This entry's OWN body — refreshed live when staleness could matter (#2601).
|
|
477
|
+
|
|
478
|
+
The natural correction to a bad prediction is editing the issue's ``##
|
|
479
|
+
Files`` block and re-adding. That did nothing (#2601) because the
|
|
480
|
+
predictor always read `_issue_body`'s cache, which a direct
|
|
481
|
+
``gh issue edit`` never invalidates.
|
|
482
|
+
|
|
483
|
+
So the candidate gets one extra check the rest of the module does not:
|
|
484
|
+
if its cached body already parses to a declaration, re-read it live and
|
|
485
|
+
mirror the answer back into the cache. A body with NO cached declaration
|
|
486
|
+
skips the live round-trip entirely — there is nothing to have gone
|
|
487
|
+
stale, and a declaration ADDED since the last sync just falls back to
|
|
488
|
+
today's "no prediction" (rule 3), exactly as an unreadable body would.
|
|
489
|
+
|
|
490
|
+
Returns ``(body, staleness_note)``: *body* is what prediction runs
|
|
491
|
+
against; *staleness_note* is non-empty only when a live re-read was
|
|
492
|
+
warranted but failed.
|
|
493
|
+
"""
|
|
494
|
+
cached = _issue_body(repo_name, issue_number)
|
|
495
|
+
if not parse_declared_files(cached):
|
|
496
|
+
return cached, ""
|
|
497
|
+
fresh = _live_issue_body(repo_github, issue_number)
|
|
498
|
+
if fresh is None:
|
|
499
|
+
return cached, _cached_body_age_note(repo_name, issue_number)
|
|
500
|
+
if fresh != cached:
|
|
501
|
+
_mirror_issue_body(repo_name, issue_number, fresh)
|
|
502
|
+
return fresh, ""
|
|
503
|
+
|
|
504
|
+
|
|
375
505
|
def _repo_coordinates(config_path: Path, repo: str) -> tuple[str, str] | None:
|
|
376
506
|
"""``(github slug, default branch)`` for *repo*, or ``None``."""
|
|
377
507
|
try:
|
|
@@ -387,27 +517,38 @@ def _repo_coordinates(config_path: Path, repo: str) -> tuple[str, str] | None:
|
|
|
387
517
|
|
|
388
518
|
def _predict_overlap(
|
|
389
519
|
config_path: Path, repo: str, issue: int, existing_entries: list[QueueEntry],
|
|
390
|
-
) -> Prediction:
|
|
520
|
+
) -> tuple[Prediction, str]:
|
|
391
521
|
"""Compare this issue's declared files against work already in flight.
|
|
392
522
|
|
|
393
523
|
Same-repo only: two repos' paths cannot collide, and comparing them would
|
|
394
524
|
manufacture overlaps out of a shared filename. In-flight branches are
|
|
395
525
|
checked first (ground truth); a queued entry with no branch yet is
|
|
396
526
|
compared declaration-to-declaration, and only when it has one.
|
|
527
|
+
|
|
528
|
+
Returns ``(prediction, staleness_note)`` — see `_candidate_body` for when
|
|
529
|
+
the note is non-empty. Every OTHER body this consults (an in-flight
|
|
530
|
+
branch's own declaration, an unrelated queued entry's) still comes from
|
|
531
|
+
the plain cache: re-reading fifteen bodies live on every `add` is exactly
|
|
532
|
+
the cost the module's docstring rejects, and #2601's own report is about
|
|
533
|
+
correcting THIS entry's declaration, not anyone else's.
|
|
397
534
|
"""
|
|
398
535
|
coordinates = _repo_coordinates(config_path, repo)
|
|
399
536
|
if coordinates is None:
|
|
400
|
-
return Prediction()
|
|
537
|
+
return Prediction(), ""
|
|
401
538
|
repo_github, base_branch = coordinates
|
|
402
539
|
|
|
540
|
+
candidate_body, staleness_note = _candidate_body(repo, issue, repo_github)
|
|
541
|
+
|
|
403
542
|
def body_fetcher(repo_name: str, number: int) -> str:
|
|
543
|
+
if repo_name == repo and number == issue:
|
|
544
|
+
return candidate_body
|
|
404
545
|
return _issue_body(repo_name, number)
|
|
405
546
|
|
|
406
547
|
candidate = collect_candidate_files(repo, issue, body_fetcher)
|
|
407
548
|
if not candidate:
|
|
408
549
|
# Rule 3: no prediction is a valid answer. Nothing is fetched, nothing
|
|
409
550
|
# is compared, and the add is byte-identical to the pre-#2247 one.
|
|
410
|
-
return Prediction()
|
|
551
|
+
return Prediction(), ""
|
|
411
552
|
|
|
412
553
|
key = entry_key(repo, issue)
|
|
413
554
|
footprints = inflight_footprints(
|
|
@@ -422,7 +563,7 @@ def _predict_overlap(
|
|
|
422
563
|
and e.state not in TERMINAL_QUEUE_STATES
|
|
423
564
|
]
|
|
424
565
|
footprints.extend(declared_footprints(queued, body_fetcher, exclude_keys=covered))
|
|
425
|
-
return predict_overlap(candidate, footprints, exclude_keys={key})
|
|
566
|
+
return predict_overlap(candidate, footprints, exclude_keys={key}), staleness_note
|
|
426
567
|
|
|
427
568
|
|
|
428
569
|
def _applicable_auto_after(
|
|
@@ -4,6 +4,7 @@ coord/cli.py (#747)."""
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
+
import sqlite3
|
|
7
8
|
import sys
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
|
|
@@ -11,6 +12,7 @@ import click
|
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
from coord.commands._common import _CONFIG_OPTION, _load_config
|
|
15
|
+
from coord.db import is_lock_contention_error, retry_on_locked
|
|
14
16
|
from coord.models import WORK_LIKE_TYPES, effective_issue_number
|
|
15
17
|
|
|
16
18
|
|
|
@@ -2128,6 +2130,14 @@ def merge(
|
|
|
2128
2130
|
open_by_repo, known_by_repo = _load_issue_states()
|
|
2129
2131
|
|
|
2130
2132
|
auto_enqueued: list[str] = []
|
|
2133
|
+
# #2597-review: assignments whose enqueue write is still locked after
|
|
2134
|
+
# `retry_on_locked` exhausts its budget. Collected here instead of
|
|
2135
|
+
# raised in place — one contended assignment must not abort the scan
|
|
2136
|
+
# for every other assignment still waiting in this batch (that's the
|
|
2137
|
+
# exact #1353 regression this file already fixed once, resurrected for
|
|
2138
|
+
# lock contention specifically). The whole run still fails loudly: once
|
|
2139
|
+
# every assignment has had its turn, a non-zero exit is raised below.
|
|
2140
|
+
lock_contention_failures: list[tuple[str, sqlite3.OperationalError]] = []
|
|
2131
2141
|
# Per-repo cache of branches that still exist on origin. Lets us skip
|
|
2132
2142
|
# re-enqueuing done-work whose branch was already merged-and-deleted — the
|
|
2133
2143
|
# dominant merge-queue clog source. A done assignment for a closed issue
|
|
@@ -2273,11 +2283,17 @@ def merge(
|
|
|
2273
2283
|
# longer matches. Dedup by (repo_github, branch) is
|
|
2274
2284
|
# preserved — refresh_entry_assignment is a no-op when the
|
|
2275
2285
|
# entry is already correctly keyed.
|
|
2276
|
-
|
|
2286
|
+
# #2597: wrapped in retry_on_locked — this is a real DB write
|
|
2287
|
+
# (merge_queue.save_queue), and unlike the gh-round-trip
|
|
2288
|
+
# failures this try/except otherwise isolates (#1353), a
|
|
2289
|
+
# `database is locked` collision here is pure transient
|
|
2290
|
+
# contention with a concurrent writer, not a reason to give
|
|
2291
|
+
# up on this assignment.
|
|
2292
|
+
if retry_on_locked(lambda: mq.refresh_entry_assignment(
|
|
2277
2293
|
a,
|
|
2278
2294
|
repo_github=repo_cfg.github,
|
|
2279
2295
|
target_branch=target_branch,
|
|
2280
|
-
):
|
|
2296
|
+
)):
|
|
2281
2297
|
auto_enqueued.append(
|
|
2282
2298
|
f" auto-enqueued: {a.repo_name} #{a.issue_number} "
|
|
2283
2299
|
f"({a.branch} → {target_branch}){gate_note}"
|
|
@@ -2295,6 +2311,34 @@ def merge(
|
|
|
2295
2311
|
f"{target_branch}) — "
|
|
2296
2312
|
f"{mq.describe_merge_gate_failures(gate_failures)}"
|
|
2297
2313
|
)
|
|
2314
|
+
except sqlite3.OperationalError as exc:
|
|
2315
|
+
if is_lock_contention_error(exc):
|
|
2316
|
+
# #2597: `retry_on_locked` above already gave the write
|
|
2317
|
+
# several backed-off attempts — reaching here means the
|
|
2318
|
+
# DB is still locked after that budget, i.e. sustained
|
|
2319
|
+
# contention, not a momentary collision. Dropping a
|
|
2320
|
+
# mergeable assignment out of the scan on that basis is
|
|
2321
|
+
# the exact correctness bug #2597 reported (a skipped
|
|
2322
|
+
# entry here is silent — nothing re-scans it until the
|
|
2323
|
+
# next `coord merge` invocation). This is a hard
|
|
2324
|
+
# failure, not the soft "skipped" outcome below — but
|
|
2325
|
+
# (per review) it must not abort the rest of the batch
|
|
2326
|
+
# either. Record it and keep scanning; a clearly-flagged
|
|
2327
|
+
# line goes into the summary and the run still fails
|
|
2328
|
+
# loudly (non-zero exit, real exception) once every
|
|
2329
|
+
# other assignment has had its turn.
|
|
2330
|
+
lock_contention_failures.append((a.assignment_id, exc))
|
|
2331
|
+
auto_enqueued.append(
|
|
2332
|
+
f" LOCK CONTENTION: {a.repo_name} #{a.issue_number} "
|
|
2333
|
+
f"(assignment {a.assignment_id}) — auto-enqueue write "
|
|
2334
|
+
f"still locked after exhausting retries: {exc!r}"
|
|
2335
|
+
)
|
|
2336
|
+
continue
|
|
2337
|
+
auto_enqueued.append(
|
|
2338
|
+
f" skipped: {a.repo_name} #{a.issue_number} "
|
|
2339
|
+
f"(assignment {a.assignment_id}) — auto-enqueue scan "
|
|
2340
|
+
f"failed, skipping this assignment: {exc!r}"
|
|
2341
|
+
)
|
|
2298
2342
|
except Exception as e: # noqa: BLE001
|
|
2299
2343
|
auto_enqueued.append(
|
|
2300
2344
|
f" skipped: {a.repo_name} #{a.issue_number} "
|
|
@@ -2304,6 +2348,20 @@ def merge(
|
|
|
2304
2348
|
for line in auto_enqueued:
|
|
2305
2349
|
click.echo(line)
|
|
2306
2350
|
|
|
2351
|
+
if lock_contention_failures:
|
|
2352
|
+
# #2597-review: every assignment in the batch has now had its turn
|
|
2353
|
+
# — including the ones after the first contended write, and their
|
|
2354
|
+
# results (if any) are already printed above. Surface the
|
|
2355
|
+
# contention loudly now: a real `sqlite3.OperationalError`
|
|
2356
|
+
# propagating out of this command (not a swallowed summary line)
|
|
2357
|
+
# so `coord merge` exits non-zero and the failure is impossible to
|
|
2358
|
+
# miss, same as any other genuinely unrecoverable write failure.
|
|
2359
|
+
assignment_ids = ", ".join(aid for aid, _exc in lock_contention_failures)
|
|
2360
|
+
raise sqlite3.OperationalError(
|
|
2361
|
+
"database is locked — auto-enqueue write(s) still locked after "
|
|
2362
|
+
f"exhausting retries for assignment(s): {assignment_ids}"
|
|
2363
|
+
) from lock_contention_failures[-1][1]
|
|
2364
|
+
|
|
2307
2365
|
# #1477: re-test any parked CONFLICT entry against GitHub's own
|
|
2308
2366
|
# mergeability computation before the pending scan below — a branch
|
|
2309
2367
|
# repaired by a conflict-fix worker (or by hand) since the last tick
|
|
@@ -1127,6 +1127,7 @@ def milestone_dispatch_cmd(
|
|
|
1127
1127
|
_predict_overlap,
|
|
1128
1128
|
_record_overlap_prediction,
|
|
1129
1129
|
)
|
|
1130
|
+
from coord.overlap_predict import fanout_warnings # noqa: PLC0415
|
|
1130
1131
|
from coord.drive_queue import ( # noqa: PLC0415
|
|
1131
1132
|
QueueError,
|
|
1132
1133
|
entries_from_rows,
|
|
@@ -1150,7 +1151,7 @@ def milestone_dispatch_cmd(
|
|
|
1150
1151
|
click.echo(f" {key}: not queued: {exc}", err=True)
|
|
1151
1152
|
failures += 1
|
|
1152
1153
|
continue
|
|
1153
|
-
prediction = _predict_overlap(
|
|
1154
|
+
prediction, staleness_note = _predict_overlap(
|
|
1154
1155
|
config_path, repo_entry.name, qe.issue_number, existing
|
|
1155
1156
|
)
|
|
1156
1157
|
auto_after = _applicable_auto_after(
|
|
@@ -1163,7 +1164,16 @@ def milestone_dispatch_cmd(
|
|
|
1163
1164
|
repo_entry.name, qe.issue_number, prediction, auto_after
|
|
1164
1165
|
)
|
|
1165
1166
|
suffix = f" after {', '.join(after)}" if after else ""
|
|
1166
|
-
|
|
1167
|
+
# #2601: same notes `drive-queue add` surfaces — the applied reason,
|
|
1168
|
+
# any high-fanout directory-token warning, and a staleness note when
|
|
1169
|
+
# this entry's own body could only be read from cache.
|
|
1170
|
+
notes = []
|
|
1171
|
+
if auto_after:
|
|
1172
|
+
notes.append(prediction.reason)
|
|
1173
|
+
notes.extend(fanout_warnings(prediction))
|
|
1174
|
+
if staleness_note:
|
|
1175
|
+
notes.append(staleness_note)
|
|
1176
|
+
overlap_note = ("\n " + "\n ".join(notes)) if notes else ""
|
|
1167
1177
|
click.echo(f" queued {key}{suffix}{overlap_note}")
|
|
1168
1178
|
queued += 1
|
|
1169
1179
|
|
|
@@ -113,6 +113,29 @@ _LOCK_RETRY_ATTEMPTS = 5
|
|
|
113
113
|
_LOCK_RETRY_BASE_DELAY_S = 0.1
|
|
114
114
|
|
|
115
115
|
|
|
116
|
+
def is_lock_contention_error(exc: BaseException) -> bool:
|
|
117
|
+
"""True when *exc* is transient SQLite lock/busy contention rather than
|
|
118
|
+
a real bug (#2597).
|
|
119
|
+
|
|
120
|
+
Centralizes a check that used to be duplicated — and drifting — between
|
|
121
|
+
this module's own :func:`retry_on_locked` and ``coord.auto_loop``'s
|
|
122
|
+
``except`` block: only the ``"database is locked"`` substring was
|
|
123
|
+
matched anywhere, missing both SQLite's other lock-collision message
|
|
124
|
+
(``"database table is locked"``, raised for a table-level lock rather
|
|
125
|
+
than the whole-database one) and the underlying ``SQLITE_BUSY`` result
|
|
126
|
+
code, which a driver could in principle surface through a differently
|
|
127
|
+
worded message. Checking the code as well as the text means a future
|
|
128
|
+
SQLite/driver wording change can't silently turn this back into a
|
|
129
|
+
"raise instead of retry" bug the way the single-substring version could.
|
|
130
|
+
"""
|
|
131
|
+
if not isinstance(exc, sqlite3.OperationalError):
|
|
132
|
+
return False
|
|
133
|
+
message = str(exc).lower()
|
|
134
|
+
if "database is locked" in message or "database table is locked" in message:
|
|
135
|
+
return True
|
|
136
|
+
return getattr(exc, "sqlite_errorcode", None) == sqlite3.SQLITE_BUSY
|
|
137
|
+
|
|
138
|
+
|
|
116
139
|
def retry_on_locked(
|
|
117
140
|
write: Callable[[], _T],
|
|
118
141
|
*,
|
|
@@ -120,8 +143,8 @@ def retry_on_locked(
|
|
|
120
143
|
base_delay: float = _LOCK_RETRY_BASE_DELAY_S,
|
|
121
144
|
) -> _T:
|
|
122
145
|
"""Run *write* (a zero-arg callable performing one or more SQLite writes),
|
|
123
|
-
retrying with exponential backoff when SQLite raises
|
|
124
|
-
|
|
146
|
+
retrying with exponential backoff when SQLite raises lock/busy
|
|
147
|
+
contention (:func:`is_lock_contention_error`, #2538/#2597).
|
|
125
148
|
|
|
126
149
|
That error is transient contention — a concurrent writer holding the DB
|
|
127
150
|
at the exact moment this call tries to write, not a real failure — and a
|
|
@@ -135,7 +158,7 @@ def retry_on_locked(
|
|
|
135
158
|
Any other ``OperationalError`` (schema drift, a malformed statement, …)
|
|
136
159
|
is re-raised immediately without retrying — those are not transient, and
|
|
137
160
|
retrying would only delay surfacing a real bug. After *attempts*
|
|
138
|
-
consecutive
|
|
161
|
+
consecutive lock-contention collisions, re-raises the last
|
|
139
162
|
``sqlite3.OperationalError`` so the caller can decide how to degrade
|
|
140
163
|
(see ``coord.state._record_dispatched_assignment_local``, whose caller —
|
|
141
164
|
``coord.auto_loop._dispatch_fix`` — treats it as a declined dispatch
|
|
@@ -146,7 +169,7 @@ def retry_on_locked(
|
|
|
146
169
|
try:
|
|
147
170
|
return write()
|
|
148
171
|
except sqlite3.OperationalError as exc:
|
|
149
|
-
if
|
|
172
|
+
if not is_lock_contention_error(exc) or attempt >= attempts:
|
|
150
173
|
raise
|
|
151
174
|
time.sleep(delay)
|
|
152
175
|
delay *= 2
|