code-coordinator 0.5.202__tar.gz → 0.5.204__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.202 → code_coordinator-0.5.204}/PKG-INFO +1 -1
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/SOURCES.txt +1 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/scm_file_list.json +1 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/portal.py +90 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/merge_queue.py +127 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/mock_author.py +102 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/portal_bridge.py +52 -6
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/portal_store.py +132 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/portal_sync.py +10 -5
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/state.py +98 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_portal.py +52 -1
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_merge_queue.py +200 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_mock_author.py +88 -1
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_portal_bridge.py +38 -0
- code_coordinator-0.5.204/tests/test_portal_store.py +176 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/.gitignore +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/CLAUDE.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/GOAL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/LICENSE +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/MANIFEST.in +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/README.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/__init__.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agent.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/audit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/block_log.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/board_service.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/brain.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/claim.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/cli.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/client.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/comments.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/config.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dao.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/db.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/deps.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/drive.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/events.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/filelock.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/freshness.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/gates.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/goal.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/context.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/models.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/render.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/health/units.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/hooks.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/interactive.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/models.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/network.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/notify.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/openapi.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/parentage.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/plans.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/progress.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/release_window.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/reports.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/review.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/self_health.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/smoke.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/split_work.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/test_author.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/test_report.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/usage.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/install-agent.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/pyproject.toml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/setup.cfg +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/__init__.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/conftest.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_db.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_events.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_init.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_models.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_network.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_session.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_split.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_state.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.202 → code_coordinator-0.5.204}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -31,6 +31,8 @@ follow-up); this is the "fail loud instead of running wrong" half.
|
|
|
31
31
|
|
|
32
32
|
from __future__ import annotations
|
|
33
33
|
|
|
34
|
+
import datetime
|
|
35
|
+
import getpass
|
|
34
36
|
import json
|
|
35
37
|
|
|
36
38
|
import click
|
|
@@ -44,6 +46,13 @@ from coord.portal_bridge import (
|
|
|
44
46
|
)
|
|
45
47
|
|
|
46
48
|
|
|
49
|
+
def _actor() -> str:
|
|
50
|
+
try:
|
|
51
|
+
return getpass.getuser()
|
|
52
|
+
except Exception: # noqa: BLE001 — no passwd entry in some containers
|
|
53
|
+
return "unknown"
|
|
54
|
+
|
|
55
|
+
|
|
47
56
|
def _refuse_if_thin_client(cmd_name: str) -> None:
|
|
48
57
|
"""Refuse *cmd_name* when this machine isn't the daemon host (#2336).
|
|
49
58
|
|
|
@@ -194,6 +203,87 @@ def portal_push(config_path, submission_id: str, revision: int, status: str) ->
|
|
|
194
203
|
raise SystemExit(1)
|
|
195
204
|
|
|
196
205
|
|
|
206
|
+
# ── #2507: milestone ↔ portal submission linkage ────────────────────────────
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
@portal_group.command("link")
|
|
210
|
+
@_CONFIG_OPTION
|
|
211
|
+
@click.argument("repo")
|
|
212
|
+
@click.argument("milestone_number", type=int)
|
|
213
|
+
@click.argument("submission_id", required=False)
|
|
214
|
+
def portal_link(
|
|
215
|
+
config_path, repo: str, milestone_number: int, submission_id: str | None
|
|
216
|
+
) -> None:
|
|
217
|
+
"""Record, or read, one milestone's portal submission_id link (#2507).
|
|
218
|
+
|
|
219
|
+
With SUBMISSION_ID: link REPO's milestone MILESTONE_NUMBER to it.
|
|
220
|
+
Operator-run — submission creation is driven by the portal's own intake
|
|
221
|
+
flow, not by coord, so there is currently no automatic way for coord to
|
|
222
|
+
learn a submission exists at all.
|
|
223
|
+
|
|
224
|
+
Without SUBMISSION_ID: report the current link, mirroring `coord gate-a`'s
|
|
225
|
+
read/write dual-mode shape.
|
|
226
|
+
|
|
227
|
+
Nothing downstream resolves this automatically yet — PDR-3's auto-push
|
|
228
|
+
and PDR-4's verdict consumer (the epic's later legs, #2506) are what will
|
|
229
|
+
read it once they exist.
|
|
230
|
+
"""
|
|
231
|
+
_refuse_if_thin_client("link")
|
|
232
|
+
|
|
233
|
+
from coord import portal_store # noqa: PLC0415
|
|
234
|
+
from coord.audit import record_audit # noqa: PLC0415
|
|
235
|
+
|
|
236
|
+
cfg = _load_config(config_path)
|
|
237
|
+
repo_cfg = cfg.repo(repo)
|
|
238
|
+
if repo_cfg is None:
|
|
239
|
+
click.secho(f"error: unknown repo {repo!r}", fg="red")
|
|
240
|
+
raise SystemExit(2)
|
|
241
|
+
|
|
242
|
+
if submission_id is None:
|
|
243
|
+
link = portal_store.get_milestone_link(
|
|
244
|
+
repo_name=repo_cfg.name, milestone_number=milestone_number
|
|
245
|
+
)
|
|
246
|
+
if link is None:
|
|
247
|
+
click.echo(f"{repo_cfg.name} ms-{milestone_number}: not linked")
|
|
248
|
+
raise SystemExit(1)
|
|
249
|
+
when = datetime.datetime.fromtimestamp(
|
|
250
|
+
link.linked_at, tz=datetime.timezone.utc
|
|
251
|
+
).strftime("%Y-%m-%d %H:%M UTC")
|
|
252
|
+
click.echo(
|
|
253
|
+
f"{repo_cfg.name} ms-{milestone_number}: "
|
|
254
|
+
f"submission_id={link.submission_id} "
|
|
255
|
+
f"(linked by {link.actor or 'unknown'} at {when})"
|
|
256
|
+
)
|
|
257
|
+
return
|
|
258
|
+
|
|
259
|
+
link = portal_store.link_milestone(
|
|
260
|
+
repo_name=repo_cfg.name,
|
|
261
|
+
milestone_number=milestone_number,
|
|
262
|
+
submission_id=submission_id,
|
|
263
|
+
actor=_actor(),
|
|
264
|
+
)
|
|
265
|
+
record_audit(
|
|
266
|
+
tier="business",
|
|
267
|
+
category="portal",
|
|
268
|
+
event_type="portal_link",
|
|
269
|
+
actor=link.actor,
|
|
270
|
+
summary=(
|
|
271
|
+
f"linked {repo_cfg.name} ms-{milestone_number} to portal "
|
|
272
|
+
f"submission {submission_id}"
|
|
273
|
+
),
|
|
274
|
+
repo=repo_cfg.name,
|
|
275
|
+
details={
|
|
276
|
+
"milestone_number": milestone_number,
|
|
277
|
+
"submission_id": submission_id,
|
|
278
|
+
},
|
|
279
|
+
)
|
|
280
|
+
click.secho(
|
|
281
|
+
f"linked: {repo_cfg.name} ms-{milestone_number} -> "
|
|
282
|
+
f"submission_id={submission_id}",
|
|
283
|
+
fg="green",
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
|
|
197
287
|
# ── #1982: the sync loop's operator surface ─────────────────────────────────
|
|
198
288
|
|
|
199
289
|
|
|
@@ -4981,6 +4981,119 @@ def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> Merge
|
|
|
4981
4981
|
return MergeEvent(entry, event_type, msg)
|
|
4982
4982
|
|
|
4983
4983
|
|
|
4984
|
+
def _maybe_push_design_round(
|
|
4985
|
+
entry: QueuedMerge, config, gh_ops: GhOps
|
|
4986
|
+
) -> "MergeEvent | None":
|
|
4987
|
+
"""PDR-3 (#2508): right after a `type="mock-author"` (Gate A) PR has
|
|
4988
|
+
actually merged into ``entry.target_branch``, push its rendered mock
|
|
4989
|
+
bundle + contract to the portal as a design round — the epic-#2506
|
|
4990
|
+
bridge's third leg, wiring PDR-1's link (``coord portal link``,
|
|
4991
|
+
#2507) and PDR-2's upload route (coord-portal#120) into the one signal
|
|
4992
|
+
``coord/merge_queue.py`` already fires for any assignment type: a real
|
|
4993
|
+
merge.
|
|
4994
|
+
|
|
4995
|
+
Returns ``None`` for every "nothing to do" reason — not a `mock-author`
|
|
4996
|
+
entry, no ``portal:`` block configured, the tracking issue isn't under
|
|
4997
|
+
a milestone, or (the common case pre-#2508) the milestone has no portal
|
|
4998
|
+
link on file. That last one is the fail-open posture
|
|
4999
|
+
``coord.portal_bridge``'s module docstring already states for the rest
|
|
5000
|
+
of this bridge: "a portal outage must never block a merge or a
|
|
5001
|
+
dispatch" applies just as much to "there's simply no portal submission
|
|
5002
|
+
for this milestone yet" — until an operator runs ``coord portal link``,
|
|
5003
|
+
this is silently, correctly, a no-op. Every other failure (can't fetch
|
|
5004
|
+
the tracking issue, can't collect the bundle, upload/enqueue rejected)
|
|
5005
|
+
degrades to a ``design_round_push_failed`` event rather than raising —
|
|
5006
|
+
called from ``process()`` inside its own try/except, same discipline as
|
|
5007
|
+
:func:`_maybe_clear_expected_red` right above it, but belt-and-braces
|
|
5008
|
+
here too since this reaches out to two different externals (GitHub's
|
|
5009
|
+
Contents API and the portal itself).
|
|
5010
|
+
"""
|
|
5011
|
+
if entry.assignment_type != "mock-author":
|
|
5012
|
+
return None
|
|
5013
|
+
portal_cfg = getattr(config, "portal", None)
|
|
5014
|
+
if portal_cfg is None or not portal_cfg.enabled:
|
|
5015
|
+
return None
|
|
5016
|
+
|
|
5017
|
+
# #1467-style optional probe: `get_issue` isn't part of the GhOps
|
|
5018
|
+
# Protocol proper (most stubs in tests never need it), so a stub that
|
|
5019
|
+
# doesn't implement it degrades to "nothing to do" rather than an
|
|
5020
|
+
# AttributeError — mirrors `branch_has_merge_commit`'s optional-probe
|
|
5021
|
+
# pattern used for the rebase→squash fallback above.
|
|
5022
|
+
get_issue = getattr(gh_ops, "get_issue", None)
|
|
5023
|
+
if get_issue is None:
|
|
5024
|
+
return None
|
|
5025
|
+
try:
|
|
5026
|
+
issue_data = get_issue(entry.repo_github, entry.issue_number)
|
|
5027
|
+
except Exception as e: # noqa: BLE001 — best-effort, see docstring
|
|
5028
|
+
return MergeEvent(
|
|
5029
|
+
entry, "design_round_push_failed",
|
|
5030
|
+
f"could not fetch tracking issue #{entry.issue_number}: {e}",
|
|
5031
|
+
)
|
|
5032
|
+
milestone = (issue_data or {}).get("milestone") or {}
|
|
5033
|
+
milestone_number = milestone.get("number")
|
|
5034
|
+
if milestone_number is None:
|
|
5035
|
+
# A "mock-author" entry not scoped to a milestone at all (shouldn't
|
|
5036
|
+
# happen via `coord acceptance mock`, which always resolves one —
|
|
5037
|
+
# but this hook must survive a hand-dispatched entry that skips it).
|
|
5038
|
+
return None
|
|
5039
|
+
|
|
5040
|
+
from coord import portal_store # noqa: PLC0415
|
|
5041
|
+
|
|
5042
|
+
link = portal_store.get_milestone_link(
|
|
5043
|
+
repo_name=entry.repo_name, milestone_number=milestone_number
|
|
5044
|
+
)
|
|
5045
|
+
if link is None:
|
|
5046
|
+
# PDR-1: no `coord portal link` recorded for this milestone yet —
|
|
5047
|
+
# the whole point of the fail-open posture (see docstring above).
|
|
5048
|
+
return None
|
|
5049
|
+
|
|
5050
|
+
from coord.mock_author import build_design_round, collect_mock_bundle_files # noqa: PLC0415
|
|
5051
|
+
from coord.portal_bridge import PortalBridgeError, client_from_config # noqa: PLC0415
|
|
5052
|
+
from coord.portal_sync import PortalSyncError, enqueue_design_round # noqa: PLC0415
|
|
5053
|
+
|
|
5054
|
+
client = client_from_config(portal_cfg)
|
|
5055
|
+
if client is None:
|
|
5056
|
+
return None
|
|
5057
|
+
|
|
5058
|
+
try:
|
|
5059
|
+
files = collect_mock_bundle_files(
|
|
5060
|
+
entry.repo_github, milestone_number, entry.target_branch
|
|
5061
|
+
)
|
|
5062
|
+
except Exception as e: # noqa: BLE001 — best-effort, see docstring
|
|
5063
|
+
return MergeEvent(
|
|
5064
|
+
entry, "design_round_push_failed",
|
|
5065
|
+
f"could not collect mock bundle: {e}",
|
|
5066
|
+
)
|
|
5067
|
+
if not files:
|
|
5068
|
+
return MergeEvent(
|
|
5069
|
+
entry, "design_round_push_skipped",
|
|
5070
|
+
f"no rendered mock bundle found on {entry.target_branch} for "
|
|
5071
|
+
f"ms-{milestone_number} — nothing to push",
|
|
5072
|
+
)
|
|
5073
|
+
|
|
5074
|
+
try:
|
|
5075
|
+
bundle_key = client.upload_bundle(link.submission_id, files)
|
|
5076
|
+
except PortalBridgeError as e:
|
|
5077
|
+
return MergeEvent(entry, "design_round_push_failed", f"bundle upload failed: {e}")
|
|
5078
|
+
|
|
5079
|
+
design_round = build_design_round(
|
|
5080
|
+
milestone_title=milestone.get("title") or f"ms-{milestone_number}",
|
|
5081
|
+
tracking_issue_title=issue_data.get("title") or "",
|
|
5082
|
+
tracking_issue_body=issue_data.get("body") or "",
|
|
5083
|
+
bundle_key=bundle_key,
|
|
5084
|
+
)
|
|
5085
|
+
try:
|
|
5086
|
+
row = enqueue_design_round(link.submission_id, design_round)
|
|
5087
|
+
except PortalSyncError as e:
|
|
5088
|
+
return MergeEvent(entry, "design_round_push_failed", f"enqueue failed: {e}")
|
|
5089
|
+
|
|
5090
|
+
return MergeEvent(
|
|
5091
|
+
entry, "design_round_queued",
|
|
5092
|
+
f"queued design round for portal submission {link.submission_id} "
|
|
5093
|
+
f"(seq={row.seq}, bundle_key={bundle_key})",
|
|
5094
|
+
)
|
|
5095
|
+
|
|
5096
|
+
|
|
4984
5097
|
def process(
|
|
4985
5098
|
items: list[QueuedMerge],
|
|
4986
5099
|
gh_ops: GhOps,
|
|
@@ -6205,6 +6318,20 @@ def process(
|
|
|
6205
6318
|
clear_event = MergeEvent(entry, "expected_red_clear_failed", str(e))
|
|
6206
6319
|
if clear_event is not None:
|
|
6207
6320
|
events.append(clear_event)
|
|
6321
|
+
# PDR-3 (#2508): a merged Gate-A (`type="mock-author"`)
|
|
6322
|
+
# branch auto-pushes a design round to the portal, if (and
|
|
6323
|
+
# only if) its milestone has a portal link on file. Best
|
|
6324
|
+
# effort, same as the expected_red clear above — a portal
|
|
6325
|
+
# outage, or simply no `coord portal link` recorded, must
|
|
6326
|
+
# never undo a real merge.
|
|
6327
|
+
try:
|
|
6328
|
+
design_round_event = _maybe_push_design_round(entry, config, gh_ops)
|
|
6329
|
+
except Exception as e: # noqa: BLE001 — bookkeeping, never undoes a real merge
|
|
6330
|
+
design_round_event = MergeEvent(
|
|
6331
|
+
entry, "design_round_push_failed", str(e)
|
|
6332
|
+
)
|
|
6333
|
+
if design_round_event is not None:
|
|
6334
|
+
events.append(design_round_event)
|
|
6208
6335
|
continue
|
|
6209
6336
|
entry.state = CONFLICT
|
|
6210
6337
|
entry.error = msg
|
|
@@ -25,10 +25,18 @@ TYPES``) and the matching exemption from the acceptance-dir auto-forbid in
|
|
|
25
25
|
Work → Test → Review → Merge pipeline as any other branch (`required_gates`
|
|
26
26
|
is the repo's normal `default_gates`) — Gate A produces a normal reviewed
|
|
27
27
|
commit, not a special-cased one.
|
|
28
|
+
|
|
29
|
+
**PDR-3 (#2508):** :func:`collect_mock_bundle_files` and
|
|
30
|
+
:func:`build_design_round` are the other end of Gate A's output — read back
|
|
31
|
+
off a merged mock-author branch and reshaped into a portal design round by
|
|
32
|
+
``coord.merge_queue``'s post-merge hook, so a Gate-A merge auto-pushes a
|
|
33
|
+
design round to any milestone with a portal link (`coord portal link`,
|
|
34
|
+
PDR-1/#2507) instead of that link sitting unread.
|
|
28
35
|
"""
|
|
29
36
|
from __future__ import annotations
|
|
30
37
|
|
|
31
38
|
import uuid
|
|
39
|
+
from typing import Any
|
|
32
40
|
|
|
33
41
|
import httpx
|
|
34
42
|
|
|
@@ -332,3 +340,97 @@ def dispatch_acceptance_mock(
|
|
|
332
340
|
pass
|
|
333
341
|
|
|
334
342
|
return assignment_id, machine.name
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
# ── PDR-3 (#2508): reading a merged Gate-A branch back into a design round ──
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def collect_mock_bundle_files(
|
|
349
|
+
repo_github: str, milestone_number: int, branch: str
|
|
350
|
+
) -> dict[str, str]:
|
|
351
|
+
"""Read a rendered Gate-A bundle off *branch* (post-merge) via the
|
|
352
|
+
GitHub Contents API — no local checkout, the same "gh-only wire layer"
|
|
353
|
+
posture the merge queue's other post-merge reads already use (see e.g.
|
|
354
|
+
``coord.acceptance.clear_expected_red_via_pr``'s docstring).
|
|
355
|
+
|
|
356
|
+
Returns a ``{relative_path: content}`` mapping — ``"contract.md"`` plus
|
|
357
|
+
every ``mocks/*.html`` fixture under
|
|
358
|
+
``tests/acceptance/ms-<milestone_number>/`` — ready to hand straight to
|
|
359
|
+
:meth:`coord.portal_bridge.PortalBridgeClient.upload_bundle`. Empty
|
|
360
|
+
when the directory doesn't exist on *branch* (Gate A hasn't merged
|
|
361
|
+
anything there yet, or the repo's acceptance driver renders to a
|
|
362
|
+
different mock glob than ``*.html``) — callers treat that as "nothing
|
|
363
|
+
to push", not an error.
|
|
364
|
+
"""
|
|
365
|
+
ms_dir = f"tests/acceptance/{ms_dirname(milestone_number)}"
|
|
366
|
+
files: dict[str, str] = {}
|
|
367
|
+
if github_ops.repo_file_exists(repo_github, f"{ms_dir}/contract.md", branch):
|
|
368
|
+
files["contract.md"] = github_ops.get_repo_file(
|
|
369
|
+
repo_github, f"{ms_dir}/contract.md", branch
|
|
370
|
+
)
|
|
371
|
+
try:
|
|
372
|
+
mock_names = github_ops.list_repo_dir(repo_github, f"{ms_dir}/mocks", branch)
|
|
373
|
+
except RuntimeError:
|
|
374
|
+
# No `mocks/` dir on this branch at all — same "nothing to push"
|
|
375
|
+
# case list_repo_dir already returns [] for a missing path; the
|
|
376
|
+
# explicit catch is only for a `gh` error shaped differently.
|
|
377
|
+
mock_names = []
|
|
378
|
+
for name in mock_names:
|
|
379
|
+
if name.endswith(".html"):
|
|
380
|
+
files[f"mocks/{name}"] = github_ops.get_repo_file(
|
|
381
|
+
repo_github, f"{ms_dir}/mocks/{name}", branch
|
|
382
|
+
)
|
|
383
|
+
return files
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def build_design_round(
|
|
387
|
+
*,
|
|
388
|
+
milestone_title: str,
|
|
389
|
+
tracking_issue_title: str,
|
|
390
|
+
tracking_issue_body: str,
|
|
391
|
+
bundle_key: str,
|
|
392
|
+
round_number: int = 1,
|
|
393
|
+
) -> dict[str, Any]:
|
|
394
|
+
"""Build the D1 metadata half of a design round from the same inputs
|
|
395
|
+
`coord milestone chat`'s steward already reads: the tracking issue's
|
|
396
|
+
title/body (source of the plain-language ``outcome_definition``) and its
|
|
397
|
+
``## Work order`` block (source of the ``decomposition``).
|
|
398
|
+
|
|
399
|
+
*bundle_key* is the R2 object key
|
|
400
|
+
:meth:`coord.portal_bridge.PortalBridgeClient.upload_bundle` returned
|
|
401
|
+
for this round's rendered mock bundle + contract — see that method's
|
|
402
|
+
docstring and :func:`coord.portal_sync.enqueue_design_round`'s for why
|
|
403
|
+
the bundle itself is never inlined into this payload.
|
|
404
|
+
|
|
405
|
+
A missing/malformed ``## Work order`` block degrades to an empty
|
|
406
|
+
``decomposition`` rather than raising — a milestone that hasn't written
|
|
407
|
+
one yet (or has a stale one that fails validation) should still get a
|
|
408
|
+
design round pushed with whatever plain-language description its
|
|
409
|
+
tracking issue carries; the portal shows a design round with no listed
|
|
410
|
+
decomposition just fine.
|
|
411
|
+
"""
|
|
412
|
+
from coord.milestone_order import WorkOrderError, parse_work_order # noqa: PLC0415
|
|
413
|
+
|
|
414
|
+
try:
|
|
415
|
+
work_order = parse_work_order(tracking_issue_body)
|
|
416
|
+
except WorkOrderError:
|
|
417
|
+
work_order = None
|
|
418
|
+
decomposition = [
|
|
419
|
+
{
|
|
420
|
+
"issue_number": node.issue_number,
|
|
421
|
+
"group": node.group,
|
|
422
|
+
"after": list(node.after),
|
|
423
|
+
}
|
|
424
|
+
for node in (work_order.nodes if work_order is not None else ())
|
|
425
|
+
]
|
|
426
|
+
outcome_definition = (
|
|
427
|
+
tracking_issue_body.strip()
|
|
428
|
+
or tracking_issue_title.strip()
|
|
429
|
+
or milestone_title
|
|
430
|
+
)
|
|
431
|
+
return {
|
|
432
|
+
"round": round_number,
|
|
433
|
+
"outcome_definition": outcome_definition,
|
|
434
|
+
"decomposition": decomposition,
|
|
435
|
+
"bundle_key": bundle_key,
|
|
436
|
+
}
|
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
**The gap this closes.** coord-portal has offered ``POST /api/bridge/push``
|
|
4
4
|
since ms-1, and the entire ms-3 mail pipeline (``docs/CUSTOMER_PORTAL.md``) is
|
|
5
5
|
live and waiting downstream of a queued outbox row — but nothing on this side
|
|
6
|
-
has ever called it. This module is that client: a thin wrapper over
|
|
7
|
-
bridge routes (``push``, ``pull``, ``heartbeat
|
|
8
|
-
|
|
6
|
+
has ever called it. This module is that client: a thin wrapper over
|
|
7
|
+
coord-portal's bridge routes (``push``, ``pull``, ``heartbeat``, and — as of
|
|
8
|
+
PDR-3/#2508 — ``upload``), matching the wire contract coord-portal's
|
|
9
|
+
``src/bridge/*`` and ``src/routes/bridge.ts`` define. ``upload`` is the one
|
|
10
|
+
route that carries a bundle's raw content rather than D1 metadata — see
|
|
11
|
+
:meth:`PortalBridgeClient.upload_bundle`.
|
|
9
12
|
|
|
10
13
|
**What this module deliberately does NOT do**, per #2179's own framing —
|
|
11
14
|
those are separate, harder design questions and belong to follow-up issues:
|
|
@@ -13,9 +16,13 @@ those are separate, harder design questions and belong to follow-up issues:
|
|
|
13
16
|
* It does not decide **when** to push. Nothing here reads coord's board or
|
|
14
17
|
watches assignment status transitions. Callers hand it
|
|
15
18
|
``(submission_id, revision, status)`` and it sends that; where those three
|
|
16
|
-
values come from
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
values come from is out of scope here. The submission↔work association is
|
|
20
|
+
now resolvable — :func:`coord.portal_store.get_milestone_link` reads the
|
|
21
|
+
durable ``(repo, milestone_number) -> submission_id`` mapping an operator
|
|
22
|
+
records with ``coord portal link`` (#2507) — but nothing in this module
|
|
23
|
+
calls it: this client still just sends whatever ``submission_id`` a caller
|
|
24
|
+
hands it. The mapping from coord's internal states to the portal's pinned
|
|
25
|
+
customer vocabulary is a separate, still-unaddressed question.
|
|
19
26
|
* It does not persist a revision counter. The portal is idempotent by
|
|
20
27
|
``(submission_id, revision)`` and ignores anything at or below its stored
|
|
21
28
|
watermark (see ``applyUpdate`` in coord-portal's ``src/bridge/updates.ts``),
|
|
@@ -315,6 +322,45 @@ class PortalBridgeClient:
|
|
|
315
322
|
except ValueError as exc:
|
|
316
323
|
raise PortalBridgeError(f"GET /api/bridge/pull: non-JSON response: {exc}") from exc
|
|
317
324
|
|
|
325
|
+
def upload_bundle(self, submission_id: str, files: dict[str, str]) -> str:
|
|
326
|
+
"""``POST /api/bridge/upload`` — store a design round's rendered
|
|
327
|
+
mock bundle + contract in the portal's R2 (coord-portal#120, PDR-2).
|
|
328
|
+
|
|
329
|
+
Deliberately a fourth route, not folded into :meth:`push`: the
|
|
330
|
+
three ``/api/bridge/*`` routes this module otherwise speaks
|
|
331
|
+
(``push``/``pull``/``heartbeat``) carry only D1 metadata —
|
|
332
|
+
:func:`coord.portal_sync.enqueue_design_round`'s own docstring
|
|
333
|
+
already says the mock bundle itself "is not uploaded here". This is
|
|
334
|
+
that upload, kept separate so a bundle (arbitrarily large HTML) is
|
|
335
|
+
never accidentally routed through :data:`MAX_PUSH_UPDATES`-bounded
|
|
336
|
+
``push`` batching.
|
|
337
|
+
|
|
338
|
+
*files* maps a path relative to the bundle root — e.g.
|
|
339
|
+
``"contract.md"``, ``"mocks/index.html"`` — to its text content; see
|
|
340
|
+
:func:`coord.mock_author.collect_mock_bundle_files`, which builds
|
|
341
|
+
exactly this mapping by reading a merged Gate-A branch back off
|
|
342
|
+
GitHub. Returns the R2 object key the portal assigns the bundle —
|
|
343
|
+
callers thread that straight into the ``design_round`` payload
|
|
344
|
+
:func:`coord.portal_sync.enqueue_design_round` queues, so the
|
|
345
|
+
customer's browser has something to fetch. Raises
|
|
346
|
+
:class:`PortalBridgeError` the same way every other method here
|
|
347
|
+
does: a transport failure, a 401, a 4xx/5xx, or a response with no
|
|
348
|
+
usable ``bundle_key``.
|
|
349
|
+
"""
|
|
350
|
+
if not files:
|
|
351
|
+
raise PortalBridgeError("upload_bundle() got an empty files mapping")
|
|
352
|
+
data = self._post(
|
|
353
|
+
"/api/bridge/upload",
|
|
354
|
+
{"submission_id": submission_id, "files": files},
|
|
355
|
+
)
|
|
356
|
+
bundle_key = data.get("bundle_key")
|
|
357
|
+
if not isinstance(bundle_key, str) or not bundle_key:
|
|
358
|
+
raise PortalBridgeError(
|
|
359
|
+
f"POST /api/bridge/upload: response had no 'bundle_key' "
|
|
360
|
+
f"string: {data!r}"
|
|
361
|
+
)
|
|
362
|
+
return bundle_key
|
|
363
|
+
|
|
318
364
|
|
|
319
365
|
def _utcnow_iso() -> str:
|
|
320
366
|
return (
|
|
@@ -762,3 +762,135 @@ def note_error(error: str) -> None:
|
|
|
762
762
|
|
|
763
763
|
def clear_error() -> None:
|
|
764
764
|
_update_sync_state(last_error="")
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
# ── #2507: milestone ↔ portal submission linkage ────────────────────────────
|
|
768
|
+
#
|
|
769
|
+
# Every table above is part of the sync bridge's own SQLite schema
|
|
770
|
+
# (``coord.db``'s ``_ensure_schema``) and, per the module docstring, is
|
|
771
|
+
# deliberately daemon-host-only. The link between a coord milestone and a
|
|
772
|
+
# portal ``submission_id`` is a DIFFERENT kind of fact — nothing here creates
|
|
773
|
+
# or drives it (the portal's own intake flow does, out of coord's sight) —
|
|
774
|
+
# but it still needs the same durability and the same "read anywhere, write
|
|
775
|
+
# on the daemon host" story, so it is persisted through
|
|
776
|
+
# :mod:`coord.state`'s ``portal_links`` board_meta seam (same shape as
|
|
777
|
+
# ``coord.gate_a``'s ``GateAApproval`` / ``gate_a_approvals``) rather than a
|
|
778
|
+
# fifth table here. This is the domain half — :mod:`coord.state` only knows
|
|
779
|
+
# plain dicts, this is where the dict shape is pinned down and given a
|
|
780
|
+
# tolerant decoder.
|
|
781
|
+
#
|
|
782
|
+
# Consumers: PDR-3's auto-push (resolve a milestone's outbox destination) and
|
|
783
|
+
# PDR-4's verdict consumer (resolve an inbound portal event back to a
|
|
784
|
+
# milestone) both need exactly this lookup and have nowhere else to get it
|
|
785
|
+
# (#2507 — confirmed by grep, ``submission_id`` appeared in neither
|
|
786
|
+
# ``coord/config.py``, ``coord/milestone*.py``, nor ``coord/gate_a.py``
|
|
787
|
+
# before this).
|
|
788
|
+
|
|
789
|
+
_LINK_SCHEMA = 1
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
@dataclass(frozen=True)
|
|
793
|
+
class PortalLink:
|
|
794
|
+
"""One durable ``(repo_name, milestone_number)`` → portal ``submission_id``
|
|
795
|
+
mapping, set by an operator with ``coord portal link`` once a submission
|
|
796
|
+
exists on the portal side.
|
|
797
|
+
"""
|
|
798
|
+
|
|
799
|
+
repo_name: str
|
|
800
|
+
milestone_number: int
|
|
801
|
+
submission_id: str
|
|
802
|
+
linked_at: float = 0.0
|
|
803
|
+
actor: str = ""
|
|
804
|
+
schema: int = _LINK_SCHEMA
|
|
805
|
+
|
|
806
|
+
def to_dict(self) -> dict[str, Any]:
|
|
807
|
+
return {
|
|
808
|
+
"repo_name": self.repo_name,
|
|
809
|
+
"milestone_number": self.milestone_number,
|
|
810
|
+
"submission_id": self.submission_id,
|
|
811
|
+
"linked_at": self.linked_at,
|
|
812
|
+
"actor": self.actor,
|
|
813
|
+
"schema": self.schema,
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
@classmethod
|
|
817
|
+
def from_dict(cls, raw: Any) -> "PortalLink | None":
|
|
818
|
+
"""Tolerant decode — ``None`` for anything this build can't read.
|
|
819
|
+
|
|
820
|
+
Same posture as :meth:`coord.gate_a.GateAApproval.from_dict`: a
|
|
821
|
+
record written by a newer schema, or a corrupt one, degrades to "no
|
|
822
|
+
link recorded" rather than crashing a caller that resolves one
|
|
823
|
+
milestone at a time.
|
|
824
|
+
"""
|
|
825
|
+
if not isinstance(raw, dict):
|
|
826
|
+
return None
|
|
827
|
+
if int(raw.get("schema", _LINK_SCHEMA) or _LINK_SCHEMA) != _LINK_SCHEMA:
|
|
828
|
+
return None
|
|
829
|
+
repo_name = raw.get("repo_name")
|
|
830
|
+
if not isinstance(repo_name, str) or not repo_name:
|
|
831
|
+
return None
|
|
832
|
+
milestone_number = _as_int_or_none(raw.get("milestone_number"))
|
|
833
|
+
if milestone_number is None:
|
|
834
|
+
return None
|
|
835
|
+
submission_id = raw.get("submission_id")
|
|
836
|
+
if not isinstance(submission_id, str) or not submission_id:
|
|
837
|
+
return None
|
|
838
|
+
return cls(
|
|
839
|
+
repo_name=repo_name,
|
|
840
|
+
milestone_number=milestone_number,
|
|
841
|
+
submission_id=submission_id,
|
|
842
|
+
linked_at=float(raw.get("linked_at") or 0.0),
|
|
843
|
+
actor=str(raw.get("actor") or ""),
|
|
844
|
+
)
|
|
845
|
+
|
|
846
|
+
|
|
847
|
+
def _as_int_or_none(value: Any) -> int | None:
|
|
848
|
+
try:
|
|
849
|
+
return int(value)
|
|
850
|
+
except (TypeError, ValueError):
|
|
851
|
+
return None
|
|
852
|
+
|
|
853
|
+
|
|
854
|
+
def link_milestone(
|
|
855
|
+
*,
|
|
856
|
+
repo_name: str,
|
|
857
|
+
milestone_number: int,
|
|
858
|
+
submission_id: str,
|
|
859
|
+
actor: str = "",
|
|
860
|
+
now: float | None = None,
|
|
861
|
+
) -> PortalLink:
|
|
862
|
+
"""Record (or overwrite) the portal submission_id for one milestone.
|
|
863
|
+
|
|
864
|
+
Overwrite, not append: there is exactly one live submission_id per
|
|
865
|
+
milestone, matching :func:`coord.state.save_gate_a_approval`'s semantics
|
|
866
|
+
for the same reason. Relinking is expected — an operator fixing a typo'd
|
|
867
|
+
submission_id, or correcting an id entered against the wrong milestone —
|
|
868
|
+
not an error case.
|
|
869
|
+
"""
|
|
870
|
+
from coord import state # noqa: PLC0415
|
|
871
|
+
|
|
872
|
+
record = PortalLink(
|
|
873
|
+
repo_name=repo_name,
|
|
874
|
+
milestone_number=int(milestone_number),
|
|
875
|
+
submission_id=submission_id,
|
|
876
|
+
linked_at=time.time() if now is None else now,
|
|
877
|
+
actor=actor,
|
|
878
|
+
)
|
|
879
|
+
state.save_portal_link(record.to_dict())
|
|
880
|
+
return record
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
def get_milestone_link(*, repo_name: str, milestone_number: int) -> PortalLink | None:
|
|
884
|
+
"""The current portal link for one milestone, or ``None`` if unlinked."""
|
|
885
|
+
from coord import state # noqa: PLC0415
|
|
886
|
+
|
|
887
|
+
raw = state.get_portal_link(repo_name=repo_name, milestone_number=milestone_number)
|
|
888
|
+
return PortalLink.from_dict(raw) if raw is not None else None
|
|
889
|
+
|
|
890
|
+
|
|
891
|
+
def list_milestone_links() -> list[PortalLink]:
|
|
892
|
+
"""Every recorded milestone ↔ submission link."""
|
|
893
|
+
from coord import state # noqa: PLC0415
|
|
894
|
+
|
|
895
|
+
links = [PortalLink.from_dict(raw) for raw in state.list_portal_links()]
|
|
896
|
+
return [link for link in links if link is not None]
|
|
@@ -177,11 +177,16 @@ def enqueue_design_round(
|
|
|
177
177
|
) -> portal_store.OutboxRow:
|
|
178
178
|
"""Queue a design round (the D1 metadata half) for *submission_id*.
|
|
179
179
|
|
|
180
|
-
The mock bundle itself is an R2 object and is **not** uploaded here:
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
180
|
+
The mock bundle itself is an R2 object and is **not** uploaded here:
|
|
181
|
+
that goes through :meth:`coord.portal_bridge.PortalBridgeClient.
|
|
182
|
+
upload_bundle` (coord-portal#120, PDR-2) — a separate call from the
|
|
183
|
+
three ``push``/``pull``/``heartbeat`` D1-metadata routes this queue
|
|
184
|
+
drains — so *design_round* is expected to already carry whatever
|
|
185
|
+
reference (the returned bundle key) the customer's browser will follow.
|
|
186
|
+
The auto-push caller (:mod:`coord.merge_queue`'s post-merge hook,
|
|
187
|
+
PDR-3/#2508) uploads first and passes the resulting key through
|
|
188
|
+
:func:`coord.mock_author.build_design_round`. What this function
|
|
189
|
+
guarantees is the ordering — see :func:`enqueue_status`.
|
|
185
190
|
"""
|
|
186
191
|
if not isinstance(design_round, dict) or not design_round:
|
|
187
192
|
raise PortalSyncError("design_round payload must be a non-empty mapping")
|