code-coordinator 0.5.330__tar.gz → 0.5.331__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.330 → code_coordinator-0.5.331}/PKG-INFO +1 -1
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/serve_app.py +27 -2
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/stage_projection.py +198 -3
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stage_projection.py +284 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.gitignore +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/CLAUDE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/GOAL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/LICENSE +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/MANIFEST.in +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/README.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agent.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/block_log.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/board_service.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/brain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/claim.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/client.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/comments.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dao.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/db.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/decomposition_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deps.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/drive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/events.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/filelock.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/freshness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/gates.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/goal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/context.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/models.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/render.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/units.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/hooks.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/interactive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/models.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/network.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/openapi.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/parentage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/plans.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/progress.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/release_window.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/reports.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/review.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/self_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/smoke.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/split_work.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/sql.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/test_author.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/test_report.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/usage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/install-agent.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/pyproject.toml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/setup.cfg +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/__init__.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/backends.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/conftest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dao.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_db.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_decomposition_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_events.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_init.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_models.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_network.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_session.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_split.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_state.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/write_parity.py +0 -0
|
@@ -2547,7 +2547,8 @@ def _board_response_schema(components: dict) -> dict:
|
|
|
2547
2547
|
"#550: server-computed per-issue stage/gate badges "
|
|
2548
2548
|
"(work/review/smoke/test/merge status, has_approved_review) — "
|
|
2549
2549
|
"generalizes the #776/#778 pattern so coord-tui's "
|
|
2550
|
-
"pipeline.rs stops re-deriving this from raw rows"
|
|
2550
|
+
"pipeline.rs stops re-deriving this from raw rows. #3013 adds "
|
|
2551
|
+
"a per-stage leg count (`stage_counts`) alongside the status."
|
|
2551
2552
|
),
|
|
2552
2553
|
"items": {
|
|
2553
2554
|
"type": "object",
|
|
@@ -2560,6 +2561,24 @@ def _board_response_schema(components: dict) -> dict:
|
|
|
2560
2561
|
"description": "stage name -> pending|active|done|failed|stale|skipped",
|
|
2561
2562
|
"additionalProperties": {"type": "string"},
|
|
2562
2563
|
},
|
|
2564
|
+
"stage_counts": {
|
|
2565
|
+
"type": "object",
|
|
2566
|
+
"description": (
|
|
2567
|
+
"#3013: stage name -> count of separate dispatched "
|
|
2568
|
+
"legs at that stage (e.g. a stage re-dispatched 4 "
|
|
2569
|
+
"times reads 4, not 1) — lets a client render "
|
|
2570
|
+
"'Work (2)' / 'Review (5)' and suppress the suffix "
|
|
2571
|
+
"at 1. Same key set as `stages` (including "
|
|
2572
|
+
"`acceptance`). Caveat: `merge` uses a different "
|
|
2573
|
+
"convention from every other key — it counts "
|
|
2574
|
+
"conflict-fix RETRIES (0 for a clean single merge, "
|
|
2575
|
+
"not 1 for 'one attempt happened'), so a uniform "
|
|
2576
|
+
"'suppress at <= 1' rule will also suppress a "
|
|
2577
|
+
"single conflict-fix retry, which is usually the "
|
|
2578
|
+
"most useful count to surface."
|
|
2579
|
+
),
|
|
2580
|
+
"additionalProperties": {"type": "integer"},
|
|
2581
|
+
},
|
|
2563
2582
|
"has_approved_review": {"type": "boolean"},
|
|
2564
2583
|
"uat_preview_url": {
|
|
2565
2584
|
"type": ["string", "null"],
|
|
@@ -2571,7 +2590,13 @@ def _board_response_schema(components: dict) -> dict:
|
|
|
2571
2590
|
),
|
|
2572
2591
|
},
|
|
2573
2592
|
},
|
|
2574
|
-
"required": [
|
|
2593
|
+
"required": [
|
|
2594
|
+
"repo_name",
|
|
2595
|
+
"issue_number",
|
|
2596
|
+
"stages",
|
|
2597
|
+
"stage_counts",
|
|
2598
|
+
"has_approved_review",
|
|
2599
|
+
],
|
|
2575
2600
|
},
|
|
2576
2601
|
},
|
|
2577
2602
|
"plan_roster": {
|
|
@@ -31,9 +31,10 @@ plain values — no I/O, no side effects.
|
|
|
31
31
|
|
|
32
32
|
from __future__ import annotations
|
|
33
33
|
|
|
34
|
+
import dataclasses
|
|
34
35
|
from typing import Any, Protocol, runtime_checkable
|
|
35
36
|
|
|
36
|
-
from coord.models import CLOSES_ISSUE_TYPES
|
|
37
|
+
from coord.models import CLOSES_ISSUE_TYPES, WORK_LIKE_TYPES, effective_issue_number
|
|
37
38
|
|
|
38
39
|
# ── Stage-status vocabulary — mirrors tui/src/app/pipeline.rs::StageStatus ──
|
|
39
40
|
PENDING = "pending"
|
|
@@ -172,6 +173,102 @@ def assignments_for_stage(
|
|
|
172
173
|
return out
|
|
173
174
|
|
|
174
175
|
|
|
176
|
+
def _leg_count_for_stage(
|
|
177
|
+
assignments_for_issue: list,
|
|
178
|
+
stage: str,
|
|
179
|
+
*,
|
|
180
|
+
require_plan: bool,
|
|
181
|
+
) -> int:
|
|
182
|
+
"""How many separate dispatched attempts ("legs") this issue has had at
|
|
183
|
+
*stage* (#3013) — "attempts a human would recognise as separate", not a
|
|
184
|
+
raw row count. Each retry/redispatch is already its own board row (a
|
|
185
|
+
retry dispatches a fresh assignment id rather than mutating the failed
|
|
186
|
+
one, see ``coord.reconcile._reassign``), so counting rows already gives
|
|
187
|
+
the right number for stages backed by their own dedicated assignment
|
|
188
|
+
``type`` — this only needs to special-case the stages that aren't:
|
|
189
|
+
|
|
190
|
+
* ``"work"`` is widened from a literal ``type == "work"`` (plus the
|
|
191
|
+
existing plan-fold) to the full :data:`WORK_LIKE_TYPES` — an
|
|
192
|
+
oracle-loop acceptance slice's repeated ``test-author``/``mock-author``
|
|
193
|
+
legs (#3013's coord-portal#164 example: 4 ``test-author`` legs, 5
|
|
194
|
+
``review`` legs on one branch) are exactly the kind of repetition this
|
|
195
|
+
field exists to surface, and a strict ``type == "work"`` match would
|
|
196
|
+
never see them.
|
|
197
|
+
* ``"test"`` has no ``type="test"`` assignment — the Test-stage's
|
|
198
|
+
dispatched worker is ``type="smoke"`` (``coord.smoke``).
|
|
199
|
+
* ``"merge"`` has no ``type="merge"`` assignment either — repeated
|
|
200
|
+
landing attempts show up as ``type="conflict-fix"`` legs (#241). Note
|
|
201
|
+
the counting convention this implies differs from every other stage:
|
|
202
|
+
a clean single merge with no conflict reports ``0`` (no *retry* was
|
|
203
|
+
needed), whereas one ordinary ``"work"``/``"review"``/``"test"`` leg
|
|
204
|
+
reports ``1`` (one attempt happened). A client applying one uniform
|
|
205
|
+
"suppress the number at <= 1" rule across every stage — as the
|
|
206
|
+
``/board`` schema description implies — will suppress a single
|
|
207
|
+
conflict-fix leg (``count == 1``, arguably the most useful case to
|
|
208
|
+
surface: "this needed a rebase") exactly like "no problem at all". No
|
|
209
|
+
code path here can distinguish the two without a wire-schema change,
|
|
210
|
+
so this is flagged for the client rather than fixed on this side.
|
|
211
|
+
* ``"acceptance"`` (review fix, #3013) has no dedicated assignment type
|
|
212
|
+
either — like ``test_state``/``uat_state``, ``acceptance_state`` is
|
|
213
|
+
stamped directly onto the ``type="work"`` row a
|
|
214
|
+
``coord acceptance record`` verdict belongs to (see
|
|
215
|
+
:func:`acceptance_stage_status_for`, which reads the same rows), so a
|
|
216
|
+
generic ``assignments_for_stage(..., "acceptance", ...)`` scan would
|
|
217
|
+
always return zero.
|
|
218
|
+
|
|
219
|
+
Every other stage (``"plan"``, ``"review"``, ``"uat"``, ...) already has
|
|
220
|
+
a 1:1 assignment ``type``, so :func:`assignments_for_stage` alone gives
|
|
221
|
+
the right count.
|
|
222
|
+
"""
|
|
223
|
+
if stage == "work":
|
|
224
|
+
matching = assignments_for_stage(assignments_for_issue, "work", require_plan=require_plan)
|
|
225
|
+
seen = {id(a) for a in matching}
|
|
226
|
+
extra = [
|
|
227
|
+
a
|
|
228
|
+
for a in assignments_for_issue
|
|
229
|
+
if id(a) not in seen and (a.type or "work") in WORK_LIKE_TYPES
|
|
230
|
+
]
|
|
231
|
+
return len(matching) + len(extra)
|
|
232
|
+
if stage == "test":
|
|
233
|
+
return sum(1 for a in assignments_for_issue if (a.type or "work") == "smoke")
|
|
234
|
+
if stage == "merge":
|
|
235
|
+
return sum(1 for a in assignments_for_issue if (a.type or "work") == "conflict-fix")
|
|
236
|
+
if stage == "acceptance":
|
|
237
|
+
return sum(
|
|
238
|
+
1
|
|
239
|
+
for a in assignments_for_issue
|
|
240
|
+
if (a.type or "work") == "work" and (a.acceptance_state or "") != ""
|
|
241
|
+
)
|
|
242
|
+
return len(assignments_for_stage(assignments_for_issue, stage, require_plan=require_plan))
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def _widen_work_like_types(assignments: list) -> list:
|
|
246
|
+
"""Return *assignments* with every :data:`WORK_LIKE_TYPES` row (#3013:
|
|
247
|
+
``mock-author``/``test-author``, not just literal ``type="work"``)
|
|
248
|
+
presented as ``type="work"`` to the generic per-stage dispatcher
|
|
249
|
+
(:func:`stage_status_for`, :func:`assignments_for_stage`,
|
|
250
|
+
:func:`acceptance_stage_status_for`, ...), all of which key strictly off
|
|
251
|
+
``a.type``.
|
|
252
|
+
|
|
253
|
+
Used ONLY by :func:`compute_board_stage_projection`'s phantom-entry
|
|
254
|
+
fallback (see that function's docstring) — without it, a slice whose
|
|
255
|
+
only rows are ``test-author``/``mock-author`` legs got
|
|
256
|
+
``stage_counts["work"] == 4`` (via :func:`_leg_count_for_stage`, which
|
|
257
|
+
already widens the same way) sitting next to ``stages["work"] ==
|
|
258
|
+
"pending"`` forever, since the strict-``type`` dispatcher never
|
|
259
|
+
recognised those rows as "work" activity. Every other field (status,
|
|
260
|
+
dispatched_at, test_state, acceptance_state, ...) is preserved
|
|
261
|
+
unchanged — this only relabels the ``type`` a downstream ``==`` check
|
|
262
|
+
sees.
|
|
263
|
+
"""
|
|
264
|
+
out = []
|
|
265
|
+
for a in assignments:
|
|
266
|
+
t = a.type or "work"
|
|
267
|
+
widen = t in WORK_LIKE_TYPES and t != "work"
|
|
268
|
+
out.append(dataclasses.replace(a, type="work") if widen else a)
|
|
269
|
+
return out
|
|
270
|
+
|
|
271
|
+
|
|
175
272
|
def upstream_max_dispatched_at(
|
|
176
273
|
assignments_for_issue: list,
|
|
177
274
|
stage: str,
|
|
@@ -698,6 +795,7 @@ def compute_issue_projection(
|
|
|
698
795
|
ci_store: Any | None = None,
|
|
699
796
|
uat_enabled: bool = False,
|
|
700
797
|
uat_preview_url: str | None = None,
|
|
798
|
+
stage_count_assignments: list | None = None,
|
|
701
799
|
) -> dict[str, Any]:
|
|
702
800
|
"""Compute the full per-issue stage badge dict.
|
|
703
801
|
|
|
@@ -717,6 +815,15 @@ def compute_issue_projection(
|
|
|
717
815
|
carried through unconditionally so a caller can show it next to the
|
|
718
816
|
badge instead of sending the operator to ``coord merge``'s refusal
|
|
719
817
|
message to find it (#2951 item 3).
|
|
818
|
+
|
|
819
|
+
``stage_count_assignments`` (#3013) is the assignment list
|
|
820
|
+
:func:`_leg_count_for_stage` scans to fill ``stage_counts`` — a client
|
|
821
|
+
can then render ``Work (2)`` / ``Review (5)`` next to the status badge
|
|
822
|
+
and suppress the suffix at 1. Defaults to *assignments_for_issue* (the
|
|
823
|
+
same list ``stages`` uses) when omitted, which is correct for an
|
|
824
|
+
ordinary issue; :func:`compute_board_stage_projection` passes a
|
|
825
|
+
separately-keyed list for the #1553 oracle-loop epic/slice case — see
|
|
826
|
+
that function's docstring.
|
|
720
827
|
"""
|
|
721
828
|
names = issue_stage_names(assignments_for_issue, default_gates, uat_enabled=uat_enabled)
|
|
722
829
|
stages: dict[str, str] = {}
|
|
@@ -741,8 +848,29 @@ def compute_issue_projection(
|
|
|
741
848
|
# excluded from the per-issue stage-strip ordering that `default_gates`
|
|
742
849
|
# drives, since it only applies to oracle-loop milestones.
|
|
743
850
|
stages["acceptance"] = acceptance_stage_status_for(assignments_for_issue)
|
|
851
|
+
|
|
852
|
+
count_source = (
|
|
853
|
+
assignments_for_issue if stage_count_assignments is None else stage_count_assignments
|
|
854
|
+
)
|
|
855
|
+
stage_counts: dict[str, int] = {
|
|
856
|
+
name: _leg_count_for_stage(count_source, name, require_plan=require_plan) for name in names
|
|
857
|
+
}
|
|
858
|
+
stage_counts.setdefault(
|
|
859
|
+
"merge", _leg_count_for_stage(count_source, "merge", require_plan=require_plan)
|
|
860
|
+
)
|
|
861
|
+
# Review fix (#3013): `stages` always carries "acceptance" (added
|
|
862
|
+
# unconditionally above, outside `names`/`default_gates`), but
|
|
863
|
+
# `stage_counts` was built only from `names` plus an explicit "merge"
|
|
864
|
+
# fallback — so it silently dropped "acceptance", contradicting the
|
|
865
|
+
# `/board` schema's documented "same key set as `stages`" guarantee
|
|
866
|
+
# (coord/serve_app.py) and leaving a client that indexes `stage_counts`
|
|
867
|
+
# by every key in `stages` with a plain `KeyError`.
|
|
868
|
+
stage_counts.setdefault(
|
|
869
|
+
"acceptance", _leg_count_for_stage(count_source, "acceptance", require_plan=require_plan)
|
|
870
|
+
)
|
|
744
871
|
return {
|
|
745
872
|
"stages": stages,
|
|
873
|
+
"stage_counts": stage_counts,
|
|
746
874
|
"acceptance_progress": acceptance_progress_for(assignments_for_issue),
|
|
747
875
|
"uat_preview_url": uat_preview_url if uat_enabled else None,
|
|
748
876
|
"has_approved_review": issue_has_any_approved_review(
|
|
@@ -779,6 +907,44 @@ def compute_board_stage_projection(
|
|
|
779
907
|
``None`` (the default — e.g. a caller with no config loaded) means no
|
|
780
908
|
repo is treated as opted in, matching :func:`pipeline_stage_names`'s own
|
|
781
909
|
fail-toward-hidden default.
|
|
910
|
+
|
|
911
|
+
``stage_counts`` (#3013) is deliberately built from a SECOND index keyed
|
|
912
|
+
by ``coord.models.effective_issue_number`` rather than the raw
|
|
913
|
+
``assignments_by_key`` below: an oracle-loop acceptance slice's
|
|
914
|
+
``test-author``/``mock-author``/``review`` legs are booked
|
|
915
|
+
(``issue_number``) to the milestone's *tracking* issue, with the child
|
|
916
|
+
they're actually FOR named in ``for_issue_number`` (see
|
|
917
|
+
``coord gates <repo> <slice>``, which resolves the same way). Reusing
|
|
918
|
+
``assignments_by_key`` for the count would leave a slice's own
|
|
919
|
+
``stage_counts`` reading 0 forever — the same keying trap noted in the
|
|
920
|
+
#3013 issue's "drive-queue sweep bug" reference. For an issue that ALSO
|
|
921
|
+
has its own raw-keyed rows, this does NOT touch ``stages``: that stays
|
|
922
|
+
keyed on the raw ``issue_number`` on purpose (#1652 — re-attributing
|
|
923
|
+
status by ``for_issue_number`` moved a false "merged" green from the
|
|
924
|
+
epic onto a child that already had its own, separately-tracked state; a
|
|
925
|
+
leg *count* carries no such false-green risk, so the two fields are
|
|
926
|
+
allowed to disagree on which issue owns which rows in that case).
|
|
927
|
+
|
|
928
|
+
Review fix (#3013): a *phantom* entry — ANY key whose raw-keyed
|
|
929
|
+
assignment list is empty, whether it exists in ``issues`` with no
|
|
930
|
+
assignments of its own (the coord-portal#164 test below: the slice IS
|
|
931
|
+
already synced, but every one of its legs is booked to the tracking
|
|
932
|
+
issue) or exists ONLY via the effective-key union (never synced at all:
|
|
933
|
+
not yet caught up by ``_sync_issues_tick``, or a closed slice pruned
|
|
934
|
+
from ``issues`` after 7 days while assignment retention runs 14, see
|
|
935
|
+
``coord/state.py``) — has nothing raw-keyed to protect from the #1652
|
|
936
|
+
clobber, because there IS no separately-tracked state for it to
|
|
937
|
+
conflict with. Rendering ``stages`` from the empty raw list anyway
|
|
938
|
+
produced a self-contradictory row: every stage PENDING (acceptance
|
|
939
|
+
SKIPPED) right next to a ``stage_counts`` proving real legs ran. So for
|
|
940
|
+
that case only, ``stages``/``acceptance``/``has_approved_review`` fall
|
|
941
|
+
back to the same effective-keyed list ``stage_counts`` already uses,
|
|
942
|
+
widened through :func:`_widen_work_like_types` so a `test-author`/
|
|
943
|
+
`mock-author` leg registers as "work" activity to the generic
|
|
944
|
+
per-stage dispatcher — see the ``projection_assignments`` fallback
|
|
945
|
+
below. ``issue_title`` still reads ``""`` for a phantom entry that
|
|
946
|
+
isn't itself in ``issues`` (genuinely unknown — not fabricated from the
|
|
947
|
+
tracking issue's own title, which would be actively wrong).
|
|
782
948
|
"""
|
|
783
949
|
is_closed_by_key: dict[tuple[str, int], bool] = {
|
|
784
950
|
(i["repo_name"], i["number"]): str(i.get("state", "")).lower() == "closed"
|
|
@@ -794,6 +960,17 @@ def compute_board_stage_projection(
|
|
|
794
960
|
continue
|
|
795
961
|
assignments_by_key.setdefault((a.repo_name, a.issue_number), []).append(a)
|
|
796
962
|
|
|
963
|
+
# #3013: effective-issue-keyed index — see docstring above. Used only to
|
|
964
|
+
# fill `stage_counts`, never `stages`.
|
|
965
|
+
assignments_by_effective_key: dict[tuple[str, int], list] = {}
|
|
966
|
+
for a in assignments:
|
|
967
|
+
if not a.repo_name:
|
|
968
|
+
continue
|
|
969
|
+
eff = effective_issue_number(a)
|
|
970
|
+
if not eff:
|
|
971
|
+
continue
|
|
972
|
+
assignments_by_effective_key.setdefault((a.repo_name, eff), []).append(a)
|
|
973
|
+
|
|
797
974
|
merge_by_key: dict[tuple[str, int], Any] = {}
|
|
798
975
|
for m in merge_queue_items:
|
|
799
976
|
assignment_type = getattr(m, "assignment_type", "work") or "work"
|
|
@@ -815,7 +992,11 @@ def compute_board_stage_projection(
|
|
|
815
992
|
# `load_queue()`/`board_projection()` both order by `id` ascending.
|
|
816
993
|
merge_by_key.setdefault(key, m)
|
|
817
994
|
|
|
818
|
-
|
|
995
|
+
# #3013: also union in the effective-key index so an acceptance slice
|
|
996
|
+
# whose only board rows are booked to the tracking issue (nothing keyed
|
|
997
|
+
# to the slice's own issue_number, e.g. never separately synced) still
|
|
998
|
+
# gets a projection row for stage_counts to land in.
|
|
999
|
+
keys = set(is_closed_by_key) | set(assignments_by_key) | set(assignments_by_effective_key)
|
|
819
1000
|
|
|
820
1001
|
uat_enabled_by_repo: dict[str, bool] = {}
|
|
821
1002
|
|
|
@@ -823,12 +1004,25 @@ def compute_board_stage_projection(
|
|
|
823
1004
|
for repo_name, issue_number in keys:
|
|
824
1005
|
key = (repo_name, issue_number)
|
|
825
1006
|
issue_assignments = assignments_by_key.get(key, [])
|
|
1007
|
+
effective_assignments = assignments_by_effective_key.get(key, [])
|
|
1008
|
+
# Review fix (#3013): a phantom entry (see docstring) has no
|
|
1009
|
+
# raw-keyed rows at all, so falling back to the effective-keyed list
|
|
1010
|
+
# here — instead of leaving `stages` computed from `[]` — keeps
|
|
1011
|
+
# `stages`/`acceptance`/`has_approved_review` consistent with the
|
|
1012
|
+
# non-zero `stage_counts` this same entry reports below. Widened
|
|
1013
|
+
# through `_widen_work_like_types` so a `test-author`/`mock-author`
|
|
1014
|
+
# leg (WORK_LIKE_TYPES, not literal `type="work"`) registers with
|
|
1015
|
+
# the generic per-stage dispatcher's strict `type` check the same
|
|
1016
|
+
# way `_leg_count_for_stage` already widens it for `stage_counts`.
|
|
1017
|
+
# A no-op for every ordinary issue: `issue_assignments or ...` only
|
|
1018
|
+
# reaches the fallback when the raw list is empty.
|
|
1019
|
+
projection_assignments = issue_assignments or _widen_work_like_types(effective_assignments)
|
|
826
1020
|
merge_entry = merge_by_key.get(key)
|
|
827
1021
|
if repo_name not in uat_enabled_by_repo:
|
|
828
1022
|
uat_enabled_by_repo[repo_name] = repo_has_uat_preview(repo_name, config)
|
|
829
1023
|
uat_enabled = uat_enabled_by_repo[repo_name]
|
|
830
1024
|
entry = compute_issue_projection(
|
|
831
|
-
|
|
1025
|
+
projection_assignments,
|
|
832
1026
|
merge_entry,
|
|
833
1027
|
is_closed=is_closed_by_key.get(key, False),
|
|
834
1028
|
require_plan=require_plan,
|
|
@@ -840,6 +1034,7 @@ def compute_board_stage_projection(
|
|
|
840
1034
|
if uat_enabled
|
|
841
1035
|
else None
|
|
842
1036
|
),
|
|
1037
|
+
stage_count_assignments=effective_assignments,
|
|
843
1038
|
)
|
|
844
1039
|
entry["repo_name"] = repo_name
|
|
845
1040
|
entry["issue_number"] = issue_number
|
|
@@ -397,6 +397,116 @@ def test_compute_issue_projection_includes_acceptance_box():
|
|
|
397
397
|
assert out["acceptance_progress"] == {"passed": 5, "total": 5}
|
|
398
398
|
|
|
399
399
|
|
|
400
|
+
def test_compute_issue_projection_stage_counts_has_same_keys_as_stages():
|
|
401
|
+
"""Review fix (#3013): `stage_counts` must carry every key `stages`
|
|
402
|
+
does — including `acceptance`, which is added to `stages`
|
|
403
|
+
unconditionally outside `names`/`default_gates` and was previously
|
|
404
|
+
dropped from `stage_counts` entirely, contradicting the `/board` schema
|
|
405
|
+
description ('Same key set as `stages`') and risking a `KeyError` for
|
|
406
|
+
any client indexing `stage_counts` by every key in `stages`."""
|
|
407
|
+
a = [_work(status="done", acceptance_state="passed", acceptance_total=5, acceptance_passed=5)]
|
|
408
|
+
out = sp.compute_issue_projection(
|
|
409
|
+
a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
|
|
410
|
+
)
|
|
411
|
+
assert set(out["stage_counts"]) == set(out["stages"])
|
|
412
|
+
assert out["stage_counts"]["acceptance"] == 1
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def test_compute_issue_projection_stage_counts_acceptance_counts_verdict_legs():
|
|
416
|
+
"""Each `type="work"` row carrying a recorded `acceptance_state` is a
|
|
417
|
+
separate acceptance-verdict leg — mirrors the `test`/`merge` special
|
|
418
|
+
cases: no dedicated assignment type exists to count directly."""
|
|
419
|
+
a = [
|
|
420
|
+
_work(assignment_id="w1", status="done", acceptance_state="failed", dispatched_at=1.0),
|
|
421
|
+
_work(assignment_id="w2", status="done", acceptance_state="passed", dispatched_at=2.0),
|
|
422
|
+
_work(assignment_id="w3", status="done", dispatched_at=3.0), # no verdict yet
|
|
423
|
+
]
|
|
424
|
+
out = sp.compute_issue_projection(
|
|
425
|
+
a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
|
|
426
|
+
)
|
|
427
|
+
assert out["stage_counts"]["acceptance"] == 2
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
# ── compute_issue_projection: stage_counts (#3013) ──────────────────────────
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def test_compute_issue_projection_stage_counts_counts_separate_legs():
|
|
434
|
+
"""A stage re-dispatched N times must report N in stage_counts, not
|
|
435
|
+
fold into the single status string the way `stages` does."""
|
|
436
|
+
a = [
|
|
437
|
+
_work(assignment_id="w1", status="failed", dispatched_at=1.0),
|
|
438
|
+
_work(assignment_id="w2", status="failed", dispatched_at=2.0),
|
|
439
|
+
_work(assignment_id="w3", status="done", test_state="passed", dispatched_at=3.0),
|
|
440
|
+
_review(
|
|
441
|
+
assignment_id="r1", review_of_assignment_id="w3",
|
|
442
|
+
review_verdict="request-changes", dispatched_at=4.0,
|
|
443
|
+
),
|
|
444
|
+
_review(
|
|
445
|
+
assignment_id="r2", review_of_assignment_id="w3",
|
|
446
|
+
review_verdict="approve", dispatched_at=5.0,
|
|
447
|
+
),
|
|
448
|
+
]
|
|
449
|
+
out = sp.compute_issue_projection(
|
|
450
|
+
a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
|
|
451
|
+
)
|
|
452
|
+
assert out["stage_counts"]["work"] == 3
|
|
453
|
+
assert out["stage_counts"]["review"] == 2
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
def test_compute_issue_projection_stage_counts_single_leg_is_one():
|
|
457
|
+
a = [_work(assignment_id="w1", status="done", dispatched_at=1.0)]
|
|
458
|
+
out = sp.compute_issue_projection(
|
|
459
|
+
a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
|
|
460
|
+
)
|
|
461
|
+
assert out["stage_counts"]["work"] == 1
|
|
462
|
+
assert out["stage_counts"]["review"] == 0
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
def test_compute_issue_projection_stage_counts_test_counts_smoke_legs():
|
|
466
|
+
"""The Test stage has no `type="test"` assignment — its dispatched
|
|
467
|
+
worker is `type="smoke"` (coord.smoke) — so the count must key off
|
|
468
|
+
that, not a literal type match."""
|
|
469
|
+
a = [
|
|
470
|
+
_work(assignment_id="w1", status="done", dispatched_at=1.0),
|
|
471
|
+
_work(assignment_id="s1", type="smoke", status="done", test_state="failed", dispatched_at=2.0),
|
|
472
|
+
_work(assignment_id="s2", type="smoke", status="done", test_state="passed", dispatched_at=3.0),
|
|
473
|
+
]
|
|
474
|
+
out = sp.compute_issue_projection(
|
|
475
|
+
a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
|
|
476
|
+
)
|
|
477
|
+
assert out["stage_counts"]["test"] == 2
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
def test_compute_issue_projection_stage_counts_merge_counts_conflict_fix_legs():
|
|
481
|
+
"""Repeated landing attempts show up as `type="conflict-fix"` legs
|
|
482
|
+
(#241) — there is no `type="merge"` assignment to count directly."""
|
|
483
|
+
a = [
|
|
484
|
+
_work(assignment_id="w1", status="done", dispatched_at=1.0),
|
|
485
|
+
_work(assignment_id="cf1", type="conflict-fix", status="done", dispatched_at=2.0),
|
|
486
|
+
_work(assignment_id="cf2", type="conflict-fix", status="failed", dispatched_at=3.0),
|
|
487
|
+
]
|
|
488
|
+
out = sp.compute_issue_projection(
|
|
489
|
+
a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
|
|
490
|
+
)
|
|
491
|
+
assert out["stage_counts"]["merge"] == 2
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
def test_compute_issue_projection_stage_counts_work_includes_test_author_legs():
|
|
495
|
+
"""#3013's coord-portal#164 example: an oracle-loop acceptance slice's
|
|
496
|
+
repeated `test-author` legs must count as Work legs — a strict
|
|
497
|
+
`type == "work"` match would never see them."""
|
|
498
|
+
a = [
|
|
499
|
+
_work(assignment_id="ta1", type="test-author", status="failed", dispatched_at=1.0),
|
|
500
|
+
_work(assignment_id="ta2", type="test-author", status="failed", dispatched_at=2.0),
|
|
501
|
+
_work(assignment_id="ta3", type="test-author", status="failed", dispatched_at=3.0),
|
|
502
|
+
_work(assignment_id="ta4", type="test-author", status="done", dispatched_at=4.0),
|
|
503
|
+
]
|
|
504
|
+
out = sp.compute_issue_projection(
|
|
505
|
+
a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
|
|
506
|
+
)
|
|
507
|
+
assert out["stage_counts"]["work"] == 4
|
|
508
|
+
|
|
509
|
+
|
|
400
510
|
# ── issue_has_any_approved_review ───────────────────────────────────────────
|
|
401
511
|
|
|
402
512
|
|
|
@@ -839,3 +949,177 @@ def test_merged_test_author_entry_does_not_green_child_with_own_unmerged_work():
|
|
|
839
949
|
)
|
|
840
950
|
by_issue = {e["issue_number"]: e for e in out}
|
|
841
951
|
assert by_issue[1122]["stages"]["merge"] == sp.PENDING
|
|
952
|
+
|
|
953
|
+
|
|
954
|
+
# ── compute_board_stage_projection: stage_counts epic/slice keying (#3013) ──
|
|
955
|
+
|
|
956
|
+
|
|
957
|
+
def test_compute_board_stage_projection_stage_counts_attributes_slice_legs_to_child():
|
|
958
|
+
"""#3013's coord-portal#164 example: an oracle-loop acceptance slice's
|
|
959
|
+
test-author/review legs are booked (`issue_number`) to the milestone's
|
|
960
|
+
tracking issue but FOR the child (`for_issue_number`) — `coord gates
|
|
961
|
+
coord-portal 164` resolves them the same way. stage_counts must land on
|
|
962
|
+
the CHILD's own projection entry, not the epic's — and must not
|
|
963
|
+
double-count the same legs on both."""
|
|
964
|
+
issues = [
|
|
965
|
+
{"repo_name": "api", "number": 160, "title": "epic", "state": "open"},
|
|
966
|
+
{"repo_name": "api", "number": 164, "title": "slice", "state": "open"},
|
|
967
|
+
]
|
|
968
|
+
assignments = [
|
|
969
|
+
_work(
|
|
970
|
+
assignment_id="ta1", issue_number=160, type="test-author",
|
|
971
|
+
status="failed", for_issue_number=164, dispatched_at=1.0,
|
|
972
|
+
),
|
|
973
|
+
_work(
|
|
974
|
+
assignment_id="ta2", issue_number=160, type="test-author",
|
|
975
|
+
status="failed", for_issue_number=164, dispatched_at=2.0,
|
|
976
|
+
),
|
|
977
|
+
_work(
|
|
978
|
+
assignment_id="ta3", issue_number=160, type="test-author",
|
|
979
|
+
status="failed", for_issue_number=164, dispatched_at=3.0,
|
|
980
|
+
),
|
|
981
|
+
_work(
|
|
982
|
+
assignment_id="ta4", issue_number=160, type="test-author",
|
|
983
|
+
status="done", for_issue_number=164, dispatched_at=4.0,
|
|
984
|
+
),
|
|
985
|
+
_review(
|
|
986
|
+
assignment_id="r1", issue_number=160, review_of_assignment_id="ta4",
|
|
987
|
+
for_issue_number=164, review_verdict="request-changes", dispatched_at=5.0,
|
|
988
|
+
),
|
|
989
|
+
_review(
|
|
990
|
+
assignment_id="r2", issue_number=160, review_of_assignment_id="ta4",
|
|
991
|
+
for_issue_number=164, review_verdict="request-changes", dispatched_at=6.0,
|
|
992
|
+
),
|
|
993
|
+
_review(
|
|
994
|
+
assignment_id="r3", issue_number=160, review_of_assignment_id="ta4",
|
|
995
|
+
for_issue_number=164, review_verdict="request-changes", dispatched_at=7.0,
|
|
996
|
+
),
|
|
997
|
+
_review(
|
|
998
|
+
assignment_id="r4", issue_number=160, review_of_assignment_id="ta4",
|
|
999
|
+
for_issue_number=164, review_verdict="request-changes", dispatched_at=8.0,
|
|
1000
|
+
),
|
|
1001
|
+
_review(
|
|
1002
|
+
assignment_id="r5", issue_number=160, review_of_assignment_id="ta4",
|
|
1003
|
+
for_issue_number=164, review_verdict="approve", dispatched_at=9.0,
|
|
1004
|
+
),
|
|
1005
|
+
]
|
|
1006
|
+
out = sp.compute_board_stage_projection(
|
|
1007
|
+
issues=issues,
|
|
1008
|
+
assignments=assignments,
|
|
1009
|
+
merge_queue_items=[],
|
|
1010
|
+
default_gates=["test", "review", "merge"],
|
|
1011
|
+
)
|
|
1012
|
+
by_issue = {e["issue_number"]: e for e in out}
|
|
1013
|
+
assert by_issue[164]["stage_counts"]["work"] == 4
|
|
1014
|
+
assert by_issue[164]["stage_counts"]["review"] == 5
|
|
1015
|
+
# The epic's own count must not also carry the slice's legs — they
|
|
1016
|
+
# belong on exactly one entry, not both.
|
|
1017
|
+
assert by_issue[160]["stage_counts"]["work"] == 0
|
|
1018
|
+
assert by_issue[160]["stage_counts"]["review"] == 0
|
|
1019
|
+
|
|
1020
|
+
|
|
1021
|
+
def test_compute_board_stage_projection_phantom_slice_stages_match_stage_counts():
|
|
1022
|
+
"""Review fix (#3013 blocking finding): a slice/child issue whose ONLY
|
|
1023
|
+
board rows are booked to the tracking issue — and which is NOT itself in
|
|
1024
|
+
the `issues` table yet (unlike the sibling test above, where both #160
|
|
1025
|
+
and #164 are already synced) — must not render a self-contradictory
|
|
1026
|
+
board row: every stage PENDING/SKIPPED right next to a `stage_counts`
|
|
1027
|
+
proving 4 work legs and 5 review legs ran. `stages` now falls back to
|
|
1028
|
+
the same effective-keyed rows `stage_counts` uses whenever an issue has
|
|
1029
|
+
zero rows keyed to its own raw `issue_number` (nothing separately
|
|
1030
|
+
tracked for #1652's false-green concern to clobber)."""
|
|
1031
|
+
issues = [
|
|
1032
|
+
{"repo_name": "api", "number": 160, "title": "epic", "state": "open"},
|
|
1033
|
+
# #164 deliberately absent — the phantom case: it only appears via
|
|
1034
|
+
# the effective-key union below.
|
|
1035
|
+
]
|
|
1036
|
+
assignments = [
|
|
1037
|
+
_work(
|
|
1038
|
+
assignment_id="ta1", issue_number=160, type="test-author",
|
|
1039
|
+
status="failed", for_issue_number=164, dispatched_at=1.0,
|
|
1040
|
+
),
|
|
1041
|
+
_work(
|
|
1042
|
+
assignment_id="ta2", issue_number=160, type="test-author",
|
|
1043
|
+
status="failed", for_issue_number=164, dispatched_at=2.0,
|
|
1044
|
+
),
|
|
1045
|
+
_work(
|
|
1046
|
+
assignment_id="ta3", issue_number=160, type="test-author",
|
|
1047
|
+
status="failed", for_issue_number=164, dispatched_at=3.0,
|
|
1048
|
+
),
|
|
1049
|
+
_work(
|
|
1050
|
+
assignment_id="ta4", issue_number=160, type="test-author",
|
|
1051
|
+
status="done", for_issue_number=164, dispatched_at=4.0,
|
|
1052
|
+
),
|
|
1053
|
+
_review(
|
|
1054
|
+
assignment_id="r1", issue_number=160, review_of_assignment_id="ta4",
|
|
1055
|
+
for_issue_number=164, review_verdict="request-changes", dispatched_at=5.0,
|
|
1056
|
+
),
|
|
1057
|
+
_review(
|
|
1058
|
+
assignment_id="r2", issue_number=160, review_of_assignment_id="ta4",
|
|
1059
|
+
for_issue_number=164, review_verdict="request-changes", dispatched_at=6.0,
|
|
1060
|
+
),
|
|
1061
|
+
_review(
|
|
1062
|
+
assignment_id="r3", issue_number=160, review_of_assignment_id="ta4",
|
|
1063
|
+
for_issue_number=164, review_verdict="request-changes", dispatched_at=7.0,
|
|
1064
|
+
),
|
|
1065
|
+
_review(
|
|
1066
|
+
assignment_id="r4", issue_number=160, review_of_assignment_id="ta4",
|
|
1067
|
+
for_issue_number=164, review_verdict="request-changes", dispatched_at=8.0,
|
|
1068
|
+
),
|
|
1069
|
+
_review(
|
|
1070
|
+
assignment_id="r5", issue_number=160, review_of_assignment_id="ta4",
|
|
1071
|
+
for_issue_number=164, review_verdict="approve", dispatched_at=9.0,
|
|
1072
|
+
),
|
|
1073
|
+
]
|
|
1074
|
+
out = sp.compute_board_stage_projection(
|
|
1075
|
+
issues=issues,
|
|
1076
|
+
assignments=assignments,
|
|
1077
|
+
merge_queue_items=[],
|
|
1078
|
+
default_gates=["test", "review", "merge"],
|
|
1079
|
+
)
|
|
1080
|
+
by_issue = {e["issue_number"]: e for e in out}
|
|
1081
|
+
slice_entry = by_issue[164]
|
|
1082
|
+
|
|
1083
|
+
# The counts are unaffected by this fix — same as the synced-sibling case.
|
|
1084
|
+
assert slice_entry["stage_counts"]["work"] == 4
|
|
1085
|
+
assert slice_entry["stage_counts"]["review"] == 5
|
|
1086
|
+
|
|
1087
|
+
# The core fix: `stages` must no longer be a blanket PENDING default —
|
|
1088
|
+
# it reflects the SAME rows the counts are drawn from.
|
|
1089
|
+
assert slice_entry["stages"]["work"] == sp.DONE
|
|
1090
|
+
assert slice_entry["stages"]["review"] == sp.DONE
|
|
1091
|
+
assert slice_entry["has_approved_review"] is True
|
|
1092
|
+
# No merge signal exists for a phantom entry (no merge-queue row keys to
|
|
1093
|
+
# it) — PENDING here is honest (matches stage_counts["merge"] == 0), not
|
|
1094
|
+
# a fabricated green.
|
|
1095
|
+
assert slice_entry["stages"]["merge"] == sp.PENDING
|
|
1096
|
+
assert slice_entry["stage_counts"]["merge"] == 0
|
|
1097
|
+
|
|
1098
|
+
# Genuinely unknown, not fabricated from the tracking issue's own title.
|
|
1099
|
+
assert slice_entry["issue_title"] == ""
|
|
1100
|
+
|
|
1101
|
+
# The epic's own entry is completely unaffected (it has real raw-keyed
|
|
1102
|
+
# rows, so the phantom fallback never applies to it).
|
|
1103
|
+
assert by_issue[160]["stage_counts"]["work"] == 0
|
|
1104
|
+
assert by_issue[160]["stage_counts"]["review"] == 0
|
|
1105
|
+
|
|
1106
|
+
|
|
1107
|
+
def test_compute_board_stage_projection_stage_counts_ordinary_issue_uses_own_key():
|
|
1108
|
+
"""An ordinary (non-oracle-loop) issue has no `for_issue_number` — its
|
|
1109
|
+
stage_counts must come from its own rows, unaffected by the #3013
|
|
1110
|
+
effective-key indirection added for the slice case above."""
|
|
1111
|
+
issues = [{"repo_name": "api", "number": 1, "title": "t", "state": "open"}]
|
|
1112
|
+
assignments = [
|
|
1113
|
+
_work(assignment_id="w1", status="failed", dispatched_at=1.0),
|
|
1114
|
+
_work(assignment_id="w2", status="done", dispatched_at=2.0),
|
|
1115
|
+
_review(assignment_id="r1", review_of_assignment_id="w2", review_verdict="approve", dispatched_at=3.0),
|
|
1116
|
+
]
|
|
1117
|
+
out = sp.compute_board_stage_projection(
|
|
1118
|
+
issues=issues,
|
|
1119
|
+
assignments=assignments,
|
|
1120
|
+
merge_queue_items=[],
|
|
1121
|
+
default_gates=["test", "review", "merge"],
|
|
1122
|
+
)
|
|
1123
|
+
entry = out[0]
|
|
1124
|
+
assert entry["stage_counts"]["work"] == 2
|
|
1125
|
+
assert entry["stage_counts"]["review"] == 1
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|