code-coordinator 0.5.276__tar.gz → 0.5.277__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.276 → code_coordinator-0.5.277}/PKG-INFO +1 -1
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/drive_queue.py +198 -11
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/release.py +199 -10
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-release-window.service +35 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/drive_queue.py +117 -1
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/release_window.py +47 -2
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-release-window.service +35 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/conftest.py +20 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_release_window.py +49 -0
- code_coordinator-0.5.277/tests/test_drive_queue_roll_pending.py +540 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_roll_window_handoff.py +48 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_window.py +10 -0
- code_coordinator-0.5.276/tests/test_drive_queue_roll_pending.py +0 -261
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/.gitignore +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/CLAUDE.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/GOAL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/LICENSE +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/MANIFEST.in +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/README.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/__init__.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/agent.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/audit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/block_log.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/board_service.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/brain.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/claim.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/cli.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/client.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/comments.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/config.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/dao.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/db.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deps.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/drive.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/events.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/filelock.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/freshness.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/gates.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/goal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/context.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/models.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/render.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/health/units.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/hooks.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/interactive.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/models.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/network.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/notify.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/openapi.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/parentage.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/plans.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/progress.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/reports.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/review.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/self_health.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/smoke.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/split_work.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/sql.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/state.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/test_author.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/test_report.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/usage.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/install-agent.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/pyproject.toml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/setup.cfg +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/__init__.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/backends.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_config.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_db.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_events.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_init.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_models.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_network.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_review.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_session.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_split.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_state.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tests/write_parity.py +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/types/generated.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.276 → code_coordinator-0.5.277}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -53,6 +53,7 @@ from coord.drive_queue import (
|
|
|
53
53
|
QUEUE_ALERT_REPO,
|
|
54
54
|
QUEUE_ALERT_STAGE,
|
|
55
55
|
RESUME_PROBE_TIMEOUT_SECONDS,
|
|
56
|
+
ROLL_LEDGER_CUMULATIVE_BOUND_SECONDS,
|
|
56
57
|
ROLL_PENDING_DEFAULT_MAX_DEFERRALS,
|
|
57
58
|
ROLL_PENDING_DEFAULT_TTL_SECONDS,
|
|
58
59
|
STATE_BLOCKED,
|
|
@@ -66,6 +67,7 @@ from coord.drive_queue import (
|
|
|
66
67
|
ProbeResult,
|
|
67
68
|
QueueEntry,
|
|
68
69
|
QueueError,
|
|
70
|
+
RollLedger,
|
|
69
71
|
RollPending,
|
|
70
72
|
TickPlan,
|
|
71
73
|
add_preflight_notice,
|
|
@@ -1628,10 +1630,22 @@ def drive_queue_cancel_roll(output_json: bool) -> None:
|
|
|
1628
1630
|
Does NOT change the target: the next `coord release propagate`/
|
|
1629
1631
|
`nightly-window` run re-arms a marker from scratch if the fleet is still
|
|
1630
1632
|
behind. This only stops the CURRENT wait.
|
|
1633
|
+
|
|
1634
|
+
#2889: also resets the roll LEDGER (`RollLedger`) — the cumulative
|
|
1635
|
+
frozen-time bookkeeping a fresh marker's own arm now checks — so an
|
|
1636
|
+
operator clearing a stuck marker also clears whatever run-up of
|
|
1637
|
+
cumulative frozen time and fresh-arm history led to it, exactly the
|
|
1638
|
+
"operator intervenes" escape hatch item 1's cumulative bound requires.
|
|
1639
|
+
Reset unconditionally, even when there is no LIVE marker to cancel: a
|
|
1640
|
+
ledger can be `escalated` (refusing every fresh arm) with nothing
|
|
1641
|
+
currently pending — its last marker already expired and cleared on its
|
|
1642
|
+
own — and that state needs the SAME override.
|
|
1631
1643
|
"""
|
|
1632
1644
|
from coord.machine_pause import clear_cordon, cordons as read_cordons # noqa: PLC0415
|
|
1633
1645
|
|
|
1634
1646
|
pending = read_roll_pending()
|
|
1647
|
+
ledger = read_roll_ledger()
|
|
1648
|
+
ledger_had_history = ledger.marker_count > 0 or ledger.cumulative_frozen_seconds > 0
|
|
1635
1649
|
cleared_cordons: list[str] = []
|
|
1636
1650
|
if pending is not None:
|
|
1637
1651
|
try:
|
|
@@ -1647,6 +1661,8 @@ def drive_queue_cancel_roll(output_json: bool) -> None:
|
|
|
1647
1661
|
except Exception: # noqa: BLE001 — best-effort; never block the marker clear on this
|
|
1648
1662
|
pass
|
|
1649
1663
|
clear_roll_pending()
|
|
1664
|
+
if ledger_had_history:
|
|
1665
|
+
reset_roll_ledger()
|
|
1650
1666
|
|
|
1651
1667
|
if output_json:
|
|
1652
1668
|
click.echo(
|
|
@@ -1654,29 +1670,45 @@ def drive_queue_cancel_roll(output_json: bool) -> None:
|
|
|
1654
1670
|
{
|
|
1655
1671
|
"cancelled": pending.to_dict() if pending is not None else None,
|
|
1656
1672
|
"cleared_cordons": sorted(cleared_cordons),
|
|
1673
|
+
"ledger_reset": ledger.to_dict() if ledger_had_history else None,
|
|
1657
1674
|
},
|
|
1658
1675
|
sort_keys=True,
|
|
1659
1676
|
)
|
|
1660
1677
|
)
|
|
1661
1678
|
return
|
|
1662
1679
|
|
|
1663
|
-
if pending is None:
|
|
1680
|
+
if pending is None and not ledger_had_history:
|
|
1664
1681
|
click.echo("no roll-pending marker to cancel — the queue is not held for a roll")
|
|
1665
1682
|
return
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1683
|
+
if pending is not None:
|
|
1684
|
+
click.echo(
|
|
1685
|
+
f"cancelled {pending.describe()} — the drive-queue tick resumes "
|
|
1686
|
+
"launching immediately"
|
|
1687
|
+
)
|
|
1688
|
+
else:
|
|
1689
|
+
click.echo(
|
|
1690
|
+
"no roll-pending marker to cancel, but the roll ledger had "
|
|
1691
|
+
f"{ledger.cumulative_frozen_seconds:.0f}s cumulative frozen time "
|
|
1692
|
+
f"across {ledger.marker_count} marker generation(s)"
|
|
1693
|
+
)
|
|
1670
1694
|
if cleared_cordons:
|
|
1671
1695
|
click.echo(
|
|
1672
1696
|
"also cleared cordon(s) still open for this target: "
|
|
1673
1697
|
+ ", ".join(sorted(cleared_cordons))
|
|
1674
1698
|
)
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1699
|
+
if ledger_had_history:
|
|
1700
|
+
click.echo(
|
|
1701
|
+
"also reset the #2889 roll ledger "
|
|
1702
|
+
f"({ledger.cumulative_frozen_seconds:.0f}s cumulative frozen time / "
|
|
1703
|
+
f"{ledger.marker_count} marker generation(s)) — a fresh arm is no "
|
|
1704
|
+
"longer refused for having run up that history"
|
|
1705
|
+
)
|
|
1706
|
+
if pending is not None:
|
|
1707
|
+
click.echo(
|
|
1708
|
+
"note: this only stops the current wait — the next `coord release "
|
|
1709
|
+
"propagate`/`nightly-window` run re-arms a fresh marker if the "
|
|
1710
|
+
"fleet is still behind"
|
|
1711
|
+
)
|
|
1680
1712
|
|
|
1681
1713
|
|
|
1682
1714
|
# ── block-log (#2235 Phase 0) ────────────────────────────────────────────────
|
|
@@ -2587,6 +2619,136 @@ def clear_roll_pending() -> None:
|
|
|
2587
2619
|
pass
|
|
2588
2620
|
|
|
2589
2621
|
|
|
2622
|
+
# ── #2889: the roll ledger — memory that survives a marker's own clear ──────
|
|
2623
|
+
|
|
2624
|
+
_ROLL_LEDGER_FILENAME = "roll_pending_ledger.json"
|
|
2625
|
+
|
|
2626
|
+
|
|
2627
|
+
def roll_pending_ledger_path() -> Path:
|
|
2628
|
+
"""Absolute path to the #2889 roll ledger.
|
|
2629
|
+
|
|
2630
|
+
``$COORD_ROLL_PENDING_LEDGER_STATE`` overrides it — same test-isolation
|
|
2631
|
+
seam as :func:`roll_pending_path`; never let a test write the operator's
|
|
2632
|
+
real ``~/.coord/roll_pending_ledger.json``.
|
|
2633
|
+
"""
|
|
2634
|
+
import os # noqa: PLC0415
|
|
2635
|
+
|
|
2636
|
+
from coord.platform_paths import default_coord_dir # noqa: PLC0415
|
|
2637
|
+
|
|
2638
|
+
override = os.environ.get("COORD_ROLL_PENDING_LEDGER_STATE")
|
|
2639
|
+
if override:
|
|
2640
|
+
return Path(override).expanduser()
|
|
2641
|
+
return default_coord_dir() / _ROLL_LEDGER_FILENAME
|
|
2642
|
+
|
|
2643
|
+
|
|
2644
|
+
def read_roll_ledger() -> RollLedger:
|
|
2645
|
+
"""The current ledger — never ``None``: an absent/corrupt/hand-edited
|
|
2646
|
+
file reads as a fresh, empty ``RollLedger()``, the same fail-soft
|
|
2647
|
+
posture :func:`read_roll_pending` takes on its own file, and for the
|
|
2648
|
+
same reason — a ledger this cannot make sense of must never wedge future
|
|
2649
|
+
arms forever.
|
|
2650
|
+
"""
|
|
2651
|
+
path = roll_pending_ledger_path()
|
|
2652
|
+
try:
|
|
2653
|
+
raw = path.read_text(encoding="utf-8")
|
|
2654
|
+
except OSError:
|
|
2655
|
+
return RollLedger()
|
|
2656
|
+
if not raw.strip():
|
|
2657
|
+
return RollLedger()
|
|
2658
|
+
try:
|
|
2659
|
+
data = _json.loads(raw)
|
|
2660
|
+
except ValueError:
|
|
2661
|
+
return RollLedger()
|
|
2662
|
+
if not isinstance(data, dict):
|
|
2663
|
+
return RollLedger()
|
|
2664
|
+
return RollLedger.from_dict(data)
|
|
2665
|
+
|
|
2666
|
+
|
|
2667
|
+
def write_roll_ledger(ledger: RollLedger) -> None:
|
|
2668
|
+
"""Persist *ledger*, overwriting whatever was there before. Same atomic
|
|
2669
|
+
tempfile-then-rename pattern as :func:`write_roll_pending`."""
|
|
2670
|
+
import os # noqa: PLC0415
|
|
2671
|
+
import tempfile # noqa: PLC0415
|
|
2672
|
+
|
|
2673
|
+
path = roll_pending_ledger_path()
|
|
2674
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
2675
|
+
payload = _json.dumps(ledger.to_dict(), sort_keys=True)
|
|
2676
|
+
fd, tmp_name = tempfile.mkstemp(prefix=".roll-ledger.", suffix=".tmp", dir=path.parent)
|
|
2677
|
+
try:
|
|
2678
|
+
with os.fdopen(fd, "w", encoding="utf-8") as fh:
|
|
2679
|
+
fh.write(payload)
|
|
2680
|
+
os.replace(tmp_name, path)
|
|
2681
|
+
except Exception:
|
|
2682
|
+
try:
|
|
2683
|
+
os.unlink(tmp_name)
|
|
2684
|
+
except OSError:
|
|
2685
|
+
pass
|
|
2686
|
+
raise
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
def reset_roll_ledger() -> None:
|
|
2690
|
+
"""Drop the ledger — a CONFIRMED roll or explicit operator intervention
|
|
2691
|
+
(`coord drive-queue cancel-roll`) both mean "clean slate": whatever ran
|
|
2692
|
+
up the cumulative bound is over. A no-op when there was nothing to
|
|
2693
|
+
reset."""
|
|
2694
|
+
path = roll_pending_ledger_path()
|
|
2695
|
+
try:
|
|
2696
|
+
path.unlink()
|
|
2697
|
+
except FileNotFoundError:
|
|
2698
|
+
pass
|
|
2699
|
+
|
|
2700
|
+
|
|
2701
|
+
#: #2889's own escalation key — deliberately distinct from
|
|
2702
|
+
#: `ROLL_PENDING_ALERT_STAGE` (a single expired marker) so the two can
|
|
2703
|
+
#: coexist as separate rows: a marker expiring is routine (bounded by design,
|
|
2704
|
+
#: #2587's whole point); the LEDGER crossing its cumulative bound is the
|
|
2705
|
+
#: escalation that means "this has now failed to roll unattended several
|
|
2706
|
+
#: times in a row — an operator needs to look, not just wait for the next
|
|
2707
|
+
#: gap."
|
|
2708
|
+
ROLL_LEDGER_ALERT_REPO = "(roll-pending)"
|
|
2709
|
+
ROLL_LEDGER_ALERT_ISSUE = 0
|
|
2710
|
+
ROLL_LEDGER_ALERT_STAGE = "roll-ledger-escalated"
|
|
2711
|
+
|
|
2712
|
+
|
|
2713
|
+
def _escalate_roll_ledger(ledger: RollLedger, *, now: float) -> None:
|
|
2714
|
+
"""Surface a ledger that just crossed its cumulative bound (#2889 item
|
|
2715
|
+
1's "escalate loudly") — mirrors `_escalate_roll_pending_expired` one
|
|
2716
|
+
level up: that one is routine (a single marker hit ITS OWN bound, exactly
|
|
2717
|
+
as designed); this one means the SAME target has now failed to roll
|
|
2718
|
+
unattended across `ledger.marker_count` separate marker generations, and
|
|
2719
|
+
arming a fresh one is refused until `coord drive-queue cancel-roll`
|
|
2720
|
+
clears this ledger.
|
|
2721
|
+
"""
|
|
2722
|
+
from coord.state import record_drive_escalation # noqa: PLC0415
|
|
2723
|
+
|
|
2724
|
+
reason = (
|
|
2725
|
+
f"roll-pending ledger escalated: {ledger.cumulative_frozen_seconds:.0f}s "
|
|
2726
|
+
f"cumulative frozen time across {ledger.marker_count} marker "
|
|
2727
|
+
"generation(s), none of them confirming a roll — refusing to arm a "
|
|
2728
|
+
"fresh marker until `coord drive-queue cancel-roll` clears this "
|
|
2729
|
+
"ledger (#2889: a per-marker TTL bounds one marker; this bounds the "
|
|
2730
|
+
"RATE of fresh ones that follow)"
|
|
2731
|
+
)
|
|
2732
|
+
click.echo(f"warning: {reason}", err=True)
|
|
2733
|
+
try:
|
|
2734
|
+
record_drive_escalation(
|
|
2735
|
+
ROLL_LEDGER_ALERT_REPO,
|
|
2736
|
+
ROLL_LEDGER_ALERT_ISSUE,
|
|
2737
|
+
stage=ROLL_LEDGER_ALERT_STAGE,
|
|
2738
|
+
reason=reason,
|
|
2739
|
+
gate_readings=(
|
|
2740
|
+
f"cumulative_frozen_seconds={ledger.cumulative_frozen_seconds:.0f} | "
|
|
2741
|
+
f"bound={ROLL_LEDGER_CUMULATIVE_BOUND_SECONDS:.0f} | "
|
|
2742
|
+
f"marker_count={ledger.marker_count}"
|
|
2743
|
+
),
|
|
2744
|
+
proposed_command="coord drive-queue cancel-roll",
|
|
2745
|
+
)
|
|
2746
|
+
except Exception as exc: # noqa: BLE001 — the stderr line above is the
|
|
2747
|
+
# floor; an escalation table that cannot be written must not take
|
|
2748
|
+
# the message down with it.
|
|
2749
|
+
click.echo(f" (could not record the roll-ledger escalation: {exc})", err=True)
|
|
2750
|
+
|
|
2751
|
+
|
|
2590
2752
|
def _roll_pending_may_fire(*, occupied: int, now: float, queue_rows) -> tuple[bool, str]:
|
|
2591
2753
|
"""Is it worth attempting to fire a pending roll THIS tick? (#2870 part 2)
|
|
2592
2754
|
|
|
@@ -2664,12 +2826,25 @@ def _fire_pending_roll(*, dry_run: bool = False) -> tuple[bool, str]:
|
|
|
2664
2826
|
Returns ``(fired, detail)``, never raises — a `systemctl` this host
|
|
2665
2827
|
cannot run (no systemd, PATH issue, unit not installed) must be a
|
|
2666
2828
|
deferral the marker survives to retry next tick, not a crashed tick.
|
|
2829
|
+
|
|
2830
|
+
#2889 item 4: ``--setenv=COORD_ROLL_INVOKER=drive-queue-tick`` tags THIS
|
|
2831
|
+
specific start with a caller identity `coord release nightly-window`
|
|
2832
|
+
(the spawned unit's `ExecStart=`) reads back and journals as
|
|
2833
|
+
`WindowRecord.invoked_by` — overriding the unit file's own static
|
|
2834
|
+
`Environment=` default for just this one invocation (systemd layers a
|
|
2835
|
+
transient `--setenv=` on top of a unit's static `Environment=`), so
|
|
2836
|
+
"what invoked this run" is answerable from `coord release
|
|
2837
|
+
window-history` instead of requiring a live reproduction.
|
|
2667
2838
|
"""
|
|
2668
2839
|
if dry_run:
|
|
2669
2840
|
return True, "--dry-run: would run `systemctl --user start --no-block coord-release-window.service`"
|
|
2670
2841
|
try:
|
|
2671
2842
|
proc = subprocess.run( # noqa: S603, S607 — fixed argv, no shell
|
|
2672
|
-
[
|
|
2843
|
+
[
|
|
2844
|
+
"systemctl", "--user", "start", "--no-block",
|
|
2845
|
+
"--setenv=COORD_ROLL_INVOKER=drive-queue-tick",
|
|
2846
|
+
"coord-release-window.service",
|
|
2847
|
+
],
|
|
2673
2848
|
capture_output=True,
|
|
2674
2849
|
text=True,
|
|
2675
2850
|
timeout=30,
|
|
@@ -4483,10 +4658,22 @@ def drive_queue_tick(
|
|
|
4483
4658
|
# is dropped right here, loudly (`_escalate_roll_pending_expired`),
|
|
4484
4659
|
# and this tick proceeds exactly as if no marker had ever been set —
|
|
4485
4660
|
# the #2587 "never hold the queue down indefinitely" requirement.
|
|
4661
|
+
# #2889: before it is dropped, its lived duration is folded into the
|
|
4662
|
+
# roll LEDGER (`RollLedger`, `roll_pending_ledger.json`) — memory
|
|
4663
|
+
# that survives THIS clear, unlike the marker itself, so a fresh arm
|
|
4664
|
+
# right after this one cannot dodge the cumulative bound the way a
|
|
4665
|
+
# brand new `RollPending` dodges a single marker's own TTL. Crossing
|
|
4666
|
+
# that bound is its own, separate, louder escalation.
|
|
4486
4667
|
now = time.time()
|
|
4487
4668
|
roll_pending = read_roll_pending()
|
|
4488
4669
|
if roll_pending is not None and roll_pending.expired(now):
|
|
4489
4670
|
_escalate_roll_pending_expired(roll_pending, now=now)
|
|
4671
|
+
ledger = read_roll_ledger()
|
|
4672
|
+
was_escalated = ledger.escalated
|
|
4673
|
+
ledger = ledger.record_expiry(roll_pending, now=now)
|
|
4674
|
+
write_roll_ledger(ledger)
|
|
4675
|
+
if ledger.escalated and not was_escalated:
|
|
4676
|
+
_escalate_roll_ledger(ledger, now=now)
|
|
4490
4677
|
clear_roll_pending()
|
|
4491
4678
|
roll_pending = None
|
|
4492
4679
|
if roll_pending is not None:
|
|
@@ -653,13 +653,96 @@ def _lane_versions_by_host(report) -> dict[str, list[str | None]]:
|
|
|
653
653
|
return out
|
|
654
654
|
|
|
655
655
|
|
|
656
|
+
def _queue_provably_busy(quiescence, daemon_name: str | None) -> bool:
|
|
657
|
+
"""#2889 item 2: does *quiescence* name a genuine `drive_queue` row (not
|
|
658
|
+
some OTHER busy reason — an interactive session, a paused machine, an
|
|
659
|
+
in-flight confirmation) actively occupying *daemon_name* right now?
|
|
660
|
+
|
|
661
|
+
Deliberately narrower than "the daemon is busy" (`daemon_name in
|
|
662
|
+
busy_hosts`, this module's existing arm TRIGGER — see
|
|
663
|
+
`_ensure_roll_pending_marker`'s call site): a genuine drive-queue entry
|
|
664
|
+
is the one busy reason a freshly-armed marker cannot do anything about
|
|
665
|
+
faster than `coord drive-queue tick`'s own reconciliation already will
|
|
666
|
+
on its normal ~3-minute cadence — arming one anyway just spends up to a
|
|
667
|
+
full TTL (#2587's own hour-long bound) learning that for free, exactly
|
|
668
|
+
the "10 fresh arms, 49 ticks refused to launch" pathology #2889 reports.
|
|
669
|
+
A busy signal of any OTHER kind (`Quiescence.busy`'s `kind` field —
|
|
670
|
+
`coord.release_propagate.assess_quiescence`'s own vocabulary:
|
|
671
|
+
"confirmation/notify drain running", "live RUNNING assignment", a paused
|
|
672
|
+
machine) is exactly the case a marker's capacity-0 freeze DOES help:
|
|
673
|
+
nothing NEW should launch onto the daemon host while it clears, and
|
|
674
|
+
nothing here can predict when it will on its own.
|
|
675
|
+
|
|
676
|
+
Unattributable signals (``b.host is None`` — `Quiescence.fleet_wide_busy`)
|
|
677
|
+
are included: an unreadable board or an unattributed drive-queue row
|
|
678
|
+
means "busy somewhere unknown", which must be read as busy everywhere,
|
|
679
|
+
the same rule `Quiescence.rollable_hosts` already applies.
|
|
680
|
+
"""
|
|
681
|
+
return any(
|
|
682
|
+
b.kind == "drive-queue entry running" and (b.host is None or b.host == daemon_name)
|
|
683
|
+
for b in quiescence.busy
|
|
684
|
+
)
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
def _fresh_arm_refusal_reason(ledger, *, now: float, queue_provably_busy: bool) -> str:
|
|
688
|
+
"""Empty string when a FRESH `RollPending` arm (no existing marker at
|
|
689
|
+
all) may proceed; otherwise the reason it must not, in priority order —
|
|
690
|
+
escalated ledger, then the rate limit, then a provably busy queue.
|
|
691
|
+
|
|
692
|
+
Shared by `_ensure_roll_pending_marker` and `release_nightly_window`'s
|
|
693
|
+
own arm site (#2587 section 3) so the three #2889 checks can never drift
|
|
694
|
+
between the two places a fresh marker gets armed — #2096's "two
|
|
695
|
+
surfaces, one function" rule, one level up from `_drain`'s own reuse of
|
|
696
|
+
`release_propagate.assess_quiescence` for the identical reason.
|
|
697
|
+
|
|
698
|
+
Pure — takes a `coord.drive_queue.RollLedger` and the caller's own
|
|
699
|
+
already-computed *queue_provably_busy* rather than reading a clock or a
|
|
700
|
+
board itself, so it stays trivially testable and every call site decides
|
|
701
|
+
for itself how loud to be about the result (only the ESCALATED reason is
|
|
702
|
+
meant to also trigger a recorded escalation — see both callers).
|
|
703
|
+
"""
|
|
704
|
+
if ledger.escalated:
|
|
705
|
+
return (
|
|
706
|
+
f"the #2889 roll ledger has escalated "
|
|
707
|
+
f"({ledger.cumulative_frozen_seconds:.0f}s cumulative frozen time across "
|
|
708
|
+
f"{ledger.marker_count} marker generation(s)) — run `coord drive-queue "
|
|
709
|
+
"cancel-roll` to clear it before arming again"
|
|
710
|
+
)
|
|
711
|
+
wait = ledger.seconds_until_next_arm(now)
|
|
712
|
+
if wait > 0:
|
|
713
|
+
return (
|
|
714
|
+
f"under the #2889 rate limit ({wait:.0f}s remaining since the last "
|
|
715
|
+
"fresh arm)"
|
|
716
|
+
)
|
|
717
|
+
if queue_provably_busy:
|
|
718
|
+
return (
|
|
719
|
+
"a genuine drive-queue entry is actively occupying the daemon host "
|
|
720
|
+
"right now (#2889 item 2) — a fresh marker cannot roll any faster "
|
|
721
|
+
"than the tick's own reconciliation already will"
|
|
722
|
+
)
|
|
723
|
+
return ""
|
|
724
|
+
|
|
725
|
+
|
|
656
726
|
def _ensure_roll_pending_marker(
|
|
657
727
|
target_version: str, *, reason: str, min_releases_behind: int | None = None,
|
|
658
|
-
dry_run: bool = False,
|
|
659
|
-
) ->
|
|
728
|
+
dry_run: bool = False, queue_provably_busy: bool = False,
|
|
729
|
+
) -> bool:
|
|
660
730
|
"""#2587: make sure a roll-pending marker exists for *target_version*,
|
|
661
731
|
without resetting an already-live one's clock.
|
|
662
732
|
|
|
733
|
+
#2889: returns whether a marker is live as a result of this call
|
|
734
|
+
(existing/updated/freshly armed) — ``False`` only for a REFUSED fresh
|
|
735
|
+
arm (see the three checks below). Every existing call site predates this
|
|
736
|
+
return value and simply ignores it — a refused arm is already, on its
|
|
737
|
+
own, an ordinary deferral from the caller's point of view, exactly like
|
|
738
|
+
a still-busy fleet. *queue_provably_busy* (see
|
|
739
|
+
:func:`_queue_provably_busy`) only ever affects a FRESH arm (no existing
|
|
740
|
+
marker at all): a re-arm of an already-live marker (same OR different
|
|
741
|
+
target) is a continuation of a campaign already in progress and proceeds
|
|
742
|
+
regardless — refusing THAT would just reintroduce #2607's own bug by a
|
|
743
|
+
different door, since a marker that cannot be kept current would then
|
|
744
|
+
fire against a target it no longer names.
|
|
745
|
+
|
|
663
746
|
#2870: *min_releases_behind* is the effective `propagation.
|
|
664
747
|
min_releases_behind`/`--min-behind` threshold THIS run resolved and
|
|
665
748
|
already gated on before reaching this call (see the #2583 gate just
|
|
@@ -710,12 +793,17 @@ def _ensure_roll_pending_marker(
|
|
|
710
793
|
import dataclasses as _dataclasses # noqa: PLC0415
|
|
711
794
|
import time as _time # noqa: PLC0415
|
|
712
795
|
|
|
713
|
-
from coord.commands.drive_queue import
|
|
796
|
+
from coord.commands.drive_queue import ( # noqa: PLC0415
|
|
797
|
+
_escalate_roll_ledger,
|
|
798
|
+
read_roll_ledger,
|
|
799
|
+
read_roll_pending,
|
|
800
|
+
write_roll_pending,
|
|
801
|
+
)
|
|
714
802
|
from coord.drive_queue import RollPending # noqa: PLC0415
|
|
715
803
|
|
|
716
804
|
existing = read_roll_pending()
|
|
717
805
|
if existing is not None and existing.target_version == target_version:
|
|
718
|
-
return
|
|
806
|
+
return True
|
|
719
807
|
if existing is not None:
|
|
720
808
|
if dry_run:
|
|
721
809
|
click.echo(
|
|
@@ -723,27 +811,56 @@ def _ensure_roll_pending_marker(
|
|
|
723
811
|
f"({existing.describe()}) with v{target_version} (reason="
|
|
724
812
|
f"{reason!r}), preserving its original set_at/deferrals (#2607)"
|
|
725
813
|
)
|
|
726
|
-
return
|
|
814
|
+
return True
|
|
727
815
|
write_roll_pending(
|
|
728
816
|
_dataclasses.replace(
|
|
729
817
|
existing, target_version=target_version, reason=reason,
|
|
730
818
|
min_releases_behind=min_releases_behind,
|
|
731
819
|
)
|
|
732
820
|
)
|
|
733
|
-
return
|
|
821
|
+
return True
|
|
822
|
+
|
|
823
|
+
# #2889: a genuinely FRESH arm — no existing marker at all — is the one
|
|
824
|
+
# case the RATE of markers can run away (#2889's own report: ten fresh
|
|
825
|
+
# arms in ~15 hours, each one individually well-behaved).
|
|
826
|
+
now = _time.time()
|
|
827
|
+
ledger = read_roll_ledger()
|
|
828
|
+
refusal = _fresh_arm_refusal_reason(
|
|
829
|
+
ledger, now=now, queue_provably_busy=queue_provably_busy,
|
|
830
|
+
)
|
|
831
|
+
if refusal:
|
|
832
|
+
message = f"declining to arm a roll-pending marker for v{target_version} — {refusal}"
|
|
833
|
+
if dry_run:
|
|
834
|
+
click.echo(f"--dry-run: would refuse to arm — {refusal}")
|
|
835
|
+
return False
|
|
836
|
+
click.echo(message, err=True)
|
|
837
|
+
if ledger.escalated:
|
|
838
|
+
# Re-recorded on every refused attempt, same "quiet re-record
|
|
839
|
+
# keeps the escalation fresh" posture the #2572 self-cordon
|
|
840
|
+
# escalation already documents — cheap (an upsert) and means an
|
|
841
|
+
# operator checking `coord drive-queue status` mid-day sees this
|
|
842
|
+
# is still live, not a one-time blip from hours ago.
|
|
843
|
+
_escalate_roll_ledger(ledger, now=now)
|
|
844
|
+
return False
|
|
845
|
+
|
|
734
846
|
if dry_run:
|
|
735
847
|
click.echo(
|
|
736
848
|
f"--dry-run: would set a roll-pending marker for v{target_version} "
|
|
737
849
|
f"(reason={reason!r}) — the drive-queue tick would then hold "
|
|
738
850
|
"capacity at 0 until the queue drains"
|
|
739
851
|
)
|
|
740
|
-
return
|
|
852
|
+
return True
|
|
741
853
|
write_roll_pending(
|
|
742
854
|
RollPending(
|
|
743
|
-
target_version=target_version, set_at=
|
|
855
|
+
target_version=target_version, set_at=now, reason=reason,
|
|
744
856
|
min_releases_behind=min_releases_behind,
|
|
745
857
|
)
|
|
746
858
|
)
|
|
859
|
+
# Nothing to write to the ledger here — only an EXPIRY moves its
|
|
860
|
+
# rate-limit clock (`RollLedger.record_expiry`), never an arm. See that
|
|
861
|
+
# method's own docstring for why measuring from the arm, not the clear,
|
|
862
|
+
# would let the exact re-arm-right-after-TTL-expiry case through.
|
|
863
|
+
return True
|
|
747
864
|
|
|
748
865
|
|
|
749
866
|
@release_group.command(
|
|
@@ -1146,9 +1263,15 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
|
|
|
1146
1263
|
# (resolved above, 3a) onto the marker, so whatever discharges it is
|
|
1147
1264
|
# gated at the threshold that armed it, not a threshold re-resolved
|
|
1148
1265
|
# from scratch later.
|
|
1266
|
+
# #2889 item 2: `quiescence` was already computed above (3) — reuse
|
|
1267
|
+
# it rather than re-fetching the board, to tell a genuine
|
|
1268
|
+
# drive-queue occupancy apart from the OTHER busy reasons that put
|
|
1269
|
+
# the daemon in `busy_hosts` (see `_queue_provably_busy`'s
|
|
1270
|
+
# docstring). Only affects a genuinely FRESH arm.
|
|
1149
1271
|
_ensure_roll_pending_marker(
|
|
1150
1272
|
record.target_version, reason="propagate",
|
|
1151
1273
|
min_releases_behind=effective_min_behind, dry_run=dry_run,
|
|
1274
|
+
queue_provably_busy=_queue_provably_busy(quiescence, daemon_name),
|
|
1152
1275
|
)
|
|
1153
1276
|
_finish(rp.STATUS_DEFERRED, 0)
|
|
1154
1277
|
|
|
@@ -3088,7 +3211,9 @@ def release_nightly_window(
|
|
|
3088
3211
|
from coord.commands._common import _load_config # noqa: PLC0415
|
|
3089
3212
|
from coord.commands.drive_queue import ( # noqa: PLC0415
|
|
3090
3213
|
clear_roll_pending,
|
|
3214
|
+
read_roll_ledger,
|
|
3091
3215
|
read_roll_pending,
|
|
3216
|
+
reset_roll_ledger,
|
|
3092
3217
|
write_roll_pending,
|
|
3093
3218
|
)
|
|
3094
3219
|
from coord.drive_queue import RollPending # noqa: PLC0415
|
|
@@ -3100,8 +3225,20 @@ def release_nightly_window(
|
|
|
3100
3225
|
|
|
3101
3226
|
config = _load_config(config_path)
|
|
3102
3227
|
state_dir = _state_dir()
|
|
3228
|
+
# #2889 item 4: "what invoked this?" straight from the journal —
|
|
3229
|
+
# `$COORD_ROLL_INVOKER` is set on the process environment by whichever
|
|
3230
|
+
# trigger started `coord-release-window.service`: the unit's own static
|
|
3231
|
+
# `Environment=` default (its timer, or a human running `systemctl
|
|
3232
|
+
# --user start` by hand — systemd cannot tell those two apart, see the
|
|
3233
|
+
# unit's own "INVOKER" section) or `_fire_pending_roll`'s explicit
|
|
3234
|
+
# `--setenv=` override when the drive-queue tick is the one firing it.
|
|
3235
|
+
# Empty for a bare CLI invocation outside the unit (a test, an
|
|
3236
|
+
# operator's own shell) — nothing set the env var at all.
|
|
3237
|
+
import os as _os # noqa: PLC0415
|
|
3238
|
+
|
|
3103
3239
|
record = rw.WindowRecord(
|
|
3104
|
-
started_at=time.time(), dry_run=dry_run, queue_timer=queue_timer
|
|
3240
|
+
started_at=time.time(), dry_run=dry_run, queue_timer=queue_timer,
|
|
3241
|
+
invoked_by=_os.environ.get("COORD_ROLL_INVOKER", ""),
|
|
3105
3242
|
)
|
|
3106
3243
|
|
|
3107
3244
|
def _finish(status: str, exit_code: int = 0) -> None:
|
|
@@ -3185,6 +3322,11 @@ def release_nightly_window(
|
|
|
3185
3322
|
if not rw.needs_roll(record.daemon_version, record.target_version):
|
|
3186
3323
|
if read_roll_pending() is not None:
|
|
3187
3324
|
clear_roll_pending()
|
|
3325
|
+
# #2889: the goal is reached without needing the marker at all —
|
|
3326
|
+
# a clean slate, same as a CONFIRMED roll below. Whatever
|
|
3327
|
+
# cumulative frozen time/fresh-arm history the ledger carried is
|
|
3328
|
+
# over; a FUTURE delta starts counting fresh.
|
|
3329
|
+
reset_roll_ledger()
|
|
3188
3330
|
_finish(rw.STATUS_UP_TO_DATE, 0)
|
|
3189
3331
|
|
|
3190
3332
|
# ── 2b. #2583 min-releases-behind gate ────────────────────────────────
|
|
@@ -3296,6 +3438,11 @@ def release_nightly_window(
|
|
|
3296
3438
|
rp.STATUS_VERIFIED, rp.STATUS_UP_TO_DATE, rp.STATUS_ROLLED,
|
|
3297
3439
|
):
|
|
3298
3440
|
clear_roll_pending()
|
|
3441
|
+
# #2889: a CONFIRMED roll (or a race that found it already
|
|
3442
|
+
# current) is the clean-slate outcome — reset the ledger so a
|
|
3443
|
+
# FUTURE delta starts counting fresh rather than inheriting
|
|
3444
|
+
# whatever run-up this campaign accumulated on its way here.
|
|
3445
|
+
reset_roll_ledger()
|
|
3299
3446
|
status = (
|
|
3300
3447
|
rw.STATUS_UP_TO_DATE if prop_status == rp.STATUS_UP_TO_DATE
|
|
3301
3448
|
else rw.STATUS_ROLLED
|
|
@@ -3381,14 +3528,56 @@ def release_nightly_window(
|
|
|
3381
3528
|
)
|
|
3382
3529
|
)
|
|
3383
3530
|
else:
|
|
3531
|
+
# #2889: a genuinely FRESH arm — no existing marker for this
|
|
3532
|
+
# campaign at all — is the one case the RATE of markers can run
|
|
3533
|
+
# away. Same three checks `_ensure_roll_pending_marker` applies to
|
|
3534
|
+
# `coord release propagate`'s own arm site (#2096: one function, not
|
|
3535
|
+
# two definitions that could drift) — `_queue_provably_busy` needs
|
|
3536
|
+
# its own board read here since this command does not otherwise
|
|
3537
|
+
# compute a `Quiescence` (unlike `release_propagate`, which already
|
|
3538
|
+
# has one to reuse).
|
|
3539
|
+
arm_now = time.time()
|
|
3540
|
+
ledger = read_roll_ledger()
|
|
3541
|
+
board, board_error = _fetch_board()
|
|
3542
|
+
if board_error:
|
|
3543
|
+
# Cannot prove the queue non-empty either way — the #2889 item 2
|
|
3544
|
+
# check contributes nothing this run; the ledger's own
|
|
3545
|
+
# escalation/rate-limit checks still apply regardless.
|
|
3546
|
+
queue_provably_busy = False
|
|
3547
|
+
else:
|
|
3548
|
+
quiescence = rp.assess_quiescence(
|
|
3549
|
+
queue_entries=board.get("drive_queue") or [],
|
|
3550
|
+
assignments=board.get("assignments") or [],
|
|
3551
|
+
issues=board.get("issues") or [],
|
|
3552
|
+
now=arm_now,
|
|
3553
|
+
)
|
|
3554
|
+
queue_provably_busy = _queue_provably_busy(quiescence, daemon_name)
|
|
3555
|
+
refusal = _fresh_arm_refusal_reason(
|
|
3556
|
+
ledger, now=arm_now, queue_provably_busy=queue_provably_busy,
|
|
3557
|
+
)
|
|
3558
|
+
if refusal:
|
|
3559
|
+
record.error = (
|
|
3560
|
+
f"declined to arm a roll-pending marker for v{record.target_version} "
|
|
3561
|
+
f"— {refusal}"
|
|
3562
|
+
)
|
|
3563
|
+
click.echo(f"note: {record.error}")
|
|
3564
|
+
if ledger.escalated:
|
|
3565
|
+
from coord.commands.drive_queue import _escalate_roll_ledger # noqa: PLC0415
|
|
3566
|
+
|
|
3567
|
+
_escalate_roll_ledger(ledger, now=arm_now)
|
|
3568
|
+
_escalate_window(record, reason=record.error)
|
|
3569
|
+
_finish(rw.STATUS_LEDGER_ESCALATED, 1)
|
|
3570
|
+
_finish(rw.STATUS_ARM_DEFERRED, 0)
|
|
3384
3571
|
write_roll_pending(
|
|
3385
3572
|
RollPending(
|
|
3386
3573
|
target_version=record.target_version,
|
|
3387
|
-
set_at=
|
|
3574
|
+
set_at=arm_now,
|
|
3388
3575
|
reason="nightly-window",
|
|
3389
3576
|
min_releases_behind=effective_min_behind,
|
|
3390
3577
|
)
|
|
3391
3578
|
)
|
|
3579
|
+
# Nothing to write to the ledger here — only an EXPIRY moves its
|
|
3580
|
+
# rate-limit clock (`RollLedger.record_expiry`), never an arm.
|
|
3392
3581
|
click.echo(
|
|
3393
3582
|
f"roll pending: v{record.target_version} — the drive-queue tick will "
|
|
3394
3583
|
f"fire `coord release propagate` at the next inter-drive gap "
|
{code_coordinator-0.5.276 → code_coordinator-0.5.277}/coord/deploy/coord-release-window.service
RENAMED
|
@@ -173,6 +173,36 @@
|
|
|
173
173
|
# since it was added but would NOT have survived a from-scratch rebuild of
|
|
174
174
|
# this host — the whole reason this is now the packaged default instead of
|
|
175
175
|
# operator-local state.
|
|
176
|
+
#
|
|
177
|
+
# INVOKER (#2889 item 4) — ANSWERS "WHAT STARTED THIS?", HONESTLY BOUNDED
|
|
178
|
+
# --------------------------------------------------------------------------
|
|
179
|
+
# 2026-08-28's #2889 report found this unit starting ~10 times with BOTH
|
|
180
|
+
# release timers masked, and could rule out every trigger this codebase
|
|
181
|
+
# actually controls (`coord-release-window.timer` masked, the tick's own
|
|
182
|
+
# `_fire_pending_roll` only fires when a marker already exists, the watchdog
|
|
183
|
+
# only restarts `failed` units, no cron entry) without ever identifying the
|
|
184
|
+
# real cause — because `systemd` does not record a `systemctl start`'s
|
|
185
|
+
# CALLING process anywhere this unit (or its journal) can read.
|
|
186
|
+
#
|
|
187
|
+
# `$COORD_ROLL_INVOKER`, read by `coord release nightly-window` itself and
|
|
188
|
+
# journalled as `WindowRecord.invoked_by` (`coord release window-history`),
|
|
189
|
+
# is the closest honest answer available without deeper systemd
|
|
190
|
+
# instrumentation:
|
|
191
|
+
# * `Environment=` below sets the STATIC default, "timer-or-manual" —
|
|
192
|
+
# covers BOTH this unit's own `.timer` firing it AND a human running
|
|
193
|
+
# `systemctl --user start coord-release-window.service` by hand; those
|
|
194
|
+
# two genuinely cannot be told apart from inside the unit.
|
|
195
|
+
# * `coord.commands.drive_queue._fire_pending_roll` (the tick's own
|
|
196
|
+
# trigger — see "TWO TRIGGERS" above) overrides it with
|
|
197
|
+
# `--setenv=COORD_ROLL_INVOKER=drive-queue-tick` on that ONE start
|
|
198
|
+
# request — a transient per-invocation override, layered on top of this
|
|
199
|
+
# unit's static default by systemd itself, never touching this file.
|
|
200
|
+
# A future THIRD trigger (the open question #2889 could not close) will
|
|
201
|
+
# show up as "timer-or-manual" here too, same as a human running it by
|
|
202
|
+
# hand — this narrows the search space (it did NOT come from the tick) but
|
|
203
|
+
# does not, on its own, distinguish the timer from a person. If that
|
|
204
|
+
# distinction becomes necessary, `coord-release-window.timer`'s own unit can
|
|
205
|
+
# set a THIRD value via its own `Environment=`/`--setenv=` the same way.
|
|
176
206
|
|
|
177
207
|
[Unit]
|
|
178
208
|
Description=Release window: set/fire the #2587 roll-pending marker on the daemon host
|
|
@@ -181,6 +211,11 @@ Wants=network-online.target
|
|
|
181
211
|
|
|
182
212
|
[Service]
|
|
183
213
|
Type=oneshot
|
|
214
|
+
# #2889 item 4: the static default this run's `$COORD_ROLL_INVOKER` reads
|
|
215
|
+
# back as `WindowRecord.invoked_by` unless `_fire_pending_roll`'s own
|
|
216
|
+
# `--setenv=` overrides it for that one invocation — see the "INVOKER"
|
|
217
|
+
# section above for the full mechanism and its honest limits.
|
|
218
|
+
Environment=COORD_ROLL_INVOKER=timer-or-manual
|
|
184
219
|
# No --force, ever (trap 1) — coord/commands/release.py's
|
|
185
220
|
# release_nightly_window never passes it to the `coord release propagate`
|
|
186
221
|
# it shells out to when firing an already-pending marker. A fleet that is
|