code-coordinator 0.5.538__tar.gz → 0.5.539__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.538 → code_coordinator-0.5.539}/PKG-INFO +1 -1
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/smoke.py +25 -109
- code_coordinator-0.5.539/coord/smoke_tags.py +140 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/stage_projection.py +88 -2
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_stage_projection.py +174 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/.gitignore +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/CLAUDE.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/GOAL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/LICENSE +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/MANIFEST.in +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/README.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/__init__.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/agent.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/audit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/backup.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/block_log.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/board_service.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/brain.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/claim.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/claude_setup_token.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/cli.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/client.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/codegen.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/backup.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/ci.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/codegen.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/dr.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/comments.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/config.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dao.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/db.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/deps.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dispatch_liveness.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dr_promote.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/dr_verify.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/drive.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/drive_sessions_snapshot.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/events.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/failure_classifier.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/filelock.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/freshness.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/gates.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/goal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/config_drift.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/local_machine_identity.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/pr_churn.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/context.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/models.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/render.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/health/units.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/hooks.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/interactive.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/invariant_alarms.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/machine_fault.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/machine_metrics.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/machine_stats.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/models.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/network.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/notify.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/openapi.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/parentage.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/plans.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/progress.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/release_window.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/reports.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/restart_cmd.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/review.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/self_health.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/split_work.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/sql.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/state.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/store_parity.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/templates/deploy-cloudflare.node.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/test_author.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/test_report.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/uat_checks.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/usage.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-backup.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-backup.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-dr-verify.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-dr-verify.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/DATA_STORE_SELECTION.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/DISASTER_RECOVERY.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/install-agent.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/pyproject.toml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/dr-down.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/dr-up.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/provision-server.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/throwaway-vm.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/lib/provision-core.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/provision-machine.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/setup-macmini.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/verify-provision-noble.sh +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/setup.cfg +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/__init__.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/backends.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/conftest.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_approve_capability_reroute_3241.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_backup.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_ci_github.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_claude_setup_token.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_ci.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_codegen.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_doctor_store_backend_3084.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_issues.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_serve_store_backend_3084.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_invariant_alarms.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_machine_fault.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_retried_3340.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_supervisor_3366.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_client.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_client_config_cache_atomic_3052.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_config.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_config_drift_check.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_config_effective.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dashboard_server.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_db.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_db_backup_unit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dispatch_liveness.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dispatch_workers.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dr_azure_scripts.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dr_promote.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_dr_verify.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_machine_fault.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_queue_max_parallel_config.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_sessions_snapshot.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_events.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_failure_classifier.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_fix_escalation_classifier.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_pr_churn.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_housekeeping.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_init.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_interactive.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_invariant_alarms.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_machine_fault.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_machine_metrics.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_machine_stats.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_models.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_network.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_provision_core.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_provision_machine.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_cordon_drain_stall_3336.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_repo_max_parallel_3423.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_restart_cmd.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_retry_escalation_classify_3360.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_review.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_serve_app.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_session.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_smoke_fanout_manifest_3333.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_split.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_state.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_throwaway_vm.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_uat_checks.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.538 → code_coordinator-0.5.539}/tests/write_parity.py +0 -0
|
@@ -82,7 +82,6 @@ independence; for smoke we want a *capable* machine for hardware, and
|
|
|
82
82
|
|
|
83
83
|
from __future__ import annotations
|
|
84
84
|
|
|
85
|
-
import base64
|
|
86
85
|
import json
|
|
87
86
|
import logging
|
|
88
87
|
import re
|
|
@@ -123,6 +122,24 @@ from coord.models import (
|
|
|
123
122
|
# runner actually emits, or from what `coord.notify` parses back out of the
|
|
124
123
|
# agent's own transcript (see `_smoke_baseline_red_reason` there).
|
|
125
124
|
from coord.revalidate import BASELINE_RED_OUTPUT_MARKER, RUNNER_BASELINE_RED_EXIT
|
|
125
|
+
# The #3182 fan-out's on-the-board text encodings, DEFINED in a leaf module
|
|
126
|
+
# and re-exported here under their original spellings so every existing
|
|
127
|
+
# importer (`coord.notify`, `coord.diagnose`, `coord.reconcile`, the tests)
|
|
128
|
+
# still reads them off `coord.smoke`, with exactly one definition of each.
|
|
129
|
+
# See `coord/smoke_tags.py`'s docstring for why they were split out: they are
|
|
130
|
+
# pure `re`/`base64` string handling, and `coord.stage_projection` — a
|
|
131
|
+
# deliberately dependency-free leaf module — has to parse both to count Test
|
|
132
|
+
# rounds (#3191). Reaching them through THIS module would drag the whole
|
|
133
|
+
# dispatch stack (`coord.config`, `coord.dispatch`, `coord.github_ops`,
|
|
134
|
+
# `coord.revalidate`, `httpx`) into `coord serve`'s `/board` request path.
|
|
135
|
+
from coord.smoke_tags import ( # noqa: F401 (re-export; see note above)
|
|
136
|
+
_FANOUT_MANIFEST_RE,
|
|
137
|
+
_LEG_TAG_RE,
|
|
138
|
+
_encode_fanout_manifest,
|
|
139
|
+
_parse_fanout_manifest,
|
|
140
|
+
smoke_leg_capabilities,
|
|
141
|
+
smoke_leg_issue_title,
|
|
142
|
+
)
|
|
126
143
|
|
|
127
144
|
logger = logging.getLogger("coord.smoke")
|
|
128
145
|
|
|
@@ -638,114 +655,13 @@ def partition_capability_requirements(
|
|
|
638
655
|
# sweep if a partition never got a machine at all — the existing, generic
|
|
639
656
|
# mechanism, not a fan-out-specific reinvention of it.
|
|
640
657
|
|
|
641
|
-
#
|
|
642
|
-
#
|
|
643
|
-
#
|
|
644
|
-
#
|
|
645
|
-
# `
|
|
646
|
-
#
|
|
647
|
-
#
|
|
648
|
-
# lowercase/`[a-z0-9+_-]` until that validation exists.
|
|
649
|
-
_LEG_TAG_RE = re.compile(r"^\[smoke:([a-z0-9+_-]+)\] ")
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
def smoke_leg_issue_title(base_title: str, capabilities: tuple[str, ...]) -> str:
|
|
653
|
-
"""The ``issue_title`` for one capability-partition leg of a #3182 fan-out.
|
|
654
|
-
|
|
655
|
-
Encodes *capabilities* (sorted, ``+``-joined) as a parseable prefix —
|
|
656
|
-
``"[smoke:gtk+windows] <base_title>"`` — so :func:`smoke_leg_capabilities`
|
|
657
|
-
can read it back off the board. Used both for the per-partition in-flight
|
|
658
|
-
dedupe (:func:`_find_leg_for_partition`) and for telling a fan-out leg's
|
|
659
|
-
own verdict apart from an ordinary single-leg smoke row's when processing
|
|
660
|
-
it (``coord.notify``).
|
|
661
|
-
"""
|
|
662
|
-
tag = "+".join(sorted(capabilities))
|
|
663
|
-
return f"[smoke:{tag}] {base_title}"
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
def smoke_leg_capabilities(issue_title: str | None) -> tuple[str, ...] | None:
|
|
667
|
-
"""The capability set :func:`smoke_leg_issue_title` encoded, or ``None``.
|
|
668
|
-
|
|
669
|
-
``None`` for an ordinary (untagged) smoke row — every pre-#3182 ``[smoke]
|
|
670
|
-
...`` single-partition dispatch, which never carries this prefix — or for
|
|
671
|
-
any non-smoke row. Never raises on a malformed or missing title.
|
|
672
|
-
"""
|
|
673
|
-
if not issue_title:
|
|
674
|
-
return None
|
|
675
|
-
m = _LEG_TAG_RE.match(issue_title)
|
|
676
|
-
if not m:
|
|
677
|
-
return None
|
|
678
|
-
return tuple(m.group(1).split("+"))
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
_FANOUT_MANIFEST_RE = re.compile(r"^\[\[smoke-fanout:([^\]]*)\]\]\n?")
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
def _encode_fanout_manifest(
|
|
685
|
-
legs: list[tuple[str, tuple[str, ...], str | None]],
|
|
686
|
-
) -> str:
|
|
687
|
-
"""The manifest line stamped at the FRONT of the parent's ``test_reason``
|
|
688
|
-
for a #3182 fan-out: ``[[smoke-fanout:<id>=<caps>=<command_b64>,...]]``,
|
|
689
|
-
one entry per leg dispatched (or already active/completed) this round.
|
|
690
|
-
Preserved byte-for-byte across every later rewrite of the parent's
|
|
691
|
-
``test_reason`` (the running-progress stamp, and the final aggregate) so
|
|
692
|
-
:func:`finalize_smoke_fanout` can always find its siblings again from
|
|
693
|
-
just the parent's own row — see the module note above for why this, and
|
|
694
|
-
not a new query endpoint.
|
|
695
|
-
|
|
696
|
-
``command_b64`` (#3298) is the partition's own resolved Test-stage
|
|
697
|
-
command, URL-safe base64-encoded so an arbitrary shell command — commas,
|
|
698
|
-
brackets, newlines, anything a real ``test_command``/rule ``command`` can
|
|
699
|
-
contain — can never corrupt this manifest's own ``,``/``=``/``]``
|
|
700
|
-
delimiters. Encodes as an empty third field when the command is unknown
|
|
701
|
-
(``None``), which round-trips through :func:`_parse_fanout_manifest` as
|
|
702
|
-
``command=None`` rather than raising or misparsing.
|
|
703
|
-
"""
|
|
704
|
-
def _entry(leg_id: str, caps: tuple[str, ...], command: str | None) -> str:
|
|
705
|
-
cap_str = "+".join(sorted(caps))
|
|
706
|
-
cmd_b64 = (
|
|
707
|
-
base64.urlsafe_b64encode(command.encode()).decode() if command else ""
|
|
708
|
-
)
|
|
709
|
-
return f"{leg_id}={cap_str}={cmd_b64}"
|
|
710
|
-
|
|
711
|
-
body = ",".join(_entry(leg_id, caps, command) for leg_id, caps, command in legs)
|
|
712
|
-
return f"[[smoke-fanout:{body}]]"
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
def _parse_fanout_manifest(
|
|
716
|
-
test_reason: str | None,
|
|
717
|
-
) -> list[tuple[str, tuple[str, ...], str | None]] | None:
|
|
718
|
-
"""The ``(leg_id, capabilities, command)`` triples
|
|
719
|
-
:func:`_encode_fanout_manifest` wrote, or ``None`` when *test_reason*
|
|
720
|
-
carries no manifest (not a fan-out row). Tolerates a malformed entry by
|
|
721
|
-
skipping just that entry, never raising.
|
|
722
|
-
|
|
723
|
-
``command`` is ``None`` for a pre-#3298 two-field entry
|
|
724
|
-
(``<id>=<caps>``, no trailing ``=<command_b64>``) — an already-in-flight
|
|
725
|
-
row from before this field existed — as well as for a malformed base64
|
|
726
|
-
payload; either way the caller gets "unknown command", never a crash.
|
|
727
|
-
"""
|
|
728
|
-
if not test_reason:
|
|
729
|
-
return None
|
|
730
|
-
m = _FANOUT_MANIFEST_RE.match(test_reason)
|
|
731
|
-
if not m:
|
|
732
|
-
return None
|
|
733
|
-
legs: list[tuple[str, tuple[str, ...], str | None]] = []
|
|
734
|
-
for entry in m.group(1).split(","):
|
|
735
|
-
if not entry:
|
|
736
|
-
continue
|
|
737
|
-
leg_id, _, rest = entry.partition("=")
|
|
738
|
-
caps, _, cmd_b64 = rest.partition("=")
|
|
739
|
-
if not leg_id or not caps:
|
|
740
|
-
continue
|
|
741
|
-
command: str | None = None
|
|
742
|
-
if cmd_b64:
|
|
743
|
-
try:
|
|
744
|
-
command = base64.urlsafe_b64decode(cmd_b64.encode()).decode()
|
|
745
|
-
except (ValueError, UnicodeDecodeError):
|
|
746
|
-
command = None
|
|
747
|
-
legs.append((leg_id, tuple(caps.split("+")), command))
|
|
748
|
-
return legs
|
|
658
|
+
# `smoke_leg_issue_title` / `smoke_leg_capabilities` (the `[smoke:<caps>]`
|
|
659
|
+
# tag on each leg's `issue_title`) and `_encode_fanout_manifest` /
|
|
660
|
+
# `_parse_fanout_manifest` (the `[[smoke-fanout:...]]` manifest on the
|
|
661
|
+
# parent's `test_reason`) used to be DEFINED here. They now live in
|
|
662
|
+
# `coord/smoke_tags.py` and are re-exported by the import at the top of this
|
|
663
|
+
# module, so `from coord.smoke import ...` is unchanged for every caller —
|
|
664
|
+
# see that module's docstring for why the split exists.
|
|
749
665
|
|
|
750
666
|
|
|
751
667
|
def _build_fanout_running_reason(
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""The #3182 fan-out's on-the-board *text encodings*, and nothing else.
|
|
2
|
+
|
|
3
|
+
A capability-partition fan-out records two things as plain text on rows the
|
|
4
|
+
board already has, rather than in a new table (see ``coord.smoke``'s own
|
|
5
|
+
module note for why): each leg's ``issue_title`` carries a
|
|
6
|
+
``[smoke:<caps>]`` tag, and the parent work row's ``test_reason`` carries a
|
|
7
|
+
``[[smoke-fanout:...]]`` manifest naming every leg in that round.
|
|
8
|
+
|
|
9
|
+
Those four functions used to live in ``coord/smoke.py``, next to the
|
|
10
|
+
dispatcher that writes them. They are split out here because ``coord.smoke``
|
|
11
|
+
imports the whole dispatch stack (``coord.config``, ``coord.dispatch``,
|
|
12
|
+
``coord.github_ops``, ``coord.revalidate``, ``httpx``), while the encodings
|
|
13
|
+
themselves are pure ``re``/``base64`` string handling with no coord
|
|
14
|
+
dependency at all — and ``coord.stage_projection``, which has to *read* both
|
|
15
|
+
encodings to count Test rounds (#3191), is deliberately a leaf module
|
|
16
|
+
("Pure computation: ... no I/O, no side effects") whose only other
|
|
17
|
+
production import is ``coord.models``. Importing ``coord.smoke`` from it
|
|
18
|
+
just to reach two regexes would have dragged the entire dispatch stack into
|
|
19
|
+
``coord serve``'s ``/board`` request path — a first-request-time import of
|
|
20
|
+
half the package inside a threadpool worker — for no benefit.
|
|
21
|
+
|
|
22
|
+
``coord.smoke`` re-exports every name below under its original spelling, so
|
|
23
|
+
existing importers (``coord.notify``, ``coord.diagnose``,
|
|
24
|
+
``coord.reconcile``, and the tests) are unaffected and there is exactly one
|
|
25
|
+
definition of each encoding.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import base64
|
|
31
|
+
import re
|
|
32
|
+
|
|
33
|
+
# Restricted to `[a-z0-9+_-]` — every capability name in this codebase
|
|
34
|
+
# (gtk, windows, macos, browser, provider:opencode via `+`-joining, etc.)
|
|
35
|
+
# fits that class. If `coordinator.yml` ever declares a capability with an
|
|
36
|
+
# uppercase letter, a dot, or another character outside it,
|
|
37
|
+
# `smoke_leg_capabilities()` silently returns None for that leg (misread as
|
|
38
|
+
# an ordinary untagged row) rather than raising — nothing today validates
|
|
39
|
+
# capability naming at config-load time, so keep new capability names
|
|
40
|
+
# lowercase/`[a-z0-9+_-]` until that validation exists.
|
|
41
|
+
_LEG_TAG_RE = re.compile(r"^\[smoke:([a-z0-9+_-]+)\] ")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def smoke_leg_issue_title(base_title: str, capabilities: tuple[str, ...]) -> str:
|
|
45
|
+
"""The ``issue_title`` for one capability-partition leg of a #3182 fan-out.
|
|
46
|
+
|
|
47
|
+
Encodes *capabilities* (sorted, ``+``-joined) as a parseable prefix —
|
|
48
|
+
``"[smoke:gtk+windows] <base_title>"`` — so :func:`smoke_leg_capabilities`
|
|
49
|
+
can read it back off the board. Used both for the per-partition in-flight
|
|
50
|
+
dedupe (``coord.smoke._find_leg_for_partition``) and for telling a
|
|
51
|
+
fan-out leg's own verdict apart from an ordinary single-leg smoke row's
|
|
52
|
+
when processing it (``coord.notify``).
|
|
53
|
+
"""
|
|
54
|
+
tag = "+".join(sorted(capabilities))
|
|
55
|
+
return f"[smoke:{tag}] {base_title}"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def smoke_leg_capabilities(issue_title: str | None) -> tuple[str, ...] | None:
|
|
59
|
+
"""The capability set :func:`smoke_leg_issue_title` encoded, or ``None``.
|
|
60
|
+
|
|
61
|
+
``None`` for an ordinary (untagged) smoke row — every pre-#3182 ``[smoke]
|
|
62
|
+
...`` single-partition dispatch, which never carries this prefix — or for
|
|
63
|
+
any non-smoke row. Never raises on a malformed or missing title.
|
|
64
|
+
"""
|
|
65
|
+
if not issue_title:
|
|
66
|
+
return None
|
|
67
|
+
m = _LEG_TAG_RE.match(issue_title)
|
|
68
|
+
if not m:
|
|
69
|
+
return None
|
|
70
|
+
return tuple(m.group(1).split("+"))
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
_FANOUT_MANIFEST_RE = re.compile(r"^\[\[smoke-fanout:([^\]]*)\]\]\n?")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _encode_fanout_manifest(
|
|
77
|
+
legs: list[tuple[str, tuple[str, ...], str | None]],
|
|
78
|
+
) -> str:
|
|
79
|
+
"""The manifest line stamped at the FRONT of the parent's ``test_reason``
|
|
80
|
+
for a #3182 fan-out: ``[[smoke-fanout:<id>=<caps>=<command_b64>,...]]``,
|
|
81
|
+
one entry per leg dispatched (or already active/completed) this round.
|
|
82
|
+
Preserved byte-for-byte across every later rewrite of the parent's
|
|
83
|
+
``test_reason`` (the running-progress stamp, and the final aggregate) so
|
|
84
|
+
``coord.smoke.finalize_smoke_fanout`` can always find its siblings again
|
|
85
|
+
from just the parent's own row — see that module's note for why this, and
|
|
86
|
+
not a new query endpoint.
|
|
87
|
+
|
|
88
|
+
``command_b64`` (#3298) is the partition's own resolved Test-stage
|
|
89
|
+
command, URL-safe base64-encoded so an arbitrary shell command — commas,
|
|
90
|
+
brackets, newlines, anything a real ``test_command``/rule ``command`` can
|
|
91
|
+
contain — can never corrupt this manifest's own ``,``/``=``/``]``
|
|
92
|
+
delimiters. Encodes as an empty third field when the command is unknown
|
|
93
|
+
(``None``), which round-trips through :func:`_parse_fanout_manifest` as
|
|
94
|
+
``command=None`` rather than raising or misparsing.
|
|
95
|
+
"""
|
|
96
|
+
def _entry(leg_id: str, caps: tuple[str, ...], command: str | None) -> str:
|
|
97
|
+
cap_str = "+".join(sorted(caps))
|
|
98
|
+
cmd_b64 = (
|
|
99
|
+
base64.urlsafe_b64encode(command.encode()).decode() if command else ""
|
|
100
|
+
)
|
|
101
|
+
return f"{leg_id}={cap_str}={cmd_b64}"
|
|
102
|
+
|
|
103
|
+
body = ",".join(_entry(leg_id, caps, command) for leg_id, caps, command in legs)
|
|
104
|
+
return f"[[smoke-fanout:{body}]]"
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _parse_fanout_manifest(
|
|
108
|
+
test_reason: str | None,
|
|
109
|
+
) -> list[tuple[str, tuple[str, ...], str | None]] | None:
|
|
110
|
+
"""The ``(leg_id, capabilities, command)`` triples
|
|
111
|
+
:func:`_encode_fanout_manifest` wrote, or ``None`` when *test_reason*
|
|
112
|
+
carries no manifest (not a fan-out row). Tolerates a malformed entry by
|
|
113
|
+
skipping just that entry, never raising.
|
|
114
|
+
|
|
115
|
+
``command`` is ``None`` for a pre-#3298 two-field entry
|
|
116
|
+
(``<id>=<caps>``, no trailing ``=<command_b64>``) — an already-in-flight
|
|
117
|
+
row from before this field existed — as well as for a malformed base64
|
|
118
|
+
payload; either way the caller gets "unknown command", never a crash.
|
|
119
|
+
"""
|
|
120
|
+
if not test_reason:
|
|
121
|
+
return None
|
|
122
|
+
m = _FANOUT_MANIFEST_RE.match(test_reason)
|
|
123
|
+
if not m:
|
|
124
|
+
return None
|
|
125
|
+
legs: list[tuple[str, tuple[str, ...], str | None]] = []
|
|
126
|
+
for entry in m.group(1).split(","):
|
|
127
|
+
if not entry:
|
|
128
|
+
continue
|
|
129
|
+
leg_id, _, rest = entry.partition("=")
|
|
130
|
+
caps, _, cmd_b64 = rest.partition("=")
|
|
131
|
+
if not leg_id or not caps:
|
|
132
|
+
continue
|
|
133
|
+
command: str | None = None
|
|
134
|
+
if cmd_b64:
|
|
135
|
+
try:
|
|
136
|
+
command = base64.urlsafe_b64decode(cmd_b64.encode()).decode()
|
|
137
|
+
except (ValueError, UnicodeDecodeError):
|
|
138
|
+
command = None
|
|
139
|
+
legs.append((leg_id, tuple(caps.split("+")), command))
|
|
140
|
+
return legs
|
|
@@ -35,6 +35,15 @@ import dataclasses
|
|
|
35
35
|
from typing import Any, Protocol, runtime_checkable
|
|
36
36
|
|
|
37
37
|
from coord.models import CLOSES_ISSUE_TYPES, WORK_LIKE_TYPES, effective_issue_number
|
|
38
|
+
# #3191: the two #3182 fan-out encodings this module has to PARSE to count
|
|
39
|
+
# Test *rounds* rather than raw smoke rows — see `_test_stage_leg_count`.
|
|
40
|
+
# Imported from the leaf `coord.smoke_tags`, never from `coord.smoke`, so
|
|
41
|
+
# this module keeps the property its docstring above claims: the only thing
|
|
42
|
+
# it pulls in is pure computation. `coord.smoke` would bring `coord.config`,
|
|
43
|
+
# `coord.dispatch`, `coord.github_ops`, `coord.revalidate` and `httpx` with
|
|
44
|
+
# it, and `compute_board_stage_projection` runs inside `coord serve`'s
|
|
45
|
+
# `/board` handler.
|
|
46
|
+
from coord.smoke_tags import _parse_fanout_manifest, smoke_leg_capabilities
|
|
38
47
|
|
|
39
48
|
# ── Stage-status vocabulary — mirrors tui/src/app/pipeline.rs::StageStatus ──
|
|
40
49
|
PENDING = "pending"
|
|
@@ -75,6 +84,7 @@ class _AssignmentLike(Protocol):
|
|
|
75
84
|
review_verdict: str | None
|
|
76
85
|
review_of_assignment_id: str | None
|
|
77
86
|
test_state: str | None
|
|
87
|
+
test_reason: str | None
|
|
78
88
|
repo_name: str
|
|
79
89
|
issue_number: int
|
|
80
90
|
acceptance_state: str | None
|
|
@@ -82,6 +92,7 @@ class _AssignmentLike(Protocol):
|
|
|
82
92
|
acceptance_passed: int | None
|
|
83
93
|
uat_state: str | None
|
|
84
94
|
uat_reason: str | None
|
|
95
|
+
issue_title: str | None
|
|
85
96
|
|
|
86
97
|
|
|
87
98
|
# ── Helpers ──────────────────────────────────────────────────────────────
|
|
@@ -195,7 +206,11 @@ def _leg_count_for_stage(
|
|
|
195
206
|
field exists to surface, and a strict ``type == "work"`` match would
|
|
196
207
|
never see them.
|
|
197
208
|
* ``"test"`` has no ``type="test"`` assignment — the Test-stage's
|
|
198
|
-
dispatched worker is ``type="smoke"`` (``coord.smoke``).
|
|
209
|
+
dispatched worker is ``type="smoke"`` (``coord.smoke``). Since #3182,
|
|
210
|
+
one Test *attempt* can dispatch more than one ``type="smoke"`` row (a
|
|
211
|
+
fan-out leg per capability partition), so a flat row count over-reports
|
|
212
|
+
— see :func:`_test_stage_leg_count` for how rows are folded back into
|
|
213
|
+
rounds.
|
|
199
214
|
* ``"merge"`` has no ``type="merge"`` assignment either — repeated
|
|
200
215
|
landing attempts show up as ``type="conflict-fix"`` legs (#241). Note
|
|
201
216
|
the counting convention this implies differs from every other stage:
|
|
@@ -230,7 +245,7 @@ def _leg_count_for_stage(
|
|
|
230
245
|
]
|
|
231
246
|
return len(matching) + len(extra)
|
|
232
247
|
if stage == "test":
|
|
233
|
-
return
|
|
248
|
+
return _test_stage_leg_count(assignments_for_issue)
|
|
234
249
|
if stage == "merge":
|
|
235
250
|
return sum(1 for a in assignments_for_issue if (a.type or "work") == "conflict-fix")
|
|
236
251
|
if stage == "acceptance":
|
|
@@ -242,6 +257,77 @@ def _leg_count_for_stage(
|
|
|
242
257
|
return len(assignments_for_stage(assignments_for_issue, stage, require_plan=require_plan))
|
|
243
258
|
|
|
244
259
|
|
|
260
|
+
def _test_stage_leg_count(assignments_for_issue: list) -> int:
|
|
261
|
+
"""How many separate Test-stage *attempts* — not raw ``type="smoke"``
|
|
262
|
+
rows — this issue has had (#3191).
|
|
263
|
+
|
|
264
|
+
Before #3182, one Test attempt was always exactly one ``type="smoke"``
|
|
265
|
+
row, so :func:`_leg_count_for_stage`'s flat row count was already
|
|
266
|
+
correct. #3182's fan-out (``coord.smoke._dispatch_smoke_fanout``) breaks
|
|
267
|
+
that: a diff whose ``capability_rules`` matches span more than one
|
|
268
|
+
machine-satisfiable partition (e.g. ``gtk+windows`` and ``macos``)
|
|
269
|
+
dispatches one smoke row PER partition for a single Test round, so a
|
|
270
|
+
clean, fully-successful first attempt reported ``stage_counts["test"] ==
|
|
271
|
+
2`` — read by every board client as "this needed a retry" (#3013), which
|
|
272
|
+
is exactly backwards.
|
|
273
|
+
|
|
274
|
+
A fan-out leg's own ``issue_title`` carries a ``[smoke:<caps>]`` tag
|
|
275
|
+
(``coord.smoke_tags.smoke_leg_issue_title``/``smoke_leg_capabilities``);
|
|
276
|
+
an ordinary single-leg dispatch (the pre-#3182 path, and every row that
|
|
277
|
+
predates it) carries none. Untagged rows keep counting 1:1 — no
|
|
278
|
+
behaviour change for the common case.
|
|
279
|
+
|
|
280
|
+
A tagged leg's round is identified via the ``[[smoke-fanout:...]]``
|
|
281
|
+
manifest (``coord.smoke_tags._encode_fanout_manifest``/
|
|
282
|
+
``_parse_fanout_manifest``) stamped on the leg's own parent row
|
|
283
|
+
(``review_of_assignment_id``) — every leg the manifest names is one
|
|
284
|
+
round, and rounds collapse to a single count regardless of how many
|
|
285
|
+
partitions they fanned out to.
|
|
286
|
+
|
|
287
|
+
Known limitation, not fixed here: a Test retry clears the parent's
|
|
288
|
+
``test_reason`` (``coord.state.reset_work_test_state``) before the next
|
|
289
|
+
round dispatches and writes a fresh manifest, so a SUPERSEDED round's
|
|
290
|
+
manifest no longer exists to fold its legs back together by the time
|
|
291
|
+
this runs — those orphaned tagged legs fall back to counting 1 each,
|
|
292
|
+
same as before this fix. That only ever *over*-counts a past, already-
|
|
293
|
+
resolved round; it never reproduces the bug this closes, which was
|
|
294
|
+
about the live/most-recent round (the one every reader actually looks
|
|
295
|
+
at) reporting a false retry on a clean first attempt.
|
|
296
|
+
"""
|
|
297
|
+
smoke_legs = [a for a in assignments_for_issue if (a.type or "work") == "smoke"]
|
|
298
|
+
if not smoke_legs:
|
|
299
|
+
return 0
|
|
300
|
+
|
|
301
|
+
# Every row's own manifest, keyed by that row's `assignment_id` — a
|
|
302
|
+
# fan-out leg's PARENT (the work-like row `review_of_assignment_id`
|
|
303
|
+
# points back to) is the one that carries it, not the leg itself.
|
|
304
|
+
manifest_leg_ids_by_parent: dict[str, frozenset[str]] = {}
|
|
305
|
+
for a in assignments_for_issue:
|
|
306
|
+
parsed = _parse_fanout_manifest(getattr(a, "test_reason", None))
|
|
307
|
+
if parsed and a.assignment_id:
|
|
308
|
+
manifest_leg_ids_by_parent[a.assignment_id] = frozenset(
|
|
309
|
+
leg_id for leg_id, _caps, _cmd in parsed if leg_id
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
count = 0
|
|
313
|
+
counted_rounds: set[tuple[str, frozenset[str]]] = set()
|
|
314
|
+
for leg in smoke_legs:
|
|
315
|
+
if smoke_leg_capabilities(getattr(leg, "issue_title", None)) is None:
|
|
316
|
+
count += 1
|
|
317
|
+
continue
|
|
318
|
+
manifest_ids = manifest_leg_ids_by_parent.get(leg.review_of_assignment_id or "")
|
|
319
|
+
if not manifest_ids or leg.assignment_id not in manifest_ids:
|
|
320
|
+
# Orphaned tagged leg — see the "Known limitation" note above.
|
|
321
|
+
count += 1
|
|
322
|
+
continue
|
|
323
|
+
round_key = (leg.review_of_assignment_id or "", manifest_ids)
|
|
324
|
+
if round_key in counted_rounds:
|
|
325
|
+
continue
|
|
326
|
+
counted_rounds.add(round_key)
|
|
327
|
+
count += 1
|
|
328
|
+
return count
|
|
329
|
+
|
|
330
|
+
|
|
245
331
|
def _widen_work_like_types(assignments: list) -> list:
|
|
246
332
|
"""Return *assignments* with every :data:`WORK_LIKE_TYPES` row (#3013:
|
|
247
333
|
``mock-author``/``test-author``, not just literal ``type="work"``)
|
|
@@ -477,6 +477,91 @@ def test_compute_issue_projection_stage_counts_test_counts_smoke_legs():
|
|
|
477
477
|
assert out["stage_counts"]["test"] == 2
|
|
478
478
|
|
|
479
479
|
|
|
480
|
+
def test_compute_issue_projection_stage_counts_test_fanout_legs_count_as_one_round():
|
|
481
|
+
"""#3191: a #3182 capability-partition fan-out dispatches one
|
|
482
|
+
`type="smoke"` row PER partition for a SINGLE Test attempt — a flat row
|
|
483
|
+
count reports 2 for a clean, fully-successful first attempt, which every
|
|
484
|
+
board reader renders as "this needed a retry". Legs sharing the same
|
|
485
|
+
parent and `[[smoke-fanout:...]]` manifest must collapse to one round."""
|
|
486
|
+
from coord.smoke import _encode_fanout_manifest, smoke_leg_issue_title
|
|
487
|
+
|
|
488
|
+
manifest = _encode_fanout_manifest(
|
|
489
|
+
[("s1", ("gtk", "windows"), "pytest"), ("s2", ("macos",), "pytest")]
|
|
490
|
+
)
|
|
491
|
+
a = [
|
|
492
|
+
_work(
|
|
493
|
+
assignment_id="w1", status="done", dispatched_at=1.0,
|
|
494
|
+
test_state="passed", test_reason=f"{manifest}\nboth legs passed.",
|
|
495
|
+
),
|
|
496
|
+
_work(
|
|
497
|
+
assignment_id="s1", type="smoke", status="done", test_state="passed",
|
|
498
|
+
dispatched_at=2.0, review_of_assignment_id="w1",
|
|
499
|
+
issue_title=smoke_leg_issue_title("t", ("gtk", "windows")),
|
|
500
|
+
),
|
|
501
|
+
_work(
|
|
502
|
+
assignment_id="s2", type="smoke", status="done", test_state="passed",
|
|
503
|
+
dispatched_at=2.0, review_of_assignment_id="w1",
|
|
504
|
+
issue_title=smoke_leg_issue_title("t", ("macos",)),
|
|
505
|
+
),
|
|
506
|
+
]
|
|
507
|
+
out = sp.compute_issue_projection(
|
|
508
|
+
a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
|
|
509
|
+
)
|
|
510
|
+
assert out["stage_counts"]["test"] == 1
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
def test_compute_issue_projection_stage_counts_test_fanout_two_rounds_count_as_two():
|
|
514
|
+
"""A genuine retry (a fresh fan-out round after the first one failed and
|
|
515
|
+
was reset) must still surface as 2, not collapse into the same round as
|
|
516
|
+
the first — the fix must not hide real retries, only fold same-round
|
|
517
|
+
partitions together."""
|
|
518
|
+
from coord.smoke import _encode_fanout_manifest, smoke_leg_issue_title
|
|
519
|
+
|
|
520
|
+
round1_manifest = _encode_fanout_manifest(
|
|
521
|
+
[("s1", ("gtk", "windows"), "pytest"), ("s2", ("macos",), "pytest")]
|
|
522
|
+
)
|
|
523
|
+
round2_manifest = _encode_fanout_manifest(
|
|
524
|
+
[("s3", ("gtk", "windows"), "pytest"), ("s4", ("macos",), "pytest")]
|
|
525
|
+
)
|
|
526
|
+
a = [
|
|
527
|
+
# Round 1's manifest has since been overwritten by round 2's — its
|
|
528
|
+
# legs are now "orphaned" and counted individually (documented
|
|
529
|
+
# limitation), which still correctly signals "more than one round".
|
|
530
|
+
_work(
|
|
531
|
+
assignment_id="w1", status="done", dispatched_at=3.0,
|
|
532
|
+
test_state="passed", test_reason=f"{round2_manifest}\nboth legs passed.",
|
|
533
|
+
),
|
|
534
|
+
_work(
|
|
535
|
+
assignment_id="s1", type="smoke", status="failed", test_state="failed",
|
|
536
|
+
dispatched_at=1.0, review_of_assignment_id="w1",
|
|
537
|
+
issue_title=smoke_leg_issue_title("t", ("gtk", "windows")),
|
|
538
|
+
),
|
|
539
|
+
_work(
|
|
540
|
+
assignment_id="s2", type="smoke", status="done", test_state="passed",
|
|
541
|
+
dispatched_at=1.0, review_of_assignment_id="w1",
|
|
542
|
+
issue_title=smoke_leg_issue_title("t", ("macos",)),
|
|
543
|
+
),
|
|
544
|
+
_work(
|
|
545
|
+
assignment_id="s3", type="smoke", status="done", test_state="passed",
|
|
546
|
+
dispatched_at=3.0, review_of_assignment_id="w1",
|
|
547
|
+
issue_title=smoke_leg_issue_title("t", ("gtk", "windows")),
|
|
548
|
+
),
|
|
549
|
+
_work(
|
|
550
|
+
assignment_id="s4", type="smoke", status="done", test_state="passed",
|
|
551
|
+
dispatched_at=3.0, review_of_assignment_id="w1",
|
|
552
|
+
issue_title=smoke_leg_issue_title("t", ("macos",)),
|
|
553
|
+
),
|
|
554
|
+
]
|
|
555
|
+
out = sp.compute_issue_projection(
|
|
556
|
+
a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
|
|
557
|
+
)
|
|
558
|
+
# Round 2's two partitions collapse to 1 (live manifest); round 1's two
|
|
559
|
+
# orphaned legs count individually (2) — 3 total, still > 1, still
|
|
560
|
+
# visibly "more than a single clean attempt" even though it isn't an
|
|
561
|
+
# exact historical reconstruction (see the documented limitation).
|
|
562
|
+
assert out["stage_counts"]["test"] == 3
|
|
563
|
+
|
|
564
|
+
|
|
480
565
|
def test_compute_issue_projection_stage_counts_merge_counts_conflict_fix_legs():
|
|
481
566
|
"""Repeated landing attempts show up as `type="conflict-fix"` legs
|
|
482
567
|
(#241) — there is no `type="merge"` assignment to count directly."""
|
|
@@ -1272,3 +1357,92 @@ def test_compute_board_stage_projection_stage_counts_ordinary_issue_uses_own_key
|
|
|
1272
1357
|
entry = out[0]
|
|
1273
1358
|
assert entry["stage_counts"]["work"] == 2
|
|
1274
1359
|
assert entry["stage_counts"]["review"] == 1
|
|
1360
|
+
|
|
1361
|
+
|
|
1362
|
+
# ── #3191 CI follow-up: the projection module stays a dependency-free leaf ──
|
|
1363
|
+
|
|
1364
|
+
|
|
1365
|
+
def test_stage_projection_imports_no_heavy_module():
|
|
1366
|
+
"""``coord.stage_projection`` must not pull the dispatch stack in.
|
|
1367
|
+
|
|
1368
|
+
Its own module docstring promises "Pure computation: every function here
|
|
1369
|
+
takes already-loaded data and returns plain values — no I/O, no side
|
|
1370
|
+
effects", and until #3191 its only production import was
|
|
1371
|
+
``coord.models``. #3191 needs the two #3182 fan-out text encodings
|
|
1372
|
+
(``[smoke:<caps>]``, ``[[smoke-fanout:...]]``) to count Test *rounds*
|
|
1373
|
+
instead of raw smoke rows; taking them from ``coord.smoke`` would have
|
|
1374
|
+
dragged ``coord.config``, ``coord.dispatch``, ``coord.github_ops``,
|
|
1375
|
+
``coord.revalidate`` and ``httpx`` in with them — and
|
|
1376
|
+
``compute_board_stage_projection`` runs inside ``coord serve``'s
|
|
1377
|
+
``/board`` handler, so on a daemon that had not otherwise imported
|
|
1378
|
+
``coord.smoke`` the first ``/board`` request would have triggered that
|
|
1379
|
+
whole import in a threadpool worker. They live in the leaf
|
|
1380
|
+
``coord.smoke_tags`` instead.
|
|
1381
|
+
|
|
1382
|
+
Runs in a **subprocess** for the same reason
|
|
1383
|
+
``tests/test_client_base_install.py`` does: by the time this test body
|
|
1384
|
+
executes, collection has long since imported ``coord.smoke`` into *this*
|
|
1385
|
+
interpreter, so an in-process ``sys.modules`` check would pass no matter
|
|
1386
|
+
what the import graph looks like.
|
|
1387
|
+
"""
|
|
1388
|
+
import subprocess
|
|
1389
|
+
import sys
|
|
1390
|
+
|
|
1391
|
+
probe = (
|
|
1392
|
+
"import sys, coord.stage_projection\n"
|
|
1393
|
+
"heavy = ('coord.smoke', 'coord.dispatch', 'coord.github_ops',\n"
|
|
1394
|
+
" 'coord.config', 'coord.revalidate', 'httpx')\n"
|
|
1395
|
+
"print(','.join(m for m in heavy if m in sys.modules))\n"
|
|
1396
|
+
)
|
|
1397
|
+
proc = subprocess.run(
|
|
1398
|
+
[sys.executable, "-c", probe], capture_output=True, text=True, timeout=120
|
|
1399
|
+
)
|
|
1400
|
+
assert proc.returncode == 0, proc.stderr
|
|
1401
|
+
leaked = proc.stdout.strip()
|
|
1402
|
+
assert leaked == "", (
|
|
1403
|
+
f"importing coord.stage_projection pulled in {leaked} — keep it a "
|
|
1404
|
+
"leaf (import fan-out encodings from coord.smoke_tags, not coord.smoke)"
|
|
1405
|
+
)
|
|
1406
|
+
|
|
1407
|
+
|
|
1408
|
+
def test_smoke_reexports_the_fanout_encodings_from_the_leaf_module():
|
|
1409
|
+
"""One definition, two spellings: ``coord.smoke`` re-exports the encodings
|
|
1410
|
+
so every pre-existing ``from coord.smoke import ...`` caller
|
|
1411
|
+
(``coord.notify``, ``coord.diagnose``, ``coord.reconcile``, the tests) is
|
|
1412
|
+
unaffected — and a future edit cannot fork the encoder from the parser by
|
|
1413
|
+
redefining one of them in only one of the two modules."""
|
|
1414
|
+
from coord import smoke, smoke_tags
|
|
1415
|
+
|
|
1416
|
+
for name in (
|
|
1417
|
+
"smoke_leg_issue_title",
|
|
1418
|
+
"smoke_leg_capabilities",
|
|
1419
|
+
"_encode_fanout_manifest",
|
|
1420
|
+
"_parse_fanout_manifest",
|
|
1421
|
+
):
|
|
1422
|
+
assert getattr(smoke, name) is getattr(smoke_tags, name), name
|
|
1423
|
+
|
|
1424
|
+
|
|
1425
|
+
def test_fanout_encodings_round_trip_through_the_leaf_module():
|
|
1426
|
+
"""The moved code still behaves: a tag and a manifest written by
|
|
1427
|
+
``coord.smoke_tags`` parse back to exactly what went in, including the
|
|
1428
|
+
#3298 base64 command field and the "unknown command" (``None``) case."""
|
|
1429
|
+
from coord.smoke_tags import (
|
|
1430
|
+
_encode_fanout_manifest,
|
|
1431
|
+
_parse_fanout_manifest,
|
|
1432
|
+
smoke_leg_capabilities,
|
|
1433
|
+
smoke_leg_issue_title,
|
|
1434
|
+
)
|
|
1435
|
+
|
|
1436
|
+
title = smoke_leg_issue_title("Fix the thing", ("windows", "gtk"))
|
|
1437
|
+
assert title == "[smoke:gtk+windows] Fix the thing"
|
|
1438
|
+
assert smoke_leg_capabilities(title) == ("gtk", "windows")
|
|
1439
|
+
assert smoke_leg_capabilities("Fix the thing") is None
|
|
1440
|
+
|
|
1441
|
+
manifest = _encode_fanout_manifest(
|
|
1442
|
+
[("s1", ("gtk", "windows"), "pytest -q, --x"), ("s2", ("macos",), None)]
|
|
1443
|
+
)
|
|
1444
|
+
assert _parse_fanout_manifest(f"{manifest}\ntrailing prose") == [
|
|
1445
|
+
("s1", ("gtk", "windows"), "pytest -q, --x"),
|
|
1446
|
+
("s2", ("macos",), None),
|
|
1447
|
+
]
|
|
1448
|
+
assert _parse_fanout_manifest("no manifest here") is None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|