code-coordinator 0.5.230__tar.gz → 0.5.231__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.230 → code_coordinator-0.5.231}/PKG-INFO +1 -1
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/milestone.py +37 -5
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/milestone_dispatch.py +113 -11
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/milestone_gate.py +14 -1
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/milestone_order.py +61 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/serve_app.py +38 -2
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_milestone_dispatch.py +103 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_milestone_order.py +82 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_milestone_dispatch.py +112 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_milestone_gate.py +136 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_milestone_order.py +36 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/.gitignore +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/CLAUDE.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/GOAL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/LICENSE +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/MANIFEST.in +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/README.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/__init__.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/agent.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/audit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/block_log.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/board_service.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/brain.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/claim.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/cli.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/client.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/comments.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/config.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/dao.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/db.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/deps.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/drive.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/events.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/filelock.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/freshness.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/gates.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/goal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/context.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/models.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/render.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/health/units.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/hooks.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/interactive.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/models.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/network.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/notify.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/openapi.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/parentage.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/plans.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/progress.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/release_window.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/reports.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/review.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/self_health.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/smoke.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/split_work.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/state.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/test_author.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/test_report.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/usage.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/install-agent.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/pyproject.toml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/setup.cfg +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/__init__.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-67/contract.md +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-67/manifest.yml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/conftest.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_config.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_db.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_events.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_init.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_models.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_network.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_review.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_session.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_split.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_state.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/approved.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.230 → code_coordinator-0.5.231}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -48,6 +48,7 @@ from coord.milestone_order import (
|
|
|
48
48
|
replace_sub_issues_section,
|
|
49
49
|
replace_work_order_section,
|
|
50
50
|
validate_milestone_membership,
|
|
51
|
+
validate_no_shared_oracle_group,
|
|
51
52
|
)
|
|
52
53
|
|
|
53
54
|
|
|
@@ -1088,7 +1089,15 @@ def milestone_dispatch_cmd(
|
|
|
1088
1089
|
# issue as its pre-reqs land; that also makes `register_milestone_drain`
|
|
1089
1090
|
# redundant here (the queue IS the durable drain, and registering would
|
|
1090
1091
|
# have the daemon's direct-dispatch drain racing it).
|
|
1091
|
-
|
|
1092
|
+
# #2542: under oracle-loop control (Gate A already checked above), chain
|
|
1093
|
+
# the whole milestone's drive-queue entries so the tick can never launch
|
|
1094
|
+
# two of them at once — see plan_queue's own docstring for why.
|
|
1095
|
+
queue_plan = plan_queue(
|
|
1096
|
+
ctx.work_order,
|
|
1097
|
+
ctx.terminal_issues,
|
|
1098
|
+
repo_entry.name,
|
|
1099
|
+
oracle_loop=cfg.acceptance.has_driver(repo_entry.name),
|
|
1100
|
+
)
|
|
1092
1101
|
|
|
1093
1102
|
if not queue_plan:
|
|
1094
1103
|
click.echo("Nothing to queue — every work-order node is already closed.")
|
|
@@ -1277,18 +1286,25 @@ def milestone_drive_cmd(
|
|
|
1277
1286
|
|
|
1278
1287
|
# The frontier half of the dry-run report. Computed for both modes so the
|
|
1279
1288
|
# non-dry-run confirmation shows what the first `work` tick will do.
|
|
1289
|
+
# #2542: pass the same `oracle_loop` the gate tick itself will use, so
|
|
1290
|
+
# this preview never shows more than the one entry the actual `work`
|
|
1291
|
+
# gate would dispatch for an oracle-loop milestone.
|
|
1280
1292
|
if ctx.work_order.nodes:
|
|
1281
1293
|
plan = plan_dispatch(
|
|
1282
|
-
ctx.work_order, board, cfg, repo_entry, ctx.terminal_issues
|
|
1294
|
+
ctx.work_order, board, cfg, repo_entry, ctx.terminal_issues,
|
|
1295
|
+
oracle_loop=cfg.acceptance.has_driver(repo_entry.name),
|
|
1296
|
+
)
|
|
1297
|
+
to_dispatch, skipped, waiting, deferred = (
|
|
1298
|
+
plan.to_dispatch, plan.skipped, plan.waiting, plan.deferred,
|
|
1283
1299
|
)
|
|
1284
|
-
to_dispatch, skipped, waiting = plan.to_dispatch, plan.skipped, plan.waiting
|
|
1285
1300
|
else:
|
|
1286
|
-
to_dispatch, skipped, waiting = [], [], []
|
|
1301
|
+
to_dispatch, skipped, waiting, deferred = [], [], [], []
|
|
1287
1302
|
|
|
1288
1303
|
if dry_run:
|
|
1289
1304
|
for line in mg.format_plan(
|
|
1290
1305
|
record, steps,
|
|
1291
1306
|
to_dispatch=to_dispatch, skipped=skipped, waiting=waiting,
|
|
1307
|
+
deferred=deferred,
|
|
1292
1308
|
):
|
|
1293
1309
|
click.echo(line)
|
|
1294
1310
|
return
|
|
@@ -1311,7 +1327,7 @@ def milestone_drive_cmd(
|
|
|
1311
1327
|
state.save_milestone_gate(record.to_dict())
|
|
1312
1328
|
for line in mg.format_plan(
|
|
1313
1329
|
record, steps, to_dispatch=to_dispatch, skipped=skipped, waiting=waiting,
|
|
1314
|
-
footer=False,
|
|
1330
|
+
deferred=deferred, footer=False,
|
|
1315
1331
|
):
|
|
1316
1332
|
click.echo(line)
|
|
1317
1333
|
click.echo()
|
|
@@ -1448,6 +1464,22 @@ def milestone_write_order_cmd(
|
|
|
1448
1464
|
click.echo(f"error: {e}", err=True)
|
|
1449
1465
|
sys.exit(1)
|
|
1450
1466
|
|
|
1467
|
+
# #2542: refuse a proposed work order that puts two issues in the same
|
|
1468
|
+
# `{group: ...}` cohort when this milestone is under oracle-loop control
|
|
1469
|
+
# — every group member's JIT acceptance slice would additively append to
|
|
1470
|
+
# the SAME tests/acceptance/ms-N/manifest.yml, a manifest race that
|
|
1471
|
+
# exists regardless of whether the issues' actual feature work overlaps
|
|
1472
|
+
# (coord-portal#122). Cheap/early check for the explicit-group case only
|
|
1473
|
+
# — see validate_no_shared_oracle_group's docstring for what it can't
|
|
1474
|
+
# catch.
|
|
1475
|
+
try:
|
|
1476
|
+
validate_no_shared_oracle_group(
|
|
1477
|
+
work_order, oracle_loop=cfg.acceptance.has_driver(repo_entry.name)
|
|
1478
|
+
)
|
|
1479
|
+
except WorkOrderError as e:
|
|
1480
|
+
click.echo(f"error: {e}", err=True)
|
|
1481
|
+
sys.exit(1)
|
|
1482
|
+
|
|
1451
1483
|
# #1057: a valid `## Work order` block alone doesn't make this issue
|
|
1452
1484
|
# findable as the milestone's tracking epic — `coord plans`/the TUI
|
|
1453
1485
|
# Plans panel key off the `epic` label (TRACKING_ISSUE_LABEL). Ensure it
|
|
@@ -25,6 +25,11 @@ Three call sites share this module:
|
|
|
25
25
|
same fetch → plan → dispatch sequence for milestones registered via a
|
|
26
26
|
non-dry-run ``coord milestone dispatch`` call, so newly-unblocked frontier
|
|
27
27
|
entries dispatch automatically as dependencies complete.
|
|
28
|
+
- The daemon's gate tick (``coord.serve_app._milestone_gate_tick``, #1929),
|
|
29
|
+
whose ``work`` gate state IS the drain for a gate-driven milestone (``coord
|
|
30
|
+
milestone drive``, docs/ORACLE_LOOP.md) — same ``plan_dispatch`` +
|
|
31
|
+
``dispatch_entry`` primitives, so gate policy and dispatch policy can't
|
|
32
|
+
drift apart.
|
|
28
33
|
- Tests exercise the pure ``plan_dispatch``/``pick_machine`` functions
|
|
29
34
|
directly with a seeded :class:`~coord.models.Board`, no GitHub or HTTP.
|
|
30
35
|
"""
|
|
@@ -66,6 +71,7 @@ __all__ = [
|
|
|
66
71
|
"pick_machine",
|
|
67
72
|
"MachinePick",
|
|
68
73
|
"NoMachineAvailable",
|
|
74
|
+
"DeferredByOracleLoop",
|
|
69
75
|
"MilestonePlan",
|
|
70
76
|
"plan_dispatch",
|
|
71
77
|
"QueuePlanEntry",
|
|
@@ -642,15 +648,37 @@ class NoMachineAvailable:
|
|
|
642
648
|
reason: str = "no idle machine available for this repo"
|
|
643
649
|
|
|
644
650
|
|
|
651
|
+
@dataclass(frozen=True)
|
|
652
|
+
class DeferredByOracleLoop:
|
|
653
|
+
"""A ready-frontier entry withheld *this tick* because the milestone is
|
|
654
|
+
under oracle-loop control and another entry already claimed the tick's
|
|
655
|
+
one dispatch slot (#2542).
|
|
656
|
+
|
|
657
|
+
Distinct from both :class:`~coord.milestone_order.BlockedNode` (the
|
|
658
|
+
frontier itself considers this entry ready) and
|
|
659
|
+
:class:`NoMachineAvailable` (there may well be an idle machine for it) —
|
|
660
|
+
it is held back purely so two same-milestone entries never enter their
|
|
661
|
+
JIT-slice-authoring phase concurrently and race on the shared
|
|
662
|
+
``tests/acceptance/ms-N/manifest.yml``. It will be reconsidered on the
|
|
663
|
+
next tick, by which point the dispatched entry is claimed (an active
|
|
664
|
+
board assignment) and drops out of the ready frontier on its own.
|
|
665
|
+
"""
|
|
666
|
+
|
|
667
|
+
entry: FrontierEntry
|
|
668
|
+
reason: str = "oracle-loop milestone: only one entry dispatches per tick"
|
|
669
|
+
|
|
670
|
+
|
|
645
671
|
@dataclass(frozen=True)
|
|
646
672
|
class MilestonePlan:
|
|
647
673
|
"""The result of :func:`plan_dispatch`: what to dispatch now, what's
|
|
648
|
-
idle-machine-starved,
|
|
674
|
+
idle-machine-starved, what's withheld for oracle-loop serialization, and
|
|
675
|
+
what Phase 0's frontier says is still blocked.
|
|
649
676
|
"""
|
|
650
677
|
|
|
651
678
|
to_dispatch: tuple[MachinePick, ...] = ()
|
|
652
679
|
skipped: tuple[NoMachineAvailable, ...] = ()
|
|
653
680
|
waiting: tuple[BlockedNode, ...] = ()
|
|
681
|
+
deferred: tuple[DeferredByOracleLoop, ...] = ()
|
|
654
682
|
|
|
655
683
|
|
|
656
684
|
def plan_dispatch(
|
|
@@ -659,6 +687,8 @@ def plan_dispatch(
|
|
|
659
687
|
config: "Config",
|
|
660
688
|
repo_cfg: Repo,
|
|
661
689
|
terminal_issues: frozenset[int] | set[int],
|
|
690
|
+
*,
|
|
691
|
+
oracle_loop: bool = False,
|
|
662
692
|
) -> MilestonePlan:
|
|
663
693
|
"""Compute the ready frontier and pick a machine for each ready entry.
|
|
664
694
|
|
|
@@ -667,6 +697,33 @@ def plan_dispatch(
|
|
|
667
697
|
the first idle+capable machine not already claimed by an earlier entry
|
|
668
698
|
in *this* call (so a cohort of N ready issues fans out across up to N
|
|
669
699
|
distinct idle machines instead of piling onto one).
|
|
700
|
+
|
|
701
|
+
``oracle_loop`` (#2542) — the caller's already-resolved
|
|
702
|
+
``config.acceptance.has_driver(repo_cfg.name)`` — caps ``to_dispatch`` at
|
|
703
|
+
**one** entry per call. Without this, two ready-frontier entries with no
|
|
704
|
+
claim/dependency edge between them (the normal, desired fan-out above)
|
|
705
|
+
would both dispatch in the very same tick under an oracle-loop
|
|
706
|
+
milestone, and each independently authors its own JIT acceptance slice
|
|
707
|
+
into the SAME ``tests/acceptance/ms-N/manifest.yml``
|
|
708
|
+
(``coord.test_author``'s "later slices MERGE into this file"
|
|
709
|
+
convention) — a race regardless of what the declared work order says is
|
|
710
|
+
safe to parallelize. This is the same hazard :func:`plan_queue`'s
|
|
711
|
+
``oracle_loop`` chaining closes for the drive-queue path; this is the
|
|
712
|
+
equivalent for the daemon's direct-dispatch paths
|
|
713
|
+
(``coord.serve_app._milestone_gate_tick``'s ``work`` state and the
|
|
714
|
+
legacy ``_milestone_drain_tick``), which call this function directly
|
|
715
|
+
rather than going through the drive-queue. Entries that would otherwise
|
|
716
|
+
have dispatched this tick are returned in :attr:`MilestonePlan.deferred`
|
|
717
|
+
instead of silently dropped; they re-enter ``ready`` on a later tick
|
|
718
|
+
once the dispatched entry is claimed (an active board assignment) and
|
|
719
|
+
falls out of the frontier on its own — see
|
|
720
|
+
:func:`~coord.milestone_order.ready_frontier`.
|
|
721
|
+
|
|
722
|
+
Deliberately coarse, mirroring ``plan_queue``: it withholds the ENTIRE
|
|
723
|
+
entry (not just its slice-authoring phase), a real throughput cost for
|
|
724
|
+
an oracle-loop milestone dispatched via the daemon in bulk. #2543
|
|
725
|
+
(per-issue manifest fragments) is what would let real concurrency come
|
|
726
|
+
back safely; this is defense-in-depth until it lands.
|
|
670
727
|
"""
|
|
671
728
|
frontier = ready_frontier(
|
|
672
729
|
work_order,
|
|
@@ -677,8 +734,12 @@ def plan_dispatch(
|
|
|
677
734
|
)
|
|
678
735
|
picks: list[MachinePick] = []
|
|
679
736
|
skipped: list[NoMachineAvailable] = []
|
|
737
|
+
deferred: list[DeferredByOracleLoop] = []
|
|
680
738
|
used: set[str] = set()
|
|
681
739
|
for entry in frontier.ready:
|
|
740
|
+
if oracle_loop and picks:
|
|
741
|
+
deferred.append(DeferredByOracleLoop(entry))
|
|
742
|
+
continue
|
|
682
743
|
machine = pick_machine(repo_cfg.name, board, config, exclude=frozenset(used))
|
|
683
744
|
if machine is None:
|
|
684
745
|
skipped.append(NoMachineAvailable(entry))
|
|
@@ -686,7 +747,10 @@ def plan_dispatch(
|
|
|
686
747
|
used.add(machine.name)
|
|
687
748
|
picks.append(MachinePick(entry, machine))
|
|
688
749
|
return MilestonePlan(
|
|
689
|
-
to_dispatch=tuple(picks),
|
|
750
|
+
to_dispatch=tuple(picks),
|
|
751
|
+
skipped=tuple(skipped),
|
|
752
|
+
waiting=frontier.blocked,
|
|
753
|
+
deferred=tuple(deferred),
|
|
690
754
|
)
|
|
691
755
|
|
|
692
756
|
|
|
@@ -708,6 +772,8 @@ def plan_queue(
|
|
|
708
772
|
work_order: WorkOrder,
|
|
709
773
|
terminal_issues: frozenset[int] | set[int],
|
|
710
774
|
repo_name: str,
|
|
775
|
+
*,
|
|
776
|
+
oracle_loop: bool = False,
|
|
711
777
|
) -> tuple[QueuePlanEntry, ...]:
|
|
712
778
|
"""Translate the work order's DAG into drive-queue enqueues (#2335).
|
|
713
779
|
|
|
@@ -724,6 +790,31 @@ def plan_queue(
|
|
|
724
790
|
:func:`~coord.milestone_order.parse_work_order` already refused cycles,
|
|
725
791
|
self-edges, and edges to undeclared nodes, so the sort always terminates;
|
|
726
792
|
the defensive tail below only fires on inputs constructed outside it.
|
|
793
|
+
|
|
794
|
+
``oracle_loop`` (#2542) — the caller's already-resolved
|
|
795
|
+
``config.acceptance.has_driver(repo_name)`` — additionally chains every
|
|
796
|
+
entry's ``after`` to the issue immediately before it in this function's
|
|
797
|
+
own topological order, so the drive-queue admits the WHOLE milestone
|
|
798
|
+
strictly one entry at a time. Without this, two entries with no declared
|
|
799
|
+
edge between them (different ``group``s, or neither declaring one) are
|
|
800
|
+
both ``waiting`` the moment their own pre-reqs land, and the
|
|
801
|
+
drive-queue's per-repo concurrency cap (``coord.drive_queue.plan_tick``)
|
|
802
|
+
launches both at once — each independently authoring its own JIT
|
|
803
|
+
acceptance slice into the SAME ``tests/acceptance/ms-N/manifest.yml``
|
|
804
|
+
(``coord.test_author``'s "later slices MERGE into this file"
|
|
805
|
+
convention), regardless of what the declared work order says is safe to
|
|
806
|
+
parallelize. This is exactly coord-portal#122's SECOND collision (#130
|
|
807
|
+
vs. #132, filed as #2542's correction) — ``validate_no_shared_oracle_
|
|
808
|
+
group`` only catches the explicit-group case, and this milestone's
|
|
809
|
+
entries shared no group at all.
|
|
810
|
+
|
|
811
|
+
Deliberately coarse: it serializes the entry's WHOLE dispatch (Work
|
|
812
|
+
through Merge), not just its slice-authoring phase, because the
|
|
813
|
+
drive-queue has no notion of "authoring" vs. "working" phases to hang a
|
|
814
|
+
narrower edge on. That is a real throughput cost for an oracle-loop
|
|
815
|
+
milestone dispatched in bulk — #2543 (giving each issue its own manifest
|
|
816
|
+
fragment instead of one shared appended file) is what would let real
|
|
817
|
+
concurrency come back safely; this is defense-in-depth until it lands.
|
|
727
818
|
"""
|
|
728
819
|
from coord.drive_queue import entry_key # noqa: PLC0415
|
|
729
820
|
|
|
@@ -746,16 +837,27 @@ def plan_queue(
|
|
|
746
837
|
if not progressed: # cycle — unreachable via parse_work_order; see above
|
|
747
838
|
ordered.extend(remaining.values())
|
|
748
839
|
break
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
840
|
+
|
|
841
|
+
entries: list[QueuePlanEntry] = []
|
|
842
|
+
previous_issue_number: int | None = None
|
|
843
|
+
for n in ordered:
|
|
844
|
+
after_numbers = list(n.after)
|
|
845
|
+
if oracle_loop and (
|
|
846
|
+
previous_issue_number is not None
|
|
847
|
+
and previous_issue_number not in after_numbers
|
|
848
|
+
):
|
|
849
|
+
after_numbers.append(previous_issue_number)
|
|
850
|
+
entries.append(
|
|
851
|
+
QueuePlanEntry(
|
|
852
|
+
issue_number=n.issue_number,
|
|
853
|
+
after=tuple(
|
|
854
|
+
entry_key(repo_name, d) for d in after_numbers if d not in terminal
|
|
855
|
+
),
|
|
856
|
+
group=n.group,
|
|
857
|
+
)
|
|
756
858
|
)
|
|
757
|
-
|
|
758
|
-
)
|
|
859
|
+
previous_issue_number = n.issue_number
|
|
860
|
+
return tuple(entries)
|
|
759
861
|
|
|
760
862
|
|
|
761
863
|
@dataclass(frozen=True)
|
|
@@ -637,17 +637,26 @@ def format_plan(
|
|
|
637
637
|
to_dispatch: list = (),
|
|
638
638
|
skipped: list = (),
|
|
639
639
|
waiting: list = (),
|
|
640
|
+
deferred: list = (),
|
|
640
641
|
footer: bool = True,
|
|
641
642
|
) -> list[str]:
|
|
642
643
|
"""Render a ``--dry-run`` report: the gate walk plus the work frontier.
|
|
643
644
|
|
|
644
|
-
``to_dispatch``/``skipped``/``waiting`` come straight off a
|
|
645
|
+
``to_dispatch``/``skipped``/``waiting``/``deferred`` come straight off a
|
|
645
646
|
:class:`~coord.milestone_dispatch.MilestonePlan` (the same frontier
|
|
646
647
|
``coord milestone dispatch --dry-run`` prints), so the operator sees both
|
|
647
648
|
halves of #1440's fourth acceptance bullet — every gate, *and* what would
|
|
648
649
|
dispatch — in one output. Returns lines rather than echoing so both the
|
|
649
650
|
CLI and a test can consume it.
|
|
650
651
|
|
|
652
|
+
``deferred`` (#2542) is populated only when the caller resolved
|
|
653
|
+
``oracle_loop=True`` — entries the frontier considers ready but that the
|
|
654
|
+
`work` gate is deliberately holding back this tick so no two
|
|
655
|
+
same-milestone entries start authoring a JIT acceptance slice
|
|
656
|
+
concurrently. Rendered separately from ``skipped`` (no idle machine) so
|
|
657
|
+
the report never implies "we couldn't find a machine" for something
|
|
658
|
+
that's actually being serialized on purpose.
|
|
659
|
+
|
|
651
660
|
``footer`` controls whether the trailing blank line + "(dry run — ...)"
|
|
652
661
|
line is included. A non-dry-run confirmation (``coord milestone drive``
|
|
653
662
|
without ``--dry-run``) wants the same report *without* that footer, since
|
|
@@ -702,6 +711,10 @@ def format_plan(
|
|
|
702
711
|
lines.append(" Waiting on declared-order dependencies:")
|
|
703
712
|
for b in waiting:
|
|
704
713
|
lines.append(f" #{b.issue_number}: {b.reason}")
|
|
714
|
+
if deferred:
|
|
715
|
+
lines.append(" Deferred (oracle-loop: one entry per tick):")
|
|
716
|
+
for d in deferred:
|
|
717
|
+
lines.append(f" #{d.entry.issue_number}: {d.reason}")
|
|
705
718
|
|
|
706
719
|
if footer:
|
|
707
720
|
lines.append("")
|
|
@@ -111,6 +111,7 @@ __all__ = [
|
|
|
111
111
|
"remove_sub_issues_section",
|
|
112
112
|
"milestone_work_order_membership",
|
|
113
113
|
"validate_milestone_membership",
|
|
114
|
+
"validate_no_shared_oracle_group",
|
|
114
115
|
"FrontierEntry",
|
|
115
116
|
"BlockedNode",
|
|
116
117
|
"Frontier",
|
|
@@ -571,6 +572,66 @@ def validate_milestone_membership(
|
|
|
571
572
|
)
|
|
572
573
|
|
|
573
574
|
|
|
575
|
+
def validate_no_shared_oracle_group(
|
|
576
|
+
work_order: WorkOrder,
|
|
577
|
+
*,
|
|
578
|
+
oracle_loop: bool,
|
|
579
|
+
) -> None:
|
|
580
|
+
"""Refuse two `## Work order` nodes sharing a `{group: ...}` cohort when
|
|
581
|
+
the milestone is under oracle-loop control (#2542).
|
|
582
|
+
|
|
583
|
+
A ``group`` annotation declares its members safe to dispatch — and
|
|
584
|
+
therefore author their JIT acceptance slices (``coord acceptance
|
|
585
|
+
author``, docs/ORACLE_LOOP.md) — CONCURRENTLY. Every slice for one
|
|
586
|
+
milestone additively appends to the SAME file,
|
|
587
|
+
``tests/acceptance/ms-N/manifest.yml`` (``coord.test_author``'s "later
|
|
588
|
+
slices MERGE into this file" convention), so two issues in the same
|
|
589
|
+
group race on that write regardless of whether their actual feature
|
|
590
|
+
work overlaps at all — the coupling is mechanical, not semantic, and
|
|
591
|
+
so invisible to ``coord.overlap_predict`` (#2247), which only reasons
|
|
592
|
+
about declared/real *diffs*. coord-portal#122 hit exactly this: #128
|
|
593
|
+
and #132 shared ``{group: A}`` because they looked feature-independent
|
|
594
|
+
(a schema change vs. a status override) and both authored slices into
|
|
595
|
+
ms-N's manifest at once.
|
|
596
|
+
|
|
597
|
+
``oracle_loop`` is the caller's already-resolved
|
|
598
|
+
``config.acceptance.has_driver(repo_name)`` — this stays a pure
|
|
599
|
+
function, no config/GitHub reach-out of its own. A no-op when
|
|
600
|
+
``oracle_loop`` is False (repos outside the oracle loop keep declaring
|
|
601
|
+
parallel groups exactly as before this check existed) or when no group
|
|
602
|
+
holds more than one node.
|
|
603
|
+
|
|
604
|
+
This is deliberately only the cheap, early check for the EXPLICIT-group
|
|
605
|
+
case — ``coord milestone write-order`` validates it before a word order
|
|
606
|
+
is ever written. It cannot catch two issues that share no declared
|
|
607
|
+
group but still end up concurrently eligible via the drive-queue's
|
|
608
|
+
per-repo concurrency cap (coord-portal#122's SECOND collision, #130 vs.
|
|
609
|
+
#132, filed as this issue's correction) — that hazard is closed
|
|
610
|
+
separately, by serializing the whole milestone's drive-queue ``after=``
|
|
611
|
+
chain (:func:`coord.milestone_dispatch.plan_queue`'s ``oracle_loop=``
|
|
612
|
+
parameter). Neither check alone is sufficient; see #2542.
|
|
613
|
+
"""
|
|
614
|
+
if not oracle_loop:
|
|
615
|
+
return
|
|
616
|
+
by_group: dict[str, list[int]] = {}
|
|
617
|
+
for n in work_order.nodes:
|
|
618
|
+
if n.group:
|
|
619
|
+
by_group.setdefault(n.group, []).append(n.issue_number)
|
|
620
|
+
for group, numbers in by_group.items():
|
|
621
|
+
if len(numbers) > 1:
|
|
622
|
+
joined = ", ".join(f"#{i}" for i in numbers)
|
|
623
|
+
raise WorkOrderError(
|
|
624
|
+
f"work order: {joined} share group {group!r}, but this "
|
|
625
|
+
"milestone is under oracle-loop control (Gate A contract / "
|
|
626
|
+
"JIT test-author slices apply) — every issue's slice "
|
|
627
|
+
"additively appends to the SAME "
|
|
628
|
+
"tests/acceptance/ms-N/manifest.yml, so authoring them "
|
|
629
|
+
"concurrently races on that file regardless of whether the "
|
|
630
|
+
"issues' actual feature work overlaps (#2542). Sequence "
|
|
631
|
+
"them with `after:` instead of sharing a `group`."
|
|
632
|
+
)
|
|
633
|
+
|
|
634
|
+
|
|
574
635
|
# ── Ready frontier ───────────────────────────────────────────────────────────
|
|
575
636
|
|
|
576
637
|
|
|
@@ -1317,6 +1317,14 @@ def _milestone_drain_tick(config: Config) -> list:
|
|
|
1317
1317
|
that filter for free). A per-milestone fetch/dispatch error must not
|
|
1318
1318
|
silence the other registered milestones — caught and logged per entry.
|
|
1319
1319
|
|
|
1320
|
+
Same ``oracle_loop`` capping as ``_milestone_gate_tick`` (#2542): a repo
|
|
1321
|
+
under oracle-loop control gets at most one dispatch per registered
|
|
1322
|
+
milestone per tick, so this legacy path can't fan two same-milestone
|
|
1323
|
+
entries out to distinct machines in one call and race them on the
|
|
1324
|
+
shared ``tests/acceptance/ms-N/manifest.yml`` either — even though only
|
|
1325
|
+
pre-#2335 registrations feed it today (see above), it is the same class
|
|
1326
|
+
of hole as the gate tick's and worth closing the same way.
|
|
1327
|
+
|
|
1320
1328
|
Extracted as a module-level function so tests can call it directly
|
|
1321
1329
|
without wiring up the async ``_tick_loop`` infrastructure (mirrors
|
|
1322
1330
|
``_auto_drain_tick``'s doc comment above).
|
|
@@ -1390,7 +1398,15 @@ def _milestone_drain_tick(config: Config) -> list:
|
|
|
1390
1398
|
)
|
|
1391
1399
|
continue
|
|
1392
1400
|
|
|
1393
|
-
|
|
1401
|
+
# #2542: an oracle-loop repo (Gate A contract exists, JIT test-author
|
|
1402
|
+
# slices apply) may only dispatch one ready-frontier entry per tick —
|
|
1403
|
+
# see plan_dispatch's oracle_loop docstring for why (two concurrently
|
|
1404
|
+
# dispatched entries under one milestone race on the same shared
|
|
1405
|
+
# tests/acceptance/ms-N/manifest.yml).
|
|
1406
|
+
plan = md.plan_dispatch(
|
|
1407
|
+
ctx.work_order, board, config, repo_cfg, ctx.terminal_issues,
|
|
1408
|
+
oracle_loop=config.acceptance.has_driver(repo_name),
|
|
1409
|
+
)
|
|
1394
1410
|
for pick in plan.to_dispatch:
|
|
1395
1411
|
outcome = md.dispatch_entry(
|
|
1396
1412
|
pick, repo_cfg, config, board, tracking_issue=tracking_issue
|
|
@@ -1466,6 +1482,14 @@ def _milestone_gate_tick(config: Config, *, now: float | None = None) -> list:
|
|
|
1466
1482
|
hold-and-report: it logs why it cannot advance and leaves the record
|
|
1467
1483
|
where it is. Nothing here silently falls through.
|
|
1468
1484
|
|
|
1485
|
+
``plan_dispatch`` is called with ``oracle_loop=config.acceptance.
|
|
1486
|
+
has_driver(repo_cfg.name)`` (#2542) — for a repo under oracle-loop
|
|
1487
|
+
control this caps the tick's dispatch at one ready-frontier entry, so
|
|
1488
|
+
this walk (docs/ORACLE_LOOP.md's "oracle drive", #1453 — the documented
|
|
1489
|
+
primary driver for an oracle-loop milestone) can never launch two
|
|
1490
|
+
same-milestone entries into their JIT slice-authoring phase in the same
|
|
1491
|
+
tick, racing on the shared ``tests/acceptance/ms-N/manifest.yml``.
|
|
1492
|
+
|
|
1469
1493
|
Deliberately **not** gated on ``config.milestone.auto_dispatch`` — that
|
|
1470
1494
|
flag gates the legacy standalone drain (:func:`_milestone_drain_tick`),
|
|
1471
1495
|
whereas gate driving is opted into per milestone by an explicit ``coord
|
|
@@ -1557,8 +1581,20 @@ def _milestone_gate_tick(config: Config, *, now: float | None = None) -> list:
|
|
|
1557
1581
|
# and _milestone_drain_tick use, so gate policy and dispatch
|
|
1558
1582
|
# policy can't drift apart.
|
|
1559
1583
|
try:
|
|
1584
|
+
# #2542: cap this tick's dispatch to one entry for an
|
|
1585
|
+
# oracle-loop milestone — see plan_dispatch's oracle_loop
|
|
1586
|
+
# docstring. Without it, `plan_dispatch`'s normal N-ready ->
|
|
1587
|
+
# N-idle-machine fan-out (by design, for non-oracle-loop
|
|
1588
|
+
# milestones) lets two same-milestone entries both start
|
|
1589
|
+
# their JIT slice-authoring phase in this single for-loop,
|
|
1590
|
+
# racing on the same tests/acceptance/ms-N/manifest.yml —
|
|
1591
|
+
# this is the "third, independent place" gap the write-order
|
|
1592
|
+
# validator and plan_queue's chaining alone don't cover: the
|
|
1593
|
+
# gate walk (docs/ORACLE_LOOP.md's "oracle drive", #1453) is
|
|
1594
|
+
# the documented primary driver for an oracle-loop milestone.
|
|
1560
1595
|
plan = md.plan_dispatch(
|
|
1561
|
-
ctx.work_order, board, config, repo_cfg, ctx.terminal_issues
|
|
1596
|
+
ctx.work_order, board, config, repo_cfg, ctx.terminal_issues,
|
|
1597
|
+
oracle_loop=config.acceptance.has_driver(repo_cfg.name),
|
|
1562
1598
|
)
|
|
1563
1599
|
for pick in plan.to_dispatch:
|
|
1564
1600
|
outcome = md.dispatch_entry(
|
|
@@ -491,6 +491,109 @@ class TestMilestoneDispatchGateA:
|
|
|
491
491
|
assert "Gate A" not in result.output
|
|
492
492
|
|
|
493
493
|
|
|
494
|
+
class TestMilestoneDispatchOracleLoopSerializes:
|
|
495
|
+
"""#2542: under oracle-loop control (an acceptance driver configured —
|
|
496
|
+
Gate A already satisfied by the `config_file_with_gate_a` fixture's
|
|
497
|
+
mocked contract), bulk `coord milestone dispatch` must chain the WHOLE
|
|
498
|
+
milestone into the drive-queue one entry at a time — the #130/#132
|
|
499
|
+
coord-portal#122 collision this issue's correction describes had no
|
|
500
|
+
shared `group` at all, so only the drive-queue translation itself (not
|
|
501
|
+
the write-order validator) can close it."""
|
|
502
|
+
|
|
503
|
+
def test_group_cohort_gets_a_serializing_after_edge(
|
|
504
|
+
self, config_file_with_gate_a: Path,
|
|
505
|
+
) -> None:
|
|
506
|
+
"""#762/#763 share {group: A} — plain (non-oracle) dispatch queues
|
|
507
|
+
them with no edge between them (see TestMilestoneDispatchBulk); under
|
|
508
|
+
an acceptance driver, #763 additionally gets `after api#762`."""
|
|
509
|
+
open_issues = [
|
|
510
|
+
{"number": 762, "milestone": {"number": 9}},
|
|
511
|
+
{"number": 763, "milestone": {"number": 9}},
|
|
512
|
+
{"number": 765, "milestone": {"number": 9}},
|
|
513
|
+
]
|
|
514
|
+
with patch("coord.github_ops.get_issue", side_effect=_get_issue), \
|
|
515
|
+
patch("coord.github_ops.get_open_issues", return_value=open_issues), \
|
|
516
|
+
patch("coord.github_ops.get_repo_file", return_value="# Contract\n"), \
|
|
517
|
+
patch("coord.board_service.read_board", return_value=Board()), \
|
|
518
|
+
patch("coord.dispatch.dispatch") as disp:
|
|
519
|
+
result = CliRunner().invoke(
|
|
520
|
+
main,
|
|
521
|
+
["milestone", "dispatch", "api", "100", "--config",
|
|
522
|
+
str(config_file_with_gate_a)],
|
|
523
|
+
)
|
|
524
|
+
assert result.exit_code == 0, result.output
|
|
525
|
+
disp.assert_not_called()
|
|
526
|
+
|
|
527
|
+
rows = state_mod.list_drive_queue()
|
|
528
|
+
by_issue = {r["issue_number"]: r for r in rows}
|
|
529
|
+
assert by_issue[762]["after_json"] == []
|
|
530
|
+
assert by_issue[763]["after_json"] == ["api#762"]
|
|
531
|
+
# #765 was already declared `after: #762,#763` — unaffected by the
|
|
532
|
+
# implicit chain (its immediate predecessor, #763, is already there).
|
|
533
|
+
assert by_issue[765]["after_json"] == ["api#762", "api#763"]
|
|
534
|
+
|
|
535
|
+
def test_ungrouped_independent_issues_still_get_chained(
|
|
536
|
+
self, config_file_with_gate_a: Path,
|
|
537
|
+
) -> None:
|
|
538
|
+
"""The SECOND coord-portal#122 collision (#130 vs. #132): no shared
|
|
539
|
+
group, no declared `after` between them at all — the drive-queue's
|
|
540
|
+
per-repo concurrency cap alone would launch both. Confirms the fix
|
|
541
|
+
isn't scoped to the explicit-group case."""
|
|
542
|
+
body = "## Work order\n- [ ] #762\n- [ ] #763\n"
|
|
543
|
+
open_issues = [
|
|
544
|
+
{"number": 762, "milestone": {"number": 9}},
|
|
545
|
+
{"number": 763, "milestone": {"number": 9}},
|
|
546
|
+
]
|
|
547
|
+
|
|
548
|
+
def get_issue(repo, number):
|
|
549
|
+
return _get_issue(repo, number, bodies={100: body})
|
|
550
|
+
|
|
551
|
+
with patch("coord.github_ops.get_issue", side_effect=get_issue), \
|
|
552
|
+
patch("coord.github_ops.get_open_issues", return_value=open_issues), \
|
|
553
|
+
patch("coord.github_ops.get_repo_file", return_value="# Contract\n"), \
|
|
554
|
+
patch("coord.board_service.read_board", return_value=Board()), \
|
|
555
|
+
patch("coord.dispatch.dispatch") as disp:
|
|
556
|
+
result = CliRunner().invoke(
|
|
557
|
+
main,
|
|
558
|
+
["milestone", "dispatch", "api", "100", "--config",
|
|
559
|
+
str(config_file_with_gate_a)],
|
|
560
|
+
)
|
|
561
|
+
assert result.exit_code == 0, result.output
|
|
562
|
+
disp.assert_not_called()
|
|
563
|
+
|
|
564
|
+
rows = state_mod.list_drive_queue()
|
|
565
|
+
by_issue = {r["issue_number"]: r for r in rows}
|
|
566
|
+
assert by_issue[762]["after_json"] == []
|
|
567
|
+
assert by_issue[763]["after_json"] == ["api#762"]
|
|
568
|
+
|
|
569
|
+
def test_repo_without_acceptance_driver_is_not_chained(
|
|
570
|
+
self, config_file: Path,
|
|
571
|
+
) -> None:
|
|
572
|
+
"""No acceptance driver configured -> not under oracle-loop control
|
|
573
|
+
-> the group cohort dispatches exactly as before #2542 (no implicit
|
|
574
|
+
edge)."""
|
|
575
|
+
open_issues = [
|
|
576
|
+
{"number": 762, "milestone": {"number": 9}},
|
|
577
|
+
{"number": 763, "milestone": {"number": 9}},
|
|
578
|
+
{"number": 765, "milestone": {"number": 9}},
|
|
579
|
+
]
|
|
580
|
+
with patch("coord.github_ops.get_issue", side_effect=_get_issue), \
|
|
581
|
+
patch("coord.github_ops.get_open_issues", return_value=open_issues), \
|
|
582
|
+
patch("coord.board_service.read_board", return_value=Board()), \
|
|
583
|
+
patch("coord.dispatch.dispatch") as disp:
|
|
584
|
+
result = CliRunner().invoke(
|
|
585
|
+
main,
|
|
586
|
+
["milestone", "dispatch", "api", "100", "--config", str(config_file)],
|
|
587
|
+
)
|
|
588
|
+
assert result.exit_code == 0, result.output
|
|
589
|
+
disp.assert_not_called()
|
|
590
|
+
|
|
591
|
+
rows = state_mod.list_drive_queue()
|
|
592
|
+
by_issue = {r["issue_number"]: r for r in rows}
|
|
593
|
+
assert by_issue[762]["after_json"] == []
|
|
594
|
+
assert by_issue[763]["after_json"] == []
|
|
595
|
+
|
|
596
|
+
|
|
494
597
|
class TestMilestoneDispatchGateControlled:
|
|
495
598
|
"""#1930 (epic #1440 S-2): a milestone under gate control (``coord
|
|
496
599
|
milestone drive``) is drained exclusively by the daemon's gate tick.
|