code-coordinator 0.5.238__tar.gz → 0.5.240__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.238 → code_coordinator-0.5.240}/PKG-INFO +1 -1
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/audit.py +156 -24
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/auto_loop.py +2 -1
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/drive_queue.py +73 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/merge.py +60 -2
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/release.py +78 -15
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/status.py +47 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/confirm_test.py +57 -3
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/db.py +27 -4
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/drive.py +174 -63
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/drive_queue.py +33 -6
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/predicate.py +41 -4
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/release_propagate.py +64 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/serve_app.py +19 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/state.py +27 -8
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/NOTIFIER.md +31 -1
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_audit_log.py +213 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_drive_queue.py +2 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_merge.py +138 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_release_window.py +36 -2
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_confirm_test.py +60 -1
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_db.py +67 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_drive.py +161 -55
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_drive_queue.py +78 -0
- code_coordinator-0.5.240/tests/test_drive_queue_roll_pending.py +261 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notifier_cli.py +8 -2
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notifier_isolation.py +6 -1
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notifier_predicate.py +96 -13
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notifier_service.py +67 -12
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notify.py +35 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_release_propagate.py +67 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_state.py +134 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/.gitignore +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/CLAUDE.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/GOAL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/LICENSE +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/MANIFEST.in +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/README.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/__init__.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/agent.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/block_log.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/board_service.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/brain.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/claim.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/cli.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/client.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/comments.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/config.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/dao.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/deps.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/events.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/filelock.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/freshness.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/gates.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/goal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/context.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/models.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/render.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/health/units.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/hooks.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/interactive.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/models.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/network.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/notify.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/openapi.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/parentage.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/plans.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/progress.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/release_window.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/reports.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/review.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/self_health.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/smoke.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/split_work.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/test_author.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/test_report.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/usage.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/install-agent.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/pyproject.toml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/setup.cfg +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/__init__.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/conftest.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_config.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_events.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_init.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_models.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_network.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_review.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_session.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_split.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.238 → code_coordinator-0.5.240}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -496,6 +496,7 @@ tests/test_dist_name.py
|
|
|
496
496
|
tests/test_done_housekeeping.py
|
|
497
497
|
tests/test_drive.py
|
|
498
498
|
tests/test_drive_queue.py
|
|
499
|
+
tests/test_drive_queue_roll_pending.py
|
|
499
500
|
tests/test_drive_state.py
|
|
500
501
|
tests/test_drive_tmux.py
|
|
501
502
|
tests/test_epic_up_capability_detection.py
|
{code_coordinator-0.5.238 → code_coordinator-0.5.240}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -568,6 +568,7 @@
|
|
|
568
568
|
"tests/test_done_housekeeping.py",
|
|
569
569
|
"tests/test_drive.py",
|
|
570
570
|
"tests/test_drive_queue.py",
|
|
571
|
+
"tests/test_drive_queue_roll_pending.py",
|
|
571
572
|
"tests/test_drive_state.py",
|
|
572
573
|
"tests/test_drive_tmux.py",
|
|
573
574
|
"tests/test_epic_up_capability_detection.py",
|
|
@@ -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.
|
|
@@ -1111,6 +1111,79 @@ def drive_queue_status(output_json: bool, config_path: Path) -> None:
|
|
|
1111
1111
|
click.echo("alert: (none)")
|
|
1112
1112
|
|
|
1113
1113
|
|
|
1114
|
+
@drive_queue_group.command("cancel-roll")
|
|
1115
|
+
@click.option("--json", "output_json", is_flag=True, default=False,
|
|
1116
|
+
help="Emit the cancelled marker (and any cordons cleared with it) as JSON.")
|
|
1117
|
+
def drive_queue_cancel_roll(output_json: bool) -> None:
|
|
1118
|
+
"""Cancel a #2587 roll-pending marker so the queue resumes launching now.
|
|
1119
|
+
|
|
1120
|
+
#2607: every OTHER queue-blocking state has an operator override — a
|
|
1121
|
+
held deploy gate has `coord drive-queue resume`, a release cordon has
|
|
1122
|
+
`coord release cordon --clear` — but the roll-pending marker had none.
|
|
1123
|
+
It is supposed to be self-bounding (a TTL / deferral ceiling —
|
|
1124
|
+
`RollPending.expired`), but a marker that keeps getting RE-ARMED before
|
|
1125
|
+
it ever expires never reaches that bound on its own (the defect #2607
|
|
1126
|
+
fixed at the write sites); this command is the escape hatch for while
|
|
1127
|
+
that marker is still live, and for any future case a re-arm loop is not
|
|
1128
|
+
yet ruled out for. Also clears any release cordon still open for the
|
|
1129
|
+
SAME target — the cordon a stalled `coord release propagate`/
|
|
1130
|
+
`nightly-window` run can leave behind — so cancelling actually frees the
|
|
1131
|
+
queue rather than trading one hold for another.
|
|
1132
|
+
|
|
1133
|
+
Does NOT change the target: the next `coord release propagate`/
|
|
1134
|
+
`nightly-window` run re-arms a marker from scratch if the fleet is still
|
|
1135
|
+
behind. This only stops the CURRENT wait.
|
|
1136
|
+
"""
|
|
1137
|
+
from coord.machine_pause import clear_cordon, cordons as read_cordons # noqa: PLC0415
|
|
1138
|
+
|
|
1139
|
+
pending = read_roll_pending()
|
|
1140
|
+
cleared_cordons: list[str] = []
|
|
1141
|
+
if pending is not None:
|
|
1142
|
+
try:
|
|
1143
|
+
active_cordons = read_cordons()
|
|
1144
|
+
except Exception: # noqa: BLE001 — best-effort; the marker clear below is load-bearing
|
|
1145
|
+
active_cordons = {}
|
|
1146
|
+
for name, cordon in active_cordons.items():
|
|
1147
|
+
if getattr(cordon, "target_version", None) != pending.target_version:
|
|
1148
|
+
continue
|
|
1149
|
+
try:
|
|
1150
|
+
if clear_cordon(name):
|
|
1151
|
+
cleared_cordons.append(name)
|
|
1152
|
+
except Exception: # noqa: BLE001 — best-effort; never block the marker clear on this
|
|
1153
|
+
pass
|
|
1154
|
+
clear_roll_pending()
|
|
1155
|
+
|
|
1156
|
+
if output_json:
|
|
1157
|
+
click.echo(
|
|
1158
|
+
_json.dumps(
|
|
1159
|
+
{
|
|
1160
|
+
"cancelled": pending.to_dict() if pending is not None else None,
|
|
1161
|
+
"cleared_cordons": sorted(cleared_cordons),
|
|
1162
|
+
},
|
|
1163
|
+
sort_keys=True,
|
|
1164
|
+
)
|
|
1165
|
+
)
|
|
1166
|
+
return
|
|
1167
|
+
|
|
1168
|
+
if pending is None:
|
|
1169
|
+
click.echo("no roll-pending marker to cancel — the queue is not held for a roll")
|
|
1170
|
+
return
|
|
1171
|
+
click.echo(
|
|
1172
|
+
f"cancelled {pending.describe()} — the drive-queue tick resumes "
|
|
1173
|
+
"launching immediately"
|
|
1174
|
+
)
|
|
1175
|
+
if cleared_cordons:
|
|
1176
|
+
click.echo(
|
|
1177
|
+
"also cleared cordon(s) still open for this target: "
|
|
1178
|
+
+ ", ".join(sorted(cleared_cordons))
|
|
1179
|
+
)
|
|
1180
|
+
click.echo(
|
|
1181
|
+
"note: this only stops the current wait — the next `coord release "
|
|
1182
|
+
"propagate`/`nightly-window` run re-arms a fresh marker if the "
|
|
1183
|
+
"fleet is still behind"
|
|
1184
|
+
)
|
|
1185
|
+
|
|
1186
|
+
|
|
1114
1187
|
# ── block-log (#2235 Phase 0) ────────────────────────────────────────────────
|
|
1115
1188
|
|
|
1116
1189
|
|
|
@@ -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
|
|
@@ -431,6 +431,24 @@ def _paused_machine_busy(config) -> list:
|
|
|
431
431
|
return busy
|
|
432
432
|
|
|
433
433
|
|
|
434
|
+
def _confirmation_running_busy() -> list:
|
|
435
|
+
"""A #2464 out-of-band test confirmation in flight, as a `Busy` signal
|
|
436
|
+
(#2596).
|
|
437
|
+
|
|
438
|
+
Thin wiring around :func:`coord.release_propagate.confirmation_lock_busy`
|
|
439
|
+
— see that function's docstring for the incident and why a LOCAL,
|
|
440
|
+
non-networked lock probe is the right (and sufficient) check here. Feeds
|
|
441
|
+
the same `extra_busy` seam `_interactive_session_busy`/
|
|
442
|
+
`_paused_machine_busy` do, at both call sites that build one (the top of
|
|
443
|
+
`propagate` and `_drain`'s default `extra_busy_fetch`), so a confirmation
|
|
444
|
+
in flight defers a restart exactly like a live headless assignment does.
|
|
445
|
+
"""
|
|
446
|
+
from coord import release_propagate as rp # noqa: PLC0415
|
|
447
|
+
from coord.filelock import notify_lock_path # noqa: PLC0415
|
|
448
|
+
|
|
449
|
+
return rp.confirmation_lock_busy(notify_lock_path())
|
|
450
|
+
|
|
451
|
+
|
|
434
452
|
def _daemon_machine_name(
|
|
435
453
|
config, override: str | None, machine_health: dict | None = None
|
|
436
454
|
) -> str | None:
|
|
@@ -595,14 +613,22 @@ def _ensure_roll_pending_marker(target_version: str, *, reason: str) -> None:
|
|
|
595
613
|
:class:`coord.drive_queue.RollPending`'s docstring for the mechanism
|
|
596
614
|
this feeds.
|
|
597
615
|
|
|
598
|
-
Never overwrites an existing marker for the
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
616
|
+
Never overwrites an existing marker's ``set_at``/``deferrals`` — for the
|
|
617
|
+
SAME target this is a plain no-op (unchanged from before #2607); for a
|
|
618
|
+
DIFFERENT target the target/reason are updated in place but the clock
|
|
619
|
+
and deferral count carry over unchanged. #2607: PyPI's "latest" climbs on
|
|
620
|
+
every merge (`Auto-release on merge to main`), so a busy fleet's target
|
|
621
|
+
had almost always moved by the time this timer re-fired — treating that
|
|
622
|
+
as a "new" roll and resetting ``set_at``/``deferrals`` made the TTL/
|
|
623
|
+
deferral bound (:meth:`~coord.drive_queue.RollPending.expired`)
|
|
624
|
+
unreachable in practice, exactly the "never actually bounded" failure
|
|
625
|
+
#2587's own bound exists to prevent, and exactly how #2607's queue froze
|
|
626
|
+
for good. A re-arm — same target or not — is a continuation of the SAME
|
|
627
|
+
stuck roll, not a new operator request; only a marker set from scratch
|
|
628
|
+
(no existing one at all, e.g. right after `coord drive-queue
|
|
629
|
+
cancel-roll`) starts a new clock.
|
|
605
630
|
"""
|
|
631
|
+
import dataclasses as _dataclasses # noqa: PLC0415
|
|
606
632
|
import time as _time # noqa: PLC0415
|
|
607
633
|
|
|
608
634
|
from coord.commands.drive_queue import read_roll_pending, write_roll_pending # noqa: PLC0415
|
|
@@ -611,6 +637,11 @@ def _ensure_roll_pending_marker(target_version: str, *, reason: str) -> None:
|
|
|
611
637
|
existing = read_roll_pending()
|
|
612
638
|
if existing is not None and existing.target_version == target_version:
|
|
613
639
|
return
|
|
640
|
+
if existing is not None:
|
|
641
|
+
write_roll_pending(
|
|
642
|
+
_dataclasses.replace(existing, target_version=target_version, reason=reason)
|
|
643
|
+
)
|
|
644
|
+
return
|
|
614
645
|
write_roll_pending(
|
|
615
646
|
RollPending(target_version=target_version, set_at=_time.time(), reason=reason)
|
|
616
647
|
)
|
|
@@ -808,6 +839,13 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
808
839
|
# seam from the daemon-aware pause store, so an operator-paused machine
|
|
809
840
|
# defers exactly like a live assignment does instead of reading idle.
|
|
810
841
|
extra_busy.extend(_paused_machine_busy(config))
|
|
842
|
+
# #2596: nor can it see a #2464 confirmation running in the notify
|
|
843
|
+
# drain — a restart landing mid-confirmation is exactly what let a
|
|
844
|
+
# SIGTERM get read as a test failure on 2026-08-22 (the confirmation
|
|
845
|
+
# itself now refuses that read, #2527, but the restart still shouldn't
|
|
846
|
+
# have happened at all). Feed the same seam so it defers like a live
|
|
847
|
+
# assignment instead of getting reaped.
|
|
848
|
+
extra_busy.extend(_confirmation_running_busy())
|
|
811
849
|
quiescence = rp.assess_quiescence(
|
|
812
850
|
queue_entries=board.get("drive_queue") or [],
|
|
813
851
|
assignments=board.get("assignments") or [],
|
|
@@ -2510,8 +2548,15 @@ def _drain(
|
|
|
2510
2548
|
# #2174: paused/quiet-hours state, same as the top-level
|
|
2511
2549
|
# `propagate` call site — a paused daemon host must keep the
|
|
2512
2550
|
# drain from ever reading "clear" just because tmux is quiet.
|
|
2551
|
+
# #2596: same for a confirmation running under `notify.lock` —
|
|
2552
|
+
# gated on `config is not None` too, even though the check
|
|
2553
|
+
# itself needs no config, purely to keep this function's
|
|
2554
|
+
# documented "no *config* means no real filesystem I/O"
|
|
2555
|
+
# contract intact for the `config=None` unit-test path above.
|
|
2513
2556
|
extra_busy_fetch = lambda: ( # noqa: E731
|
|
2514
|
-
_interactive_session_busy(config)
|
|
2557
|
+
_interactive_session_busy(config)
|
|
2558
|
+
+ _paused_machine_busy(config)
|
|
2559
|
+
+ _confirmation_running_busy()
|
|
2515
2560
|
)
|
|
2516
2561
|
else:
|
|
2517
2562
|
extra_busy_fetch = lambda: [] # noqa: E731
|
|
@@ -2799,6 +2844,7 @@ def release_nightly_window(
|
|
|
2799
2844
|
genuinely idle is a fine moment to roll immediately. A still-busy fleet
|
|
2800
2845
|
just leaves the marker exactly as it was for the tick to keep watching.
|
|
2801
2846
|
"""
|
|
2847
|
+
import dataclasses as _dataclasses # noqa: PLC0415
|
|
2802
2848
|
import json as _json # noqa: PLC0415
|
|
2803
2849
|
import time # noqa: PLC0415
|
|
2804
2850
|
|
|
@@ -3002,18 +3048,35 @@ def release_nightly_window(
|
|
|
3002
3048
|
_finish(rw.STATUS_PROPAGATE_FAILED, prop_exit or 1)
|
|
3003
3049
|
|
|
3004
3050
|
# ── 3. set (or refresh) the marker and return immediately (#2587) ─────
|
|
3051
|
+
# #2607: a marker already pending for a DIFFERENT target is updated in
|
|
3052
|
+
# place — target_version/reason move, but set_at/deferrals carry over
|
|
3053
|
+
# unchanged. This is the exact site the incident traced back to: PyPI's
|
|
3054
|
+
# "latest" climbs on every merge, so by the time this nightly timer
|
|
3055
|
+
# re-fired the target had almost always moved, and writing a brand new
|
|
3056
|
+
# `RollPending` here reset the TTL/deferral escape hatch on every single
|
|
3057
|
+
# re-arm — the queue froze because the bound that was supposed to save it
|
|
3058
|
+
# could never be reached. Only a genuinely fresh marker (no existing one
|
|
3059
|
+
# at all) gets a new clock.
|
|
3005
3060
|
if existing is not None:
|
|
3006
3061
|
click.echo(
|
|
3007
3062
|
f"replacing stale roll-pending marker ({existing.describe()}) "
|
|
3008
|
-
f"with v{record.target_version}"
|
|
3063
|
+
f"with v{record.target_version} — preserving its original "
|
|
3064
|
+
f"set_at/deferrals (#2607: a re-arm is a continuation of the "
|
|
3065
|
+
f"same stuck roll, not a new request)"
|
|
3009
3066
|
)
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
|
-
|
|
3014
|
-
|
|
3067
|
+
write_roll_pending(
|
|
3068
|
+
_dataclasses.replace(
|
|
3069
|
+
existing, target_version=record.target_version, reason="nightly-window",
|
|
3070
|
+
)
|
|
3071
|
+
)
|
|
3072
|
+
else:
|
|
3073
|
+
write_roll_pending(
|
|
3074
|
+
RollPending(
|
|
3075
|
+
target_version=record.target_version,
|
|
3076
|
+
set_at=time.time(),
|
|
3077
|
+
reason="nightly-window",
|
|
3078
|
+
)
|
|
3015
3079
|
)
|
|
3016
|
-
)
|
|
3017
3080
|
click.echo(
|
|
3018
3081
|
f"roll pending: v{record.target_version} — the drive-queue tick will "
|
|
3019
3082
|
f"fire `coord release propagate` at the next inter-drive gap "
|