code-coordinator 0.5.510__tar.gz → 0.5.512__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.510 → code_coordinator-0.5.512}/PKG-INFO +1 -1
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/code_coordinator.egg-info/SOURCES.txt +2 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/code_coordinator.egg-info/scm_file_list.json +2 -0
- code_coordinator-0.5.512/code_coordinator.egg-info/scm_version.json +8 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/board_schema.py +235 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/drive_queue.py +136 -11
- code_coordinator-0.5.512/coord/drive_sessions_snapshot.py +177 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/serve_app.py +226 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_board_read_path.py +22 -7
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_board_schema.py +122 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_config_effective.py +127 -0
- code_coordinator-0.5.512/tests/test_drive_sessions_snapshot.py +120 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_serve.py +390 -0
- code_coordinator-0.5.510/code_coordinator.egg-info/scm_version.json +0 -8
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/.gitignore +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/CLAUDE.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/GOAL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/LICENSE +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/MANIFEST.in +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/README.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/__init__.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/agent.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/audit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/backup.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/block_log.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/board_service.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/brain.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/claim.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/cli.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/client.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/codegen.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/ci.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/comments.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/config.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dao.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/db.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/deps.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/drive.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/events.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/filelock.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/freshness.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/gates.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/goal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/context.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/models.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/render.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/health/units.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/hooks.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/interactive.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/models.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/network.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/notify.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/openapi.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/parentage.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/plans.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/progress.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/release_window.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/reports.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/restart_cmd.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/review.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/self_health.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/smoke.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/split_work.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/sql.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/state.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/test_author.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/test_report.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/usage.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/install-agent.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/pyproject.toml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/setup.cfg +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/__init__.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/backends.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/conftest.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_ci.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_supervisor_3366.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_client.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_config.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_db.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_queue_max_parallel_config.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_events.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_init.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_models.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_network.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_repo_max_parallel_3423.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_restart_cmd.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_review.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_session.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_split.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_state.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.510 → code_coordinator-0.5.512}/tests/write_parity.py +0 -0
|
@@ -76,6 +76,7 @@ coord/dr_promote.py
|
|
|
76
76
|
coord/dr_verify.py
|
|
77
77
|
coord/drive.py
|
|
78
78
|
coord/drive_queue.py
|
|
79
|
+
coord/drive_sessions_snapshot.py
|
|
79
80
|
coord/drive_state.py
|
|
80
81
|
coord/events.py
|
|
81
82
|
coord/failure_class.py
|
|
@@ -622,6 +623,7 @@ tests/test_drive_queue_max_parallel_config.py
|
|
|
622
623
|
tests/test_drive_queue_max_parallel_per_repo_config.py
|
|
623
624
|
tests/test_drive_queue_roll_pending.py
|
|
624
625
|
tests/test_drive_queue_self_cordon_escalation.py
|
|
626
|
+
tests/test_drive_sessions_snapshot.py
|
|
625
627
|
tests/test_drive_state.py
|
|
626
628
|
tests/test_drive_tmux.py
|
|
627
629
|
tests/test_epic_up_capability_detection.py
|
{code_coordinator-0.5.510 → code_coordinator-0.5.512}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -136,6 +136,7 @@
|
|
|
136
136
|
"coord/dr_verify.py",
|
|
137
137
|
"coord/drive.py",
|
|
138
138
|
"coord/drive_queue.py",
|
|
139
|
+
"coord/drive_sessions_snapshot.py",
|
|
139
140
|
"coord/drive_state.py",
|
|
140
141
|
"coord/events.py",
|
|
141
142
|
"coord/failure_class.py",
|
|
@@ -648,6 +649,7 @@
|
|
|
648
649
|
"tests/test_drive_queue_max_parallel_per_repo_config.py",
|
|
649
650
|
"tests/test_drive_queue_roll_pending.py",
|
|
650
651
|
"tests/test_drive_queue_self_cordon_escalation.py",
|
|
652
|
+
"tests/test_drive_sessions_snapshot.py",
|
|
651
653
|
"tests/test_drive_state.py",
|
|
652
654
|
"tests/test_drive_tmux.py",
|
|
653
655
|
"tests/test_epic_up_capability_detection.py",
|
|
@@ -62,6 +62,11 @@ import typing
|
|
|
62
62
|
from collections.abc import Mapping
|
|
63
63
|
from typing import Any, Union
|
|
64
64
|
|
|
65
|
+
# #3428: the `concurrency` block's `occupancy_state` value set — owned by the
|
|
66
|
+
# snapshot module that produces it (see `BoardConcurrency` below). Safe at
|
|
67
|
+
# module scope: that module imports nothing from `coord` at import time.
|
|
68
|
+
from coord.drive_sessions_snapshot import OCCUPANCY_UNOBSERVED
|
|
69
|
+
|
|
65
70
|
#: What the read path actually hands the projection. ``sqlite3.Row`` is *not*
|
|
66
71
|
#: a ``Mapping`` (see :func:`_as_dict`), so it has to be named explicitly.
|
|
67
72
|
RowLike = Union[Mapping[str, Any], sqlite3.Row]
|
|
@@ -310,6 +315,236 @@ class BoardDriveQueueEntry:
|
|
|
310
315
|
apply_verdict_at: float | None = None
|
|
311
316
|
|
|
312
317
|
|
|
318
|
+
# ── #3428 (#3408 item 3): concurrency ceilings + provenance + occupancy ──────
|
|
319
|
+
#
|
|
320
|
+
# The three dataclasses below are NOT a table projection — there is no
|
|
321
|
+
# `concurrency` table — so they are absent from `BOARD_PROJECTIONS` and
|
|
322
|
+
# `decode_row()` never touches them. They exist to give the *computed*
|
|
323
|
+
# `coord.drive_queue.CeilingResolution` (already resolved on the daemon host
|
|
324
|
+
# by `coord config --effective`'s own machinery — see that command's
|
|
325
|
+
# docstring) an explicit wire shape, the same way `BoardAssignment` etc. give
|
|
326
|
+
# one to a raw DB row. `coord/serve_app.py`'s `board()` handler builds a
|
|
327
|
+
# `BoardConcurrency` per request (never persisted) and adds it to the
|
|
328
|
+
# `/board` payload as the sibling key ``concurrency`` — same posture as
|
|
329
|
+
# ``roll_pending``/``goal_header``: additive, absent-tolerant, never required.
|
|
330
|
+
#
|
|
331
|
+
# Deliberately does NOT import `coord.drive_queue` at module scope:
|
|
332
|
+
# `coord.drive_queue` transitively imports THIS module (via
|
|
333
|
+
# `coord.merge_queue` -> `coord.state` -> `coord.board_schema`), so a
|
|
334
|
+
# top-level `from coord.drive_queue import CeilingResolution` here would be a
|
|
335
|
+
# real import cycle, not just an ugly one. `CeilingResolution` is referenced
|
|
336
|
+
# only for typing (`from __future__ import annotations` makes the annotation
|
|
337
|
+
# itself lazy) and duck-typed at runtime by :func:`board_ceiling_from_resolution`.
|
|
338
|
+
# (`coord.drive_sessions_snapshot`, which owns the `occupancy_state` value
|
|
339
|
+
# set `BoardConcurrency` below defaults to, is by contrast imported at the
|
|
340
|
+
# TOP of this file: it imports nothing from `coord` at module scope — its own
|
|
341
|
+
# tmux/queue imports are deferred into `refresh()` — so it cannot close a
|
|
342
|
+
# cycle back through here.)
|
|
343
|
+
if typing.TYPE_CHECKING: # pragma: no cover — typing only
|
|
344
|
+
from coord.drive_queue import CeilingResolution
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
#: `BoardCeiling.source_kind` / `BoardCeilingSource.source_kind`'s closed
|
|
348
|
+
#: value set (#3428) — a machine-readable classification of
|
|
349
|
+
#: `CeilingResolution.source`'s free-text prose (written for `coord config
|
|
350
|
+
#: --effective`'s human-readable output), so a client can style/filter a
|
|
351
|
+
#: ceiling's provenance without string-matching wording that is free to
|
|
352
|
+
#: change. See :func:`classify_ceiling_source` for the mapping.
|
|
353
|
+
CEILING_SOURCE_KIND_SYSTEMD_FLAG = "systemd_flag"
|
|
354
|
+
CEILING_SOURCE_KIND_CLI_FLAG = "cli_flag"
|
|
355
|
+
CEILING_SOURCE_KIND_COORDINATOR_YML_REPO = "coordinator_yml_repo"
|
|
356
|
+
CEILING_SOURCE_KIND_COORDINATOR_YML_PIPELINE = "coordinator_yml_pipeline"
|
|
357
|
+
CEILING_SOURCE_KIND_COORDINATOR_YML_CONCURRENCY = "coordinator_yml_concurrency"
|
|
358
|
+
CEILING_SOURCE_KIND_DERIVED = "derived"
|
|
359
|
+
CEILING_SOURCE_KIND_DEFAULT = "default"
|
|
360
|
+
#: A `CeilingResolution.source` this classifier doesn't recognise — should
|
|
361
|
+
#: never actually appear on a real `/board` payload (every source string
|
|
362
|
+
#: `coord.drive_queue`'s resolvers produce is covered below), but a client
|
|
363
|
+
#: must still be able to parse it rather than choke: unlike the DTOs above,
|
|
364
|
+
#: `source_kind` degrading to "unknown" is a display nit, not a #632-class
|
|
365
|
+
#: parse failure.
|
|
366
|
+
CEILING_SOURCE_KIND_UNKNOWN = "unknown"
|
|
367
|
+
|
|
368
|
+
CEILING_SOURCE_KINDS: frozenset[str] = frozenset(
|
|
369
|
+
{
|
|
370
|
+
CEILING_SOURCE_KIND_SYSTEMD_FLAG,
|
|
371
|
+
CEILING_SOURCE_KIND_CLI_FLAG,
|
|
372
|
+
CEILING_SOURCE_KIND_COORDINATOR_YML_REPO,
|
|
373
|
+
CEILING_SOURCE_KIND_COORDINATOR_YML_PIPELINE,
|
|
374
|
+
CEILING_SOURCE_KIND_COORDINATOR_YML_CONCURRENCY,
|
|
375
|
+
CEILING_SOURCE_KIND_DERIVED,
|
|
376
|
+
CEILING_SOURCE_KIND_DEFAULT,
|
|
377
|
+
CEILING_SOURCE_KIND_UNKNOWN,
|
|
378
|
+
}
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def classify_ceiling_source(source: str) -> str:
|
|
383
|
+
"""Map one `CeilingResolution.source` (or one of its `losing` entries'
|
|
384
|
+
source names) prose string to a :data:`CEILING_SOURCE_KINDS` enum value.
|
|
385
|
+
|
|
386
|
+
Ordered by specificity, matching the exact strings
|
|
387
|
+
`coord.drive_queue`'s resolvers / `coord.commands.setup._print_effective_
|
|
388
|
+
concurrency` actually construct today:
|
|
389
|
+
|
|
390
|
+
* ``"systemd ExecStart --max-parallel..."`` (`read_systemd_max_parallel_
|
|
391
|
+
flags` via `coord.commands.setup`'s ``per_repo_source``/
|
|
392
|
+
``max_parallel_source``) -> ``systemd_flag`` — the #3408 incident
|
|
393
|
+
source: a machine-local flag a thin client can never see for itself.
|
|
394
|
+
* ``"--max-parallel[-per-repo] flag"`` (an explicit CLI override on
|
|
395
|
+
`coord drive-queue tick`'s own invocation) -> ``cli_flag``.
|
|
396
|
+
* ``"coordinator.yml repos[<name>].max_parallel"`` (#3423 per-repo
|
|
397
|
+
override) -> ``coordinator_yml_repo``.
|
|
398
|
+
* ``"coordinator.yml pipeline.max_parallel..."`` -> ``coordinator_yml_pipeline``.
|
|
399
|
+
* ``"coordinator.yml concurrency.max_workers"`` (this module's own
|
|
400
|
+
synthetic resolution for the fleet worker cap — see
|
|
401
|
+
:func:`board_ceiling_from_resolution`'s caller in `coord/serve_app.py`)
|
|
402
|
+
-> ``coordinator_yml_concurrency``.
|
|
403
|
+
* ``"derived (...)"`` (`default_max_parallel`'s repo-shape derivation)
|
|
404
|
+
-> ``derived``.
|
|
405
|
+
* ``"default (...)"`` (the hardcoded fallback, config unreadable) ->
|
|
406
|
+
``default``.
|
|
407
|
+
* anything else -> ``unknown`` (fail-soft; see that constant's docstring).
|
|
408
|
+
"""
|
|
409
|
+
if source.startswith("systemd ExecStart"):
|
|
410
|
+
return CEILING_SOURCE_KIND_SYSTEMD_FLAG
|
|
411
|
+
if source.startswith("coordinator.yml repos["):
|
|
412
|
+
return CEILING_SOURCE_KIND_COORDINATOR_YML_REPO
|
|
413
|
+
if source.startswith("coordinator.yml pipeline."):
|
|
414
|
+
return CEILING_SOURCE_KIND_COORDINATOR_YML_PIPELINE
|
|
415
|
+
if source.startswith("coordinator.yml concurrency."):
|
|
416
|
+
return CEILING_SOURCE_KIND_COORDINATOR_YML_CONCURRENCY
|
|
417
|
+
if source.startswith("derived"):
|
|
418
|
+
return CEILING_SOURCE_KIND_DERIVED
|
|
419
|
+
if source.startswith("default"):
|
|
420
|
+
return CEILING_SOURCE_KIND_DEFAULT
|
|
421
|
+
if source.startswith("--") and source.endswith("flag"):
|
|
422
|
+
return CEILING_SOURCE_KIND_CLI_FLAG
|
|
423
|
+
return CEILING_SOURCE_KIND_UNKNOWN
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
@dataclasses.dataclass(kw_only=True)
|
|
427
|
+
class BoardCeilingSource:
|
|
428
|
+
"""One LOSING source's own opinion for a :class:`BoardCeiling` (#3428) —
|
|
429
|
+
the wire twin of one ``(name, value)`` pair in a
|
|
430
|
+
`coord.drive_queue.CeilingResolution.losing` tuple. This is the whole
|
|
431
|
+
point of shipping provenance at all: it is what tells an operator that
|
|
432
|
+
editing ``coordinator.yml``/``coord-settings`` is futile while a
|
|
433
|
+
machine-local systemd flag outranks it (#3408's reported incident).
|
|
434
|
+
"""
|
|
435
|
+
|
|
436
|
+
source: str
|
|
437
|
+
source_kind: str
|
|
438
|
+
value: int
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
@dataclasses.dataclass(kw_only=True)
|
|
442
|
+
class BoardCeiling:
|
|
443
|
+
"""One resolved concurrency ceiling + provenance (#3428) — the `/board`
|
|
444
|
+
wire twin of `coord.drive_queue.CeilingResolution`, the exact resolution
|
|
445
|
+
`coord config --effective` and `coord drive-queue tick` itself already
|
|
446
|
+
use (#2085 "one question, one answer": this block is never a second,
|
|
447
|
+
independently-derived answer).
|
|
448
|
+
|
|
449
|
+
``source`` carries the same free-text `CeilingResolution.source` a human
|
|
450
|
+
reads in `coord config --effective`'s output; ``source_kind`` is the
|
|
451
|
+
machine-readable classification of it (:func:`classify_ceiling_source`)
|
|
452
|
+
a client should actually branch on. ``losing`` is ``None`` (not ``[]``)
|
|
453
|
+
when nothing else was configured, matching `CeilingResolution.losing`'s
|
|
454
|
+
own "empty means nobody else had an opinion" contract.
|
|
455
|
+
"""
|
|
456
|
+
|
|
457
|
+
name: str
|
|
458
|
+
value: int
|
|
459
|
+
source: str
|
|
460
|
+
source_kind: str
|
|
461
|
+
losing: list[BoardCeilingSource] | None = None
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
def board_ceiling_from_resolution(resolution: "CeilingResolution") -> BoardCeiling:
|
|
465
|
+
"""`coord.drive_queue.CeilingResolution` -> its `/board` wire shape.
|
|
466
|
+
|
|
467
|
+
Duck-typed on purpose (reads ``.name``/``.value``/``.source``/``.losing``
|
|
468
|
+
rather than importing the real class) — see the module note above this
|
|
469
|
+
section for why `coord.drive_queue` cannot be imported here at runtime.
|
|
470
|
+
"""
|
|
471
|
+
losing = [
|
|
472
|
+
BoardCeilingSource(
|
|
473
|
+
source=name, source_kind=classify_ceiling_source(name), value=value
|
|
474
|
+
)
|
|
475
|
+
for name, value in resolution.losing
|
|
476
|
+
] or None
|
|
477
|
+
return BoardCeiling(
|
|
478
|
+
name=resolution.name,
|
|
479
|
+
value=resolution.value,
|
|
480
|
+
source=resolution.source,
|
|
481
|
+
source_kind=classify_ceiling_source(resolution.source),
|
|
482
|
+
losing=losing,
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
@dataclasses.dataclass(kw_only=True)
|
|
487
|
+
class BoardConcurrency:
|
|
488
|
+
"""The `/board` payload's ``concurrency`` block (#3428, #3408 item 3):
|
|
489
|
+
every ceiling `coord drive-queue tick` actually enforces, resolved on
|
|
490
|
+
THIS (the daemon) host, plus current occupancy against each.
|
|
491
|
+
|
|
492
|
+
**Resolved server-side, always** — the systemd-flag source
|
|
493
|
+
(:data:`CEILING_SOURCE_KIND_SYSTEMD_FLAG`) is machine-local and invisible
|
|
494
|
+
to a thin client (a Rust TUI, a phone webapp) by construction; a client
|
|
495
|
+
deriving ceilings from its own cached ``coordinator.yml`` would
|
|
496
|
+
confidently print the config value while a host-local flag silently
|
|
497
|
+
outranked it — the exact #3408 failure this block exists to end.
|
|
498
|
+
|
|
499
|
+
``repo_overrides`` carries only the repos whose OWN ``repos[].max_parallel``
|
|
500
|
+
(#3423) actually differs from ``max_parallel_per_repo``'s fleet-wide
|
|
501
|
+
value — mirroring `coord.drive_queue.effective_repo_capacities`'s own
|
|
502
|
+
"only the repos that disagree" trim (see that function's docstring):
|
|
503
|
+
listing every repo would bury the ones that matter and make an
|
|
504
|
+
all-default fleet look like something was overridden everywhere.
|
|
505
|
+
|
|
506
|
+
``occupied``/``repo_occupied`` are `coord.drive_queue.
|
|
507
|
+
compute_running_occupancy`'s own output, verbatim — the SAME "is this
|
|
508
|
+
entry still occupying a slot" verdict `plan_tick` enforces, never a
|
|
509
|
+
second, independently-recounted number (#2085 "one question, one
|
|
510
|
+
answer").
|
|
511
|
+
|
|
512
|
+
**Occupancy is nullable, and says why (#2096).** That verdict's first
|
|
513
|
+
question about a `running` entry is "is its drive session live?", which
|
|
514
|
+
only a ``tmux list-sessions`` reading can answer — and that reading is a
|
|
515
|
+
SUBPROCESS, so it is taken on the daemon's tick cadence
|
|
516
|
+
(`coord.drive_sessions_snapshot`), never inline off this read path (the
|
|
517
|
+
`/board` invariant 1 that `tests/test_board_read_path.py` enforces). When
|
|
518
|
+
the daemon has not taken a reading yet, or its refresh loop has stalled
|
|
519
|
+
(#2862) and the last one is too old to be evidence about now,
|
|
520
|
+
``occupied``/``repo_occupied`` are ``None`` and ``occupancy_state`` says
|
|
521
|
+
which — never a confidently-wrong ``0`` that a client would render as
|
|
522
|
+
"all slots free". ``occupancy_observed_at`` is the wall-clock moment of
|
|
523
|
+
the reading behind the numbers (``None`` when there has never been one),
|
|
524
|
+
so a client can show — and age out — the numbers itself.
|
|
525
|
+
|
|
526
|
+
The CEILINGS are unaffected by any of that: they are resolved from
|
|
527
|
+
config + this host's systemd unit on every build, so they stay populated
|
|
528
|
+
even when occupancy is unknown.
|
|
529
|
+
|
|
530
|
+
Absent-tolerant in both directions (#3428 acceptance): an older daemon
|
|
531
|
+
simply omits the ``concurrency`` key entirely (never ships it as e.g. an
|
|
532
|
+
empty object), and a newer client must not require the key to parse an
|
|
533
|
+
otherwise-valid board.
|
|
534
|
+
"""
|
|
535
|
+
|
|
536
|
+
max_parallel: BoardCeiling
|
|
537
|
+
max_parallel_per_repo: BoardCeiling
|
|
538
|
+
max_workers: BoardCeiling
|
|
539
|
+
repo_overrides: dict[str, BoardCeiling]
|
|
540
|
+
#: ``None`` unless ``occupancy_state`` is
|
|
541
|
+
#: :data:`~coord.drive_sessions_snapshot.OCCUPANCY_OBSERVED`.
|
|
542
|
+
occupied: int | None = None
|
|
543
|
+
repo_occupied: dict[str, int] | None = None
|
|
544
|
+
#: One of :data:`~coord.drive_sessions_snapshot.OCCUPANCY_STATES`.
|
|
545
|
+
occupancy_state: str = OCCUPANCY_UNOBSERVED
|
|
546
|
+
occupancy_observed_at: float | None = None
|
|
547
|
+
|
|
313
548
|
|
|
314
549
|
#: ``table name`` → the DTO that defines its ``/board`` wire shape. These are
|
|
315
550
|
#: exactly the seven projections ``coord/serve_app.py`` publishes under
|
|
@@ -874,10 +874,24 @@ def default_systemd_user_unit_path(unit_name: str = DRIVE_QUEUE_UNIT_NAME) -> Pa
|
|
|
874
874
|
|
|
875
875
|
def parse_max_parallel_flags_from_execstart(unit_text: str) -> dict[str, int]:
|
|
876
876
|
"""Extract a hardcoded ``--max-parallel``/``--max-parallel-per-repo``
|
|
877
|
-
integer from a systemd unit's ``ExecStart=`` line
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
877
|
+
integer from a systemd unit's ``ExecStart=`` line — and ONLY that line
|
|
878
|
+
(#3429). Pure and independently testable — the sole reason this is split
|
|
879
|
+
out from :func:`read_systemd_max_parallel_flags`, which does the actual
|
|
880
|
+
(unstubbable) file read.
|
|
881
|
+
|
|
882
|
+
#3429: this used to regex the WHOLE unit file's text, which its own
|
|
883
|
+
docstring called "harmless". It was not — a #2573 explanatory comment in
|
|
884
|
+
the packaged unit (`coord/deploy/coord-drive-queue.service`) mentions
|
|
885
|
+
"--max-parallel-per-repo 2" in prose, describing a drop-in that USED to
|
|
886
|
+
exist and should be deleted, and that comment's `2` was being read back
|
|
887
|
+
as a live systemd override, inventing a flag nobody set, outranking a
|
|
888
|
+
real `coordinator.yml` value, suppressing the real per-repo override
|
|
889
|
+
line, and firing a false "your config has no effect" warning — on the
|
|
890
|
+
one host (the daemon host) where this function's output is trusted.
|
|
891
|
+
Scoping the scan to the `ExecStart=` line only is the fix: systemd
|
|
892
|
+
itself only ever reads flags from there, and comments (whether inline
|
|
893
|
+
`#...` above/around it or, in principle, a stray `#` mid-line) cannot
|
|
894
|
+
masquerade as part of it because they live on other lines entirely.
|
|
881
895
|
|
|
882
896
|
``--max-parallel-per-repo`` is checked before ``--max-parallel``: both
|
|
883
897
|
regexes require the character right after the flag name to be a space
|
|
@@ -885,20 +899,28 @@ def parse_max_parallel_flags_from_execstart(unit_text: str) -> dict[str, int]:
|
|
|
885
899
|
``--max-parallel`` with a stray ``-per-repo`` suffix — but per-repo is
|
|
886
900
|
still matched first here for readability, not correctness.
|
|
887
901
|
|
|
888
|
-
Returns ``{}`` when
|
|
889
|
-
purpose, from "this text was not a
|
|
890
|
-
(:func:`read_systemd_max_parallel_flags`)
|
|
891
|
-
file into the same empty result, since both
|
|
892
|
-
every consumer of this function.
|
|
902
|
+
Returns ``{}`` when there is no ``ExecStart=`` line, or it carries
|
|
903
|
+
neither flag — indistinguishable, on purpose, from "this text was not a
|
|
904
|
+
real unit at all"; the caller (:func:`read_systemd_max_parallel_flags`)
|
|
905
|
+
folds an unreadable/missing file into the same empty result, since both
|
|
906
|
+
mean "no override known" to every consumer of this function.
|
|
893
907
|
"""
|
|
908
|
+
execstart_line = None
|
|
909
|
+
for line in unit_text.splitlines():
|
|
910
|
+
stripped = line.strip()
|
|
911
|
+
if stripped.startswith("ExecStart="):
|
|
912
|
+
execstart_line = stripped
|
|
913
|
+
break
|
|
914
|
+
if execstart_line is None:
|
|
915
|
+
return {}
|
|
894
916
|
result: dict[str, int] = {}
|
|
895
|
-
per_repo_match = re.search(r"--max-parallel-per-repo[ =](\d+)",
|
|
917
|
+
per_repo_match = re.search(r"--max-parallel-per-repo[ =](\d+)", execstart_line)
|
|
896
918
|
if per_repo_match:
|
|
897
919
|
result["max_parallel_per_repo"] = int(per_repo_match.group(1))
|
|
898
920
|
# `--max-parallel` must not also match the `--max-parallel-per-repo`
|
|
899
921
|
# occurrence above — requiring a space/`=` right after `max-parallel`
|
|
900
922
|
# means the character there is `-` for the per-repo flag, never a match.
|
|
901
|
-
max_parallel_match = re.search(r"--max-parallel[ =](\d+)",
|
|
923
|
+
max_parallel_match = re.search(r"--max-parallel[ =](\d+)", execstart_line)
|
|
902
924
|
if max_parallel_match:
|
|
903
925
|
result["max_parallel"] = int(max_parallel_match.group(1))
|
|
904
926
|
return result
|
|
@@ -966,6 +988,109 @@ def compute_running_occupancy(
|
|
|
966
988
|
return occupied, repo_occupied
|
|
967
989
|
|
|
968
990
|
|
|
991
|
+
@dataclass(frozen=True)
|
|
992
|
+
class ConcurrencyReport:
|
|
993
|
+
"""Every concurrency ceiling `coord drive-queue tick` enforces, resolved
|
|
994
|
+
together in the SAME order + SAME primitives ``coord config --effective``
|
|
995
|
+
(`coord.commands.setup._print_effective_concurrency`) already applies
|
|
996
|
+
(#3408), plus current occupancy against each — the one call a daemon-host
|
|
997
|
+
caller should make rather than re-deriving the wiring itself (#3428,
|
|
998
|
+
#2085 "one question, one answer").
|
|
999
|
+
|
|
1000
|
+
``repo_resolutions`` is EVERY repo's own :class:`CeilingResolution`
|
|
1001
|
+
(#3423), keyed by name — :func:`resolve_repo_ceilings`'s full table.
|
|
1002
|
+
``repo_overrides`` is the trimmed subset that actually differs from
|
|
1003
|
+
``max_parallel_per_repo``'s fleet-wide value —
|
|
1004
|
+
:func:`effective_repo_capacities`'s own shape, and also what
|
|
1005
|
+
``max_parallel``'s own resolution is computed against (a repo with no
|
|
1006
|
+
override contributes the fleet figure to that sum, not its own name).
|
|
1007
|
+
"""
|
|
1008
|
+
|
|
1009
|
+
max_parallel: CeilingResolution
|
|
1010
|
+
max_parallel_per_repo: CeilingResolution
|
|
1011
|
+
max_workers: CeilingResolution
|
|
1012
|
+
repo_resolutions: dict[str, CeilingResolution]
|
|
1013
|
+
repo_overrides: dict[str, int]
|
|
1014
|
+
occupied: int
|
|
1015
|
+
repo_occupied: dict[str, int]
|
|
1016
|
+
|
|
1017
|
+
|
|
1018
|
+
def resolve_concurrency_report(
|
|
1019
|
+
*,
|
|
1020
|
+
repo_overrides: Mapping[str, int | None],
|
|
1021
|
+
pipeline_max_parallel: int | None,
|
|
1022
|
+
pipeline_max_parallel_per_repo: int | None,
|
|
1023
|
+
max_workers_cap: int,
|
|
1024
|
+
systemd_flags: Mapping[str, int] | None = None,
|
|
1025
|
+
entries: Sequence["QueueEntry"] = (),
|
|
1026
|
+
board: "BoardView | None" = None,
|
|
1027
|
+
max_attempts: int = DEFAULT_MAX_ATTEMPTS,
|
|
1028
|
+
now: float | None = None,
|
|
1029
|
+
local_host: str | None = None,
|
|
1030
|
+
) -> ConcurrencyReport:
|
|
1031
|
+
"""Resolve every concurrency ceiling in one call (#3428).
|
|
1032
|
+
|
|
1033
|
+
*repo_overrides* is ``{repo_name: repos[].max_parallel or None}`` for
|
|
1034
|
+
EVERY repo in the fleet (not just the overridden ones — see
|
|
1035
|
+
:func:`resolve_repo_ceilings`). *systemd_flags* defaults to a fresh
|
|
1036
|
+
:func:`read_systemd_max_parallel_flags` read of THIS machine's own
|
|
1037
|
+
installed unit when not given (a caller with an already-read dict, e.g.
|
|
1038
|
+
a test, passes it explicitly rather than touching the filesystem).
|
|
1039
|
+
|
|
1040
|
+
*board*/*entries* are `compute_running_occupancy`'s own arguments;
|
|
1041
|
+
*board* left ``None`` (the default) skips occupancy entirely
|
|
1042
|
+
(``occupied=0``, ``repo_occupied={}``) rather than raising — a caller
|
|
1043
|
+
that only wants the ceilings (no live queue state) does not need to
|
|
1044
|
+
fabricate an empty :class:`BoardView`.
|
|
1045
|
+
"""
|
|
1046
|
+
flags = systemd_flags if systemd_flags is not None else read_systemd_max_parallel_flags()
|
|
1047
|
+
|
|
1048
|
+
per_repo_resolution = resolve_max_parallel_per_repo(
|
|
1049
|
+
override_value=flags.get("max_parallel_per_repo"),
|
|
1050
|
+
override_source="systemd ExecStart --max-parallel-per-repo",
|
|
1051
|
+
config_value=pipeline_max_parallel_per_repo,
|
|
1052
|
+
)
|
|
1053
|
+
repo_resolutions = resolve_repo_ceilings(repo_overrides, fleet=per_repo_resolution)
|
|
1054
|
+
effective_repo_overrides = effective_repo_capacities(
|
|
1055
|
+
repo_resolutions, fleet_value=per_repo_resolution.value
|
|
1056
|
+
)
|
|
1057
|
+
|
|
1058
|
+
global_resolution = resolve_max_parallel(
|
|
1059
|
+
override_value=flags.get("max_parallel"),
|
|
1060
|
+
override_source="systemd ExecStart --max-parallel",
|
|
1061
|
+
config_value=pipeline_max_parallel,
|
|
1062
|
+
repo_count=len(repo_overrides),
|
|
1063
|
+
max_parallel_per_repo=per_repo_resolution.value,
|
|
1064
|
+
max_workers_cap=max_workers_cap,
|
|
1065
|
+
repo_overrides=effective_repo_overrides,
|
|
1066
|
+
)
|
|
1067
|
+
# `concurrency.max_workers` has exactly one source today — nothing can
|
|
1068
|
+
# beat `coordinator.yml`'s own value — but the wire/report shape stays
|
|
1069
|
+
# uniform across all three ceilings (#3428's own contract), so it is
|
|
1070
|
+
# wrapped in the same `CeilingResolution` shape the other two use, with
|
|
1071
|
+
# an always-empty `losing`.
|
|
1072
|
+
max_workers_resolution = CeilingResolution(
|
|
1073
|
+
"max_workers", max_workers_cap, "coordinator.yml concurrency.max_workers"
|
|
1074
|
+
)
|
|
1075
|
+
|
|
1076
|
+
if board is not None:
|
|
1077
|
+
occupied, repo_occupied = compute_running_occupancy(
|
|
1078
|
+
entries, board, max_attempts, now=now, local_host=local_host
|
|
1079
|
+
)
|
|
1080
|
+
else:
|
|
1081
|
+
occupied, repo_occupied = 0, {}
|
|
1082
|
+
|
|
1083
|
+
return ConcurrencyReport(
|
|
1084
|
+
max_parallel=global_resolution,
|
|
1085
|
+
max_parallel_per_repo=per_repo_resolution,
|
|
1086
|
+
max_workers=max_workers_resolution,
|
|
1087
|
+
repo_resolutions=repo_resolutions,
|
|
1088
|
+
repo_overrides=effective_repo_overrides,
|
|
1089
|
+
occupied=occupied,
|
|
1090
|
+
repo_occupied=repo_occupied,
|
|
1091
|
+
)
|
|
1092
|
+
|
|
1093
|
+
|
|
969
1094
|
# ── the startup grace window (#1794) ─────────────────────────────────────────
|
|
970
1095
|
#
|
|
971
1096
|
# A drive is NOT established the instant `coord drive --tmux` exits 0. #1606's
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""Tick-refreshed snapshot of this host's live drive tmux sessions (#3428).
|
|
2
|
+
|
|
3
|
+
**Invariant 1 of the ``/board`` read path: read endpoints perform no
|
|
4
|
+
third-party I/O** (``coord.gate_snapshot``'s own opening line, and the
|
|
5
|
+
enforcement test ``tests/test_board_read_path.py::
|
|
6
|
+
test_board_read_makes_zero_gh_calls``, which fails the build on *any*
|
|
7
|
+
subprocess spawned while a board is built).
|
|
8
|
+
|
|
9
|
+
:func:`coord.drive.list_drive_sessions` is a ``tmux list-sessions``
|
|
10
|
+
**subprocess** with a 5 s timeout. The #3428 ``concurrency`` block needs its
|
|
11
|
+
answer — occupancy is computed by :func:`coord.drive_queue.
|
|
12
|
+
compute_running_occupancy`, whose very first question about a ``running``
|
|
13
|
+
entry is "is its drive session live?" — but calling it inline off the board
|
|
14
|
+
handler would put a process spawn (and, on a wedged tmux server, a 5 s stall)
|
|
15
|
+
on the hottest read path in the daemon, once per cold build. That is exactly
|
|
16
|
+
the ``gh``-on-``/board`` mechanism of the #762/#715/#1336 timeout-overrun
|
|
17
|
+
class, with tmux swapped in for GitHub.
|
|
18
|
+
|
|
19
|
+
So the reading moves to the daemon's tick cadence, the same shape
|
|
20
|
+
``GateSnapshotRefresher`` / ``FleetHealthRefresher`` / ``MachineMetricsSampler``
|
|
21
|
+
already use: :meth:`DriveSessionsRefresher.refresh` (tick side, the ONLY
|
|
22
|
+
subprocess) publishes an immutable :class:`DriveSessionsSnapshot`, and the
|
|
23
|
+
board handler consumes the last one published with a bare attribute read.
|
|
24
|
+
|
|
25
|
+
**The snapshot states its own freshness, and "I did not observe this" is a
|
|
26
|
+
reachable verdict (#2096).** An occupancy count is only as true as the
|
|
27
|
+
session reading behind it, and *two* real conditions leave that reading
|
|
28
|
+
absent rather than merely empty:
|
|
29
|
+
|
|
30
|
+
* the daemon has not taken one yet — a just-restarted ``coord serve``, or a
|
|
31
|
+
deployment with the refresh loop disabled (``COORD_DRIVE_SESSIONS_REFRESH_
|
|
32
|
+
INTERVAL=0``); and
|
|
33
|
+
* the refresh loop stopped — the bare ``asyncio.create_task`` loops in
|
|
34
|
+
``coord/serve_app.py`` have no supervisor (#2862), so a loop that dies
|
|
35
|
+
stays dead until the daemon restarts, and its last snapshot would otherwise
|
|
36
|
+
keep being served as current forever.
|
|
37
|
+
|
|
38
|
+
In both cases occupancy is reported as ``None`` with an
|
|
39
|
+
:data:`OCCUPANCY_STATES` label saying which, never as a confidently-wrong
|
|
40
|
+
``0``. A "0 of 4 slots in use" that actually meant "nobody looked" is the
|
|
41
|
+
same defect class as a green gate that only proves the request was issued.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
from __future__ import annotations
|
|
45
|
+
|
|
46
|
+
import time
|
|
47
|
+
from dataclasses import dataclass, field
|
|
48
|
+
from typing import Any
|
|
49
|
+
|
|
50
|
+
#: How old the last reading may be before it stops counting as current.
|
|
51
|
+
#: Deliberately several multiples of the daemon's default refresh cadence
|
|
52
|
+
#: (``COORD_DRIVE_SESSIONS_REFRESH_INTERVAL``, 15 s) so an ordinary slow tick
|
|
53
|
+
#: — or one pass that lost its race with a 5 s ``tmux`` timeout — does not
|
|
54
|
+
#: flap the label, while a loop that has genuinely stopped (#2862) crosses it
|
|
55
|
+
#: within a minute.
|
|
56
|
+
STALE_AFTER_SECONDS = 90.0
|
|
57
|
+
|
|
58
|
+
#: A reading was taken within :data:`STALE_AFTER_SECONDS` — the occupancy
|
|
59
|
+
#: numbers built from it are current.
|
|
60
|
+
OCCUPANCY_OBSERVED = "observed"
|
|
61
|
+
#: No reading has EVER been taken by this daemon (fresh start, or the refresh
|
|
62
|
+
#: loop is disabled). Occupancy is unknown, not zero.
|
|
63
|
+
OCCUPANCY_UNOBSERVED = "unobserved"
|
|
64
|
+
#: A reading was taken, but too long ago to be evidence about now — the
|
|
65
|
+
#: refresh loop has stalled or died. Occupancy is unknown, not last-known.
|
|
66
|
+
OCCUPANCY_STALE = "stale"
|
|
67
|
+
|
|
68
|
+
#: The closed value set for the ``/board`` ``concurrency.occupancy_state``
|
|
69
|
+
#: field (#3428). Only :data:`OCCUPANCY_OBSERVED` carries numbers.
|
|
70
|
+
OCCUPANCY_STATES: frozenset[str] = frozenset(
|
|
71
|
+
{OCCUPANCY_OBSERVED, OCCUPANCY_UNOBSERVED, OCCUPANCY_STALE}
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@dataclass(frozen=True)
|
|
76
|
+
class DriveSessionsSnapshot:
|
|
77
|
+
"""One immutable reading of this host's live ``coord-drive-*`` sessions.
|
|
78
|
+
|
|
79
|
+
*keys* are ``coord.drive_queue.entry_key`` strings (``"repo#N"``) —
|
|
80
|
+
exactly what :func:`coord.drive_queue.build_board_view` accepts as its
|
|
81
|
+
``live_sessions`` argument, so the board's occupancy is computed from the
|
|
82
|
+
identical input ``coord drive-queue tick`` feeds it.
|
|
83
|
+
|
|
84
|
+
*observed_at* is the wall-clock (``time.time()``) moment the reading was
|
|
85
|
+
taken, or ``None`` for the never-refreshed default — the distinction
|
|
86
|
+
:meth:`state` turns into a label. Wall-clock rather than monotonic on
|
|
87
|
+
purpose: it is also carried on the wire so a client can show how old the
|
|
88
|
+
numbers are.
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
keys: frozenset[str] = field(default_factory=frozenset)
|
|
92
|
+
observed_at: float | None = None
|
|
93
|
+
|
|
94
|
+
def state(
|
|
95
|
+
self,
|
|
96
|
+
*,
|
|
97
|
+
now: float | None = None,
|
|
98
|
+
stale_after: float = STALE_AFTER_SECONDS,
|
|
99
|
+
) -> str:
|
|
100
|
+
"""This snapshot's freshness as one of :data:`OCCUPANCY_STATES`."""
|
|
101
|
+
if self.observed_at is None:
|
|
102
|
+
return OCCUPANCY_UNOBSERVED
|
|
103
|
+
age = (time.time() if now is None else now) - self.observed_at
|
|
104
|
+
if age > stale_after:
|
|
105
|
+
return OCCUPANCY_STALE
|
|
106
|
+
return OCCUPANCY_OBSERVED
|
|
107
|
+
|
|
108
|
+
def is_current(
|
|
109
|
+
self,
|
|
110
|
+
*,
|
|
111
|
+
now: float | None = None,
|
|
112
|
+
stale_after: float = STALE_AFTER_SECONDS,
|
|
113
|
+
) -> bool:
|
|
114
|
+
"""Whether occupancy derived from this snapshot may be reported as a
|
|
115
|
+
number at all (``state() == OCCUPANCY_OBSERVED``)."""
|
|
116
|
+
return self.state(now=now, stale_after=stale_after) == OCCUPANCY_OBSERVED
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class DriveSessionsRefresher:
|
|
120
|
+
"""Owns the current :class:`DriveSessionsSnapshot`; refreshed by the tick.
|
|
121
|
+
|
|
122
|
+
:meth:`snapshot` is what the read path consumes — a bare attribute read
|
|
123
|
+
(atomic under CPython), never I/O. :meth:`refresh` is the only method
|
|
124
|
+
that spawns ``tmux`` and must only ever run from the daemon's tick
|
|
125
|
+
machinery (or a test driving it explicitly).
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
def __init__(self, initial: DriveSessionsSnapshot | None = None) -> None:
|
|
129
|
+
"""*initial* seeds the published snapshot — for tests that need a
|
|
130
|
+
specific freshness (a reading from 20 minutes ago, say) without
|
|
131
|
+
waiting on a real tick or spawning ``tmux``. Production callers
|
|
132
|
+
omit it and get the never-refreshed default, whose
|
|
133
|
+
:meth:`DriveSessionsSnapshot.state` is
|
|
134
|
+
:data:`OCCUPANCY_UNOBSERVED`."""
|
|
135
|
+
self._snapshot = initial if initial is not None else DriveSessionsSnapshot()
|
|
136
|
+
|
|
137
|
+
def snapshot(self) -> DriveSessionsSnapshot:
|
|
138
|
+
return self._snapshot
|
|
139
|
+
|
|
140
|
+
# ── the tick-side refresh (the ONLY subprocess) ─────────────────────────
|
|
141
|
+
def refresh(self) -> DriveSessionsSnapshot:
|
|
142
|
+
"""Take one ``tmux list-sessions`` reading and publish it.
|
|
143
|
+
|
|
144
|
+
Reads through :func:`coord.drive.list_drive_sessions` rather than
|
|
145
|
+
re-implementing the tmux call, so the board's notion of "which drives
|
|
146
|
+
are live" is literally the same function ``coord drive-queue tick``
|
|
147
|
+
consults before deciding whether a slot is occupied (#2085 "one
|
|
148
|
+
question, one answer") — including its own fail-soft contract, where
|
|
149
|
+
an unavailable tmux and a genuinely idle host both read as "no live
|
|
150
|
+
sessions".
|
|
151
|
+
|
|
152
|
+
Raises nothing of its own; a failure inside ``list_drive_sessions``
|
|
153
|
+
propagates to the caller's loop (which logs and keeps serving the
|
|
154
|
+
PREVIOUS snapshot, which then ages into :data:`OCCUPANCY_STALE` on
|
|
155
|
+
its own if the failures persist). Publishes only after the read
|
|
156
|
+
returned — a pass that raised must never stamp a fresh
|
|
157
|
+
``observed_at`` on data nobody actually observed.
|
|
158
|
+
"""
|
|
159
|
+
from coord.drive import list_drive_sessions # noqa: PLC0415
|
|
160
|
+
from coord.drive_queue import entry_key # noqa: PLC0415
|
|
161
|
+
|
|
162
|
+
rows: list[dict[str, Any]] = list_drive_sessions()
|
|
163
|
+
keys: set[str] = set()
|
|
164
|
+
for row in rows:
|
|
165
|
+
repo = row.get("repo") or ""
|
|
166
|
+
number = row.get("issue")
|
|
167
|
+
if not repo or number is None:
|
|
168
|
+
continue
|
|
169
|
+
try:
|
|
170
|
+
keys.add(entry_key(repo, int(number)))
|
|
171
|
+
except (TypeError, ValueError):
|
|
172
|
+
continue
|
|
173
|
+
snapshot = DriveSessionsSnapshot(
|
|
174
|
+
keys=frozenset(keys), observed_at=time.time()
|
|
175
|
+
)
|
|
176
|
+
self._snapshot = snapshot
|
|
177
|
+
return snapshot
|