code-coordinator 0.5.552__tar.gz → 0.5.554__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.552 → code_coordinator-0.5.554}/PKG-INFO +1 -1
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/acceptance.py +16 -1
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/acceptance_drivers.py +26 -3
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/bugbash.py +108 -10
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/release.py +19 -2
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/config.py +105 -14
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gtk_native_driver.py +73 -15
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/mac_native_driver.py +64 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_gate.py +51 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/reports.py +5 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/review.py +183 -6
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/win_native_driver.py +121 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_acceptance.py +40 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_acceptance_drivers.py +50 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_bugbash.py +71 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config.py +20 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_acceptance.py +124 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gtk_native_driver.py +69 -3
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_mac_native_driver.py +35 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_gate.py +112 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review.py +269 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_win_native_driver.py +64 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/.gitignore +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/CLAUDE.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/GOAL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/LICENSE +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/MANIFEST.in +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/README.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/__init__.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agent.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/audit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/backup.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/block_log.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/board_service.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/brain.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/claim.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/cli.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/client.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/codegen.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/bugbash.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/ci.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/comments.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dao.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/db.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/deps.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/drive.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/drive_sessions_snapshot.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/events.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/filelock.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/freshness.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gates.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/goal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/local_machine_identity.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/context.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/models.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/render.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/health/units.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/hooks.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/interactive.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/models.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/network.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/notify.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/openapi.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/parentage.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/plans.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/progress.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/release_window.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/restart_cmd.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/self_health.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/smoke.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/smoke_tags.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/split_work.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/sql.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/state.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/test_author.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/test_report.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/tui_pty_driver.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/usage.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/install-agent.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/pyproject.toml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/setup.cfg +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/__init__.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/backends.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/conftest.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_ci.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_issues.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_supervisor_3366.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_client.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_effective.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_db.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_max_parallel_config.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_sessions_snapshot.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_events.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_init.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_models.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_network.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_max_parallel_3423.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_restart_cmd.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_session.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_split.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_state.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_tui_pty_driver.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.552 → code_coordinator-0.5.554}/tests/write_parity.py +0 -0
|
@@ -957,13 +957,22 @@ def build_verdict(
|
|
|
957
957
|
passed = sum(1 for t in tests if t.get("status") == "pass")
|
|
958
958
|
failed = sum(1 for t in tests if t.get("status") == "fail")
|
|
959
959
|
skipped = sum(1 for t in tests if t.get("status") == "skip")
|
|
960
|
+
# #3510: a session precheck (win-native/mac-native/gtk-native) that
|
|
961
|
+
# finds a locked/absent GUI reports a distinct "unavailable" status,
|
|
962
|
+
# not "fail" — it's an environment condition, not an app bug. It must
|
|
963
|
+
# still block `green`/`ci_green`: an unconfirmed result is not a pass
|
|
964
|
+
# (epic #2096's "a gate must be able to fail" / "unconfirmed success
|
|
965
|
+
# is a defect"). Counted and reported separately so callers can tell
|
|
966
|
+
# "the app is broken" apart from "go unlock the host".
|
|
967
|
+
unavailable = sum(1 for t in tests if t.get("status") == "unavailable")
|
|
960
968
|
payload: dict[str, Any] = {
|
|
961
969
|
"scope": scope,
|
|
962
970
|
"total": len(tests),
|
|
963
971
|
"passed": passed,
|
|
964
972
|
"failed": failed,
|
|
965
973
|
"skipped": skipped,
|
|
966
|
-
"
|
|
974
|
+
"unavailable": unavailable,
|
|
975
|
+
"green": failed == 0 and unavailable == 0 and len(tests) > 0,
|
|
967
976
|
"tests": tests,
|
|
968
977
|
}
|
|
969
978
|
if issue_number is not None:
|
|
@@ -1038,12 +1047,18 @@ def apply_expected_red(verdict: dict[str, Any], expected_red_ids: "set[str]") ->
|
|
|
1038
1047
|
real_failures = sum(
|
|
1039
1048
|
1 for t in tests if t.get("status") == "fail" and t["id"] not in expected_red_ids
|
|
1040
1049
|
)
|
|
1050
|
+
# #3510: an `unavailable` entry (locked/absent GUI session) is never
|
|
1051
|
+
# expected-red-eligible — it isn't a test failure to excuse, it's a
|
|
1052
|
+
# precheck that never ran anything — so it always counts against
|
|
1053
|
+
# `ci_green` just like it does against `green` in build_verdict.
|
|
1054
|
+
unavailable = verdict.get("unavailable", 0)
|
|
1041
1055
|
verdict["unexpected_green"] = unexpected_green
|
|
1042
1056
|
verdict["expected_red_still_red"] = expected_red_still_red
|
|
1043
1057
|
verdict["missing_expected_red_ids"] = missing_expected_red_ids
|
|
1044
1058
|
verdict["ci_green"] = (
|
|
1045
1059
|
len(tests) > 0
|
|
1046
1060
|
and real_failures == 0
|
|
1061
|
+
and unavailable == 0
|
|
1047
1062
|
and not unexpected_green
|
|
1048
1063
|
and not missing_expected_red_ids
|
|
1049
1064
|
)
|
|
@@ -782,7 +782,15 @@ def _run_win_native(run_command: str, cwd: str, entrypoint: str, *, timeout: int
|
|
|
782
782
|
except WinNativeRuntimeError as e:
|
|
783
783
|
raise DriverError(f"win-native driver could not run: {e}") from e
|
|
784
784
|
|
|
785
|
-
|
|
785
|
+
# #3510: a locked/absent interactive session reports a distinct
|
|
786
|
+
# "unavailable" status (coord.win_native_driver's session precheck),
|
|
787
|
+
# not "fail" — it must still fail this exit code rather than read as a
|
|
788
|
+
# silent pass. An unconfirmed result is not a pass.
|
|
789
|
+
exit_code = (
|
|
790
|
+
0
|
|
791
|
+
if tests and all(t.get("status") not in ("fail", "unavailable") for t in tests)
|
|
792
|
+
else 1
|
|
793
|
+
)
|
|
786
794
|
raw_output = "\n".join(
|
|
787
795
|
f"{t.get('status')}: {t.get('id')} {t.get('message', '')}".rstrip()
|
|
788
796
|
for t in tests
|
|
@@ -843,7 +851,14 @@ def _run_mac_native(run_command: str, cwd: str, entrypoint: str, *, timeout: int
|
|
|
843
851
|
except MacNativeRuntimeError as e:
|
|
844
852
|
raise DriverError(f"mac-native driver could not run: {e}") from e
|
|
845
853
|
|
|
846
|
-
|
|
854
|
+
# #3510: a locked/absent GUI session reports a distinct "unavailable"
|
|
855
|
+
# status (coord.mac_native_driver's session precheck), not "fail" —
|
|
856
|
+
# it must still fail this exit code rather than read as a silent pass.
|
|
857
|
+
exit_code = (
|
|
858
|
+
0
|
|
859
|
+
if tests and all(t.get("status") not in ("fail", "unavailable") for t in tests)
|
|
860
|
+
else 1
|
|
861
|
+
)
|
|
847
862
|
raw_output = "\n".join(
|
|
848
863
|
f"{t.get('status')}: {t.get('id')} {t.get('message', '')}".rstrip()
|
|
849
864
|
for t in tests
|
|
@@ -904,7 +919,15 @@ def _run_gtk_native(run_command: str, cwd: str, entrypoint: str, *, timeout: int
|
|
|
904
919
|
except GtkNativeRuntimeError as e:
|
|
905
920
|
raise DriverError(f"gtk-native driver could not run: {e}") from e
|
|
906
921
|
|
|
907
|
-
|
|
922
|
+
# #3510: a missing $DISPLAY/$WAYLAND_DISPLAY reports a distinct
|
|
923
|
+
# "unavailable" status (coord.gtk_native_driver's session precheck),
|
|
924
|
+
# not "fail" — it must still fail this exit code rather than read as a
|
|
925
|
+
# silent pass.
|
|
926
|
+
exit_code = (
|
|
927
|
+
0
|
|
928
|
+
if tests and all(t.get("status") not in ("fail", "unavailable") for t in tests)
|
|
929
|
+
else 1
|
|
930
|
+
)
|
|
908
931
|
raw_output = "\n".join(
|
|
909
932
|
f"{t.get('status')}: {t.get('id')} {t.get('message', '')}".rstrip()
|
|
910
933
|
for t in tests
|
|
@@ -45,6 +45,20 @@ routing does — a lane only exists when some configured machine actually
|
|
|
45
45
|
carries the driver's declared ``capability``, so a repo with no capable
|
|
46
46
|
machine for a platform silently gets no lane rather than a lane that can
|
|
47
47
|
never run.
|
|
48
|
+
|
|
49
|
+
**#3510: an unavailable lane is not a bug finding.** When a win-native/
|
|
50
|
+
mac-native/gtk-native lane's own driver reports a locked or absent GUI
|
|
51
|
+
session (or no usable display), an explorer that sets
|
|
52
|
+
:attr:`ExploreOutcome.unavailable` causes :func:`run_bugbash` to skip that
|
|
53
|
+
lane for the round (:attr:`RoundReport.unavailable_lanes`) rather than
|
|
54
|
+
running the exploration checklist against it or filing any finding from it
|
|
55
|
+
— a locked desktop is an environment condition for the operator to fix,
|
|
56
|
+
not evidence of an app bug. This engine-level behavior is unit-tested
|
|
57
|
+
against a fake explorer in ``tests/test_bugbash.py``; the production
|
|
58
|
+
explorer (:func:`coord.commands.bugbash._dispatch_and_await_lane`) does
|
|
59
|
+
not itself set ``unavailable`` yet — see its own module docstring's
|
|
60
|
+
"KNOWN GAP" note — so a live ``coord bugbash`` run does not currently
|
|
61
|
+
benefit from this skip until that wiring lands.
|
|
48
62
|
"""
|
|
49
63
|
|
|
50
64
|
from __future__ import annotations
|
|
@@ -426,12 +440,31 @@ class ExploreOutcome:
|
|
|
426
440
|
there were findings," the second means "we looked, and there weren't
|
|
427
441
|
any" — :func:`run_bugbash` keeps them distinguishable in
|
|
428
442
|
:attr:`RoundReport.lane_failures` and its termination reason, rather
|
|
429
|
-
than collapsing both into "zero findings".
|
|
443
|
+
than collapsing both into "zero findings".
|
|
444
|
+
|
|
445
|
+
``unavailable`` is a THIRD, separate outcome (#3510): the lane's own
|
|
446
|
+
native driver observed a locked/absent GUI session (win-native/
|
|
447
|
+
mac-native) or no usable display (gtk-native) and ran no exploration at
|
|
448
|
+
all — a host/environment condition, never a bug finding and never a
|
|
449
|
+
dispatch/poll failure. An explorer that sets ``unavailable=True`` (as
|
|
450
|
+
the fake explorers in ``tests/test_bugbash.py`` do, modeling a
|
|
451
|
+
dispatched worker whose Tier-2 lane result came back
|
|
452
|
+
``status="unavailable"`` — see ``coord.win_native_driver``'s/
|
|
453
|
+
``coord.mac_native_driver``'s/``coord.gtk_native_driver``'s own
|
|
454
|
+
precheck) causes :func:`run_bugbash` to skip that lane for the round —
|
|
455
|
+
recording it in :attr:`RoundReport.unavailable_lanes` instead of
|
|
456
|
+
:attr:`RoundReport.lane_failures` — and never file findings from it
|
|
457
|
+
this round, even defensively, regardless of what ``findings`` carries.
|
|
458
|
+
The production explorer,
|
|
459
|
+
:func:`coord.commands.bugbash._dispatch_and_await_lane`, does not yet
|
|
460
|
+
set this flag (tracked as a KNOWN GAP in that module's docstring) —
|
|
461
|
+
today this is exercised only at the engine/unit-test level."""
|
|
430
462
|
|
|
431
463
|
findings: tuple[Finding, ...] = ()
|
|
432
464
|
cost: float = 0.0
|
|
433
465
|
notes: str = ""
|
|
434
466
|
ok: bool = True
|
|
467
|
+
unavailable: bool = False
|
|
435
468
|
|
|
436
469
|
|
|
437
470
|
#: ``(lane, round_num) -> ExploreOutcome`` — "go run this lane's
|
|
@@ -628,6 +661,16 @@ class RoundReport:
|
|
|
628
661
|
#: a lane skipped for having blown its per-lane cost cap was never
|
|
629
662
|
#: asked a question this round, so it can't have failed to answer one).
|
|
630
663
|
lane_failures: dict[str, str] = field(default_factory=dict)
|
|
664
|
+
#: ``{platform: notes}`` for every lane explored this round whose
|
|
665
|
+
#: :attr:`ExploreOutcome.unavailable` was ``True`` (#3510) — a locked or
|
|
666
|
+
#: absent GUI session (win-native/mac-native) or no usable display
|
|
667
|
+
#: (gtk-native). Distinct from :attr:`lane_failures`: this is a verified
|
|
668
|
+
#: observation (the native driver's own session precheck ran and
|
|
669
|
+
#: reported it), not a dispatch/poll/log failure — but it is ALSO not a
|
|
670
|
+
#: verified "ran the checklist and found nothing" either, so it is
|
|
671
|
+
#: tracked separately rather than folded into either bucket. No
|
|
672
|
+
#: findings are ever filed from a lane recorded here this round.
|
|
673
|
+
unavailable_lanes: dict[str, str] = field(default_factory=dict)
|
|
631
674
|
|
|
632
675
|
@property
|
|
633
676
|
def explored_lanes(self) -> set[str]:
|
|
@@ -643,10 +686,27 @@ class RoundReport:
|
|
|
643
686
|
not a clean pass" signal (#2096). A round with nothing explored at
|
|
644
687
|
all (e.g. every lane skipped on its cost cap) is NOT reported as
|
|
645
688
|
"all failed" — there is nothing to distrust, just nothing that
|
|
646
|
-
ran.
|
|
689
|
+
ran. Does NOT count an ``unavailable`` lane as failed — see
|
|
690
|
+
:attr:`all_explored_lanes_unavailable_or_failed` for the combined
|
|
691
|
+
check."""
|
|
647
692
|
explored = self.explored_lanes
|
|
648
693
|
return bool(explored) and explored <= set(self.lane_failures)
|
|
649
694
|
|
|
695
|
+
@property
|
|
696
|
+
def all_explored_lanes_unavailable_or_failed(self) -> bool:
|
|
697
|
+
"""``True`` when every lane explored this round either failed to
|
|
698
|
+
dispatch/poll/log OR reported its GUI session/display unavailable
|
|
699
|
+
(#3510) — i.e. NONE of them actually ran the exploration checklist.
|
|
700
|
+
Used by :func:`run_bugbash` to pick the ``"lanes_unavailable"``
|
|
701
|
+
termination reason over a false ``"zero_findings"`` clean-pass read
|
|
702
|
+
when every lane this round was simply locked/absent rather than
|
|
703
|
+
genuinely explored (#2096: zero findings is only a clean pass when
|
|
704
|
+
something was actually observed to run)."""
|
|
705
|
+
explored = self.explored_lanes
|
|
706
|
+
return bool(explored) and explored <= (
|
|
707
|
+
set(self.lane_failures) | set(self.unavailable_lanes)
|
|
708
|
+
)
|
|
709
|
+
|
|
650
710
|
|
|
651
711
|
@dataclass
|
|
652
712
|
class BugbashReport:
|
|
@@ -677,6 +737,15 @@ class BugbashReport:
|
|
|
677
737
|
part of what it observed along the way was unverified (#2096)."""
|
|
678
738
|
return any(r.lane_failures for r in self.rounds)
|
|
679
739
|
|
|
740
|
+
@property
|
|
741
|
+
def any_lane_unavailable(self) -> bool:
|
|
742
|
+
"""``True`` if ANY round recorded a lane as unavailable (#3510) —
|
|
743
|
+
surfaced regardless of whether it happened to be the terminating
|
|
744
|
+
round, so an operator glancing at a run that otherwise filed/found
|
|
745
|
+
plenty still sees that one platform was locked/absent the whole
|
|
746
|
+
time and needs attention, not a bug report."""
|
|
747
|
+
return any(r.unavailable_lanes for r in self.rounds)
|
|
748
|
+
|
|
680
749
|
|
|
681
750
|
def run_bugbash(
|
|
682
751
|
config: BugbashConfig,
|
|
@@ -701,14 +770,24 @@ def run_bugbash(
|
|
|
701
770
|
``new_count``/cost, never inferred from "no exception was raised":
|
|
702
771
|
|
|
703
772
|
- ``"zero_findings"`` — this round's non-duplicate finding count is 0,
|
|
704
|
-
AND at least one explored lane actually completed
|
|
705
|
-
(``RoundReport.all_explored_lanes_failed``
|
|
706
|
-
|
|
773
|
+
AND at least one explored lane actually completed its checklist
|
|
774
|
+
(neither ``RoundReport.all_explored_lanes_failed`` nor
|
|
775
|
+
``RoundReport.all_explored_lanes_unavailable_or_failed`` is ``True``)
|
|
776
|
+
— a genuine observed clean pass.
|
|
707
777
|
- ``"lane_failure"`` — this round's non-duplicate finding count is ALSO
|
|
708
778
|
0, but every lane explored this round came back ``ok=False``
|
|
709
779
|
(dispatch/poll/log failure) — #2096: a fleet-wide dispatch outage
|
|
710
780
|
must never be reported identically to a clean bugbash pass. Check
|
|
711
781
|
``BugbashReport.rounds[-1].lane_failures`` for what actually broke.
|
|
782
|
+
- ``"lanes_unavailable"`` — this round's non-duplicate finding count is
|
|
783
|
+
ALSO 0, no lane came back a dispatch/poll/log failure, but every lane
|
|
784
|
+
explored this round reported its GUI session/display unavailable
|
|
785
|
+
(#3510: locked or absent, e.g. a locked dell64) — a different reason
|
|
786
|
+
from ``"lane_failure"`` (the explorer DID run and DID get a verified
|
|
787
|
+
answer, it's just "the host is locked", not "I don't know"), and
|
|
788
|
+
still not a clean pass either, since nothing was actually exercised
|
|
789
|
+
against the app. Check ``BugbashReport.rounds[-1].unavailable_lanes``
|
|
790
|
+
for which host needs unlocking.
|
|
712
791
|
- ``"cost_cap"`` — cumulative cost has reached ``cost_cap_total``.
|
|
713
792
|
- ``"round_cap"`` — ``config.max_rounds`` rounds ran without either of
|
|
714
793
|
the above firing.
|
|
@@ -730,6 +809,16 @@ def run_bugbash(
|
|
|
730
809
|
lane_cost[lane.platform] += outcome.cost
|
|
731
810
|
report.lane_cost[lane.platform] = lane_cost[lane.platform]
|
|
732
811
|
total_cost += outcome.cost
|
|
812
|
+
if outcome.unavailable:
|
|
813
|
+
# #3510: a locked/absent GUI session (or missing display)
|
|
814
|
+
# is a host condition, not a finding — recorded separately
|
|
815
|
+
# from both a clean pass and a dispatch/poll failure, and
|
|
816
|
+
# NEVER contributes findings this round, even defensively
|
|
817
|
+
# if the explorer happened to also hand some back.
|
|
818
|
+
report.unavailable_lanes[lane.platform] = (
|
|
819
|
+
outcome.notes or "lane unavailable — no usable GUI session/display"
|
|
820
|
+
)
|
|
821
|
+
continue
|
|
733
822
|
report.findings.extend(outcome.findings)
|
|
734
823
|
if not outcome.ok:
|
|
735
824
|
# #2096: this lane's "findings" (almost certainly empty) are
|
|
@@ -788,11 +877,20 @@ def run_bugbash(
|
|
|
788
877
|
|
|
789
878
|
if report.new_count == 0:
|
|
790
879
|
# #2096: "zero findings" is only a genuine clean-pass verdict
|
|
791
|
-
# when at least one lane was actually verified to have
|
|
792
|
-
# round. A round where every explored lane failed
|
|
793
|
-
# poll
|
|
794
|
-
#
|
|
795
|
-
|
|
880
|
+
# when at least one lane was actually verified to have RUN THE
|
|
881
|
+
# CHECKLIST this round. A round where every explored lane failed
|
|
882
|
+
# to dispatch/poll/fetch its log gets "lane_failure"; a round
|
|
883
|
+
# where every explored lane instead reported its session/display
|
|
884
|
+
# unavailable (#3510 — locked or absent, never a dispatch
|
|
885
|
+
# failure) gets its own distinct "lanes_unavailable" reason, in
|
|
886
|
+
# that priority order since a round can't be "all failed" AND
|
|
887
|
+
# "all unavailable" (each lane only sets one of the two).
|
|
888
|
+
if report.all_explored_lanes_failed:
|
|
889
|
+
reason = "lane_failure"
|
|
890
|
+
elif report.all_explored_lanes_unavailable_or_failed:
|
|
891
|
+
reason = "lanes_unavailable"
|
|
892
|
+
else:
|
|
893
|
+
reason = "zero_findings"
|
|
796
894
|
break
|
|
797
895
|
if total_cost >= config.cost_cap_total:
|
|
798
896
|
reason = "cost_cap"
|
|
@@ -4551,6 +4551,12 @@ def _load_release_gate_observations(
|
|
|
4551
4551
|
passed=_require_bool(entry["passed"], field_name="lanes[].passed"),
|
|
4552
4552
|
detail=entry.get("detail", ""),
|
|
4553
4553
|
checked_at=entry.get("checked_at"),
|
|
4554
|
+
# #3510: a locked/absent GUI session or missing display, as
|
|
4555
|
+
# reported by the native driver's own session precheck — never
|
|
4556
|
+
# coerced from a truthy non-bool, same discipline as `passed`.
|
|
4557
|
+
unavailable=_require_bool(
|
|
4558
|
+
entry.get("unavailable", False), field_name="lanes[].unavailable",
|
|
4559
|
+
),
|
|
4554
4560
|
)
|
|
4555
4561
|
for entry in payload.get("lanes", []) or []
|
|
4556
4562
|
]
|
|
@@ -4576,7 +4582,10 @@ def _gate_verdict_to_dict(verdict: "Any") -> dict[str, Any]:
|
|
|
4576
4582
|
"gate_passed": verdict.gate_passed,
|
|
4577
4583
|
"effective_passed": verdict.effective_passed,
|
|
4578
4584
|
"steps": [
|
|
4579
|
-
{
|
|
4585
|
+
{
|
|
4586
|
+
"name": s.name, "passed": s.passed, "detail": s.detail,
|
|
4587
|
+
"unavailable": s.unavailable,
|
|
4588
|
+
}
|
|
4580
4589
|
for s in verdict.steps
|
|
4581
4590
|
],
|
|
4582
4591
|
"override": None if verdict.override is None else {
|
|
@@ -4590,7 +4599,15 @@ def _gate_verdict_to_dict(verdict: "Any") -> dict[str, Any]:
|
|
|
4590
4599
|
def _render_gate_verdict(verdict: "Any") -> str:
|
|
4591
4600
|
lines = [f"release gate: {verdict.repo} @ {verdict.release_sha}"]
|
|
4592
4601
|
for step in verdict.steps:
|
|
4593
|
-
|
|
4602
|
+
# #3510: a locked/absent GUI session is blocking but is NOT the app
|
|
4603
|
+
# failing — labeled distinctly so an operator knows to unlock the
|
|
4604
|
+
# host rather than go debug the app.
|
|
4605
|
+
if step.unavailable:
|
|
4606
|
+
marker = "UNAVAILABLE"
|
|
4607
|
+
elif step.passed:
|
|
4608
|
+
marker = "PASS"
|
|
4609
|
+
else:
|
|
4610
|
+
marker = "FAIL"
|
|
4594
4611
|
lines.append(f" [{marker}] {step.name}: {step.detail}")
|
|
4595
4612
|
if verdict.override is not None:
|
|
4596
4613
|
lines.append(
|
|
@@ -427,6 +427,20 @@ class AcceptanceDriverConfig:
|
|
|
427
427
|
``pytest tests/acceptance/{ms}`` legitimately has no entry point, which
|
|
428
428
|
is exactly why #1175's blanket refusal only ever broke the Rust route.
|
|
429
429
|
|
|
430
|
+
#3509: the four Tier-2 lane kinds (:data:`TIER2_LANE_KINDS` —
|
|
431
|
+
``tui-pty``/``win-native``/``mac-native``/``gtk-native``) are the one
|
|
432
|
+
exception to "folded into the sealed set" above. Their ``entrypoint:``
|
|
433
|
+
is a smoke spec that ``coord bugbash`` (#3487) expects every fix to
|
|
434
|
+
GROW, with no independent ``test-author`` the way ``tests/acceptance/``
|
|
435
|
+
has one — full sealing made it impossible for a ``type="work"`` worker
|
|
436
|
+
to add the smoke-spec step its own fix is required to ship. See
|
|
437
|
+
:meth:`AcceptanceConfig.sealed_paths` and
|
|
438
|
+
:meth:`AcceptanceConfig.additive_only_entrypoints` for the derived sets,
|
|
439
|
+
and :func:`coord.review._lane_entrypoint_violation_lines` for the
|
|
440
|
+
mandatory (but narrower) rule that still applies: additions are
|
|
441
|
+
unrestricted, but removing or rewriting a pre-existing line is still a
|
|
442
|
+
mandatory ``request-changes``.
|
|
443
|
+
|
|
430
444
|
``match`` and ``routes`` implement #1125's in-repo path routing: a repo
|
|
431
445
|
entry with a non-empty ``routes`` list is a *router* — its own
|
|
432
446
|
``kind``/``run``/``mock``/``capability``/``setup``/``entrypoint`` are
|
|
@@ -469,6 +483,20 @@ class AcceptanceDriverConfig:
|
|
|
469
483
|
# directory without the trailing slash.
|
|
470
484
|
SEALED_ACCEPTANCE_DIR = "tests/acceptance/"
|
|
471
485
|
|
|
486
|
+
# #3509: the four Tier-2 (epic #3482) platform-lane acceptance driver kinds
|
|
487
|
+
# whose `entrypoint:` is a smoke spec `coord bugbash` (#3487) grows one step
|
|
488
|
+
# at a time, not an oracle a `test-author` writes once and a worker is
|
|
489
|
+
# graded against — see `AcceptanceConfig.sealed_paths`'s docstring for why
|
|
490
|
+
# that makes full sealing wrong for exactly these four kinds. Kept in sync
|
|
491
|
+
# with `coord.bugbash.LANE_DRIVER_KINDS` by hand rather than imported — the
|
|
492
|
+
# same hand-sync discipline `coord.acceptance_drivers.SUPPORTED_KINDS` and
|
|
493
|
+
# `coord.bugbash.LANE_DRIVER_KINDS` already use for each other, for the same
|
|
494
|
+
# reason: `coord.bugbash` deliberately takes a duck-typed `config: Any`
|
|
495
|
+
# rather than importing this (foundational, widely-imported) module, so
|
|
496
|
+
# this module returns the favor instead of introducing a config->feature
|
|
497
|
+
# dependency from the other side.
|
|
498
|
+
TIER2_LANE_KINDS = frozenset({"tui-pty", "win-native", "mac-native", "gtk-native"})
|
|
499
|
+
|
|
472
500
|
|
|
473
501
|
def entrypoint_sibling_acceptance_dir(entrypoint: str) -> str:
|
|
474
502
|
"""The ``acceptance/`` directory an entrypoint-linked driver ``include!``s
|
|
@@ -496,6 +524,27 @@ class AcceptanceConfig:
|
|
|
496
524
|
|
|
497
525
|
drivers: dict[str, AcceptanceDriverConfig] = field(default_factory=dict)
|
|
498
526
|
|
|
527
|
+
def _entrypoint_kind_pairs(self, repo_name: str) -> list[tuple[str, str]]:
|
|
528
|
+
"""``(entrypoint, kind)`` for every declared entrypoint of
|
|
529
|
+
*repo_name*, deduped on the entrypoint, declaration order preserved
|
|
530
|
+
— the one traversal :meth:`entrypoints`, :meth:`sealed_paths` and
|
|
531
|
+
(#3509) :meth:`additive_only_entrypoints` all build on, so "which
|
|
532
|
+
driver kind owns this entrypoint" is answered in exactly one place
|
|
533
|
+
rather than three copies of the same ``for cfg in [entry,
|
|
534
|
+
*entry.routes]`` walk silently drifting apart.
|
|
535
|
+
"""
|
|
536
|
+
entry = self.drivers.get(repo_name)
|
|
537
|
+
if entry is None:
|
|
538
|
+
return []
|
|
539
|
+
out: list[tuple[str, str]] = []
|
|
540
|
+
seen: set[str] = set()
|
|
541
|
+
for cfg in [entry, *entry.routes]:
|
|
542
|
+
ep = cfg.entrypoint.strip()
|
|
543
|
+
if ep and ep not in seen:
|
|
544
|
+
seen.add(ep)
|
|
545
|
+
out.append((ep, cfg.kind))
|
|
546
|
+
return out
|
|
547
|
+
|
|
499
548
|
def entrypoints(self, repo_name: str) -> list[str]:
|
|
500
549
|
"""Every ``entrypoint:`` declared by *repo_name*'s acceptance driver
|
|
501
550
|
(#1552), deduped, declaration order preserved.
|
|
@@ -508,16 +557,31 @@ class AcceptanceConfig:
|
|
|
508
557
|
flat repo contributes at most its own. Repos with no driver — and
|
|
509
558
|
drivers whose suite is directory-discovered (``cli-pytest``) —
|
|
510
559
|
return ``[]``.
|
|
560
|
+
|
|
561
|
+
Includes Tier-2 lane-kind entrypoints (:data:`TIER2_LANE_KINDS`) —
|
|
562
|
+
this is "every entrypoint the repo declares", not "every SEALED
|
|
563
|
+
entrypoint"; use :meth:`sealed_paths` for the sealed subset and
|
|
564
|
+
:meth:`additive_only_entrypoints` for the lane-kind one (#3509).
|
|
511
565
|
"""
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
566
|
+
return [ep for ep, _kind in self._entrypoint_kind_pairs(repo_name)]
|
|
567
|
+
|
|
568
|
+
def additive_only_entrypoints(self, repo_name: str) -> list[str]:
|
|
569
|
+
"""(#3509) The subset of :meth:`entrypoints` declared by a Tier-2
|
|
570
|
+
lane-kind driver (``tui-pty``/``win-native``/``mac-native``/
|
|
571
|
+
``gtk-native``, :data:`TIER2_LANE_KINDS`) — deliberately excluded
|
|
572
|
+
from :meth:`sealed_paths`, see that method's docstring for why.
|
|
573
|
+
|
|
574
|
+
These paths are not a free-for-all: :func:`coord.review
|
|
575
|
+
._lane_entrypoint_violation_lines` still mandatorily rejects a
|
|
576
|
+
``type="work"`` diff that removes or rewrites a pre-existing line in
|
|
577
|
+
one of them (a deleted step, a loosened ``expect_*`` field, a raised
|
|
578
|
+
latency budget, a shortened idle window) — only ADDING to them (a
|
|
579
|
+
new step, or a wholly new spec file beside them) is unrestricted.
|
|
580
|
+
"""
|
|
581
|
+
return [
|
|
582
|
+
ep for ep, kind in self._entrypoint_kind_pairs(repo_name)
|
|
583
|
+
if kind in TIER2_LANE_KINDS
|
|
584
|
+
]
|
|
521
585
|
|
|
522
586
|
def sealed_paths(self, repo_name: str) -> list[str]:
|
|
523
587
|
"""The full sealed-oracle path set for *repo_name* (#944 sealing v1,
|
|
@@ -554,11 +618,33 @@ class AcceptanceConfig:
|
|
|
554
618
|
standalone ``coord-tui`` repo's flat ``tests/acceptance.rs``) has
|
|
555
619
|
that sibling collapse onto ``SEALED_ACCEPTANCE_DIR`` itself — see the
|
|
556
620
|
dedup below.
|
|
621
|
+
|
|
622
|
+
#3509: a Tier-2 lane-kind entrypoint (:data:`TIER2_LANE_KINDS` —
|
|
623
|
+
``tui-pty``/``win-native``/``mac-native``/``gtk-native``) is
|
|
624
|
+
deliberately excluded from this set, entrypoint AND sibling dir
|
|
625
|
+
both. Those four kinds' ``entrypoint:`` is a smoke spec
|
|
626
|
+
``coord bugbash`` (#3487) files findings against on the acceptance
|
|
627
|
+
line "the fix must add a Tier-1 shared conformance scenario or a
|
|
628
|
+
Tier-2 smoke-spec step that fails first" — a regression ratchet
|
|
629
|
+
every fix is expected to GROW, with no independent author the way
|
|
630
|
+
``tests/acceptance/`` has one. Full sealing made that structurally
|
|
631
|
+
impossible: a ``type="work"`` diff adding the very step its own fix
|
|
632
|
+
requires tripped the same mandatory tamper banner as rewriting the
|
|
633
|
+
oracle it's graded against. Excluded here does not mean
|
|
634
|
+
unrestricted — :func:`coord.review._lane_entrypoint_violation_lines`
|
|
635
|
+
(fed by :meth:`additive_only_entrypoints`) still mandatorily rejects
|
|
636
|
+
a diff that removes or weakens a pre-existing line in one of these
|
|
637
|
+
files; only growing them is unconstrained. ``tui-tuidriver`` and
|
|
638
|
+
``cli-pytest`` are unaffected — neither kind is in
|
|
639
|
+
:data:`TIER2_LANE_KINDS`, so their entrypoints stay fully sealed
|
|
640
|
+
exactly as before.
|
|
557
641
|
"""
|
|
558
642
|
if not self.has_driver(repo_name):
|
|
559
643
|
return []
|
|
560
644
|
out = [SEALED_ACCEPTANCE_DIR]
|
|
561
|
-
for ep in self.
|
|
645
|
+
for ep, kind in self._entrypoint_kind_pairs(repo_name):
|
|
646
|
+
if kind in TIER2_LANE_KINDS:
|
|
647
|
+
continue
|
|
562
648
|
if ep not in out:
|
|
563
649
|
out.append(ep)
|
|
564
650
|
sibling = entrypoint_sibling_acceptance_dir(ep)
|
|
@@ -3908,10 +3994,15 @@ def _parse_acceptance_routes(
|
|
|
3908
3994
|
def _acceptance_entrypoint(entry: dict, label: str) -> str:
|
|
3909
3995
|
"""Validate an acceptance driver's optional ``entrypoint:`` (#1552).
|
|
3910
3996
|
|
|
3911
|
-
Must be a repo-root-relative *file* path —
|
|
3912
|
-
set as an exact-match entry
|
|
3913
|
-
an absolute path or a
|
|
3914
|
-
|
|
3997
|
+
Must be a repo-root-relative *file* path — for most ``kind`` values it
|
|
3998
|
+
is folded into the sealed set as an exact-match entry
|
|
3999
|
+
(:meth:`AcceptanceConfig.sealed_paths`), so an absolute path or a
|
|
4000
|
+
trailing-slash directory would silently seal nothing at all. (#3509:
|
|
4001
|
+
the four Tier-2 lane kinds in :data:`TIER2_LANE_KINDS` are the one
|
|
4002
|
+
exception — their entrypoint is additive-only, not sealed — but the
|
|
4003
|
+
same validation still applies: a malformed path there would just as
|
|
4004
|
+
silently defeat :meth:`AcceptanceConfig.additive_only_entrypoints`.)
|
|
4005
|
+
Reject both malformations here rather than at review time, where the
|
|
3915
4006
|
only symptom would be a `test-author` bounced for a scope violation it
|
|
3916
4007
|
cannot fix.
|
|
3917
4008
|
"""
|
|
@@ -106,6 +106,18 @@ child. See ``tests/test_gtk_native_driver.py``'s
|
|
|
106
106
|
regression guard, mirroring :mod:`coord.win_native_driver`'s
|
|
107
107
|
``test_no_image_name_kill_path_exists_in_the_module`` and
|
|
108
108
|
:mod:`coord.mac_native_driver`'s own equivalent.
|
|
109
|
+
|
|
110
|
+
**Missing-display precheck (#3510).** Unlike ``win-native``/``mac-native``,
|
|
111
|
+
a missing display here means no ``$DISPLAY``/``$WAYLAND_DISPLAY`` at all —
|
|
112
|
+
no Xvfb/compositor session is up on this host. That's a host-provisioning
|
|
113
|
+
condition, not an app bug, so before :meth:`NativeRunner.run` launches
|
|
114
|
+
anything it calls :meth:`GtkCalls.session_available`. When unavailable, the
|
|
115
|
+
run returns a single ``status="unavailable"`` result — never a ``"fail"``
|
|
116
|
+
— and no step (not even ``launch``) runs. ``LinuxGtkCalls`` itself no
|
|
117
|
+
longer raises at construction time for a missing display (that check moved
|
|
118
|
+
into :meth:`LinuxGtkCalls.session_available` so it's always reachable
|
|
119
|
+
through the seam, including from a fake in tests) — only a non-Linux host
|
|
120
|
+
is still a construction-time :class:`GtkNativeRuntimeError`.
|
|
109
121
|
"""
|
|
110
122
|
|
|
111
123
|
from __future__ import annotations
|
|
@@ -129,10 +141,12 @@ class GtkNativeSpecError(Exception):
|
|
|
129
141
|
|
|
130
142
|
|
|
131
143
|
class GtkNativeRuntimeError(Exception):
|
|
132
|
-
"""Raised when the native driver itself can't run: not on Linux,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
144
|
+
"""Raised when the native driver itself can't run: not on Linux, a
|
|
145
|
+
missing ``xdotool``/``xwd`` binary or AT-SPI binding, the launched
|
|
146
|
+
process/window never appearing, or a step referencing a window before
|
|
147
|
+
any ``launch`` step ran. A missing ``$DISPLAY``/``$WAYLAND_DISPLAY`` is
|
|
148
|
+
NOT one of these (#3510) — that is an "unavailable" lane verdict via
|
|
149
|
+
:meth:`GtkCalls.session_available`, never a raised exception."""
|
|
136
150
|
|
|
137
151
|
|
|
138
152
|
# ── native spec model ───────────────────────────────────────────────────────
|
|
@@ -314,6 +328,16 @@ class GtkCalls(Protocol):
|
|
|
314
328
|
|
|
315
329
|
def kill(self, pid: int) -> None: ...
|
|
316
330
|
|
|
331
|
+
def session_available(self) -> tuple[bool, str]:
|
|
332
|
+
"""``(True, "")`` when a usable display is present for this driver
|
|
333
|
+
to launch into; ``(False, reason)`` when neither ``$DISPLAY`` nor
|
|
334
|
+
``$WAYLAND_DISPLAY`` is set (#3510) — checked by
|
|
335
|
+
:meth:`NativeRunner.run` BEFORE any step (including ``launch``)
|
|
336
|
+
runs, so a missing display is reported as ``status="unavailable"``
|
|
337
|
+
rather than a failed step. Never raises — a probe failure here is
|
|
338
|
+
itself an "unavailable" verdict, not a crash."""
|
|
339
|
+
...
|
|
340
|
+
|
|
317
341
|
|
|
318
342
|
def _find_a11y_match(elements: list[dict], role: str, name: str) -> dict | None:
|
|
319
343
|
"""The first *elements* entry whose ``role`` matches exactly
|
|
@@ -368,7 +392,19 @@ class NativeRunner:
|
|
|
368
392
|
self._window_id: int | None = None
|
|
369
393
|
|
|
370
394
|
def run(self, spec: NativeSpec) -> list[dict]:
|
|
395
|
+
"""Run *spec*, first checking :meth:`GtkCalls.session_available`
|
|
396
|
+
(#3510). A missing display is a host-provisioning condition, not an
|
|
397
|
+
app bug: when unavailable, this returns a single
|
|
398
|
+
``status="unavailable"`` entry and runs NO step at all (not even
|
|
399
|
+
``launch``) — never folding it into an ordinary ``"fail"``."""
|
|
371
400
|
self._spec = spec
|
|
401
|
+
available, reason = self._calls.session_available()
|
|
402
|
+
if not available:
|
|
403
|
+
return [{
|
|
404
|
+
"id": "session",
|
|
405
|
+
"status": "unavailable",
|
|
406
|
+
"message": reason or "no usable display is available",
|
|
407
|
+
}]
|
|
372
408
|
results: list[dict] = []
|
|
373
409
|
try:
|
|
374
410
|
for step in spec.steps:
|
|
@@ -557,12 +593,14 @@ class LinuxGtkCalls:
|
|
|
557
593
|
``python3-gi``) for the accessibility tree, and ``xwd`` (ships with every
|
|
558
594
|
X11 install) for window captures.
|
|
559
595
|
|
|
560
|
-
Linux-only
|
|
561
|
-
:class:`
|
|
562
|
-
:class:`coord.
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
596
|
+
Linux-only: raises :class:`GtkNativeRuntimeError` at construction on any
|
|
597
|
+
other platform, mirroring :class:`coord.mac_native_driver.MacOSCalls`'s/
|
|
598
|
+
:class:`coord.win_native_driver.Win32Calls`'s own platform guards. A
|
|
599
|
+
missing ``$DISPLAY``/``$WAYLAND_DISPLAY`` is NOT a construction-time
|
|
600
|
+
raise (#3510) — see :meth:`session_available`, checked by
|
|
601
|
+
:class:`NativeRunner` before any step runs. This driver never starts its
|
|
602
|
+
own ``Xvfb`` — see the module docstring's "headless by construction"
|
|
603
|
+
note.
|
|
566
604
|
"""
|
|
567
605
|
|
|
568
606
|
def __init__(self) -> None:
|
|
@@ -572,11 +610,25 @@ class LinuxGtkCalls:
|
|
|
572
610
|
"runs on a real Linux host with a display (e.g. a fleet "
|
|
573
611
|
"host running a persistent Xvfb session)"
|
|
574
612
|
)
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
613
|
+
# Deliberately NOT a construction-time raise for a missing display
|
|
614
|
+
# (#3510) — that is an "unavailable" lane verdict, not a driver
|
|
615
|
+
# construction failure, and is checked (and reachable through the
|
|
616
|
+
# same `GtkCalls` seam a test's fake implements) via
|
|
617
|
+
# :meth:`session_available`, called by `NativeRunner.run` before any
|
|
618
|
+
# step — see the module docstring's "missing-display precheck".
|
|
619
|
+
|
|
620
|
+
# -- session precheck (#3510) --
|
|
621
|
+
|
|
622
|
+
def session_available(self) -> tuple[bool, str]:
|
|
623
|
+
"""Real check: either ``$DISPLAY`` (X11) or ``$WAYLAND_DISPLAY``
|
|
624
|
+
(Wayland) must be set — no headless compositor or Xvfb session
|
|
625
|
+
appears to be running on this host otherwise."""
|
|
626
|
+
if os.environ.get("DISPLAY") or os.environ.get("WAYLAND_DISPLAY"):
|
|
627
|
+
return True, ""
|
|
628
|
+
return False, (
|
|
629
|
+
"neither $DISPLAY nor $WAYLAND_DISPLAY is set — no headless "
|
|
630
|
+
"compositor or Xvfb session appears to be running on this host"
|
|
631
|
+
)
|
|
580
632
|
|
|
581
633
|
# -- process lifecycle --
|
|
582
634
|
|
|
@@ -772,6 +824,12 @@ def run_native_spec(
|
|
|
772
824
|
assertion fails) do NOT raise — they're folded into the returned list
|
|
773
825
|
as a ``status="fail"`` entry, the same "partial results, not a crash"
|
|
774
826
|
contract :func:`coord.mac_native_driver.run_native_spec` already gives.
|
|
827
|
+
|
|
828
|
+
When *calls* reports no usable display
|
|
829
|
+
(:meth:`GtkCalls.session_available`, #3510), the returned list is a
|
|
830
|
+
single ``status="unavailable"`` entry and no step runs — a distinct
|
|
831
|
+
verdict from ``"fail"``, since a missing display is a host-provisioning
|
|
832
|
+
condition, not an app bug.
|
|
775
833
|
"""
|
|
776
834
|
spec = parse_native_spec(spec_text)
|
|
777
835
|
resolved_calls = calls if calls is not None else LinuxGtkCalls()
|