code-coordinator 0.5.498__tar.gz → 0.5.500__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.498 → code_coordinator-0.5.500}/.github/workflows/test.yml +28 -6
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/PKG-INFO +1 -1
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/code_coordinator.egg-info/SOURCES.txt +3 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/code_coordinator.egg-info/scm_file_list.json +3 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/agent_app.py +51 -4
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/agent_update.py +3 -2
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/agent_ops.py +49 -10
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/release.py +106 -14
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/status.py +12 -2
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/config.py +18 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/machine_onboard.py +52 -3
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/models.py +13 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/release_verify.py +4 -2
- code_coordinator-0.5.500/coord/restart_cmd.py +120 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/MAC_MINI.md +10 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_app.py +17 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_deploy_units_endpoint.py +34 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_update.py +33 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_release_propagate.py +161 -3
- code_coordinator-0.5.500/tests/test_cli_status_supervisor_3366.py +91 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_config.py +36 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_machine_onboard.py +26 -0
- code_coordinator-0.5.500/tests/test_restart_cmd.py +88 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_windows_job_is_a_real_gate_2000.py +46 -11
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/.gitignore +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/CLAUDE.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/GOAL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/LICENSE +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/MANIFEST.in +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/README.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/__init__.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/agent.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/audit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/backup.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/block_log.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/board_service.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/brain.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/claim.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/cli.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/client.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/codegen.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/comments.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dao.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/db.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/deps.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/drive.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/events.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/filelock.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/freshness.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/gates.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/goal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/context.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/models.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/render.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/health/units.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/hooks.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/interactive.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/network.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/notify.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/openapi.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/parentage.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/plans.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/progress.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/release_window.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/reports.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/review.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/self_health.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/smoke.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/split_work.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/sql.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/state.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/test_author.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/test_report.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/usage.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/install-agent.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/pyproject.toml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/setup.cfg +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/__init__.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/backends.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/conftest.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_client.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_db.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_queue_max_parallel_config.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_events.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_init.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_models.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_network.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_review.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_session.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_split.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_state.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.498 → code_coordinator-0.5.500}/tests/write_parity.py +0 -0
|
@@ -111,12 +111,34 @@ jobs:
|
|
|
111
111
|
# — the matrix axis there is Python versions on Linux; this job's axis is
|
|
112
112
|
# the platform. See docs/CROSS_PLATFORM.md §9.
|
|
113
113
|
windows:
|
|
114
|
-
# #
|
|
115
|
-
#
|
|
116
|
-
#
|
|
117
|
-
#
|
|
118
|
-
#
|
|
119
|
-
|
|
114
|
+
# #3394, 2026-09-18: taken out of automatic CI by operator decision —
|
|
115
|
+
# Windows is not current work. Everything in the block above about this
|
|
116
|
+
# being a real gate (#2000) remains true of the job's SHAPE and is
|
|
117
|
+
# deliberately left intact; what changed is WHEN it runs.
|
|
118
|
+
#
|
|
119
|
+
# Why: it has failed every run sampled back to 2026-09-10 (~614
|
|
120
|
+
# AssertionError plus WinError / BackupError / FileNotFoundError / OSError,
|
|
121
|
+
# concentrated in tests/test_dr_azure_scripts.py and tests/test_agent.py).
|
|
122
|
+
# A gate that is always red gates nothing — it only kept `main` permanently
|
|
123
|
+
# red, at ~85 min of runner time per push, and that permanent redness is
|
|
124
|
+
# what made coord mark every branch baseline-red and SKIP its test stage
|
|
125
|
+
# while the gate still reported `test: passed`. #3378 item 1, #3380 and
|
|
126
|
+
# #3385 were all scoped as "make main green" and all misattributed that
|
|
127
|
+
# redness to the (advisory) postgres job.
|
|
128
|
+
#
|
|
129
|
+
# The #2039 note this replaces still describes the restore target: on
|
|
130
|
+
# `push` only, so the job is SKIPPED on `pull_request` — conclusion
|
|
131
|
+
# `skipped`, already in `ci_store._PASSING_CONCLUSIONS`, so a red Windows
|
|
132
|
+
# run surfaces on main and never blocks a PR. `windows` is not a required
|
|
133
|
+
# status check either, so branch protection is unaffected in either shape.
|
|
134
|
+
#
|
|
135
|
+
# RESTORE by putting `github.event_name == 'push'` back here when Windows
|
|
136
|
+
# becomes active work — THEN fix the ~614 failures. Only once it is green
|
|
137
|
+
# is it a gate again. Do NOT add `continue-on-error` as a shortcut: #2026
|
|
138
|
+
# found that softens the run conclusion while the check still reports
|
|
139
|
+
# `failure` to the Checks API, which stalled the whole drive queue
|
|
140
|
+
# overnight on 2026-08-08.
|
|
141
|
+
if: github.event_name == 'workflow_dispatch'
|
|
120
142
|
runs-on: windows-latest
|
|
121
143
|
steps:
|
|
122
144
|
- uses: actions/checkout@v4
|
|
@@ -143,6 +143,7 @@ coord/repo_edit.py
|
|
|
143
143
|
coord/repo_onboard.py
|
|
144
144
|
coord/reports.py
|
|
145
145
|
coord/rest_schema.py
|
|
146
|
+
coord/restart_cmd.py
|
|
146
147
|
coord/revalidate.py
|
|
147
148
|
coord/review.py
|
|
148
149
|
coord/scorecard.py
|
|
@@ -541,6 +542,7 @@ tests/test_cli_status_merge_queue.py
|
|
|
541
542
|
tests/test_cli_status_provider.py
|
|
542
543
|
tests/test_cli_status_retried_3340.py
|
|
543
544
|
tests/test_cli_status_review_finalizing.py
|
|
545
|
+
tests/test_cli_status_supervisor_3366.py
|
|
544
546
|
tests/test_cli_status_test_failed_tag.py
|
|
545
547
|
tests/test_cli_status_usage_limit.py
|
|
546
548
|
tests/test_cli_sync_comments_873.py
|
|
@@ -786,6 +788,7 @@ tests/test_repo_graph_fleet_2237.py
|
|
|
786
788
|
tests/test_repo_onboard_2220.py
|
|
787
789
|
tests/test_report_result_push.py
|
|
788
790
|
tests/test_reports.py
|
|
791
|
+
tests/test_restart_cmd.py
|
|
789
792
|
tests/test_retry.py
|
|
790
793
|
tests/test_retry_advisory_1606.py
|
|
791
794
|
tests/test_retry_escalation_classify_3360.py
|
{code_coordinator-0.5.498 → code_coordinator-0.5.500}/code_coordinator.egg-info/scm_file_list.json
RENAMED
|
@@ -257,6 +257,7 @@
|
|
|
257
257
|
"coord/repo_onboard.py",
|
|
258
258
|
"coord/reports.py",
|
|
259
259
|
"coord/rest_schema.py",
|
|
260
|
+
"coord/restart_cmd.py",
|
|
260
261
|
"coord/revalidate.py",
|
|
261
262
|
"coord/review.py",
|
|
262
263
|
"coord/scorecard.py",
|
|
@@ -567,6 +568,7 @@
|
|
|
567
568
|
"tests/test_cli_status_provider.py",
|
|
568
569
|
"tests/test_cli_status_retried_3340.py",
|
|
569
570
|
"tests/test_cli_status_review_finalizing.py",
|
|
571
|
+
"tests/test_cli_status_supervisor_3366.py",
|
|
570
572
|
"tests/test_cli_status_test_failed_tag.py",
|
|
571
573
|
"tests/test_cli_status_usage_limit.py",
|
|
572
574
|
"tests/test_cli_sync_comments_873.py",
|
|
@@ -812,6 +814,7 @@
|
|
|
812
814
|
"tests/test_repo_onboard_2220.py",
|
|
813
815
|
"tests/test_report_result_push.py",
|
|
814
816
|
"tests/test_reports.py",
|
|
817
|
+
"tests/test_restart_cmd.py",
|
|
815
818
|
"tests/test_retry.py",
|
|
816
819
|
"tests/test_retry_advisory_1606.py",
|
|
817
820
|
"tests/test_retry_escalation_classify_3360.py",
|
|
@@ -7,6 +7,7 @@ import json
|
|
|
7
7
|
import logging
|
|
8
8
|
import os
|
|
9
9
|
import re
|
|
10
|
+
import shutil
|
|
10
11
|
import subprocess
|
|
11
12
|
import sys
|
|
12
13
|
import threading
|
|
@@ -20,7 +21,7 @@ from starlette.requests import Request
|
|
|
20
21
|
from starlette.responses import JSONResponse, PlainTextResponse, Response, StreamingResponse
|
|
21
22
|
from starlette.routing import Route
|
|
22
23
|
|
|
23
|
-
from coord import __version__, agent_update
|
|
24
|
+
from coord import __version__, agent_update, restart_cmd
|
|
24
25
|
from coord.agent import RUNNING, PENDING, AgentAssignment, AgentServer, AssignmentSpec
|
|
25
26
|
from coord.dist_name import DistributionNotFoundError, resolve_installed, resolve_installed_name
|
|
26
27
|
from coord.dist_name import pkg_spec as _dist_pkg_spec
|
|
@@ -129,8 +130,13 @@ def _running_under_systemd() -> bool:
|
|
|
129
130
|
``INVOCATION_ID`` is set by systemd for every unit invocation (since
|
|
130
131
|
v232) and is the standard "am I running under systemd" signal — unlike
|
|
131
132
|
checking the parent PID, it survives the process being reparented.
|
|
133
|
+
|
|
134
|
+
Delegates to :mod:`coord.restart_cmd` (#3366) — the single place that
|
|
135
|
+
answers this, shared with the SSH-side escalation and every
|
|
136
|
+
operator-facing remediation string, so this process's own idea of its
|
|
137
|
+
supervisor can never drift from what those tell an operator.
|
|
132
138
|
"""
|
|
133
|
-
return
|
|
139
|
+
return restart_cmd.running_under_systemd()
|
|
134
140
|
|
|
135
141
|
|
|
136
142
|
def _systemctl_env() -> dict[str, str]:
|
|
@@ -1157,6 +1163,12 @@ def build_app(
|
|
|
1157
1163
|
# liveness or PID.
|
|
1158
1164
|
data["version"] = __version__
|
|
1159
1165
|
data["installed_version"] = _installed_version()
|
|
1166
|
+
# #3366: this process's own live self-report of what supervises
|
|
1167
|
+
# it — "systemd", "launchd", or null when neither is known (a dev
|
|
1168
|
+
# box, Windows). The freshest possible answer to "what restarts
|
|
1169
|
+
# this host," ahead of any static config an operator may also set
|
|
1170
|
+
# (see `coord.restart_cmd.resolve_supervisor`).
|
|
1171
|
+
data["supervisor"] = restart_cmd.local_supervisor()
|
|
1160
1172
|
# Surface the most recent /update attempt so the CLI can show
|
|
1161
1173
|
# "0.3.0 → 0.4.0" or "no_change (0.3.0)" or "failed: <error>".
|
|
1162
1174
|
last = _read_last_update(server.state_dir)
|
|
@@ -1625,6 +1637,33 @@ def build_app(
|
|
|
1625
1637
|
body = {}
|
|
1626
1638
|
dry_run = bool(body.get("dry_run"))
|
|
1627
1639
|
|
|
1640
|
+
# #3366: this whole lane is systemd-unit management — on a host
|
|
1641
|
+
# with no `systemctl` at all (every macOS agent today; #1158's
|
|
1642
|
+
# launchd port ships no unit-file equivalent) every one of the
|
|
1643
|
+
# packaged units reads as "new"/"not installed here", every run,
|
|
1644
|
+
# forever. That is not drift, it is the platform, and reporting it
|
|
1645
|
+
# as drift-adjacent noise on every propagation trains the operator
|
|
1646
|
+
# to ignore this lane. Short-circuit with an honest n/a instead of
|
|
1647
|
+
# calling into `du.install_units`, which has no way to tell "not
|
|
1648
|
+
# installed yet" apart from "cannot ever be installed here".
|
|
1649
|
+
if shutil.which("systemctl") is None:
|
|
1650
|
+
supervisor = restart_cmd.local_supervisor()
|
|
1651
|
+
return JSONResponse(
|
|
1652
|
+
{
|
|
1653
|
+
"ok": True,
|
|
1654
|
+
"units": [],
|
|
1655
|
+
"dry_run": dry_run,
|
|
1656
|
+
"reloaded": False,
|
|
1657
|
+
"reload_detail": "",
|
|
1658
|
+
"timers_enabled": {},
|
|
1659
|
+
"detail": (
|
|
1660
|
+
f"n/a — no systemd on this host (supervisor: "
|
|
1661
|
+
f"{supervisor or 'unknown'})"
|
|
1662
|
+
),
|
|
1663
|
+
},
|
|
1664
|
+
status_code=200,
|
|
1665
|
+
)
|
|
1666
|
+
|
|
1628
1667
|
report = du.install_units(
|
|
1629
1668
|
machine_name=getattr(server, "machine_name", None),
|
|
1630
1669
|
port=AGENT_PORT,
|
|
@@ -1714,12 +1753,20 @@ def build_app(
|
|
|
1714
1753
|
)
|
|
1715
1754
|
|
|
1716
1755
|
if not _running_under_systemd():
|
|
1756
|
+
# #3366: name the actual supervisor, when known, instead of
|
|
1757
|
+
# only ever saying what this ISN'T (systemd) — a launchd host
|
|
1758
|
+
# reads as clearly out of scope for a systemd-only lane rather
|
|
1759
|
+
# than as unexplained drift-adjacent noise on every run.
|
|
1760
|
+
supervisor = restart_cmd.local_supervisor()
|
|
1717
1761
|
return JSONResponse(
|
|
1718
1762
|
{
|
|
1719
1763
|
"units": {},
|
|
1720
1764
|
"detail": (
|
|
1721
|
-
"this agent
|
|
1722
|
-
"can restart a sibling unit"
|
|
1765
|
+
f"this agent runs under {supervisor}, not systemd — "
|
|
1766
|
+
"nothing here can restart a sibling unit"
|
|
1767
|
+
if supervisor
|
|
1768
|
+
else "this agent is not running under systemd — nothing "
|
|
1769
|
+
"here can restart a sibling unit"
|
|
1723
1770
|
),
|
|
1724
1771
|
},
|
|
1725
1772
|
status_code=200,
|
|
@@ -85,6 +85,7 @@ import sys
|
|
|
85
85
|
from dataclasses import dataclass
|
|
86
86
|
from pathlib import Path
|
|
87
87
|
|
|
88
|
+
from coord import restart_cmd
|
|
88
89
|
from coord.platform_paths import venv_exe, venv_pip, venv_python
|
|
89
90
|
|
|
90
91
|
_log = logging.getLogger(__name__)
|
|
@@ -698,8 +699,8 @@ def perform_update(
|
|
|
698
699
|
f"and rebuild — {listed}. Replacing a running process's "
|
|
699
700
|
"site-packages leaves it executing a mix of two versions (the "
|
|
700
701
|
"2026-08-11 dellserver incident, #2121). Restart or stop those "
|
|
701
|
-
"processes —
|
|
702
|
-
"agent — and retry.",
|
|
702
|
+
f"processes — {restart_cmd.restart_hint(restart_cmd.local_supervisor())} "
|
|
703
|
+
"for the agent — and retry.",
|
|
703
704
|
holders=[
|
|
704
705
|
{"pid": h.pid, "source": h.source, "cmdline": h.cmdline}
|
|
705
706
|
for h in holders[:20]
|
|
@@ -16,7 +16,7 @@ from typing import TYPE_CHECKING, Any
|
|
|
16
16
|
import click
|
|
17
17
|
import httpx
|
|
18
18
|
|
|
19
|
-
from coord import __version__
|
|
19
|
+
from coord import __version__, restart_cmd
|
|
20
20
|
# Aliased: `agent_update` is also the name of this module's click command.
|
|
21
21
|
from coord.agent_update import cli_initiator as _cli_initiator
|
|
22
22
|
from coord.config import Config
|
|
@@ -726,10 +726,12 @@ def agent_update(
|
|
|
726
726
|
err = outcome.get("error") or "pip failed; see ~/.coord/last_update.log"
|
|
727
727
|
click.echo(f" {machine.name}: ✗ failed — {err}", err=True)
|
|
728
728
|
elif outcome.get("escalated"):
|
|
729
|
+
hint = restart_cmd.resolve_supervisor(machine, live=outcome.get("supervisor"))
|
|
729
730
|
click.echo(
|
|
730
731
|
f" {machine.name}: ✗ pip upgraded to {target_version} but the "
|
|
731
|
-
f"process is stuck reporting {version_now} even after a "
|
|
732
|
-
"
|
|
732
|
+
f"process is stuck reporting {version_now} even after a driven "
|
|
733
|
+
f"restart ({restart_cmd.restart_shell_command(hint)}) — needs "
|
|
734
|
+
"manual investigation",
|
|
733
735
|
err=True,
|
|
734
736
|
)
|
|
735
737
|
elif not outcome.get("came_online"):
|
|
@@ -743,12 +745,15 @@ def agent_update(
|
|
|
743
745
|
# Distinguishing this from a bare "still reporting X"
|
|
744
746
|
# is the whole point: it says the process needs a
|
|
745
747
|
# restart, not another pip attempt.
|
|
748
|
+
hint = restart_cmd.resolve_supervisor(
|
|
749
|
+
machine, live=outcome.get("supervisor")
|
|
750
|
+
)
|
|
746
751
|
click.echo(
|
|
747
752
|
f" {machine.name}: ✗ installed {installed_now} but the "
|
|
748
753
|
f"running process still reports {version_now} (expected "
|
|
749
754
|
f"{target_version}) — it hasn't restarted since the "
|
|
750
|
-
"update; try
|
|
751
|
-
"
|
|
755
|
+
f"update; try {restart_cmd.restart_hint(hint)} on that "
|
|
756
|
+
"machine",
|
|
752
757
|
err=True,
|
|
753
758
|
)
|
|
754
759
|
else:
|
|
@@ -1169,6 +1174,7 @@ def _wait_agents_updated(
|
|
|
1169
1174
|
"result": None,
|
|
1170
1175
|
"error": None,
|
|
1171
1176
|
"escalated": False,
|
|
1177
|
+
"supervisor": None,
|
|
1172
1178
|
}
|
|
1173
1179
|
for m in machines
|
|
1174
1180
|
}
|
|
@@ -1199,6 +1205,11 @@ def _wait_agents_updated(
|
|
|
1199
1205
|
info["result"] = last.get("result")
|
|
1200
1206
|
info["error"] = last.get("error")
|
|
1201
1207
|
info["version_before"] = last.get("version_before")
|
|
1208
|
+
# #3366: the agent's own live self-report — when this ever
|
|
1209
|
+
# disagrees with the machine's static `supervisor:` config, this
|
|
1210
|
+
# wins (see `restart_cmd.resolve_supervisor`), because it's the
|
|
1211
|
+
# host answering right now, not a fact someone typed once.
|
|
1212
|
+
info["supervisor"] = health.get("supervisor")
|
|
1202
1213
|
|
|
1203
1214
|
if machine.name in pre:
|
|
1204
1215
|
pre_val = pre[machine.name]
|
|
@@ -1255,7 +1266,8 @@ def _wait_agents_updated(
|
|
|
1255
1266
|
|
|
1256
1267
|
|
|
1257
1268
|
def _escalate_restart(machine) -> bool:
|
|
1258
|
-
"""Best-effort
|
|
1269
|
+
"""Best-effort driven restart of ``coord-agent`` over SSH — systemd or
|
|
1270
|
+
launchd, whichever the target host actually runs (#3366).
|
|
1259
1271
|
|
|
1260
1272
|
#404 / #1568: ``/update``'s ``os.execv`` self-restart does not take
|
|
1261
1273
|
under systemd — same PID, stale version. ``XDG_RUNTIME_DIR=/run/user/
|
|
@@ -1263,17 +1275,44 @@ def _escalate_restart(machine) -> bool:
|
|
|
1263
1275
|
silently no-ops in a non-interactive SSH session. See
|
|
1264
1276
|
docs/AGENT_OPERATIONS.md for the manual runbook this automates.
|
|
1265
1277
|
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
/
|
|
1278
|
+
#3366: macOS ships no systemd at all, so the command above always
|
|
1279
|
+
failed there — this was the whole escalation channel, and a fleet mac
|
|
1280
|
+
(``docs/MAC_MINI.md``) simply had none: no automated recovery, and
|
|
1281
|
+
every operator-facing message also only ever named ``systemctl``. The
|
|
1282
|
+
working command is ``launchctl kickstart -k gui/<uid>/<label>``
|
|
1283
|
+
(:mod:`coord.restart_cmd`). Rather than branching ahead of time on
|
|
1284
|
+
possibly-stale config, the remote shell tries systemd FIRST — zero
|
|
1285
|
+
behaviour change for the rest of the fleet — and only falls back to
|
|
1286
|
+
launchd when ``systemctl`` genuinely isn't there to ask, discovering
|
|
1287
|
+
the real launchd Label from the host's own plist (falling back to
|
|
1288
|
+
:data:`coord.restart_cmd.LAUNCHD_LABEL` only if that read fails) so
|
|
1289
|
+
this keeps working even if a second mac ever uses a different label.
|
|
1290
|
+
|
|
1291
|
+
Returns True if a restart command itself exited 0 on the target host —
|
|
1292
|
+
NOT whether the agent actually came back on the new version; the
|
|
1293
|
+
caller re-polls /health afterwards to confirm that.
|
|
1269
1294
|
"""
|
|
1295
|
+
from coord.restart_cmd import LAUNCHD_LABEL # noqa: PLC0415
|
|
1296
|
+
|
|
1297
|
+
remote_script = (
|
|
1298
|
+
"if command -v systemctl >/dev/null 2>&1 && "
|
|
1299
|
+
"XDG_RUNTIME_DIR=/run/user/$(id -u) systemctl --user restart coord-agent "
|
|
1300
|
+
"2>/dev/null; then exit 0; fi; "
|
|
1301
|
+
'plist=$(ls "$HOME/Library/LaunchAgents"/*coord-agent*.plist 2>/dev/null | head -1); '
|
|
1302
|
+
'if [ -n "$plist" ]; then '
|
|
1303
|
+
"label=$(/usr/libexec/PlistBuddy -c 'Print :Label' \"$plist\" 2>/dev/null); "
|
|
1304
|
+
f'label="${{label:-{LAUNCHD_LABEL}}}"; '
|
|
1305
|
+
'exec launchctl kickstart -k "gui/$(id -u)/$label"; '
|
|
1306
|
+
"fi; "
|
|
1307
|
+
"exit 1"
|
|
1308
|
+
)
|
|
1270
1309
|
cmd = [
|
|
1271
1310
|
"ssh",
|
|
1272
1311
|
"-o", "BatchMode=yes",
|
|
1273
1312
|
"-o", "ConnectTimeout=10",
|
|
1274
1313
|
"-o", "StrictHostKeyChecking=accept-new",
|
|
1275
1314
|
machine.host,
|
|
1276
|
-
|
|
1315
|
+
remote_script,
|
|
1277
1316
|
]
|
|
1278
1317
|
try:
|
|
1279
1318
|
result = subprocess.run(cmd, capture_output=True, text=True, timeout=20)
|
|
@@ -24,6 +24,7 @@ from typing import Any
|
|
|
24
24
|
|
|
25
25
|
import click
|
|
26
26
|
|
|
27
|
+
from coord import restart_cmd
|
|
27
28
|
from coord.commands._common import _CONFIG_OPTION
|
|
28
29
|
|
|
29
30
|
|
|
@@ -1746,6 +1747,14 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
1746
1747
|
+ ", ".join(spared)
|
|
1747
1748
|
)
|
|
1748
1749
|
|
|
1750
|
+
# #3365: the version each targeted host was on BEFORE this run's
|
|
1751
|
+
# forward roll — i.e. exactly the version a rollback puts it back
|
|
1752
|
+
# on. `before` is the pre-roll verify sweep already paid for in
|
|
1753
|
+
# step 3, so this is a read, not a new probe. Passed through so
|
|
1754
|
+
# `_wait_agent_back` can assert on that version rather than on mere
|
|
1755
|
+
# liveness — see its docstring for why liveness alone lied here.
|
|
1756
|
+
pre_roll_versions = _python_lane_versions(before, targets, record.target_version)
|
|
1757
|
+
|
|
1749
1758
|
down: list[str] = []
|
|
1750
1759
|
for host in targets:
|
|
1751
1760
|
machine = by_name.get(host)
|
|
@@ -1756,6 +1765,7 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
1756
1765
|
initiator=cli_initiator(
|
|
1757
1766
|
f"coord release propagate -> {machine.name} rollback (red gate)"
|
|
1758
1767
|
),
|
|
1768
|
+
expected_version=pre_roll_versions.get(host),
|
|
1759
1769
|
)
|
|
1760
1770
|
record.rolled_back.append(f"{host}: {detail}")
|
|
1761
1771
|
if not ok:
|
|
@@ -1770,9 +1780,11 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
1770
1780
|
"ROLLBACK LEFT AGENTS DOWN: "
|
|
1771
1781
|
+ ", ".join(down)
|
|
1772
1782
|
+ " — these hosts answered the rollback but never came back "
|
|
1773
|
-
"on /health, and
|
|
1774
|
-
"
|
|
1775
|
-
"
|
|
1783
|
+
"on /health, and a driven SSH restart (systemd "
|
|
1784
|
+
f"({restart_cmd.restart_shell_command(restart_cmd.SYSTEMD)}) or "
|
|
1785
|
+
f"launchd ({restart_cmd.restart_shell_command(restart_cmd.LAUNCHD)}), "
|
|
1786
|
+
"whichever applies) did not revive them either. Recover by "
|
|
1787
|
+
"hand before anything else."
|
|
1776
1788
|
)
|
|
1777
1789
|
click.echo(f"error: {record.error}", err=True)
|
|
1778
1790
|
_finish(rp.STATUS_ROLLED_BACK, 2)
|
|
@@ -2706,6 +2718,16 @@ def _roll_units(machine, *, agent_port: int) -> tuple[bool | None, str]:
|
|
|
2706
2718
|
# report" / a false-positive success.
|
|
2707
2719
|
if status != 200 and not (status == 500 and "units" in body):
|
|
2708
2720
|
return False, str(body.get("error") or body.get("summary") or f"HTTP {status}")
|
|
2721
|
+
# #3366: the agent itself already told us this host has no systemd to
|
|
2722
|
+
# deploy units onto (see `agent_app.py`'s `deploy_units` handler) —
|
|
2723
|
+
# every packaged unit reading as "new"/"not installed here" on THAT
|
|
2724
|
+
# host, every run, is the platform, not drift, so this is a structural
|
|
2725
|
+
# gap like the pre-#1835 404 branch above, not a failed lane: `None`,
|
|
2726
|
+
# same "not accountable for a lane it cannot roll" verdict #2052
|
|
2727
|
+
# already established for that case.
|
|
2728
|
+
detail = str(body.get("detail") or "")
|
|
2729
|
+
if detail.startswith("n/a"):
|
|
2730
|
+
return None, detail
|
|
2709
2731
|
units = body.get("units") or []
|
|
2710
2732
|
changed = [u.get("name") for u in units if u.get("action") == "updated"]
|
|
2711
2733
|
new = [u.get("name") for u in units if u.get("action") == "new"]
|
|
@@ -2935,34 +2957,98 @@ def _get(url: str, *, timeout: float) -> tuple[int | None, dict]:
|
|
|
2935
2957
|
return resp.status_code, (body if isinstance(body, dict) else {})
|
|
2936
2958
|
|
|
2937
2959
|
|
|
2938
|
-
def _wait_agent_back(
|
|
2939
|
-
|
|
2960
|
+
def _wait_agent_back(
|
|
2961
|
+
machine, *, agent_port: int, timeout: float,
|
|
2962
|
+
expected_version: str | None = None, require_change: bool = True,
|
|
2963
|
+
) -> tuple[bool, str]:
|
|
2964
|
+
"""Poll ``/health`` until the agent answers again ON THE POST-ROLLBACK
|
|
2965
|
+
VERSION — never on the first 200, which may still be the not-yet-re-execed
|
|
2966
|
+
OLD process. ``(back, version)``.
|
|
2940
2967
|
|
|
2941
2968
|
A rollback re-execs the agent process, and #2052 fault 1 is what happens
|
|
2942
2969
|
when that re-exec does not take: precision's ``coord-agent`` went
|
|
2943
2970
|
``inactive (dead)`` at the moment of the rollback and stayed there until
|
|
2944
2971
|
a human noticed. "The POST was accepted" is therefore not an outcome —
|
|
2945
2972
|
the outcome is whether the service is serving again.
|
|
2973
|
+
|
|
2974
|
+
#3365: "serving again" turned out not to be a strong enough condition
|
|
2975
|
+
either. Between the accepted ``POST /rollback`` and the re-exec actually
|
|
2976
|
+
taking, the OLD process is still listening and answers 200 with the
|
|
2977
|
+
*pre-rollback* version — a liveness signal indistinguishable from success
|
|
2978
|
+
at the moment it's observed. Reporting the first 200's version asserted
|
|
2979
|
+
the opposite of what happened: four hosts rolled back to 0.5.479 all
|
|
2980
|
+
reported "serving again on v0.5.482", the version they'd just been rolled
|
|
2981
|
+
away from. Liveness alone cannot tell "the new process is up" from "the
|
|
2982
|
+
old process hasn't gone down yet" — both are a 200 — so this now asserts
|
|
2983
|
+
on version identity instead, the same fix #1568 made for the forward
|
|
2984
|
+
``/update`` wait (:func:`coord.commands.agent_ops._wait_agents_updated`):
|
|
2985
|
+
|
|
2986
|
+
* When the caller knows the destination version — the rollback path in
|
|
2987
|
+
``coord release propagate`` reads it straight out of the pre-roll
|
|
2988
|
+
``before`` snapshot, the same version this host is rolling back TO —
|
|
2989
|
+
pass it as *expected_version* and this polls until ``/health`` reports
|
|
2990
|
+
exactly that, never returning True for anything else. The version
|
|
2991
|
+
printed by the caller is then the version verified, by construction.
|
|
2992
|
+
* When the caller has no such snapshot (``coord release rollback``, the
|
|
2993
|
+
manual break-glass command, has no forward-roll record to read a
|
|
2994
|
+
target version from) AND *require_change* is left at its default
|
|
2995
|
+
``True``, the first 200 seen is recorded as a baseline to RULE OUT
|
|
2996
|
+
rather than proof of success — it is exactly the reading a still-live
|
|
2997
|
+
old process would produce — and this waits for a *different* version
|
|
2998
|
+
to show up before returning True. A process that never re-execs keeps
|
|
2999
|
+
answering the same baseline version for the whole window and
|
|
3000
|
+
correctly times out False, instead of the old bug's instant (wrong)
|
|
3001
|
+
True on the first answer.
|
|
3002
|
+
* *require_change* exists for :func:`_rollback_host`'s retry-after-SSH-
|
|
3003
|
+
escalation call. That escalation only ever runs after a FULL prior
|
|
3004
|
+
window of nothing but non-200s — the ambiguity above (an old process
|
|
3005
|
+
that never went away) cannot apply, because the polling already
|
|
3006
|
+
proved for one whole ``timeout`` that nothing was answering. Reusing
|
|
3007
|
+
the version-change requirement there would demand a signal
|
|
3008
|
+
(a version DIFFERENT from a baseline that was never even set) this
|
|
3009
|
+
call has no way to produce, and wrongly fail a host a hard
|
|
3010
|
+
``systemctl --user restart`` genuinely revived.
|
|
2946
3011
|
"""
|
|
2947
3012
|
import time # noqa: PLC0415
|
|
2948
3013
|
|
|
2949
3014
|
deadline = time.time() + max(timeout, 1.0)
|
|
2950
3015
|
poll = min(2.0, max(timeout / 10, 0.05))
|
|
3016
|
+
baseline: str | None = None # only used when expected_version is None
|
|
3017
|
+
last_version = "?"
|
|
2951
3018
|
while True:
|
|
2952
3019
|
status, body = _get(f"http://{machine.host}:{agent_port}/health", timeout=3.0)
|
|
2953
3020
|
if status == 200:
|
|
2954
|
-
|
|
3021
|
+
version = str(body.get("version") or "?")
|
|
3022
|
+
last_version = version
|
|
3023
|
+
if expected_version is not None:
|
|
3024
|
+
if version == expected_version:
|
|
3025
|
+
return True, version
|
|
3026
|
+
elif not require_change:
|
|
3027
|
+
return True, version
|
|
3028
|
+
elif baseline is None:
|
|
3029
|
+
baseline = version
|
|
3030
|
+
elif version != baseline:
|
|
3031
|
+
return True, version
|
|
2955
3032
|
if time.time() >= deadline:
|
|
2956
|
-
return False,
|
|
3033
|
+
return False, last_version
|
|
2957
3034
|
time.sleep(poll)
|
|
2958
3035
|
|
|
2959
3036
|
|
|
2960
3037
|
def _rollback_host(
|
|
2961
|
-
machine, *, agent_port: int, timeout: float = 90.0, initiator: str | None = None
|
|
3038
|
+
machine, *, agent_port: int, timeout: float = 90.0, initiator: str | None = None,
|
|
3039
|
+
expected_version: str | None = None,
|
|
2962
3040
|
) -> tuple[bool, str]:
|
|
2963
3041
|
"""POST /rollback — back to the previous blue/green generation (#1241) —
|
|
2964
3042
|
and then put the service back on its feet.
|
|
2965
3043
|
|
|
3044
|
+
#3365: *expected_version*, when the caller has one (the pre-roll version
|
|
3045
|
+
read for this host before the forward roll that's now being undone —
|
|
3046
|
+
see the ``coord release propagate`` rollback loop), is threaded straight
|
|
3047
|
+
through to :func:`_wait_agent_back` so the wait asserts on THAT version
|
|
3048
|
+
rather than on mere liveness. Without it, ``_wait_agent_back`` falls
|
|
3049
|
+
back to its own baseline-diff check — see its docstring — rather than
|
|
3050
|
+
this function inventing a second version-identity scheme.
|
|
3051
|
+
|
|
2966
3052
|
#2052 fault 1: "a rollback that stops a service and does not restore it
|
|
2967
3053
|
leaves the fleet worse off than the failed roll did." This used to return
|
|
2968
3054
|
True the instant the agent answered 202, which is a statement about the
|
|
@@ -3020,7 +3106,10 @@ def _rollback_host(
|
|
|
3020
3106
|
# service THIS call took down.
|
|
3021
3107
|
return True, f"{note}; {sib_detail}"
|
|
3022
3108
|
|
|
3023
|
-
back, version = _wait_agent_back(
|
|
3109
|
+
back, version = _wait_agent_back(
|
|
3110
|
+
machine, agent_port=agent_port, timeout=timeout,
|
|
3111
|
+
expected_version=expected_version,
|
|
3112
|
+
)
|
|
3024
3113
|
if back:
|
|
3025
3114
|
return _back_on_target(f"rolled back; agent is serving again on v{version}")
|
|
3026
3115
|
|
|
@@ -3030,12 +3119,14 @@ def _rollback_host(
|
|
|
3030
3119
|
escalated = _escalate_restart(machine)
|
|
3031
3120
|
if escalated:
|
|
3032
3121
|
back, version = _wait_agent_back(
|
|
3033
|
-
machine, agent_port=agent_port, timeout=min(timeout, 60.0)
|
|
3122
|
+
machine, agent_port=agent_port, timeout=min(timeout, 60.0),
|
|
3123
|
+
expected_version=expected_version, require_change=False,
|
|
3034
3124
|
)
|
|
3035
3125
|
if back:
|
|
3036
3126
|
return _back_on_target(
|
|
3037
|
-
|
|
3038
|
-
f"
|
|
3127
|
+
"rolled back; agent needed a driven SSH restart "
|
|
3128
|
+
f"({restart_cmd.restart_hint(restart_cmd.resolve_supervisor(machine))}) "
|
|
3129
|
+
f"but is serving again on v{version}"
|
|
3039
3130
|
)
|
|
3040
3131
|
return False, (
|
|
3041
3132
|
"rolled back the venv but the agent is DOWN — it never came back on "
|
|
@@ -3043,8 +3134,9 @@ def _rollback_host(
|
|
|
3043
3134
|
+ (
|
|
3044
3135
|
"the SSH restart did not revive it"
|
|
3045
3136
|
if escalated
|
|
3046
|
-
else "the SSH
|
|
3047
|
-
"
|
|
3137
|
+
else "the SSH "
|
|
3138
|
+
f"{restart_cmd.restart_hint(restart_cmd.resolve_supervisor(machine))} "
|
|
3139
|
+
"escalation could not run"
|
|
3048
3140
|
)
|
|
3049
3141
|
+ f". Recover by hand on {machine.name}."
|
|
3050
3142
|
)
|
|
@@ -10,7 +10,7 @@ from typing import TYPE_CHECKING
|
|
|
10
10
|
|
|
11
11
|
import click
|
|
12
12
|
|
|
13
|
-
from coord import __version__, github_ops
|
|
13
|
+
from coord import __version__, github_ops, restart_cmd
|
|
14
14
|
|
|
15
15
|
from coord.commands._common import _CONFIG_OPTION, _load_config
|
|
16
16
|
|
|
@@ -375,6 +375,16 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
|
|
|
375
375
|
version_line = f" agent-version: {agent_version} ⚠ (coord is {__version__})"
|
|
376
376
|
else:
|
|
377
377
|
version_line = f" agent-version: {agent_version}"
|
|
378
|
+
# #3366: surface the non-default supervisor (launchd) up front,
|
|
379
|
+
# before it matters — "this agent is not running under systemd"
|
|
380
|
+
# used to only ever show up mid-incident, buried in a propagate
|
|
381
|
+
# run's output. Silent for the systemd case: that's every other
|
|
382
|
+
# machine in the fleet today, and naming it there would just be
|
|
383
|
+
# noise on every `coord status`.
|
|
384
|
+
live_supervisor = s.health.get("supervisor") if s.is_online and s.health else None
|
|
385
|
+
supervisor = restart_cmd.resolve_supervisor(m, live=live_supervisor)
|
|
386
|
+
if supervisor == restart_cmd.LAUNCHD:
|
|
387
|
+
version_line += " supervisor: launchd"
|
|
378
388
|
click.echo(f" host: {m.host} repos: {repos}{version_line}")
|
|
379
389
|
|
|
380
390
|
# #1886 Path B: `/health` exposes `installed_version` (a disk read
|
|
@@ -399,7 +409,7 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
|
|
|
399
409
|
click.echo(
|
|
400
410
|
f" ⚠ running v{running_version} but installed "
|
|
401
411
|
f"v{installed_version} — process hasn't restarted since "
|
|
402
|
-
"its last update (
|
|
412
|
+
f"its last update ({restart_cmd.restart_hint(supervisor)} "
|
|
403
413
|
"on that machine, or `coord agent update` to retry)"
|
|
404
414
|
)
|
|
405
415
|
|
|
@@ -3071,6 +3071,23 @@ def _parse_machines(raw: Any, repos: list[Repo]) -> list[Machine]:
|
|
|
3071
3071
|
entry.get("quiet_hours"), machine_index=i, machine_name=name,
|
|
3072
3072
|
)
|
|
3073
3073
|
|
|
3074
|
+
# #3366: optional fact about which init system supervises this
|
|
3075
|
+
# host's `coord agent` — see `Machine.supervisor`'s docstring for
|
|
3076
|
+
# why it isn't inferred. Validated against the two names
|
|
3077
|
+
# `coord.restart_cmd` actually knows rather than left free-form,
|
|
3078
|
+
# so a typo (`launchD`, `Systemd`) fails config load loudly
|
|
3079
|
+
# instead of silently falling through to the systemd default the
|
|
3080
|
+
# same way an unset field does.
|
|
3081
|
+
machine_supervisor = entry.get("supervisor")
|
|
3082
|
+
if machine_supervisor is not None:
|
|
3083
|
+
if not isinstance(machine_supervisor, str) or machine_supervisor not in (
|
|
3084
|
+
"systemd", "launchd",
|
|
3085
|
+
):
|
|
3086
|
+
raise ConfigError(
|
|
3087
|
+
f"machines[{i}].supervisor must be 'systemd' or 'launchd', "
|
|
3088
|
+
f"got {machine_supervisor!r}"
|
|
3089
|
+
)
|
|
3090
|
+
|
|
3074
3091
|
# #3340: optional per-machine floor for the `/health` reachability
|
|
3075
3092
|
# probe timeout — see `Machine.health_timeout`'s docstring for why
|
|
3076
3093
|
# this exists instead of just raising `network.DEFAULT_TIMEOUT`.
|
|
@@ -3094,6 +3111,7 @@ def _parse_machines(raw: Any, repos: list[Repo]) -> list[Machine]:
|
|
|
3094
3111
|
max_workers=machine_max_workers,
|
|
3095
3112
|
quiet_hours=quiet_hours,
|
|
3096
3113
|
health_timeout=machine_health_timeout,
|
|
3114
|
+
supervisor=machine_supervisor,
|
|
3097
3115
|
)
|
|
3098
3116
|
)
|
|
3099
3117
|
return machines
|