code-coordinator 0.5.330__tar.gz → 0.5.332__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.330 → code_coordinator-0.5.332}/PKG-INFO +1 -1
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/scm_file_list.json +2 -0
- code_coordinator-0.5.332/code_coordinator.egg-info/scm_version.json +8 -0
- code_coordinator-0.5.332/coord/machine_metrics.py +217 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/serve_app.py +63 -3
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/stage_projection.py +198 -3
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_PY_RUST_MIRRORS.md +1 -0
- code_coordinator-0.5.332/tests/test_machine_metrics.py +229 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stage_projection.py +284 -0
- code_coordinator-0.5.330/code_coordinator.egg-info/scm_version.json +0 -8
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.gitignore +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/CLAUDE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/GOAL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/LICENSE +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/MANIFEST.in +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/README.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agent.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/block_log.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/board_service.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/brain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/claim.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/client.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/comments.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dao.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/db.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deps.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/drive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/events.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/filelock.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/freshness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/gates.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/goal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/context.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/models.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/render.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/units.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/hooks.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/interactive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/models.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/network.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/openapi.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/parentage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/plans.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/progress.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/release_window.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/reports.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/review.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/self_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/smoke.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/split_work.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/sql.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/test_author.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/test_report.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/usage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/install-agent.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/pyproject.toml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/setup.cfg +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/backends.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/conftest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_db.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_events.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_init.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_models.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_network.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_session.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_split.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/write_parity.py +0 -0
|
@@ -91,6 +91,7 @@ coord/interactive.py
|
|
|
91
91
|
coord/issue_store.py
|
|
92
92
|
coord/issues_sync_status.py
|
|
93
93
|
coord/liveness_auditor.py
|
|
94
|
+
coord/machine_metrics.py
|
|
94
95
|
coord/machine_onboard.py
|
|
95
96
|
coord/machine_pause.py
|
|
96
97
|
coord/merge_queue.py
|
|
@@ -625,6 +626,7 @@ tests/test_issues_sync_status.py
|
|
|
625
626
|
tests/test_liveness_auditor.py
|
|
626
627
|
tests/test_liveness_notify.py
|
|
627
628
|
tests/test_lock_contention_ratchet.py
|
|
629
|
+
tests/test_machine_metrics.py
|
|
628
630
|
tests/test_machine_onboard.py
|
|
629
631
|
tests/test_machine_pause.py
|
|
630
632
|
tests/test_merge_queue.py
|
{code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -181,6 +181,7 @@
|
|
|
181
181
|
"coord/issue_store.py",
|
|
182
182
|
"coord/issues_sync_status.py",
|
|
183
183
|
"coord/liveness_auditor.py",
|
|
184
|
+
"coord/machine_metrics.py",
|
|
184
185
|
"coord/machine_onboard.py",
|
|
185
186
|
"coord/machine_pause.py",
|
|
186
187
|
"coord/merge_queue.py",
|
|
@@ -651,6 +652,7 @@
|
|
|
651
652
|
"tests/test_liveness_auditor.py",
|
|
652
653
|
"tests/test_liveness_notify.py",
|
|
653
654
|
"tests/test_lock_contention_ratchet.py",
|
|
655
|
+
"tests/test_machine_metrics.py",
|
|
654
656
|
"tests/test_machine_onboard.py",
|
|
655
657
|
"tests/test_machine_pause.py",
|
|
656
658
|
"tests/test_merge_queue.py",
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"""Coordinator-side machine metrics sampler + bounded ring buffer (#3020).
|
|
2
|
+
|
|
3
|
+
Part of milestone #71 (Fleet metrics + machines API) — the backend half of
|
|
4
|
+
the coord-web Machines panel.
|
|
5
|
+
|
|
6
|
+
``coord-tui`` renders CPU/mem sparklines by polling **each agent's own**
|
|
7
|
+
``/metrics`` endpoint directly on port 7433 (``coord.agent_app.metrics``, a
|
|
8
|
+
``psutil`` cpu/mem snapshot) and buffering samples in-process for as long as
|
|
9
|
+
the panel stays open (see ``coord-tui/src/app/data.rs``
|
|
10
|
+
``spawn_machine_metrics``). A browser can't do that — ``coord web`` is a
|
|
11
|
+
single-origin HTTP client of the dashboard API, not something that can fan
|
|
12
|
+
out to N agent hosts — and nothing anywhere persists a series; the TUI's
|
|
13
|
+
``VecDeque`` dies with the panel.
|
|
14
|
+
|
|
15
|
+
This module is the one missing thing: a coordinator-side sampler, owned by
|
|
16
|
+
the board daemon (``coord serve``) and driven off its existing periodic-loop
|
|
17
|
+
machinery (mirrors ``coord.health.fleet_snapshot.FleetHealthRefresher`` and
|
|
18
|
+
``coord.gate_snapshot.GateSnapshotRefresher`` — see ``coord.serve_app``'s
|
|
19
|
+
``_machine_metrics_loop``, isolated from ``_tick_loop`` for the identical
|
|
20
|
+
reason those two are: a fan-out HTTP GET per agent must never block, or be
|
|
21
|
+
blocked by, the reconcile/enqueue/drain steps).
|
|
22
|
+
|
|
23
|
+
**Bounded, not incidental (#3020).** Each machine gets its own
|
|
24
|
+
``collections.deque(maxlen=...)`` ring buffer sized for a ~6h window at the
|
|
25
|
+
default ~15s cadence (:data:`DEFAULT_MAX_SAMPLES` = 1440) — old samples are
|
|
26
|
+
evicted automatically as new ones arrive; the process can never accumulate
|
|
27
|
+
unbounded history no matter how long the daemon stays up.
|
|
28
|
+
|
|
29
|
+
**``unknown``, never a silent gap (#1485).** A failed, timed-out, or 503
|
|
30
|
+
(psutil not installed) poll still appends a sample — with
|
|
31
|
+
``status="unknown"`` — never nothing. A renderer building a sparkline from
|
|
32
|
+
this series must be able to tell "no data point" (a gap it filled in itself)
|
|
33
|
+
from "the daemon tried and the agent didn't answer" (an explicit unknown
|
|
34
|
+
sample); silently skipping the append would collapse that distinction back
|
|
35
|
+
into "looks the same as healthy", the exact failure mode
|
|
36
|
+
``coord.health.fleet_snapshot`` already guards against for machine health.
|
|
37
|
+
|
|
38
|
+
**No persistence.** This is purely in-memory; history is lost on daemon
|
|
39
|
+
restart by design (a sqlite time-series was considered and deliberately
|
|
40
|
+
rejected for this milestone — see the issue).
|
|
41
|
+
|
|
42
|
+
**Out of scope here.** The read endpoint for this series (#A2) and putting
|
|
43
|
+
it on ``/board`` (explicitly rejected — every TUI client polls ``/board`` on
|
|
44
|
+
a short interval and ``FleetHealthSnapshot`` already carries a 256 KiB cap
|
|
45
|
+
for exactly this reason) are not this module's job.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
from __future__ import annotations
|
|
49
|
+
|
|
50
|
+
import logging
|
|
51
|
+
import time
|
|
52
|
+
from collections import deque
|
|
53
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
54
|
+
from dataclasses import dataclass
|
|
55
|
+
|
|
56
|
+
import httpx
|
|
57
|
+
|
|
58
|
+
from coord.network import AGENT_PORT, DEFAULT_TIMEOUT, classify_error
|
|
59
|
+
|
|
60
|
+
log = logging.getLogger("coord.serve")
|
|
61
|
+
|
|
62
|
+
# ~6h of history at the default ~15s cadence. Explicit and enforced (each
|
|
63
|
+
# per-machine buffer is a `deque(maxlen=...)`, not a list someone forgot to
|
|
64
|
+
# trim) rather than incidental.
|
|
65
|
+
DEFAULT_MAX_SAMPLES = 1440
|
|
66
|
+
DEFAULT_CADENCE_SECONDS = 15.0
|
|
67
|
+
|
|
68
|
+
STATUS_OK = "ok"
|
|
69
|
+
STATUS_UNKNOWN = "unknown"
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@dataclass(frozen=True)
|
|
73
|
+
class MetricsSample:
|
|
74
|
+
"""One machine, one point in time. ``status="unknown"`` carries no
|
|
75
|
+
cpu/mem values — never fabricated zeros — only a human-readable
|
|
76
|
+
``reason`` for why the poll didn't produce a real reading.
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
timestamp: float
|
|
80
|
+
status: str # STATUS_OK | STATUS_UNKNOWN
|
|
81
|
+
cpu_percent: float | None = None
|
|
82
|
+
mem_percent: float | None = None
|
|
83
|
+
mem_used_mb: float | None = None
|
|
84
|
+
mem_total_mb: float | None = None
|
|
85
|
+
reason: str = ""
|
|
86
|
+
|
|
87
|
+
def to_dict(self) -> dict:
|
|
88
|
+
return {
|
|
89
|
+
"timestamp": self.timestamp,
|
|
90
|
+
"status": self.status,
|
|
91
|
+
"cpu_percent": self.cpu_percent,
|
|
92
|
+
"mem_percent": self.mem_percent,
|
|
93
|
+
"mem_used_mb": self.mem_used_mb,
|
|
94
|
+
"mem_total_mb": self.mem_total_mb,
|
|
95
|
+
"reason": self.reason,
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _unknown(reason: str, *, now: float | None = None) -> MetricsSample:
|
|
100
|
+
return MetricsSample(
|
|
101
|
+
timestamp=now if now is not None else time.time(),
|
|
102
|
+
status=STATUS_UNKNOWN,
|
|
103
|
+
reason=reason,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def fetch_metrics(machine, timeout: float = DEFAULT_TIMEOUT) -> MetricsSample: # noqa: ANN001 — coord.models.Machine
|
|
108
|
+
"""GET one machine's agent ``/metrics`` and classify the result.
|
|
109
|
+
|
|
110
|
+
Mirrors ``coord.network.check_machine``'s error classification but
|
|
111
|
+
targets ``/metrics`` instead of ``/health``. Never raises: every failure
|
|
112
|
+
mode — connect/read timeout, DNS failure, connection refused, a non-200
|
|
113
|
+
status (including the documented 503 an agent returns when ``psutil``
|
|
114
|
+
isn't installed), and malformed/missing-field JSON — becomes an explicit
|
|
115
|
+
:data:`STATUS_UNKNOWN` sample rather than an exception or a dropped
|
|
116
|
+
point. The bounded ``timeout`` (default :data:`coord.network.
|
|
117
|
+
DEFAULT_TIMEOUT`, 3s) is what keeps one hanging agent from stalling this
|
|
118
|
+
call past that ceiling; :class:`MachineMetricsSampler.refresh` is what
|
|
119
|
+
keeps that bounded stall from serializing behind every other machine.
|
|
120
|
+
"""
|
|
121
|
+
url = f"http://{machine.host}:{AGENT_PORT}/metrics"
|
|
122
|
+
try:
|
|
123
|
+
resp = httpx.get(url, timeout=timeout)
|
|
124
|
+
except Exception as e: # noqa: BLE001 — classify every network error, never raise
|
|
125
|
+
_, reason = classify_error(e)
|
|
126
|
+
return _unknown(reason)
|
|
127
|
+
|
|
128
|
+
if resp.status_code == 503:
|
|
129
|
+
# #207's documented shape: psutil not installed on that agent.
|
|
130
|
+
return _unknown("psutil not installed on agent")
|
|
131
|
+
if resp.status_code != 200:
|
|
132
|
+
return _unknown(f"HTTP {resp.status_code}")
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
data = resp.json()
|
|
136
|
+
except ValueError:
|
|
137
|
+
return _unknown("invalid JSON from /metrics")
|
|
138
|
+
|
|
139
|
+
try:
|
|
140
|
+
return MetricsSample(
|
|
141
|
+
timestamp=time.time(),
|
|
142
|
+
status=STATUS_OK,
|
|
143
|
+
cpu_percent=float(data["cpu_percent"]),
|
|
144
|
+
mem_percent=float(data["mem_percent"]),
|
|
145
|
+
mem_used_mb=float(data["mem_used_mb"]),
|
|
146
|
+
mem_total_mb=float(data["mem_total_mb"]),
|
|
147
|
+
)
|
|
148
|
+
except (KeyError, TypeError, ValueError):
|
|
149
|
+
return _unknown("malformed /metrics payload")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class MachineMetricsSampler:
|
|
153
|
+
"""Owns the bounded per-machine ring buffers; refreshed by the daemon tick.
|
|
154
|
+
|
|
155
|
+
``series()``/``all_series()`` are the read path — bare in-memory reads,
|
|
156
|
+
no I/O, safe to call from a request handler. ``refresh(config)`` is the
|
|
157
|
+
only method that talks to agents and must only ever run from the
|
|
158
|
+
daemon's tick machinery (or a test driving it explicitly), exactly the
|
|
159
|
+
same split as ``coord.health.fleet_snapshot.FleetHealthRefresher``.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
def __init__(
|
|
163
|
+
self,
|
|
164
|
+
*,
|
|
165
|
+
max_samples: int = DEFAULT_MAX_SAMPLES,
|
|
166
|
+
timeout: float = DEFAULT_TIMEOUT,
|
|
167
|
+
) -> None:
|
|
168
|
+
if max_samples <= 0:
|
|
169
|
+
raise ValueError("max_samples must be positive")
|
|
170
|
+
self._max_samples = max_samples
|
|
171
|
+
self._timeout = timeout
|
|
172
|
+
self._buffers: dict[str, deque] = {}
|
|
173
|
+
|
|
174
|
+
def series(self, machine_name: str) -> list[dict]:
|
|
175
|
+
"""This machine's samples, oldest first. ``[]`` if never polled."""
|
|
176
|
+
buf = self._buffers.get(machine_name)
|
|
177
|
+
return [s.to_dict() for s in buf] if buf else []
|
|
178
|
+
|
|
179
|
+
def all_series(self) -> dict[str, list[dict]]:
|
|
180
|
+
"""Every known machine's series, oldest-first, keyed by name."""
|
|
181
|
+
return {name: [s.to_dict() for s in buf] for name, buf in self._buffers.items()}
|
|
182
|
+
|
|
183
|
+
def refresh(self, config) -> None: # noqa: ANN001 — coord.config.Config
|
|
184
|
+
"""Poll every machine in ``config.machines`` once and append a sample
|
|
185
|
+
each — :data:`STATUS_OK` or :data:`STATUS_UNKNOWN`, never neither.
|
|
186
|
+
|
|
187
|
+
Polls concurrently (mirrors ``coord.network.check_all``): each call
|
|
188
|
+
is individually bounded by ``timeout``, and running them in a thread
|
|
189
|
+
pool rather than sequentially means one slow/hanging agent's bounded
|
|
190
|
+
stall does not serialize in front of the rest of the fleet's polls —
|
|
191
|
+
the whole ``refresh()`` call takes roughly one ``timeout``, not
|
|
192
|
+
``len(machines) * timeout``, no matter which machine is the slow
|
|
193
|
+
one. Called off the event loop (``run_in_threadpool`` from
|
|
194
|
+
``coord.serve_app``'s own loop, isolated from ``_tick_loop``) so
|
|
195
|
+
even that bound never touches board-read latency.
|
|
196
|
+
"""
|
|
197
|
+
machines = list(getattr(config, "machines", ()) or ())
|
|
198
|
+
if not machines:
|
|
199
|
+
return
|
|
200
|
+
|
|
201
|
+
workers = min(8, len(machines))
|
|
202
|
+
with ThreadPoolExecutor(max_workers=workers) as pool:
|
|
203
|
+
samples = list(pool.map(self._poll_one, machines))
|
|
204
|
+
|
|
205
|
+
for machine, sample in zip(machines, samples):
|
|
206
|
+
buf = self._buffers.get(machine.name)
|
|
207
|
+
if buf is None:
|
|
208
|
+
buf = deque(maxlen=self._max_samples)
|
|
209
|
+
self._buffers[machine.name] = buf
|
|
210
|
+
buf.append(sample)
|
|
211
|
+
|
|
212
|
+
def _poll_one(self, machine) -> MetricsSample: # noqa: ANN001
|
|
213
|
+
try:
|
|
214
|
+
return fetch_metrics(machine, timeout=self._timeout)
|
|
215
|
+
except Exception as exc: # noqa: BLE001 — one bad machine must never abort the refresh
|
|
216
|
+
log.warning("machine-metrics poll: %s raised %s", machine.name, exc)
|
|
217
|
+
return _unknown(f"poll raised: {exc}")
|
|
@@ -2547,7 +2547,8 @@ def _board_response_schema(components: dict) -> dict:
|
|
|
2547
2547
|
"#550: server-computed per-issue stage/gate badges "
|
|
2548
2548
|
"(work/review/smoke/test/merge status, has_approved_review) — "
|
|
2549
2549
|
"generalizes the #776/#778 pattern so coord-tui's "
|
|
2550
|
-
"pipeline.rs stops re-deriving this from raw rows"
|
|
2550
|
+
"pipeline.rs stops re-deriving this from raw rows. #3013 adds "
|
|
2551
|
+
"a per-stage leg count (`stage_counts`) alongside the status."
|
|
2551
2552
|
),
|
|
2552
2553
|
"items": {
|
|
2553
2554
|
"type": "object",
|
|
@@ -2560,6 +2561,24 @@ def _board_response_schema(components: dict) -> dict:
|
|
|
2560
2561
|
"description": "stage name -> pending|active|done|failed|stale|skipped",
|
|
2561
2562
|
"additionalProperties": {"type": "string"},
|
|
2562
2563
|
},
|
|
2564
|
+
"stage_counts": {
|
|
2565
|
+
"type": "object",
|
|
2566
|
+
"description": (
|
|
2567
|
+
"#3013: stage name -> count of separate dispatched "
|
|
2568
|
+
"legs at that stage (e.g. a stage re-dispatched 4 "
|
|
2569
|
+
"times reads 4, not 1) — lets a client render "
|
|
2570
|
+
"'Work (2)' / 'Review (5)' and suppress the suffix "
|
|
2571
|
+
"at 1. Same key set as `stages` (including "
|
|
2572
|
+
"`acceptance`). Caveat: `merge` uses a different "
|
|
2573
|
+
"convention from every other key — it counts "
|
|
2574
|
+
"conflict-fix RETRIES (0 for a clean single merge, "
|
|
2575
|
+
"not 1 for 'one attempt happened'), so a uniform "
|
|
2576
|
+
"'suppress at <= 1' rule will also suppress a "
|
|
2577
|
+
"single conflict-fix retry, which is usually the "
|
|
2578
|
+
"most useful count to surface."
|
|
2579
|
+
),
|
|
2580
|
+
"additionalProperties": {"type": "integer"},
|
|
2581
|
+
},
|
|
2563
2582
|
"has_approved_review": {"type": "boolean"},
|
|
2564
2583
|
"uat_preview_url": {
|
|
2565
2584
|
"type": ["string", "null"],
|
|
@@ -2571,7 +2590,13 @@ def _board_response_schema(components: dict) -> dict:
|
|
|
2571
2590
|
),
|
|
2572
2591
|
},
|
|
2573
2592
|
},
|
|
2574
|
-
"required": [
|
|
2593
|
+
"required": [
|
|
2594
|
+
"repo_name",
|
|
2595
|
+
"issue_number",
|
|
2596
|
+
"stages",
|
|
2597
|
+
"stage_counts",
|
|
2598
|
+
"has_approved_review",
|
|
2599
|
+
],
|
|
2575
2600
|
},
|
|
2576
2601
|
},
|
|
2577
2602
|
"plan_roster": {
|
|
@@ -5315,6 +5340,15 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
|
|
|
5315
5340
|
|
|
5316
5341
|
_fleet_health_refresher = FleetHealthRefresher()
|
|
5317
5342
|
|
|
5343
|
+
# #3020: same shape again — polling every agent's own /metrics is real
|
|
5344
|
+
# per-machine I/O, so it runs on the tick loop's cadence
|
|
5345
|
+
# (`_machine_metrics_loop` below), never inline off a request handler.
|
|
5346
|
+
# Series live only in this sampler's bounded in-memory ring buffers; no
|
|
5347
|
+
# read endpoint exists yet (that's #A2) and nothing here touches /board.
|
|
5348
|
+
from coord.machine_metrics import MachineMetricsSampler # noqa: PLC0415
|
|
5349
|
+
|
|
5350
|
+
_machine_metrics_sampler = MachineMetricsSampler()
|
|
5351
|
+
|
|
5318
5352
|
# Short-TTL cache for the computed /board projection so burst polls from the
|
|
5319
5353
|
# TUI don't each pay the full board_projection + merge-plan + stage-projection
|
|
5320
5354
|
# recomputation (~465-issue load measured in the issue). Keyed to nothing
|
|
@@ -9427,6 +9461,26 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
|
|
|
9427
9461
|
except Exception: # noqa: BLE001 — keep serving the old snapshot
|
|
9428
9462
|
log.warning("fleet-health refresh failed", exc_info=True)
|
|
9429
9463
|
|
|
9464
|
+
# #3020: CPU/mem sampler for the coord-web Machines panel — default
|
|
9465
|
+
# 15s (env COORD_METRICS_POLL_INTERVAL; 0 disables). Own loop, not a
|
|
9466
|
+
# `_tick_loop` step, for the identical reason as `_health_refresh_loop`
|
|
9467
|
+
# just above: it fans out one HTTP GET per agent and must never be
|
|
9468
|
+
# held up behind, or hold up, the reconcile/enqueue/drain steps.
|
|
9469
|
+
try:
|
|
9470
|
+
metrics_poll_interval = float(
|
|
9471
|
+
os.environ.get("COORD_METRICS_POLL_INTERVAL", "15")
|
|
9472
|
+
)
|
|
9473
|
+
except ValueError:
|
|
9474
|
+
metrics_poll_interval = 15.0
|
|
9475
|
+
|
|
9476
|
+
async def _machine_metrics_loop() -> None:
|
|
9477
|
+
while True:
|
|
9478
|
+
await asyncio.sleep(metrics_poll_interval)
|
|
9479
|
+
try:
|
|
9480
|
+
await run_in_threadpool(_machine_metrics_sampler.refresh, config)
|
|
9481
|
+
except Exception: # noqa: BLE001 — a tick must never crash the daemon
|
|
9482
|
+
log.warning("machine-metrics refresh failed", exc_info=True)
|
|
9483
|
+
|
|
9430
9484
|
# #2570: the #2536 phantom-row auto-heal, run a SECOND time from
|
|
9431
9485
|
# inside this long-lived process rather than relying solely on
|
|
9432
9486
|
# `coord-notify.timer`'s oneshot `~/.coord-venv/bin/coord notify`
|
|
@@ -10193,12 +10247,18 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
|
|
|
10193
10247
|
else None,
|
|
10194
10248
|
"auto-revalidate",
|
|
10195
10249
|
)
|
|
10250
|
+
machine_metrics_task = _watch(
|
|
10251
|
+
asyncio.create_task(_machine_metrics_loop())
|
|
10252
|
+
if interval > 0 and metrics_poll_interval > 0
|
|
10253
|
+
else None,
|
|
10254
|
+
"machine-metrics",
|
|
10255
|
+
)
|
|
10196
10256
|
try:
|
|
10197
10257
|
yield
|
|
10198
10258
|
finally:
|
|
10199
10259
|
for t in (
|
|
10200
10260
|
task, gate_task, health_task, phantom_heal_task,
|
|
10201
|
-
auto_revalidate_task,
|
|
10261
|
+
auto_revalidate_task, machine_metrics_task,
|
|
10202
10262
|
):
|
|
10203
10263
|
if t is not None:
|
|
10204
10264
|
t.cancel()
|
|
@@ -31,9 +31,10 @@ plain values — no I/O, no side effects.
|
|
|
31
31
|
|
|
32
32
|
from __future__ import annotations
|
|
33
33
|
|
|
34
|
+
import dataclasses
|
|
34
35
|
from typing import Any, Protocol, runtime_checkable
|
|
35
36
|
|
|
36
|
-
from coord.models import CLOSES_ISSUE_TYPES
|
|
37
|
+
from coord.models import CLOSES_ISSUE_TYPES, WORK_LIKE_TYPES, effective_issue_number
|
|
37
38
|
|
|
38
39
|
# ── Stage-status vocabulary — mirrors tui/src/app/pipeline.rs::StageStatus ──
|
|
39
40
|
PENDING = "pending"
|
|
@@ -172,6 +173,102 @@ def assignments_for_stage(
|
|
|
172
173
|
return out
|
|
173
174
|
|
|
174
175
|
|
|
176
|
+
def _leg_count_for_stage(
|
|
177
|
+
assignments_for_issue: list,
|
|
178
|
+
stage: str,
|
|
179
|
+
*,
|
|
180
|
+
require_plan: bool,
|
|
181
|
+
) -> int:
|
|
182
|
+
"""How many separate dispatched attempts ("legs") this issue has had at
|
|
183
|
+
*stage* (#3013) — "attempts a human would recognise as separate", not a
|
|
184
|
+
raw row count. Each retry/redispatch is already its own board row (a
|
|
185
|
+
retry dispatches a fresh assignment id rather than mutating the failed
|
|
186
|
+
one, see ``coord.reconcile._reassign``), so counting rows already gives
|
|
187
|
+
the right number for stages backed by their own dedicated assignment
|
|
188
|
+
``type`` — this only needs to special-case the stages that aren't:
|
|
189
|
+
|
|
190
|
+
* ``"work"`` is widened from a literal ``type == "work"`` (plus the
|
|
191
|
+
existing plan-fold) to the full :data:`WORK_LIKE_TYPES` — an
|
|
192
|
+
oracle-loop acceptance slice's repeated ``test-author``/``mock-author``
|
|
193
|
+
legs (#3013's coord-portal#164 example: 4 ``test-author`` legs, 5
|
|
194
|
+
``review`` legs on one branch) are exactly the kind of repetition this
|
|
195
|
+
field exists to surface, and a strict ``type == "work"`` match would
|
|
196
|
+
never see them.
|
|
197
|
+
* ``"test"`` has no ``type="test"`` assignment — the Test-stage's
|
|
198
|
+
dispatched worker is ``type="smoke"`` (``coord.smoke``).
|
|
199
|
+
* ``"merge"`` has no ``type="merge"`` assignment either — repeated
|
|
200
|
+
landing attempts show up as ``type="conflict-fix"`` legs (#241). Note
|
|
201
|
+
the counting convention this implies differs from every other stage:
|
|
202
|
+
a clean single merge with no conflict reports ``0`` (no *retry* was
|
|
203
|
+
needed), whereas one ordinary ``"work"``/``"review"``/``"test"`` leg
|
|
204
|
+
reports ``1`` (one attempt happened). A client applying one uniform
|
|
205
|
+
"suppress the number at <= 1" rule across every stage — as the
|
|
206
|
+
``/board`` schema description implies — will suppress a single
|
|
207
|
+
conflict-fix leg (``count == 1``, arguably the most useful case to
|
|
208
|
+
surface: "this needed a rebase") exactly like "no problem at all". No
|
|
209
|
+
code path here can distinguish the two without a wire-schema change,
|
|
210
|
+
so this is flagged for the client rather than fixed on this side.
|
|
211
|
+
* ``"acceptance"`` (review fix, #3013) has no dedicated assignment type
|
|
212
|
+
either — like ``test_state``/``uat_state``, ``acceptance_state`` is
|
|
213
|
+
stamped directly onto the ``type="work"`` row a
|
|
214
|
+
``coord acceptance record`` verdict belongs to (see
|
|
215
|
+
:func:`acceptance_stage_status_for`, which reads the same rows), so a
|
|
216
|
+
generic ``assignments_for_stage(..., "acceptance", ...)`` scan would
|
|
217
|
+
always return zero.
|
|
218
|
+
|
|
219
|
+
Every other stage (``"plan"``, ``"review"``, ``"uat"``, ...) already has
|
|
220
|
+
a 1:1 assignment ``type``, so :func:`assignments_for_stage` alone gives
|
|
221
|
+
the right count.
|
|
222
|
+
"""
|
|
223
|
+
if stage == "work":
|
|
224
|
+
matching = assignments_for_stage(assignments_for_issue, "work", require_plan=require_plan)
|
|
225
|
+
seen = {id(a) for a in matching}
|
|
226
|
+
extra = [
|
|
227
|
+
a
|
|
228
|
+
for a in assignments_for_issue
|
|
229
|
+
if id(a) not in seen and (a.type or "work") in WORK_LIKE_TYPES
|
|
230
|
+
]
|
|
231
|
+
return len(matching) + len(extra)
|
|
232
|
+
if stage == "test":
|
|
233
|
+
return sum(1 for a in assignments_for_issue if (a.type or "work") == "smoke")
|
|
234
|
+
if stage == "merge":
|
|
235
|
+
return sum(1 for a in assignments_for_issue if (a.type or "work") == "conflict-fix")
|
|
236
|
+
if stage == "acceptance":
|
|
237
|
+
return sum(
|
|
238
|
+
1
|
|
239
|
+
for a in assignments_for_issue
|
|
240
|
+
if (a.type or "work") == "work" and (a.acceptance_state or "") != ""
|
|
241
|
+
)
|
|
242
|
+
return len(assignments_for_stage(assignments_for_issue, stage, require_plan=require_plan))
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def _widen_work_like_types(assignments: list) -> list:
|
|
246
|
+
"""Return *assignments* with every :data:`WORK_LIKE_TYPES` row (#3013:
|
|
247
|
+
``mock-author``/``test-author``, not just literal ``type="work"``)
|
|
248
|
+
presented as ``type="work"`` to the generic per-stage dispatcher
|
|
249
|
+
(:func:`stage_status_for`, :func:`assignments_for_stage`,
|
|
250
|
+
:func:`acceptance_stage_status_for`, ...), all of which key strictly off
|
|
251
|
+
``a.type``.
|
|
252
|
+
|
|
253
|
+
Used ONLY by :func:`compute_board_stage_projection`'s phantom-entry
|
|
254
|
+
fallback (see that function's docstring) — without it, a slice whose
|
|
255
|
+
only rows are ``test-author``/``mock-author`` legs got
|
|
256
|
+
``stage_counts["work"] == 4`` (via :func:`_leg_count_for_stage`, which
|
|
257
|
+
already widens the same way) sitting next to ``stages["work"] ==
|
|
258
|
+
"pending"`` forever, since the strict-``type`` dispatcher never
|
|
259
|
+
recognised those rows as "work" activity. Every other field (status,
|
|
260
|
+
dispatched_at, test_state, acceptance_state, ...) is preserved
|
|
261
|
+
unchanged — this only relabels the ``type`` a downstream ``==`` check
|
|
262
|
+
sees.
|
|
263
|
+
"""
|
|
264
|
+
out = []
|
|
265
|
+
for a in assignments:
|
|
266
|
+
t = a.type or "work"
|
|
267
|
+
widen = t in WORK_LIKE_TYPES and t != "work"
|
|
268
|
+
out.append(dataclasses.replace(a, type="work") if widen else a)
|
|
269
|
+
return out
|
|
270
|
+
|
|
271
|
+
|
|
175
272
|
def upstream_max_dispatched_at(
|
|
176
273
|
assignments_for_issue: list,
|
|
177
274
|
stage: str,
|
|
@@ -698,6 +795,7 @@ def compute_issue_projection(
|
|
|
698
795
|
ci_store: Any | None = None,
|
|
699
796
|
uat_enabled: bool = False,
|
|
700
797
|
uat_preview_url: str | None = None,
|
|
798
|
+
stage_count_assignments: list | None = None,
|
|
701
799
|
) -> dict[str, Any]:
|
|
702
800
|
"""Compute the full per-issue stage badge dict.
|
|
703
801
|
|
|
@@ -717,6 +815,15 @@ def compute_issue_projection(
|
|
|
717
815
|
carried through unconditionally so a caller can show it next to the
|
|
718
816
|
badge instead of sending the operator to ``coord merge``'s refusal
|
|
719
817
|
message to find it (#2951 item 3).
|
|
818
|
+
|
|
819
|
+
``stage_count_assignments`` (#3013) is the assignment list
|
|
820
|
+
:func:`_leg_count_for_stage` scans to fill ``stage_counts`` — a client
|
|
821
|
+
can then render ``Work (2)`` / ``Review (5)`` next to the status badge
|
|
822
|
+
and suppress the suffix at 1. Defaults to *assignments_for_issue* (the
|
|
823
|
+
same list ``stages`` uses) when omitted, which is correct for an
|
|
824
|
+
ordinary issue; :func:`compute_board_stage_projection` passes a
|
|
825
|
+
separately-keyed list for the #1553 oracle-loop epic/slice case — see
|
|
826
|
+
that function's docstring.
|
|
720
827
|
"""
|
|
721
828
|
names = issue_stage_names(assignments_for_issue, default_gates, uat_enabled=uat_enabled)
|
|
722
829
|
stages: dict[str, str] = {}
|
|
@@ -741,8 +848,29 @@ def compute_issue_projection(
|
|
|
741
848
|
# excluded from the per-issue stage-strip ordering that `default_gates`
|
|
742
849
|
# drives, since it only applies to oracle-loop milestones.
|
|
743
850
|
stages["acceptance"] = acceptance_stage_status_for(assignments_for_issue)
|
|
851
|
+
|
|
852
|
+
count_source = (
|
|
853
|
+
assignments_for_issue if stage_count_assignments is None else stage_count_assignments
|
|
854
|
+
)
|
|
855
|
+
stage_counts: dict[str, int] = {
|
|
856
|
+
name: _leg_count_for_stage(count_source, name, require_plan=require_plan) for name in names
|
|
857
|
+
}
|
|
858
|
+
stage_counts.setdefault(
|
|
859
|
+
"merge", _leg_count_for_stage(count_source, "merge", require_plan=require_plan)
|
|
860
|
+
)
|
|
861
|
+
# Review fix (#3013): `stages` always carries "acceptance" (added
|
|
862
|
+
# unconditionally above, outside `names`/`default_gates`), but
|
|
863
|
+
# `stage_counts` was built only from `names` plus an explicit "merge"
|
|
864
|
+
# fallback — so it silently dropped "acceptance", contradicting the
|
|
865
|
+
# `/board` schema's documented "same key set as `stages`" guarantee
|
|
866
|
+
# (coord/serve_app.py) and leaving a client that indexes `stage_counts`
|
|
867
|
+
# by every key in `stages` with a plain `KeyError`.
|
|
868
|
+
stage_counts.setdefault(
|
|
869
|
+
"acceptance", _leg_count_for_stage(count_source, "acceptance", require_plan=require_plan)
|
|
870
|
+
)
|
|
744
871
|
return {
|
|
745
872
|
"stages": stages,
|
|
873
|
+
"stage_counts": stage_counts,
|
|
746
874
|
"acceptance_progress": acceptance_progress_for(assignments_for_issue),
|
|
747
875
|
"uat_preview_url": uat_preview_url if uat_enabled else None,
|
|
748
876
|
"has_approved_review": issue_has_any_approved_review(
|
|
@@ -779,6 +907,44 @@ def compute_board_stage_projection(
|
|
|
779
907
|
``None`` (the default — e.g. a caller with no config loaded) means no
|
|
780
908
|
repo is treated as opted in, matching :func:`pipeline_stage_names`'s own
|
|
781
909
|
fail-toward-hidden default.
|
|
910
|
+
|
|
911
|
+
``stage_counts`` (#3013) is deliberately built from a SECOND index keyed
|
|
912
|
+
by ``coord.models.effective_issue_number`` rather than the raw
|
|
913
|
+
``assignments_by_key`` below: an oracle-loop acceptance slice's
|
|
914
|
+
``test-author``/``mock-author``/``review`` legs are booked
|
|
915
|
+
(``issue_number``) to the milestone's *tracking* issue, with the child
|
|
916
|
+
they're actually FOR named in ``for_issue_number`` (see
|
|
917
|
+
``coord gates <repo> <slice>``, which resolves the same way). Reusing
|
|
918
|
+
``assignments_by_key`` for the count would leave a slice's own
|
|
919
|
+
``stage_counts`` reading 0 forever — the same keying trap noted in the
|
|
920
|
+
#3013 issue's "drive-queue sweep bug" reference. For an issue that ALSO
|
|
921
|
+
has its own raw-keyed rows, this does NOT touch ``stages``: that stays
|
|
922
|
+
keyed on the raw ``issue_number`` on purpose (#1652 — re-attributing
|
|
923
|
+
status by ``for_issue_number`` moved a false "merged" green from the
|
|
924
|
+
epic onto a child that already had its own, separately-tracked state; a
|
|
925
|
+
leg *count* carries no such false-green risk, so the two fields are
|
|
926
|
+
allowed to disagree on which issue owns which rows in that case).
|
|
927
|
+
|
|
928
|
+
Review fix (#3013): a *phantom* entry — ANY key whose raw-keyed
|
|
929
|
+
assignment list is empty, whether it exists in ``issues`` with no
|
|
930
|
+
assignments of its own (the coord-portal#164 test below: the slice IS
|
|
931
|
+
already synced, but every one of its legs is booked to the tracking
|
|
932
|
+
issue) or exists ONLY via the effective-key union (never synced at all:
|
|
933
|
+
not yet caught up by ``_sync_issues_tick``, or a closed slice pruned
|
|
934
|
+
from ``issues`` after 7 days while assignment retention runs 14, see
|
|
935
|
+
``coord/state.py``) — has nothing raw-keyed to protect from the #1652
|
|
936
|
+
clobber, because there IS no separately-tracked state for it to
|
|
937
|
+
conflict with. Rendering ``stages`` from the empty raw list anyway
|
|
938
|
+
produced a self-contradictory row: every stage PENDING (acceptance
|
|
939
|
+
SKIPPED) right next to a ``stage_counts`` proving real legs ran. So for
|
|
940
|
+
that case only, ``stages``/``acceptance``/``has_approved_review`` fall
|
|
941
|
+
back to the same effective-keyed list ``stage_counts`` already uses,
|
|
942
|
+
widened through :func:`_widen_work_like_types` so a `test-author`/
|
|
943
|
+
`mock-author` leg registers as "work" activity to the generic
|
|
944
|
+
per-stage dispatcher — see the ``projection_assignments`` fallback
|
|
945
|
+
below. ``issue_title`` still reads ``""`` for a phantom entry that
|
|
946
|
+
isn't itself in ``issues`` (genuinely unknown — not fabricated from the
|
|
947
|
+
tracking issue's own title, which would be actively wrong).
|
|
782
948
|
"""
|
|
783
949
|
is_closed_by_key: dict[tuple[str, int], bool] = {
|
|
784
950
|
(i["repo_name"], i["number"]): str(i.get("state", "")).lower() == "closed"
|
|
@@ -794,6 +960,17 @@ def compute_board_stage_projection(
|
|
|
794
960
|
continue
|
|
795
961
|
assignments_by_key.setdefault((a.repo_name, a.issue_number), []).append(a)
|
|
796
962
|
|
|
963
|
+
# #3013: effective-issue-keyed index — see docstring above. Used only to
|
|
964
|
+
# fill `stage_counts`, never `stages`.
|
|
965
|
+
assignments_by_effective_key: dict[tuple[str, int], list] = {}
|
|
966
|
+
for a in assignments:
|
|
967
|
+
if not a.repo_name:
|
|
968
|
+
continue
|
|
969
|
+
eff = effective_issue_number(a)
|
|
970
|
+
if not eff:
|
|
971
|
+
continue
|
|
972
|
+
assignments_by_effective_key.setdefault((a.repo_name, eff), []).append(a)
|
|
973
|
+
|
|
797
974
|
merge_by_key: dict[tuple[str, int], Any] = {}
|
|
798
975
|
for m in merge_queue_items:
|
|
799
976
|
assignment_type = getattr(m, "assignment_type", "work") or "work"
|
|
@@ -815,7 +992,11 @@ def compute_board_stage_projection(
|
|
|
815
992
|
# `load_queue()`/`board_projection()` both order by `id` ascending.
|
|
816
993
|
merge_by_key.setdefault(key, m)
|
|
817
994
|
|
|
818
|
-
|
|
995
|
+
# #3013: also union in the effective-key index so an acceptance slice
|
|
996
|
+
# whose only board rows are booked to the tracking issue (nothing keyed
|
|
997
|
+
# to the slice's own issue_number, e.g. never separately synced) still
|
|
998
|
+
# gets a projection row for stage_counts to land in.
|
|
999
|
+
keys = set(is_closed_by_key) | set(assignments_by_key) | set(assignments_by_effective_key)
|
|
819
1000
|
|
|
820
1001
|
uat_enabled_by_repo: dict[str, bool] = {}
|
|
821
1002
|
|
|
@@ -823,12 +1004,25 @@ def compute_board_stage_projection(
|
|
|
823
1004
|
for repo_name, issue_number in keys:
|
|
824
1005
|
key = (repo_name, issue_number)
|
|
825
1006
|
issue_assignments = assignments_by_key.get(key, [])
|
|
1007
|
+
effective_assignments = assignments_by_effective_key.get(key, [])
|
|
1008
|
+
# Review fix (#3013): a phantom entry (see docstring) has no
|
|
1009
|
+
# raw-keyed rows at all, so falling back to the effective-keyed list
|
|
1010
|
+
# here — instead of leaving `stages` computed from `[]` — keeps
|
|
1011
|
+
# `stages`/`acceptance`/`has_approved_review` consistent with the
|
|
1012
|
+
# non-zero `stage_counts` this same entry reports below. Widened
|
|
1013
|
+
# through `_widen_work_like_types` so a `test-author`/`mock-author`
|
|
1014
|
+
# leg (WORK_LIKE_TYPES, not literal `type="work"`) registers with
|
|
1015
|
+
# the generic per-stage dispatcher's strict `type` check the same
|
|
1016
|
+
# way `_leg_count_for_stage` already widens it for `stage_counts`.
|
|
1017
|
+
# A no-op for every ordinary issue: `issue_assignments or ...` only
|
|
1018
|
+
# reaches the fallback when the raw list is empty.
|
|
1019
|
+
projection_assignments = issue_assignments or _widen_work_like_types(effective_assignments)
|
|
826
1020
|
merge_entry = merge_by_key.get(key)
|
|
827
1021
|
if repo_name not in uat_enabled_by_repo:
|
|
828
1022
|
uat_enabled_by_repo[repo_name] = repo_has_uat_preview(repo_name, config)
|
|
829
1023
|
uat_enabled = uat_enabled_by_repo[repo_name]
|
|
830
1024
|
entry = compute_issue_projection(
|
|
831
|
-
|
|
1025
|
+
projection_assignments,
|
|
832
1026
|
merge_entry,
|
|
833
1027
|
is_closed=is_closed_by_key.get(key, False),
|
|
834
1028
|
require_plan=require_plan,
|
|
@@ -840,6 +1034,7 @@ def compute_board_stage_projection(
|
|
|
840
1034
|
if uat_enabled
|
|
841
1035
|
else None
|
|
842
1036
|
),
|
|
1037
|
+
stage_count_assignments=effective_assignments,
|
|
843
1038
|
)
|
|
844
1039
|
entry["repo_name"] = repo_name
|
|
845
1040
|
entry["issue_number"] = issue_number
|