code-coordinator 0.5.317__tar.gz → 0.5.318__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.317 → code_coordinator-0.5.318}/PKG-INFO +1 -1
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/confirm_test.py +171 -2
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notify.py +132 -22
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_confirm_test.py +193 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notify_drain.py +78 -4
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_roll_window_handoff.py +11 -4
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stuck_test_state_watchdog_2803.py +18 -2
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/.gitignore +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/CLAUDE.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/GOAL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/LICENSE +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/MANIFEST.in +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/README.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/__init__.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agent.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/audit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/block_log.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/board_service.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/brain.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/claim.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/cli.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/client.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/comments.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/config.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dao.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/db.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/deps.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/drive.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/events.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/filelock.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/freshness.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/gates.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/goal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/context.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/models.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/render.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/health/units.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/hooks.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/interactive.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/models.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/network.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/openapi.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/parentage.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/plans.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/progress.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/release_window.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/reports.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/review.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/self_health.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/smoke.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/split_work.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/sql.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/state.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/test_author.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/test_report.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/usage.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/install-agent.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/pyproject.toml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/setup.cfg +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/__init__.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/backends.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/conftest.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_db.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_events.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_init.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_models.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_network.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_session.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_split.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_state.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.317 → code_coordinator-0.5.318}/tests/write_parity.py +0 -0
|
@@ -171,6 +171,23 @@ CONFIRM_DEFAULT_TIMEOUT_SECONDS = 60 * 20
|
|
|
171
171
|
#: so a pass can confirm ~4 branches back to back) while the daemon-side worst
|
|
172
172
|
#: case stays a number the thin client can actually be given — see
|
|
173
173
|
#: :func:`notify_client_timeout_seconds`.
|
|
174
|
+
#:
|
|
175
|
+
#: #2975: that "~6 min serial" sizing is calibrated on THIS repo and does not
|
|
176
|
+
#: hold everywhere — quadraui's ``cargo test --features tui`` builds every
|
|
177
|
+
#: example/test executable (#305 in coordinator.yml) and blows straight past
|
|
178
|
+
#: it, and every ceiling in this module (this one, ``CONFIRM_DEFAULT_
|
|
179
|
+
#: TIMEOUT_SECONDS``, ``deploy/coord-notify.service``'s ``TimeoutStartSec``)
|
|
180
|
+
#: is bigger than ``coord-notify.timer``'s 5-minute cadence, so one such
|
|
181
|
+
#: confirmation can span several fires. Two changes close that without
|
|
182
|
+
#: shrinking this constant (which would just make the COMMON case degrade to
|
|
183
|
+
#: UNCONFIRMED instead): ``coord.notify``'s drain now dispatches pending
|
|
184
|
+
#: Test/Review/PR-opens BEFORE running any confirmation each pass, so a slow
|
|
185
|
+
#: suite on one repo can no longer queue another repo's dispatch behind it;
|
|
186
|
+
#: and :func:`expected_confirmation_seconds` remembers how long a repo's
|
|
187
|
+
#: confirmation last took, so :func:`confirmation_timeout` can recognise a
|
|
188
|
+
#: repo whose suite structurally cannot fit this budget and skip straight to
|
|
189
|
+
#: UNCONFIRMED instead of re-discovering that identical fact — and re-paying
|
|
190
|
+
#: the full ceiling for it — on every single PASS claim.
|
|
174
191
|
CONFIRM_PASS_BUDGET_SECONDS = 60 * 25
|
|
175
192
|
|
|
176
193
|
#: Don't *start* a confirmation with less than this left in the pass budget.
|
|
@@ -232,6 +249,31 @@ KIND_NO_OUTPUT = "no_output"
|
|
|
232
249
|
#: docstring's fail-direction section — this frozenset IS that safety property.
|
|
233
250
|
REFUTING_KINDS = frozenset({KIND_BUILD, KIND_SUITE})
|
|
234
251
|
|
|
252
|
+
#: #2975: kinds whose elapsed wall-clock time is a trustworthy signal of how
|
|
253
|
+
#: long THIS repo's confirmation genuinely takes, worth remembering for next
|
|
254
|
+
#: time via :func:`record_confirmation_duration`.
|
|
255
|
+
#:
|
|
256
|
+
#: ``KIND_OK``/``KIND_BUILD``/``KIND_SUITE``/``KIND_BASELINE_RED``/
|
|
257
|
+
#: ``KIND_NO_OUTPUT`` all ran the command to actual completion — a real
|
|
258
|
+
#: measurement. ``KIND_TIMEOUT`` ran for at least the ceiling it was given —
|
|
259
|
+
#: not exact, but a valid LOWER BOUND, and a lower bound is exactly what lets
|
|
260
|
+
#: a chronically-too-slow repo (quadraui's ``cargo test --features tui``
|
|
261
|
+
#: builds every example/test executable, #305 in coordinator.yml) be
|
|
262
|
+
#: recognised as such after a single attempt instead of re-discovering it on
|
|
263
|
+
#: every PASS claim — see :func:`expected_confirmation_seconds`.
|
|
264
|
+
#:
|
|
265
|
+
#: ``KIND_SETUP``/``KIND_INFRA``/``KIND_SIGNAL`` are deliberately excluded:
|
|
266
|
+
#: none of them ran the real command for a representative duration (no
|
|
267
|
+
#: checkout, no toolchain, or killed externally mid-run), and recording their
|
|
268
|
+
#: near-zero elapsed time would silently erase a previously-learned
|
|
269
|
+
#: expectation — exactly the failure mode that would make a single lock
|
|
270
|
+
#: contention hiccup or a missing checkout reset a repo's hard-won "this one
|
|
271
|
+
#: is slow" memory back to "assume it's fast."
|
|
272
|
+
RECORDABLE_DURATION_KINDS = frozenset({
|
|
273
|
+
KIND_OK, KIND_BUILD, KIND_SUITE, KIND_BASELINE_RED, KIND_NO_OUTPUT,
|
|
274
|
+
KIND_TIMEOUT,
|
|
275
|
+
})
|
|
276
|
+
|
|
235
277
|
#: Kinds meaning "the check could not reach a verdict". The caller falls back to
|
|
236
278
|
#: the worker's own claim on any of these, which is pre-#2464 behaviour.
|
|
237
279
|
INCONCLUSIVE_KINDS = frozenset({
|
|
@@ -270,7 +312,7 @@ def begin_confirmation_pass(total: float = CONFIRM_PASS_BUDGET_SECONDS) -> None:
|
|
|
270
312
|
_pass_state.remaining = float(total)
|
|
271
313
|
|
|
272
314
|
|
|
273
|
-
def confirmation_timeout() -> int | None:
|
|
315
|
+
def confirmation_timeout(expected_seconds: float | None = None) -> int | None:
|
|
274
316
|
"""Seconds the next confirmation in this pass may take, or ``None``.
|
|
275
317
|
|
|
276
318
|
``None`` means the pass budget is spent (or too nearly spent to be worth
|
|
@@ -279,13 +321,31 @@ def confirmation_timeout() -> int | None:
|
|
|
279
321
|
|
|
280
322
|
Outside a pass — a direct :func:`confirm_branch` call, a unit test — there
|
|
281
323
|
is no budget to draw down and the full per-run ceiling applies.
|
|
324
|
+
|
|
325
|
+
*expected_seconds* (#2975) is the caller's best estimate of how long THIS
|
|
326
|
+
repo's confirmation will actually take — see
|
|
327
|
+
:func:`expected_confirmation_seconds`, which reads it back from what
|
|
328
|
+
:func:`record_confirmation_duration` learned last time. When it is
|
|
329
|
+
already at or past what this pass has left to spend, starting the run
|
|
330
|
+
would only spend the remainder re-discovering a fact already on record —
|
|
331
|
+
this repo cannot be confirmed in what is left — so this returns ``None``
|
|
332
|
+
immediately instead of paying for that discovery again. This is what
|
|
333
|
+
turns a repo whose suite structurally cannot fit the ceiling (quadraui's
|
|
334
|
+
``cargo test --features tui``, #2975) from a repeated worst-case cost —
|
|
335
|
+
every PASS claim spending the full budget to learn the identical lesson —
|
|
336
|
+
into a one-time one: the FIRST attempt still spends up to the full
|
|
337
|
+
ceiling discovering the suite is too slow, and every attempt after that
|
|
338
|
+
skips straight to UNCONFIRMED.
|
|
282
339
|
"""
|
|
283
340
|
remaining = getattr(_pass_state, "remaining", None)
|
|
284
341
|
if remaining is None:
|
|
285
342
|
return int(CONFIRM_DEFAULT_TIMEOUT_SECONDS)
|
|
286
343
|
if remaining < CONFIRM_MIN_RUN_SECONDS:
|
|
287
344
|
return None
|
|
288
|
-
|
|
345
|
+
ceiling = min(float(CONFIRM_DEFAULT_TIMEOUT_SECONDS), remaining)
|
|
346
|
+
if expected_seconds is not None and expected_seconds >= ceiling:
|
|
347
|
+
return None
|
|
348
|
+
return int(ceiling)
|
|
289
349
|
|
|
290
350
|
|
|
291
351
|
def spend_confirmation_budget(seconds: float) -> None:
|
|
@@ -300,6 +360,112 @@ def spend_confirmation_budget(seconds: float) -> None:
|
|
|
300
360
|
_pass_state.remaining = max(0.0, remaining - max(0.0, float(seconds)))
|
|
301
361
|
|
|
302
362
|
|
|
363
|
+
#: #2975: filename under ``COORD_DIR`` for the per-repo measured-duration map
|
|
364
|
+
#: :func:`record_confirmation_duration` / :func:`expected_confirmation_seconds`
|
|
365
|
+
#: read and write. A tiny flat file, not a lock-guarded store: the worst case
|
|
366
|
+
#: of a torn read/write is one stale or missing estimate, which degrades to
|
|
367
|
+
#: exactly pre-#2975 behaviour (attempt the run, learn the hard way) — never
|
|
368
|
+
#: a correctness problem, so it does not warrant the ceremony
|
|
369
|
+
#: ``confirm_lock_path`` needs for the worktree lifecycle it guards.
|
|
370
|
+
_CONFIRM_HISTORY_FILENAME = "confirm_test_history.json"
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def _confirm_history_path() -> Path:
|
|
374
|
+
"""Where per-repo measured confirmation durations are persisted (#2975).
|
|
375
|
+
|
|
376
|
+
Resolved against ``coord.state.COORD_DIR`` freshly on every call — the
|
|
377
|
+
same discipline :func:`confirm_worktree_path` /
|
|
378
|
+
:func:`write_confirmation_output` already use above — so a test's
|
|
379
|
+
``monkeypatch.setattr("coord.state.COORD_DIR", ...)`` is honoured rather
|
|
380
|
+
than this module caching a stale path at import time.
|
|
381
|
+
"""
|
|
382
|
+
from coord.state import COORD_DIR # noqa: PLC0415
|
|
383
|
+
|
|
384
|
+
return COORD_DIR / _CONFIRM_HISTORY_FILENAME
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def _load_confirm_history() -> dict[str, float]:
|
|
388
|
+
"""Best-effort read of the persisted per-repo duration map.
|
|
389
|
+
|
|
390
|
+
Fail-soft on everything — a missing file, corrupt JSON, an unexpected
|
|
391
|
+
shape, a hand-edited value — because this is purely an optimisation hint
|
|
392
|
+
for :func:`confirmation_timeout`, never a correctness dependency. A file
|
|
393
|
+
this cannot make sense of must read as "nothing learned yet", the same
|
|
394
|
+
posture as :func:`coord.commands.drive_queue.read_roll_pending`.
|
|
395
|
+
"""
|
|
396
|
+
import json # noqa: PLC0415
|
|
397
|
+
|
|
398
|
+
try:
|
|
399
|
+
raw = _confirm_history_path().read_text(encoding="utf-8")
|
|
400
|
+
except OSError:
|
|
401
|
+
return {}
|
|
402
|
+
try:
|
|
403
|
+
data = json.loads(raw)
|
|
404
|
+
except ValueError:
|
|
405
|
+
return {}
|
|
406
|
+
if not isinstance(data, dict):
|
|
407
|
+
return {}
|
|
408
|
+
out: dict[str, float] = {}
|
|
409
|
+
for key, value in data.items():
|
|
410
|
+
if isinstance(key, str) and isinstance(value, (int, float)) and value > 0:
|
|
411
|
+
out[key] = float(value)
|
|
412
|
+
return out
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def record_confirmation_duration(repo_name: str, seconds: float) -> None:
|
|
416
|
+
"""Remember how long *repo_name*'s confirmation attempt just took (#2975).
|
|
417
|
+
|
|
418
|
+
Callers pass this only results whose ``kind`` is in
|
|
419
|
+
:data:`RECORDABLE_DURATION_KINDS` — see that frozenset's docstring for
|
|
420
|
+
which outcomes are a trustworthy signal of real suite duration.
|
|
421
|
+
|
|
422
|
+
Overwrites any previous value for this repo outright, with no averaging:
|
|
423
|
+
the LAST attempt is a better estimate of the CURRENT suite than a rolling
|
|
424
|
+
average across however long ago the repo's test suite was this size.
|
|
425
|
+
|
|
426
|
+
Best-effort and atomic (tempfile-then-rename, mirroring
|
|
427
|
+
:func:`coord.commands.drive_queue.write_roll_pending`) — a full disk, an
|
|
428
|
+
unwritable ``COORD_DIR``, or a concurrent writer must not break the
|
|
429
|
+
confirmation this is charging against; the caller already has its real
|
|
430
|
+
result, this is purely a hint for next time.
|
|
431
|
+
"""
|
|
432
|
+
if seconds <= 0:
|
|
433
|
+
return
|
|
434
|
+
import json # noqa: PLC0415
|
|
435
|
+
import tempfile # noqa: PLC0415
|
|
436
|
+
|
|
437
|
+
path = _confirm_history_path()
|
|
438
|
+
history = _load_confirm_history()
|
|
439
|
+
history[repo_name] = float(seconds)
|
|
440
|
+
try:
|
|
441
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
442
|
+
fd, tmp_name = tempfile.mkstemp(
|
|
443
|
+
prefix=".confirm_test_history.", suffix=".tmp", dir=str(path.parent),
|
|
444
|
+
)
|
|
445
|
+
try:
|
|
446
|
+
with os.fdopen(fd, "w", encoding="utf-8") as fh:
|
|
447
|
+
json.dump(history, fh)
|
|
448
|
+
os.replace(tmp_name, path)
|
|
449
|
+
except OSError:
|
|
450
|
+
try:
|
|
451
|
+
os.unlink(tmp_name)
|
|
452
|
+
except OSError:
|
|
453
|
+
pass
|
|
454
|
+
except OSError:
|
|
455
|
+
pass
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def expected_confirmation_seconds(repo_name: str) -> float | None:
|
|
459
|
+
"""The most recently measured confirmation duration for *repo_name*.
|
|
460
|
+
|
|
461
|
+
``None`` when this repo has never produced a
|
|
462
|
+
:data:`RECORDABLE_DURATION_KINDS` result — the common case for most
|
|
463
|
+
repos most of the time, and the caller's cue to fall back to the
|
|
464
|
+
un-informed ceiling exactly as before #2975.
|
|
465
|
+
"""
|
|
466
|
+
return _load_confirm_history().get(repo_name)
|
|
467
|
+
|
|
468
|
+
|
|
303
469
|
def notify_client_timeout_seconds(
|
|
304
470
|
budget: float = CONFIRM_PASS_BUDGET_SECONDS,
|
|
305
471
|
) -> float:
|
|
@@ -1067,6 +1233,7 @@ __all__ = [
|
|
|
1067
1233
|
"KIND_SIGNAL",
|
|
1068
1234
|
"NOTIFY_BASE_CLIENT_TIMEOUT_SECONDS",
|
|
1069
1235
|
"PERMISSION_DENIED_EXIT",
|
|
1236
|
+
"RECORDABLE_DURATION_KINDS",
|
|
1070
1237
|
"REFUTING_KINDS",
|
|
1071
1238
|
"STALE_WORKTREE_MAX_AGE_HOURS",
|
|
1072
1239
|
"ConfirmationResult",
|
|
@@ -1077,7 +1244,9 @@ __all__ = [
|
|
|
1077
1244
|
"confirm_worktree_path",
|
|
1078
1245
|
"confirmation_enabled",
|
|
1079
1246
|
"confirmation_timeout",
|
|
1247
|
+
"expected_confirmation_seconds",
|
|
1080
1248
|
"notify_client_timeout_seconds",
|
|
1249
|
+
"record_confirmation_duration",
|
|
1081
1250
|
"spend_confirmation_budget",
|
|
1082
1251
|
"sweep_stale_confirm_worktrees",
|
|
1083
1252
|
"unmet_confirmation_capabilities",
|
|
@@ -2033,9 +2033,12 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
|
|
|
2033
2033
|
that cannot run must degrade to pre-#2464 behaviour, never break the reap.
|
|
2034
2034
|
"""
|
|
2035
2035
|
from coord.confirm_test import ( # noqa: PLC0415
|
|
2036
|
+
RECORDABLE_DURATION_KINDS,
|
|
2036
2037
|
confirm_branch,
|
|
2037
2038
|
confirmation_enabled,
|
|
2038
2039
|
confirmation_timeout,
|
|
2040
|
+
expected_confirmation_seconds,
|
|
2041
|
+
record_confirmation_duration,
|
|
2039
2042
|
spend_confirmation_budget,
|
|
2040
2043
|
)
|
|
2041
2044
|
|
|
@@ -2066,15 +2069,34 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
|
|
|
2066
2069
|
# `/notify` request the thin client is blocked on — scale with board
|
|
2067
2070
|
# activity. Exhausted budget means UNCONFIRMED, which is pre-#2464
|
|
2068
2071
|
# behaviour, and it is said out loud rather than truncating silently.
|
|
2069
|
-
|
|
2072
|
+
#
|
|
2073
|
+
# #2975: also hand in whatever this repo's OWN last confirmation measured
|
|
2074
|
+
# (`expected_confirmation_seconds`) — a repo whose suite structurally
|
|
2075
|
+
# cannot finish inside the budget (quadraui's `cargo test --features
|
|
2076
|
+
# tui`) would otherwise spend the full ceiling relearning that identical
|
|
2077
|
+
# fact on every single PASS claim, serialising every other repo's Test/
|
|
2078
|
+
# Review dispatch behind it each time. Knowing the answer already lets
|
|
2079
|
+
# `confirmation_timeout` skip straight to UNCONFIRMED instead.
|
|
2080
|
+
expected = expected_confirmation_seconds(transition.repo_name)
|
|
2081
|
+
timeout = confirmation_timeout(expected)
|
|
2070
2082
|
if timeout is None:
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2083
|
+
if expected is not None:
|
|
2084
|
+
log.warning(
|
|
2085
|
+
"smoke %s: %s's last measured confirmation took about %.0fs, "
|
|
2086
|
+
"at or beyond what this pass has left to spend — skipping "
|
|
2087
|
+
"the run and recording the worker's own claim UNCONFIRMED "
|
|
2088
|
+
"rather than repeating a run already known not to finish "
|
|
2089
|
+
"(#2975).",
|
|
2090
|
+
transition.assignment_id, transition.repo_name, expected,
|
|
2091
|
+
)
|
|
2092
|
+
else:
|
|
2093
|
+
log.warning(
|
|
2094
|
+
"smoke %s: this notify pass has spent its confirmation budget "
|
|
2095
|
+
"(coord.confirm_test.CONFIRM_PASS_BUDGET_SECONDS) — recording the "
|
|
2096
|
+
"worker's own claim for %s UNCONFIRMED rather than holding "
|
|
2097
|
+
"notify.lock any longer (#2464).",
|
|
2098
|
+
transition.assignment_id, transition.repo_name,
|
|
2099
|
+
)
|
|
2078
2100
|
return None
|
|
2079
2101
|
|
|
2080
2102
|
branch = entry.get("branch")
|
|
@@ -2084,10 +2106,12 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
|
|
|
2084
2106
|
transition.assignment_id, transition.repo_name, branch, timeout,
|
|
2085
2107
|
)
|
|
2086
2108
|
started = time.monotonic()
|
|
2109
|
+
result: ConfirmationResult | None = None
|
|
2087
2110
|
try:
|
|
2088
|
-
|
|
2111
|
+
result = confirm_branch(
|
|
2089
2112
|
transition.repo_name, branch, config, timeout=timeout,
|
|
2090
2113
|
)
|
|
2114
|
+
return result
|
|
2091
2115
|
except Exception as exc: # noqa: BLE001
|
|
2092
2116
|
log.warning(
|
|
2093
2117
|
"smoke %s: confirmation run raised (%s) — falling back to the "
|
|
@@ -2100,7 +2124,15 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
|
|
|
2100
2124
|
# It really did hold the drain (and `notify.lock`) for those seconds,
|
|
2101
2125
|
# and a run that reliably blows up after ten minutes must not be able
|
|
2102
2126
|
# to repeat that for every row on the board free of charge.
|
|
2103
|
-
|
|
2127
|
+
elapsed = time.monotonic() - started
|
|
2128
|
+
spend_confirmation_budget(elapsed)
|
|
2129
|
+
# #2975: only remember the duration when the result is actually a
|
|
2130
|
+
# trustworthy measurement (see RECORDABLE_DURATION_KINDS) — an
|
|
2131
|
+
# exception, a disabled config load, or a KIND_SETUP/INFRA/SIGNAL
|
|
2132
|
+
# short-circuit tells us nothing about how long the real suite takes
|
|
2133
|
+
# and must never overwrite a previously-learned expectation.
|
|
2134
|
+
if result is not None and result.kind in RECORDABLE_DURATION_KINDS:
|
|
2135
|
+
record_confirmation_duration(transition.repo_name, elapsed)
|
|
2104
2136
|
|
|
2105
2137
|
|
|
2106
2138
|
def _confirmed_pass_verdict(
|
|
@@ -4155,6 +4187,20 @@ def run_drain(
|
|
|
4155
4187
|
*notifications*, not pipeline advancement, and giving the daemon a
|
|
4156
4188
|
periodic detector is #1632's job (which is blocked on this).
|
|
4157
4189
|
|
|
4190
|
+
**Dispatch order (#2975).** Smoke/review/PR-open dispatch also runs as a
|
|
4191
|
+
HEAD START right at the top of the pass, before this pass's own
|
|
4192
|
+
transition detection (which is where a #2464 out-of-band confirmation
|
|
4193
|
+
runs — see :mod:`coord.confirm_test`). A confirmation re-runs a repo's
|
|
4194
|
+
real build+test synchronously and can hold this very lock for the whole
|
|
4195
|
+
confirmation-pass budget, several timer fires' worth for a repo whose
|
|
4196
|
+
suite is structurally too slow. Every row already eligible for dispatch
|
|
4197
|
+
as of the top of the pass must not queue behind that — a slow suite on
|
|
4198
|
+
one repo must delay only its own confirmation, never another repo's
|
|
4199
|
+
Test/Review dispatch. The three dispatch functions run a second time
|
|
4200
|
+
afterward too, in their historical place, to pick up anything the
|
|
4201
|
+
transition-detection step below made newly eligible; all three are
|
|
4202
|
+
idempotent, so the repeat costs only a second, mostly-empty scan.
|
|
4203
|
+
|
|
4158
4204
|
**Concurrency.** The whole pass runs under ``~/.coord/notify.lock`` —
|
|
4159
4205
|
literally :class:`coord.filelock.FileLock`, the same class on the same
|
|
4160
4206
|
path ``coord drive``'s ``run_notify()`` takes — so a drive's nudge and the
|
|
@@ -4203,6 +4249,56 @@ def _run_drain_locked(config: Config) -> DrainResult:
|
|
|
4203
4249
|
|
|
4204
4250
|
begin_confirmation_pass()
|
|
4205
4251
|
|
|
4252
|
+
# Step 0a (#2803, moved up by #2975): clear any work row wedged at
|
|
4253
|
+
# test_state='running' well past its Test-stage child's own terminal
|
|
4254
|
+
# resolution (or absence) — a lost verdict write, never a fabricated one
|
|
4255
|
+
# (see `sweep_stuck_test_state_rows`'s docstring). It still runs BEFORE
|
|
4256
|
+
# every smoke dispatch in this pass, which is #2803's invariant: a row
|
|
4257
|
+
# this clears is picked up and redispatched in THIS SAME pass, not the
|
|
4258
|
+
# next one. It now runs before step 0b's head start as well, so a row it
|
|
4259
|
+
# clears gets that head start too rather than waiting behind step 1's
|
|
4260
|
+
# confirmations. Nothing is lost by sweeping before transition detection:
|
|
4261
|
+
# every case the sweep acts on is gated on
|
|
4262
|
+
# `STUCK_TEST_STATE_GRACE_SECONDS` (10 minutes) having elapsed since the
|
|
4263
|
+
# child's own resolution, so a child that only just went terminal in
|
|
4264
|
+
# THIS pass is out of scope either way.
|
|
4265
|
+
try:
|
|
4266
|
+
_sweep_stuck_test_state(config)
|
|
4267
|
+
except Exception: # noqa: BLE001
|
|
4268
|
+
log.exception("notify drain: stuck test_state sweep failed")
|
|
4269
|
+
|
|
4270
|
+
# Step 0b (#2975): dispatch pending Test-stage smoke / PR-opens / reviews
|
|
4271
|
+
# from the board exactly as it reads RIGHT NOW — before step 1 below gets
|
|
4272
|
+
# anywhere near a `confirm_branch` call. A confirmation re-runs one
|
|
4273
|
+
# repo's real build+test synchronously inside THIS pass and can
|
|
4274
|
+
# legitimately hold `notify.lock` for the whole `CONFIRM_PASS_BUDGET_
|
|
4275
|
+
# SECONDS` ceiling — several `coord-notify.timer` fires' worth (#2975).
|
|
4276
|
+
# Every row already eligible for dispatch as of the top of this pass
|
|
4277
|
+
# must not queue behind that: a slow suite on one repo should delay only
|
|
4278
|
+
# its own confirmation, never another repo's Test/Review dispatch.
|
|
4279
|
+
#
|
|
4280
|
+
# Steps 2-3 below repeat these same three calls after the transition
|
|
4281
|
+
# detection has had a chance to add anything newly eligible (a work leg
|
|
4282
|
+
# that just finished, a PR that just opened) — this head start is
|
|
4283
|
+
# additive, not a replacement.
|
|
4284
|
+
# All three are idempotent (`_dispatch_board_pending_pr_opens`'s and
|
|
4285
|
+
# `_dispatch_board_pending_smoke`'s own docstrings: "safe to call even
|
|
4286
|
+
# when the board file doesn't exist", find-or-create PRs, dedupe via
|
|
4287
|
+
# `has_active_followup`), so calling each twice in one pass costs
|
|
4288
|
+
# nothing beyond a second, mostly-empty scan.
|
|
4289
|
+
try:
|
|
4290
|
+
_dispatch_board_pending_pr_opens(config)
|
|
4291
|
+
except Exception: # noqa: BLE001
|
|
4292
|
+
log.exception("notify drain: head-start PR-open dispatch failed")
|
|
4293
|
+
try:
|
|
4294
|
+
_dispatch_board_pending_smoke(config)
|
|
4295
|
+
except Exception: # noqa: BLE001
|
|
4296
|
+
log.exception("notify drain: head-start smoke dispatch failed")
|
|
4297
|
+
try:
|
|
4298
|
+
_dispatch_board_pending_reviews(config)
|
|
4299
|
+
except Exception: # noqa: BLE001
|
|
4300
|
+
log.exception("notify drain: head-start review dispatch failed")
|
|
4301
|
+
|
|
4206
4302
|
# Step 1: post completion/failure/advisory/plan/review comments for rows
|
|
4207
4303
|
# the agent reports terminal. This is what stamps `finished_at` (via
|
|
4208
4304
|
# mark_notified) and captures cost / SMOKE_TESTS / summary / session id /
|
|
@@ -4234,18 +4330,7 @@ def _run_drain_locked(config: Config) -> DrainResult:
|
|
|
4234
4330
|
except Exception: # noqa: BLE001
|
|
4235
4331
|
log.exception("notify drain: detect_transitions failed")
|
|
4236
4332
|
|
|
4237
|
-
# Step 2 (#
|
|
4238
|
-
# past its Test-stage child's own terminal resolution (or absence) — a
|
|
4239
|
-
# lost verdict write, never a fabricated one (see `sweep_stuck_test_
|
|
4240
|
-
# state_rows`'s docstring). Runs BEFORE step 3's smoke dispatch so a row
|
|
4241
|
-
# this clears is picked up and redispatched in THIS SAME pass, not the
|
|
4242
|
-
# next one.
|
|
4243
|
-
try:
|
|
4244
|
-
_sweep_stuck_test_state(config)
|
|
4245
|
-
except Exception: # noqa: BLE001
|
|
4246
|
-
log.exception("notify drain: stuck test_state sweep failed")
|
|
4247
|
-
|
|
4248
|
-
# Step 2.5 (#2844): open PRs for work-leg completions still missing one —
|
|
4333
|
+
# Step 2 (#2844): open PRs for work-leg completions still missing one —
|
|
4249
4334
|
# BEFORE the Test-stage dispatch below, so the pull_request CI run starts
|
|
4250
4335
|
# overlapping smoke instead of waiting for review dispatch to open the
|
|
4251
4336
|
# PR ~20 minutes later.
|
|
@@ -4447,6 +4532,31 @@ def run(
|
|
|
4447
4532
|
# why this reads the marker but never writes it.
|
|
4448
4533
|
_roll_pending = _roll_pending_blocks_new_dispatch()
|
|
4449
4534
|
|
|
4535
|
+
# Step 0 (#2975): same head start `_run_drain_locked` takes, and for the
|
|
4536
|
+
# identical reason — dispatch pending Test-stage smoke / PR-opens /
|
|
4537
|
+
# reviews from the board exactly as it reads RIGHT NOW, before the
|
|
4538
|
+
# transition-detection loop below gets anywhere near a `confirm_branch`
|
|
4539
|
+
# call that can hold `notify.lock` for up to `CONFIRM_PASS_BUDGET_
|
|
4540
|
+
# SECONDS`. Gated on `_roll_pending` like every other NEW-leg dispatch in
|
|
4541
|
+
# this function (#2587) — the later calls to the same three functions,
|
|
4542
|
+
# a few dozen lines down, repeat this after the loop below has had a
|
|
4543
|
+
# chance to add anything newly eligible; this is a head start, not a
|
|
4544
|
+
# replacement, and all three are idempotent so calling each twice costs
|
|
4545
|
+
# only a second, mostly-empty scan.
|
|
4546
|
+
if not _roll_pending:
|
|
4547
|
+
try:
|
|
4548
|
+
_dispatch_board_pending_pr_opens(config)
|
|
4549
|
+
except Exception: # noqa: BLE001
|
|
4550
|
+
pass
|
|
4551
|
+
try:
|
|
4552
|
+
_dispatch_board_pending_smoke(config)
|
|
4553
|
+
except Exception: # noqa: BLE001
|
|
4554
|
+
pass
|
|
4555
|
+
try:
|
|
4556
|
+
_dispatch_board_pending_reviews(config)
|
|
4557
|
+
except Exception: # noqa: BLE001
|
|
4558
|
+
pass
|
|
4559
|
+
|
|
4450
4560
|
# #522: one terminal-state cache shared across every gh-hitting check in
|
|
4451
4561
|
# this notify run (the auto-loop review/fix dispatches below, and the
|
|
4452
4562
|
# #1441 stalled-pipeline sweep at the end), so a burst of activity for
|
|
@@ -1698,3 +1698,196 @@ class TestConfirmationRespectsCapabilityRouting:
|
|
|
1698
1698
|
read that as 'gate not applicable', never as 'nothing required'
|
|
1699
1699
|
collapsing into a refusal."""
|
|
1700
1700
|
assert ct.branch_touched_files(tmp_path, BRANCH, "main") == []
|
|
1701
|
+
|
|
1702
|
+
|
|
1703
|
+
# ── #2975: per-repo measured duration, so a chronically-too-slow repo stops
|
|
1704
|
+
# re-learning the same lesson on every PASS claim ─────────────────────────
|
|
1705
|
+
|
|
1706
|
+
|
|
1707
|
+
class TestExpectedConfirmationDurationHistory:
|
|
1708
|
+
"""quadraui's `cargo test --features tui` builds every example/test
|
|
1709
|
+
executable (#305 in coordinator.yml) and structurally cannot finish
|
|
1710
|
+
inside any ceiling this module hands out from the reap path. Before
|
|
1711
|
+
#2975, every PASS claim on that repo spent the FULL pass budget
|
|
1712
|
+
rediscovering that identical fact, serialising every other repo's
|
|
1713
|
+
Test/Review dispatch behind it each time (#2975's reported symptom:
|
|
1714
|
+
coord-tui#17 sat idle ~20 minutes with three machines free). Remembering
|
|
1715
|
+
the last measured duration lets `confirmation_timeout` recognise a
|
|
1716
|
+
doomed run and skip it instead of repeating it.
|
|
1717
|
+
"""
|
|
1718
|
+
|
|
1719
|
+
def test_never_measured_reports_no_expectation(self) -> None:
|
|
1720
|
+
assert ct.expected_confirmation_seconds("quadraui") is None
|
|
1721
|
+
|
|
1722
|
+
def test_records_and_reads_back_a_measured_duration(self) -> None:
|
|
1723
|
+
ct.record_confirmation_duration("quadraui", 1234.5)
|
|
1724
|
+
assert ct.expected_confirmation_seconds("quadraui") == 1234.5
|
|
1725
|
+
|
|
1726
|
+
def test_recording_is_per_repo(self) -> None:
|
|
1727
|
+
ct.record_confirmation_duration("quadraui", 1200.0)
|
|
1728
|
+
ct.record_confirmation_duration("claude-coordinator", 360.0)
|
|
1729
|
+
assert ct.expected_confirmation_seconds("quadraui") == 1200.0
|
|
1730
|
+
assert ct.expected_confirmation_seconds("claude-coordinator") == 360.0
|
|
1731
|
+
|
|
1732
|
+
def test_a_later_measurement_overwrites_the_earlier_one(self) -> None:
|
|
1733
|
+
"""The LAST attempt is a better estimate of the CURRENT suite than an
|
|
1734
|
+
average across however long ago the suite was this size — no
|
|
1735
|
+
averaging, straight overwrite."""
|
|
1736
|
+
ct.record_confirmation_duration("quadraui", 1200.0)
|
|
1737
|
+
ct.record_confirmation_duration("quadraui", 90.0)
|
|
1738
|
+
assert ct.expected_confirmation_seconds("quadraui") == 90.0
|
|
1739
|
+
|
|
1740
|
+
def test_a_non_positive_duration_is_never_recorded(self) -> None:
|
|
1741
|
+
ct.record_confirmation_duration("quadraui", 0.0)
|
|
1742
|
+
ct.record_confirmation_duration("quadraui", -5.0)
|
|
1743
|
+
assert ct.expected_confirmation_seconds("quadraui") is None
|
|
1744
|
+
|
|
1745
|
+
def test_recordable_kinds_are_exactly_the_ones_that_ran_for_real(self) -> None:
|
|
1746
|
+
"""`KIND_OK`/`KIND_BUILD`/`KIND_SUITE`/`KIND_BASELINE_RED`/
|
|
1747
|
+
`KIND_NO_OUTPUT` ran to completion; `KIND_TIMEOUT` ran for at least
|
|
1748
|
+
its ceiling — all six are a trustworthy signal. `KIND_SETUP`/
|
|
1749
|
+
`KIND_INFRA`/`KIND_SIGNAL` never ran the command for a representative
|
|
1750
|
+
duration and must stay excluded, or a single lock-contention hiccup
|
|
1751
|
+
or missing checkout would erase a hard-won 'this one is slow'
|
|
1752
|
+
expectation back down to near zero."""
|
|
1753
|
+
assert ct.RECORDABLE_DURATION_KINDS == {
|
|
1754
|
+
KIND_OK, KIND_BUILD, KIND_SUITE, KIND_BASELINE_RED,
|
|
1755
|
+
ct.KIND_NO_OUTPUT, KIND_TIMEOUT,
|
|
1756
|
+
}
|
|
1757
|
+
for excluded in (KIND_SETUP, KIND_INFRA, ct.KIND_SIGNAL):
|
|
1758
|
+
assert excluded not in ct.RECORDABLE_DURATION_KINDS
|
|
1759
|
+
|
|
1760
|
+
def test_a_corrupt_history_file_reads_as_never_measured(
|
|
1761
|
+
self, isolated_coord_dir: Path,
|
|
1762
|
+
) -> None:
|
|
1763
|
+
history_path = isolated_coord_dir / "confirm_test_history.json"
|
|
1764
|
+
history_path.write_text("not json{{{", encoding="utf-8")
|
|
1765
|
+
assert ct.expected_confirmation_seconds("quadraui") is None
|
|
1766
|
+
|
|
1767
|
+
def test_history_survives_being_read_back_from_a_fresh_process_view(
|
|
1768
|
+
self, isolated_coord_dir: Path,
|
|
1769
|
+
) -> None:
|
|
1770
|
+
"""The store is a plain file, not process memory — write it once and
|
|
1771
|
+
a completely separate read must see it, exactly like
|
|
1772
|
+
`coord.commands.drive_queue`'s roll-pending marker."""
|
|
1773
|
+
import json
|
|
1774
|
+
|
|
1775
|
+
history_path = isolated_coord_dir / "confirm_test_history.json"
|
|
1776
|
+
ct.record_confirmation_duration("quadraui", 777.0)
|
|
1777
|
+
assert json.loads(history_path.read_text())["quadraui"] == 777.0
|
|
1778
|
+
|
|
1779
|
+
|
|
1780
|
+
class TestConfirmationTimeoutSkipsAKnownDoomedRepo:
|
|
1781
|
+
"""`confirmation_timeout`'s *expected_seconds* parameter — the wiring
|
|
1782
|
+
that turns a measured history entry into an actual skip."""
|
|
1783
|
+
|
|
1784
|
+
def test_expected_well_below_the_ceiling_still_hands_out_the_ceiling(
|
|
1785
|
+
self,
|
|
1786
|
+
) -> None:
|
|
1787
|
+
ct.begin_confirmation_pass(600)
|
|
1788
|
+
assert ct.confirmation_timeout(expected_seconds=100) == 600
|
|
1789
|
+
|
|
1790
|
+
def test_expected_at_the_ceiling_skips_the_run(self) -> None:
|
|
1791
|
+
ct.begin_confirmation_pass(600)
|
|
1792
|
+
assert ct.confirmation_timeout(expected_seconds=600) is None
|
|
1793
|
+
|
|
1794
|
+
def test_expected_past_the_ceiling_skips_the_run(self) -> None:
|
|
1795
|
+
ct.begin_confirmation_pass(600)
|
|
1796
|
+
assert ct.confirmation_timeout(expected_seconds=900) is None
|
|
1797
|
+
|
|
1798
|
+
def test_no_expectation_falls_back_to_the_ordinary_ceiling(self) -> None:
|
|
1799
|
+
ct.begin_confirmation_pass(600)
|
|
1800
|
+
assert ct.confirmation_timeout(expected_seconds=None) == 600
|
|
1801
|
+
assert ct.confirmation_timeout() == 600
|
|
1802
|
+
|
|
1803
|
+
def test_expectation_is_irrelevant_outside_a_pass(self) -> None:
|
|
1804
|
+
"""No `begin_confirmation_pass()` call — the full per-run ceiling
|
|
1805
|
+
applies regardless of history, exactly like calling this with no
|
|
1806
|
+
argument at all."""
|
|
1807
|
+
assert ct.confirmation_timeout(expected_seconds=10**9) == int(
|
|
1808
|
+
ct.CONFIRM_DEFAULT_TIMEOUT_SECONDS
|
|
1809
|
+
)
|
|
1810
|
+
|
|
1811
|
+
def test_a_shrinking_budget_can_flip_a_previously_eligible_repo_to_skipped(
|
|
1812
|
+
self,
|
|
1813
|
+
) -> None:
|
|
1814
|
+
"""Spending most of the pass on other rows first must make the SAME
|
|
1815
|
+
expectation newly disqualifying — this is what protects every OTHER
|
|
1816
|
+
repo's confirmation from a known-slow one eating the tail of the
|
|
1817
|
+
budget on a run that was already unlikely to finish."""
|
|
1818
|
+
ct.begin_confirmation_pass(600)
|
|
1819
|
+
assert ct.confirmation_timeout(expected_seconds=500) == 600
|
|
1820
|
+
ct.spend_confirmation_budget(550)
|
|
1821
|
+
assert ct.confirmation_timeout(expected_seconds=500) is None
|
|
1822
|
+
|
|
1823
|
+
|
|
1824
|
+
class TestNotifyReapSkipsAKnownDoomedConfirmation:
|
|
1825
|
+
"""Integration: `coord.notify._run_pass_confirmation` actually consults
|
|
1826
|
+
the history and actually records into it — the two ends of #2975's fix
|
|
1827
|
+
wired together, not just the pure functions in isolation."""
|
|
1828
|
+
|
|
1829
|
+
@staticmethod
|
|
1830
|
+
def _transition():
|
|
1831
|
+
from coord.notify import EVENT_COMPLETION, Transition
|
|
1832
|
+
|
|
1833
|
+
return Transition(
|
|
1834
|
+
assignment_id="smoke-1", machine_name="laptop", repo_name="api",
|
|
1835
|
+
issue_number=42, event=EVENT_COMPLETION, exit_code=0,
|
|
1836
|
+
)
|
|
1837
|
+
|
|
1838
|
+
def test_a_timeout_is_remembered_and_the_next_attempt_skips_the_run(
|
|
1839
|
+
self,
|
|
1840
|
+
) -> None:
|
|
1841
|
+
from coord.notify import _run_pass_confirmation
|
|
1842
|
+
|
|
1843
|
+
entry = {"branch": BRANCH}
|
|
1844
|
+
ct.begin_confirmation_pass(600)
|
|
1845
|
+
clock = _FakeClock()
|
|
1846
|
+
|
|
1847
|
+
def _timed_out(*_a, **_k):
|
|
1848
|
+
# The real `confirm_branch` blocks until it hits its deadline —
|
|
1849
|
+
# simulate that by advancing the fake clock the same amount
|
|
1850
|
+
# `_run_pass_confirmation`'s `finally` will charge to the budget.
|
|
1851
|
+
clock.now += 600.0
|
|
1852
|
+
return ct.ConfirmationResult(
|
|
1853
|
+
kind=KIND_TIMEOUT,
|
|
1854
|
+
reason="confirmation suite timed out after 600s",
|
|
1855
|
+
)
|
|
1856
|
+
|
|
1857
|
+
# First attempt: nothing measured yet for 'api', so it really runs —
|
|
1858
|
+
# and this one times out, the #2975 shape (a suite that structurally
|
|
1859
|
+
# cannot finish inside the ceiling).
|
|
1860
|
+
with (
|
|
1861
|
+
patch("coord.config.load", return_value=_StubConfig()),
|
|
1862
|
+
patch("coord.notify.time.monotonic", side_effect=clock),
|
|
1863
|
+
patch(
|
|
1864
|
+
"coord.confirm_test.confirm_branch", side_effect=_timed_out,
|
|
1865
|
+
) as confirm,
|
|
1866
|
+
):
|
|
1867
|
+
result = _run_pass_confirmation(self._transition(), entry)
|
|
1868
|
+
|
|
1869
|
+
assert result is not None and result.kind == KIND_TIMEOUT
|
|
1870
|
+
confirm.assert_called_once()
|
|
1871
|
+
assert ct.expected_confirmation_seconds("api") == 600.0, (
|
|
1872
|
+
"a KIND_TIMEOUT result must be remembered as (at least) how long "
|
|
1873
|
+
"it ran — it's a valid lower bound on how long this repo's "
|
|
1874
|
+
"suite takes"
|
|
1875
|
+
)
|
|
1876
|
+
|
|
1877
|
+
# Second attempt, same repo, a FRESH pass with a full budget again —
|
|
1878
|
+
# so the skip below is attributable to the measured expectation
|
|
1879
|
+
# alone, not to a budget the first attempt happened to exhaust.
|
|
1880
|
+
ct.begin_confirmation_pass(600)
|
|
1881
|
+
with (
|
|
1882
|
+
patch("coord.config.load", return_value=_StubConfig()),
|
|
1883
|
+
patch(
|
|
1884
|
+
"coord.confirm_test.confirm_branch",
|
|
1885
|
+
return_value=ct.ConfirmationResult(
|
|
1886
|
+
kind=KIND_OK, reason="should not be reached",
|
|
1887
|
+
),
|
|
1888
|
+
) as confirm2,
|
|
1889
|
+
):
|
|
1890
|
+
result2 = _run_pass_confirmation(self._transition(), entry)
|
|
1891
|
+
|
|
1892
|
+
confirm2.assert_not_called()
|
|
1893
|
+
assert result2 is None
|