code-coordinator 0.5.206__tar.gz → 0.5.207__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.206 → code_coordinator-0.5.207}/PKG-INFO +1 -1
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/db.py +40 -6
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/gate_a.py +13 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/portal_store.py +90 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/portal_sync.py +321 -7
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/serve_app.py +9 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_portal_store.py +30 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_portal_sync.py +336 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/release-tui.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/.gitignore +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/CLAUDE.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/GOAL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/LICENSE +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/MANIFEST.in +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/README.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/__init__.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agent.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/audit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/block_log.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/board_bool_guard.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/board_service.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/brain.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/claim.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/cli.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/client.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/portal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/comments.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/config.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dao.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/deps.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/drive.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/events.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/filelock.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/freshness.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/gates.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/goal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/context.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/models.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/render.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/health/units.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/hooks.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/interactive.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/merge_queue.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/models.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/network.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/notify.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/openapi.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/parentage.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/plans.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/progress.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/release_window.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/reports.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/review.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/self_health.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/smoke.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/split_work.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/state.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/test_author.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/test_report.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/usage.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/install-agent.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/pyproject.toml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/setup.cfg +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/__init__.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/audit_1039.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/contract.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/manifest.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/contract.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/manifest.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/contract.md +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/manifest.yml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/conftest.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_db.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_events.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_init.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_merge_queue.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_models.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_network.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_session.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_split.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_state.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/Cargo.lock +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/Cargo.toml +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/cargo-config-local-quadraui.toml.example +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/audit.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/chat.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/data.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/dialogs.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/doc_tabs.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/drive.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/drive_queue.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/escalation.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/events.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/fixtures.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/fleet_health.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/fleet_sessions.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/fleet_terminals.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/format.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/milestone_dag.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/mod.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/msv.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/pipeline.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/plans.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/render.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/reports.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/sessions.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/settings_ui.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/sidebar.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/terminal.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/tests.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/types.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/app/workspace.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/bin/gtk.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/commands.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/lib.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/main.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/src/settings.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/tests/acceptance.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/tests/cli.rs +0 -0
- {code_coordinator-0.5.206 → code_coordinator-0.5.207}/tui/tests/fixtures/board_sample.json +0 -0
|
@@ -583,13 +583,35 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
|
|
|
583
583
|
-- CHECK pins it to one row so "which cursor?" can never be a
|
|
584
584
|
-- question). `pull_cursor` is opaque to coord — it is whatever the
|
|
585
585
|
-- portal handed back — and is the replay point on daemon restart.
|
|
586
|
+
--
|
|
587
|
+
-- `verdict_watermark_at` / `verdict_watermark_rowid` (#2509 review
|
|
588
|
+
-- fix): the verdict consumer's OWN read position into
|
|
589
|
+
-- `portal_events`, independent of the shared `handled_at` column.
|
|
590
|
+
-- `unhandled_events()`/`mark_event_handled()` are shared plumbing —
|
|
591
|
+
-- this consumer only stamps `handled_at` for a `changes_requested`
|
|
592
|
+
-- event it actually dispatched, leaving every other kind (a new
|
|
593
|
+
-- submission, an `approved` verdict, a Q&A answer) NULL by design so
|
|
594
|
+
-- a future consumer can still read it. Scanning by `handled_at IS
|
|
595
|
+
-- NULL` therefore re-returns that growing, never-marked backlog
|
|
596
|
+
-- ahead of anything newer forever once it exceeds one page — a real
|
|
597
|
+
-- `changes-requested` event behind it would never surface. A
|
|
598
|
+
-- private watermark sidesteps that: it advances past every event
|
|
599
|
+
-- this consumer has looked at, acted on or not, so a pile of
|
|
600
|
+
-- non-actionable events cannot block the ones behind it.
|
|
601
|
+
-- `(received_at, rowid)` mirrors `unhandled_events`'s own tiebreaker
|
|
602
|
+
-- ordering.
|
|
603
|
+
-- Both NULL until the first tick with this column runs (an empty
|
|
604
|
+
-- `~/.coord/coord.db` or one predating this migration), read as
|
|
605
|
+
-- `(0.0, 0)` — before every real event's `received_at`/`rowid`.
|
|
586
606
|
CREATE TABLE IF NOT EXISTS portal_sync_state (
|
|
587
|
-
id
|
|
588
|
-
pull_cursor
|
|
589
|
-
last_pull_at
|
|
590
|
-
last_push_at
|
|
591
|
-
last_heartbeat_at
|
|
592
|
-
last_error
|
|
607
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
608
|
+
pull_cursor TEXT,
|
|
609
|
+
last_pull_at REAL,
|
|
610
|
+
last_push_at REAL,
|
|
611
|
+
last_heartbeat_at REAL,
|
|
612
|
+
last_error TEXT NOT NULL DEFAULT '',
|
|
613
|
+
verdict_watermark_at REAL,
|
|
614
|
+
verdict_watermark_rowid INTEGER
|
|
593
615
|
);
|
|
594
616
|
|
|
595
617
|
CREATE INDEX IF NOT EXISTS idx_assignments_status ON assignments(status);
|
|
@@ -942,6 +964,18 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
|
|
|
942
964
|
# predating this migration, same as the column's own default for a
|
|
943
965
|
# freshly-enqueued entry.
|
|
944
966
|
"ALTER TABLE merge_queue ADD COLUMN ci_fix_dispatches INTEGER NOT NULL DEFAULT 0",
|
|
967
|
+
# #2509 review fix: the verdict consumer's own read position into
|
|
968
|
+
# `portal_events` — see the CREATE TABLE comment above for why it
|
|
969
|
+
# cannot reuse the shared `handled_at` column. NULL (read as
|
|
970
|
+
# `(0.0, 0)`, before every real event) for every database predating
|
|
971
|
+
# this migration, which replays the full existing inbox exactly once
|
|
972
|
+
# on upgrade — safe: re-scanning a non-actionable event is a no-op,
|
|
973
|
+
# and `_consume_verdicts` skips (never re-dispatches) any event
|
|
974
|
+
# whose `handled_at` is already set, so an already-consumed
|
|
975
|
+
# `changes_requested` event from before this migration is walked
|
|
976
|
+
# past, not re-sent — see `coord.portal_sync._consume_verdicts`.
|
|
977
|
+
"ALTER TABLE portal_sync_state ADD COLUMN verdict_watermark_at REAL",
|
|
978
|
+
"ALTER TABLE portal_sync_state ADD COLUMN verdict_watermark_rowid INTEGER",
|
|
945
979
|
]
|
|
946
980
|
for sql in migrations:
|
|
947
981
|
try:
|
|
@@ -224,6 +224,19 @@ def make_record(
|
|
|
224
224
|
``verdict`` must be one of :data:`VERDICTS`; anything else is a
|
|
225
225
|
programming error, not an operator error (the CLI's mutually-exclusive
|
|
226
226
|
``--approved``/``--changes`` flags already reject bad input).
|
|
227
|
+
|
|
228
|
+
**Open policy question (#2509, flagged for the operator, not resolved by
|
|
229
|
+
this call or any caller yet):** should an "approved" verdict on the
|
|
230
|
+
customer portal auto-call this with ``verdict=VERDICT_APPROVED`` — i.e.
|
|
231
|
+
does a client's portal sign-off record itself — or does an operator
|
|
232
|
+
still confirm separately via the existing CLI/TUI path? Today nothing
|
|
233
|
+
does the former: ``coord.portal_sync._consume_verdicts`` only acts on
|
|
234
|
+
`changes-requested` (auto-amending the contract) and deliberately leaves
|
|
235
|
+
`approved` events unconsumed rather than silently picking an answer here.
|
|
236
|
+
Whichever way this is eventually decided, an auto-recorded call MUST
|
|
237
|
+
pass ``actor="client via portal"`` (or similarly explicit) — never leave
|
|
238
|
+
``actor`` to default such that a client's decision reads as if some
|
|
239
|
+
coord process made it.
|
|
227
240
|
"""
|
|
228
241
|
if verdict not in VERDICTS:
|
|
229
242
|
raise ValueError(f"unknown Gate A verdict {verdict!r}")
|
|
@@ -206,6 +206,44 @@ def unhandled_events(limit: int = 100) -> list[PortalEvent]:
|
|
|
206
206
|
return [_event_from_row(r) for r in rows]
|
|
207
207
|
|
|
208
208
|
|
|
209
|
+
def events_after_verdict_watermark(
|
|
210
|
+
received_at: float, rowid: int, *, limit: int = 100
|
|
211
|
+
) -> list[tuple[int, PortalEvent]]:
|
|
212
|
+
"""Events strictly after ``(received_at, rowid)``, oldest first, with rowid.
|
|
213
|
+
|
|
214
|
+
The verdict consumer's (#2509) OWN scan, independent of the shared
|
|
215
|
+
``handled_at`` column that :func:`unhandled_events` filters on. That
|
|
216
|
+
column is written by every consumer that ever gets added, but this one
|
|
217
|
+
only stamps it for a ``changes_requested`` event it actually dispatched —
|
|
218
|
+
every other kind is deliberately left ``handled_at IS NULL`` forever so a
|
|
219
|
+
future consumer can still read it. Scanning by ``handled_at IS NULL``
|
|
220
|
+
would therefore re-return that growing, never-marked backlog ahead of
|
|
221
|
+
anything newer on every call, and once it exceeds one page a genuinely
|
|
222
|
+
new ``changes_requested`` event behind it would never surface — see
|
|
223
|
+
:func:`coord.portal_sync._consume_verdicts`. A private, monotonic
|
|
224
|
+
watermark sidesteps that: it advances past every event this consumer has
|
|
225
|
+
*looked at*, whether or not it acted, so a pile of non-actionable events
|
|
226
|
+
cannot block the ones behind it.
|
|
227
|
+
|
|
228
|
+
Returns ``(rowid, event)`` pairs (not just events) so the caller can
|
|
229
|
+
advance the watermark to the exact row it stopped at without a second
|
|
230
|
+
query. ``rowid`` is SQLite's own implicit rowid — stable and unique
|
|
231
|
+
because ``portal_events``' primary key is the (non-integer) ``event_id``,
|
|
232
|
+
not ``rowid`` itself, so declaring the primary key never aliased it away.
|
|
233
|
+
"""
|
|
234
|
+
rows = _conn().execute(
|
|
235
|
+
"""
|
|
236
|
+
SELECT rowid, * FROM portal_events
|
|
237
|
+
WHERE received_at > ?
|
|
238
|
+
OR (received_at = ? AND rowid > ?)
|
|
239
|
+
ORDER BY received_at ASC, rowid ASC
|
|
240
|
+
LIMIT ?
|
|
241
|
+
""",
|
|
242
|
+
(received_at, received_at, rowid, limit),
|
|
243
|
+
).fetchall()
|
|
244
|
+
return [(r["rowid"], _event_from_row(r)) for r in rows]
|
|
245
|
+
|
|
246
|
+
|
|
209
247
|
def mark_event_handled(event_id: str, *, now: float | None = None) -> None:
|
|
210
248
|
"""Stamp an event as consumed. Idempotent — re-stamping is a plain UPDATE."""
|
|
211
249
|
conn = _conn()
|
|
@@ -704,6 +742,8 @@ class SyncState:
|
|
|
704
742
|
last_push_at: float | None = None
|
|
705
743
|
last_heartbeat_at: float | None = None
|
|
706
744
|
last_error: str = ""
|
|
745
|
+
verdict_watermark_at: float = 0.0
|
|
746
|
+
verdict_watermark_rowid: int = 0
|
|
707
747
|
|
|
708
748
|
|
|
709
749
|
def get_sync_state() -> SyncState:
|
|
@@ -718,6 +758,8 @@ def get_sync_state() -> SyncState:
|
|
|
718
758
|
last_push_at=row["last_push_at"],
|
|
719
759
|
last_heartbeat_at=row["last_heartbeat_at"],
|
|
720
760
|
last_error=row["last_error"] or "",
|
|
761
|
+
verdict_watermark_at=row["verdict_watermark_at"] or 0.0,
|
|
762
|
+
verdict_watermark_rowid=row["verdict_watermark_rowid"] or 0,
|
|
721
763
|
)
|
|
722
764
|
|
|
723
765
|
|
|
@@ -748,6 +790,36 @@ def note_pull(*, now: float | None = None) -> None:
|
|
|
748
790
|
_update_sync_state(last_pull_at=time.time() if now is None else now)
|
|
749
791
|
|
|
750
792
|
|
|
793
|
+
def get_verdict_watermark() -> tuple[float, int]:
|
|
794
|
+
"""The verdict consumer's own read position, ``(0.0, 0)`` if never set.
|
|
795
|
+
|
|
796
|
+
``(0.0, 0)`` sorts before every real ``portal_events`` row (``received_at``
|
|
797
|
+
is a wall-clock epoch stamp, ``rowid`` starts at 1), so a fresh database
|
|
798
|
+
or one predating this column reads as "nothing scanned yet" and the next
|
|
799
|
+
scan starts from the very beginning of the inbox — see
|
|
800
|
+
:func:`events_after_verdict_watermark`.
|
|
801
|
+
"""
|
|
802
|
+
row = _conn().execute(
|
|
803
|
+
"SELECT verdict_watermark_at, verdict_watermark_rowid "
|
|
804
|
+
"FROM portal_sync_state WHERE id = 1"
|
|
805
|
+
).fetchone()
|
|
806
|
+
if row is None or row["verdict_watermark_at"] is None:
|
|
807
|
+
return (0.0, 0)
|
|
808
|
+
return (row["verdict_watermark_at"], row["verdict_watermark_rowid"] or 0)
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
def set_verdict_watermark(received_at: float, rowid: int) -> None:
|
|
812
|
+
"""Advance the verdict consumer's read position past ``(received_at, rowid)``.
|
|
813
|
+
|
|
814
|
+
Called after a scan has looked at that row — regardless of whether it was
|
|
815
|
+
acted on — so a run of non-actionable events cannot make this consumer
|
|
816
|
+
re-scan them forever (#2509 review fix). Independent of
|
|
817
|
+
:func:`mark_event_handled`, which is shared, per-event bookkeeping for
|
|
818
|
+
whatever future consumer looks at ``handled_at`` next.
|
|
819
|
+
"""
|
|
820
|
+
_update_sync_state(verdict_watermark_at=received_at, verdict_watermark_rowid=rowid)
|
|
821
|
+
|
|
822
|
+
|
|
751
823
|
def note_push(*, now: float | None = None) -> None:
|
|
752
824
|
_update_sync_state(last_push_at=time.time() if now is None else now)
|
|
753
825
|
|
|
@@ -894,3 +966,21 @@ def list_milestone_links() -> list[PortalLink]:
|
|
|
894
966
|
|
|
895
967
|
links = [PortalLink.from_dict(raw) for raw in state.list_portal_links()]
|
|
896
968
|
return [link for link in links if link is not None]
|
|
969
|
+
|
|
970
|
+
|
|
971
|
+
def get_link_by_submission(submission_id: str) -> PortalLink | None:
|
|
972
|
+
"""Reverse lookup: the milestone link for a portal ``submission_id``, if any.
|
|
973
|
+
|
|
974
|
+
:func:`link_milestone` / :func:`get_milestone_link` only index the
|
|
975
|
+
forward direction (milestone → submission_id), which is all PDR-3's
|
|
976
|
+
auto-push needs. PDR-4's verdict consumer needs the other direction —
|
|
977
|
+
an inbound event carries only ``submission_id`` and must resolve back to
|
|
978
|
+
the ``(repo_name, milestone_number)`` coord dispatches against. Links are
|
|
979
|
+
few enough (one per submission a customer has ever been sent to) that a
|
|
980
|
+
linear scan of :func:`list_milestone_links` is simply the read path — no
|
|
981
|
+
new index, no new table.
|
|
982
|
+
"""
|
|
983
|
+
for link in list_milestone_links():
|
|
984
|
+
if link.submission_id == submission_id:
|
|
985
|
+
return link
|
|
986
|
+
return None
|
|
@@ -10,9 +10,25 @@ One pass, in this order:
|
|
|
10
10
|
1. **Pull** — customer-authored events since the stored cursor (new
|
|
11
11
|
submissions · sign-off verdicts · answers to open questions) into the
|
|
12
12
|
local inbox, then advance the cursor.
|
|
13
|
-
2. **
|
|
13
|
+
2. **Consume verdicts** (#2509, PDR-4) — walk events pulled but not yet
|
|
14
|
+
*scanned by this consumer* (its own watermark —
|
|
15
|
+
:func:`coord.portal_store.events_after_verdict_watermark`, independent of
|
|
16
|
+
the shared ``handled_at`` column) and, for each ``changes-requested``
|
|
17
|
+
sign-off, resolve the linked ``(repo, milestone)`` (#2507, PDR-1) and
|
|
18
|
+
dispatch a targeted Gate-A contract amendment
|
|
19
|
+
(:func:`coord.mock_author.dispatch_acceptance_mock` with
|
|
20
|
+
``amend_briefing`` set to the client's own comment) — the same
|
|
21
|
+
``coord acceptance mock --amend`` path an operator would type by hand,
|
|
22
|
+
now triggered by the portal event instead. An event is marked consumed
|
|
23
|
+
(``handled_at``) only once the dispatch itself has succeeded, and the
|
|
24
|
+
watermark stops advancing at the first dispatch failure in a page, so a
|
|
25
|
+
crash — or a stuck dispatch (no idle machine, Gate A already claimed) —
|
|
26
|
+
re-processes that event next tick rather than dropping the client's
|
|
27
|
+
feedback or skipping past it. An ``approved`` verdict is deliberately
|
|
28
|
+
left alone here — see :func:`_consume_verdicts`.
|
|
29
|
+
3. **Push** — coord-authored facts from the outbox (design rounds · status ·
|
|
14
30
|
open questions), one row at a time, in per-submission FIFO order.
|
|
15
|
-
|
|
31
|
+
4. **Heartbeat** — say the daemon is alive.
|
|
16
32
|
|
|
17
33
|
Each phase is independently guarded: a portal outage, a rejected field, or a
|
|
18
34
|
malformed event can never crash the tick or silence the other two phases (the
|
|
@@ -58,6 +74,7 @@ before can be confirmed that way.
|
|
|
58
74
|
from __future__ import annotations
|
|
59
75
|
|
|
60
76
|
import logging
|
|
77
|
+
import re
|
|
61
78
|
from dataclasses import dataclass, field
|
|
62
79
|
from typing import Any
|
|
63
80
|
|
|
@@ -130,6 +147,29 @@ MAX_PUSH_PER_TICK = 25
|
|
|
130
147
|
#: former freezes a customer's queue forever behind a request that will never
|
|
131
148
|
#: succeed.
|
|
132
149
|
MAX_PUSH_ATTEMPTS = 8
|
|
150
|
+
#: Events walked per page by the verdict consumer (#2509). Bounded for the
|
|
151
|
+
#: same reason as the push/pull budgets above — a large backlog must not make
|
|
152
|
+
#: one tick unbounded.
|
|
153
|
+
#:
|
|
154
|
+
#: This consumer tracks its OWN watermark into `portal_events`
|
|
155
|
+
#: (`portal_store.get_verdict_watermark` / `set_verdict_watermark`),
|
|
156
|
+
#: independent of the shared `handled_at` column: a `changes-requested`
|
|
157
|
+
#: sign-off is the only kind ever stamped `handled_at` here, so relying on
|
|
158
|
+
#: `handled_at IS NULL` to decide what is left to scan would mean the
|
|
159
|
+
#: never-marked backlog of every OTHER kind (new submissions, `approved`
|
|
160
|
+
#: verdicts, Q&A answers) piles up ahead of anything newer forever, and once
|
|
161
|
+
#: it exceeds one page a genuinely new `changes-requested` event behind it
|
|
162
|
+
#: would never be seen again by ANY future tick. The watermark advances past
|
|
163
|
+
#: every event this pass has looked at, acted on or not, so a backlog of
|
|
164
|
+
#: non-actionable events cannot block the ones behind it. See
|
|
165
|
+
#: :func:`_consume_verdicts`.
|
|
166
|
+
MAX_VERDICTS_PER_TICK = 100
|
|
167
|
+
#: Pages of `MAX_VERDICTS_PER_TICK` walked in one tick before leaving the
|
|
168
|
+
#: rest for the next — the verdict-consumer counterpart to `MAX_PULL_PAGES`,
|
|
169
|
+
#: for the same reason: a one-time backlog (e.g. the first tick after this
|
|
170
|
+
#: consumer shipped) should drain in a handful of ticks, not one page a
|
|
171
|
+
#: tick forever.
|
|
172
|
+
MAX_VERDICT_PAGES = 10
|
|
133
173
|
|
|
134
174
|
|
|
135
175
|
@dataclass(frozen=True)
|
|
@@ -138,6 +178,7 @@ class SyncResult:
|
|
|
138
178
|
|
|
139
179
|
enabled: bool = True
|
|
140
180
|
pulled: int = 0
|
|
181
|
+
verdicts_consumed: int = 0
|
|
141
182
|
applied: int = 0
|
|
142
183
|
rejected: int = 0
|
|
143
184
|
held: int = 0
|
|
@@ -147,7 +188,9 @@ class SyncResult:
|
|
|
147
188
|
@property
|
|
148
189
|
def moved(self) -> bool:
|
|
149
190
|
"""True when this pass actually moved a row in either direction."""
|
|
150
|
-
return bool(
|
|
191
|
+
return bool(
|
|
192
|
+
self.pulled or self.verdicts_consumed or self.applied or self.rejected
|
|
193
|
+
)
|
|
151
194
|
|
|
152
195
|
def summary(self) -> str:
|
|
153
196
|
if not self.enabled:
|
|
@@ -159,6 +202,7 @@ class SyncResult:
|
|
|
159
202
|
return "portal sync: disabled"
|
|
160
203
|
parts = [
|
|
161
204
|
f"pulled={self.pulled}",
|
|
205
|
+
f"verdicts_consumed={self.verdicts_consumed}",
|
|
162
206
|
f"applied={self.applied}",
|
|
163
207
|
f"rejected={self.rejected}",
|
|
164
208
|
f"held={self.held}",
|
|
@@ -326,11 +370,12 @@ def sync_tick(
|
|
|
326
370
|
``SyncResult(enabled=False)`` having sent nothing. Pass *client*
|
|
327
371
|
explicitly to bypass config (tests, ``coord portal sync``).
|
|
328
372
|
|
|
329
|
-
The
|
|
373
|
+
The four phases are independently isolated, deliberately in this order:
|
|
330
374
|
pull first (a sign-off verdict pulled now can be acted on this same
|
|
331
|
-
tick),
|
|
332
|
-
failed everything else still proves the
|
|
333
|
-
precisely the pass the portal most needs to
|
|
375
|
+
tick), then verdict consumption (#2509), then push, heartbeat last but
|
|
376
|
+
unconditionally — a pass that failed everything else still proves the
|
|
377
|
+
daemon is alive, and that is precisely the pass the portal most needs to
|
|
378
|
+
hear about.
|
|
334
379
|
"""
|
|
335
380
|
if client is None:
|
|
336
381
|
try:
|
|
@@ -353,6 +398,19 @@ def sync_tick(
|
|
|
353
398
|
errors.append(f"pull: {exc}")
|
|
354
399
|
logger.warning("portal sync: pull failed", exc_info=True)
|
|
355
400
|
|
|
401
|
+
# #2509 (PDR-4): act on whatever the pull above (or an earlier tick) left
|
|
402
|
+
# in the inbox. Isolated exactly like the other phases — a dispatch
|
|
403
|
+
# failure (no idle machine, GitHub down, the milestone's Gate A already
|
|
404
|
+
# claimed) must not silence push or heartbeat, and must not be mistaken
|
|
405
|
+
# for a portal-side problem.
|
|
406
|
+
verdicts_consumed = 0
|
|
407
|
+
try:
|
|
408
|
+
verdicts_consumed, verdict_errors = _consume_verdicts(config, now=now)
|
|
409
|
+
errors.extend(verdict_errors)
|
|
410
|
+
except Exception as exc: # noqa: BLE001
|
|
411
|
+
errors.append(f"verdicts: {exc}")
|
|
412
|
+
logger.warning("portal sync: verdict consumption failed", exc_info=True)
|
|
413
|
+
|
|
356
414
|
applied = rejected = held = 0
|
|
357
415
|
try:
|
|
358
416
|
applied, rejected, held, push_errors = _push(
|
|
@@ -391,6 +449,7 @@ def sync_tick(
|
|
|
391
449
|
return SyncResult(
|
|
392
450
|
enabled=True,
|
|
393
451
|
pulled=pulled,
|
|
452
|
+
verdicts_consumed=verdicts_consumed,
|
|
394
453
|
applied=applied,
|
|
395
454
|
rejected=rejected,
|
|
396
455
|
held=held,
|
|
@@ -505,6 +564,261 @@ def _mirror_event(event: dict[str, Any], *, now: float | None) -> None:
|
|
|
505
564
|
portal_store.seed_revision(submission_id, revision, now=now)
|
|
506
565
|
|
|
507
566
|
|
|
567
|
+
# ── consuming portal verdicts (#2509, PDR-4) ────────────────────────────────
|
|
568
|
+
#
|
|
569
|
+
# The counterpart to `enqueue_*` above: those put coord-owned facts on the
|
|
570
|
+
# outbound queue, this acts on customer-owned ones the portal already sent.
|
|
571
|
+
# `portal_store.unhandled_events()` / `mark_event_handled()` have existed as
|
|
572
|
+
# pull-side plumbing since #1982 with zero callers — this consumer is the
|
|
573
|
+
# first, but does NOT scan through `unhandled_events()` (see below).
|
|
574
|
+
#
|
|
575
|
+
# Scope, deliberately narrow: only a `changes-requested` sign-off is acted on
|
|
576
|
+
# here. Every other event kind (a new submission, an `approved` sign-off, an
|
|
577
|
+
# answer to an open question) never gets `handled_at` stamped by this
|
|
578
|
+
# consumer — not lost, just not this ticket's job — so a future consumer can
|
|
579
|
+
# still read it via `unhandled_events()`, and nothing here silently decides a
|
|
580
|
+
# question it wasn't asked. See the "approved" branch below for the specific
|
|
581
|
+
# open question this deliberately does not resolve.
|
|
582
|
+
#
|
|
583
|
+
# That is also exactly why this consumer cannot scan `unhandled_events()`
|
|
584
|
+
# (`handled_at IS NULL`, oldest first) to find its own work: every kind above
|
|
585
|
+
# piles up there FOREVER, always sorted ahead of anything newer, so once that
|
|
586
|
+
# backlog exceeds one page a genuinely new `changes-requested` event behind
|
|
587
|
+
# it would never be returned — not this tick, not any future one (found in
|
|
588
|
+
# review; reproduced by seeding 150 non-actionable events ahead of one
|
|
589
|
+
# `changes_requested` event and running 5 ticks: `consumed == 0` every time,
|
|
590
|
+
# and the targeted event never appeared in `unhandled_events()`'s result at
|
|
591
|
+
# all). Instead this consumer tracks its OWN watermark
|
|
592
|
+
# (`portal_store.get_verdict_watermark` / `set_verdict_watermark`,
|
|
593
|
+
# `events_after_verdict_watermark`) into `portal_events`, which advances past
|
|
594
|
+
# every event it has looked at regardless of what it decided — so a pile of
|
|
595
|
+
# events it will never mark `handled_at` cannot block it from reaching what
|
|
596
|
+
# comes after them.
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
def _signoff_verdict(event: "portal_store.PortalEvent") -> str | None:
|
|
600
|
+
"""The sign-off verdict *event* carries, or ``None`` if it isn't one.
|
|
601
|
+
|
|
602
|
+
The portal's own event contract for a sign-off is not fully pinned down
|
|
603
|
+
yet, so this reads either shape that has been observed: the verdict as a
|
|
604
|
+
suffix on ``type`` (``"signoff.changes_requested"``) or nested in the
|
|
605
|
+
event's ``data``/``fields`` payload (``{"type": "signoff", "data":
|
|
606
|
+
{"verdict": "changes_requested"}}``). Never raises on a malformed event —
|
|
607
|
+
it just returns ``None``, and the event is left unhandled for a human to
|
|
608
|
+
look at rather than mis-filed as "not a sign-off".
|
|
609
|
+
"""
|
|
610
|
+
kind = (event.kind or "").strip()
|
|
611
|
+
if not (kind == "signoff" or kind.startswith("signoff.")):
|
|
612
|
+
return None
|
|
613
|
+
if "." in kind:
|
|
614
|
+
suffix = kind.split(".", 1)[1].strip()
|
|
615
|
+
if suffix:
|
|
616
|
+
return suffix
|
|
617
|
+
payload = event.payload if isinstance(event.payload, dict) else {}
|
|
618
|
+
nested = payload.get("data")
|
|
619
|
+
if not isinstance(nested, dict):
|
|
620
|
+
nested = payload.get("fields")
|
|
621
|
+
verdict = nested.get("verdict") if isinstance(nested, dict) else None
|
|
622
|
+
if not isinstance(verdict, str) or not verdict.strip():
|
|
623
|
+
verdict = payload.get("verdict")
|
|
624
|
+
return verdict.strip() if isinstance(verdict, str) and verdict.strip() else None
|
|
625
|
+
|
|
626
|
+
|
|
627
|
+
def _signoff_comment(event: "portal_store.PortalEvent") -> str:
|
|
628
|
+
"""The client's own comment text on *event*, or ``""`` if it left none."""
|
|
629
|
+
payload = event.payload if isinstance(event.payload, dict) else {}
|
|
630
|
+
nested = payload.get("data")
|
|
631
|
+
if not isinstance(nested, dict):
|
|
632
|
+
nested = payload.get("fields")
|
|
633
|
+
for source in (nested, payload):
|
|
634
|
+
if not isinstance(source, dict):
|
|
635
|
+
continue
|
|
636
|
+
for key in ("comments", "comment", "message", "note"):
|
|
637
|
+
value = source.get(key)
|
|
638
|
+
if isinstance(value, str) and value.strip():
|
|
639
|
+
return value.strip()
|
|
640
|
+
return ""
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
def _resolve_tracking_issue(repo_cfg: Any, milestone_number: int) -> int | None:
|
|
644
|
+
"""The milestone's tracking (epic) issue number, or ``None`` if unresolved.
|
|
645
|
+
|
|
646
|
+
Every command that dispatches milestone work
|
|
647
|
+
(:func:`coord.mock_author.dispatch_acceptance_mock` included) is keyed by
|
|
648
|
+
tracking-issue number, resolving the milestone FROM it — but a
|
|
649
|
+
:class:`coord.portal_store.PortalLink` only carries the milestone number
|
|
650
|
+
the other direction, inbound events never see a tracking-issue number at
|
|
651
|
+
all. This is the reverse lookup, same approach
|
|
652
|
+
:func:`coord.plans.aggregate_repo_plans` already uses: open issues + the
|
|
653
|
+
closed-epics list, filtered to the one carrying the epic label under this
|
|
654
|
+
milestone (:func:`coord.plans.find_tracking_issue`).
|
|
655
|
+
"""
|
|
656
|
+
from coord import github_ops # noqa: PLC0415
|
|
657
|
+
from coord.plans import find_tracking_issue # noqa: PLC0415
|
|
658
|
+
|
|
659
|
+
candidates = github_ops.get_open_issues(repo_cfg.github) + github_ops.get_closed_epics(
|
|
660
|
+
repo_cfg.github
|
|
661
|
+
)
|
|
662
|
+
tracking = find_tracking_issue(milestone_number, candidates)
|
|
663
|
+
return tracking["number"] if tracking is not None else None
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
def _amend_from_verdict(config: Any, event: "portal_store.PortalEvent") -> None:
|
|
667
|
+
"""Dispatch the targeted Gate-A amendment for one `changes-requested` event.
|
|
668
|
+
|
|
669
|
+
Raises on anything that stops the dispatch (no link recorded, unknown
|
|
670
|
+
repo, no resolvable tracking issue, Gate A already claimed, no idle
|
|
671
|
+
machine, ...) — the caller marks the event consumed only if this returns
|
|
672
|
+
normally, so any of these leaves the event to retry next tick rather than
|
|
673
|
+
dropping the client's feedback.
|
|
674
|
+
"""
|
|
675
|
+
link = portal_store.get_link_by_submission(event.submission_id)
|
|
676
|
+
if link is None:
|
|
677
|
+
raise RuntimeError(
|
|
678
|
+
f"no milestone is linked to portal submission "
|
|
679
|
+
f"{event.submission_id!r} (coord portal link) — cannot resolve "
|
|
680
|
+
"where to dispatch the amendment"
|
|
681
|
+
)
|
|
682
|
+
repo_cfg = config.repo(link.repo_name)
|
|
683
|
+
if repo_cfg is None:
|
|
684
|
+
raise RuntimeError(
|
|
685
|
+
f"linked repo {link.repo_name!r} is not in coordinator.yml"
|
|
686
|
+
)
|
|
687
|
+
|
|
688
|
+
tracking_issue_number = _resolve_tracking_issue(repo_cfg, link.milestone_number)
|
|
689
|
+
if tracking_issue_number is None:
|
|
690
|
+
raise RuntimeError(
|
|
691
|
+
f"could not resolve a tracking (epic) issue for milestone "
|
|
692
|
+
f"{link.milestone_number} in {link.repo_name!r}"
|
|
693
|
+
)
|
|
694
|
+
|
|
695
|
+
comment = _signoff_comment(event)
|
|
696
|
+
amend_text = comment or (
|
|
697
|
+
"The client requested changes via the portal sign-off but left no "
|
|
698
|
+
f"comment text — check portal submission {event.submission_id!r} "
|
|
699
|
+
"directly for context."
|
|
700
|
+
)
|
|
701
|
+
|
|
702
|
+
from coord.mock_author import dispatch_acceptance_mock # noqa: PLC0415
|
|
703
|
+
|
|
704
|
+
dispatch_acceptance_mock(
|
|
705
|
+
link.repo_name,
|
|
706
|
+
tracking_issue_number,
|
|
707
|
+
config,
|
|
708
|
+
amend_briefing=amend_text,
|
|
709
|
+
)
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
#: Matches a sign-off verdict's separator, whichever the portal actually
|
|
713
|
+
#: used — a literal hyphen (`"changes-requested"`) or a space
|
|
714
|
+
#: (`"changes requested"`). The portal's own event contract for this field
|
|
715
|
+
#: is not fully pinned down (see `_signoff_verdict`'s docstring), so both are
|
|
716
|
+
#: folded to `_` before comparing against `"changes_requested"` rather than
|
|
717
|
+
#: risking a silent no-match on a contract detail neither side has confirmed.
|
|
718
|
+
_VERDICT_SEPARATOR_RE = re.compile(r"[-\s]+")
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
def _normalize_verdict(verdict: str) -> str:
|
|
722
|
+
return _VERDICT_SEPARATOR_RE.sub("_", verdict.strip().lower()).strip("_")
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
def _consume_verdicts(
|
|
726
|
+
config: Any,
|
|
727
|
+
*,
|
|
728
|
+
limit: int = MAX_VERDICTS_PER_TICK,
|
|
729
|
+
pages: int = MAX_VERDICT_PAGES,
|
|
730
|
+
now: float | None = None,
|
|
731
|
+
) -> tuple[int, list[str]]:
|
|
732
|
+
"""Walk the inbox from this consumer's own watermark, acting on every
|
|
733
|
+
`changes-requested` sign-off found.
|
|
734
|
+
|
|
735
|
+
Requires *config* (a real :class:`coord.config.Config`) to resolve the
|
|
736
|
+
linked repo and dispatch through — a bare *client* (the test/CLI bypass
|
|
737
|
+
:func:`sync_tick` also accepts) is not enough to dispatch anything, so
|
|
738
|
+
with no config this is a deliberate no-op rather than a crash.
|
|
739
|
+
|
|
740
|
+
Returns ``(consumed, errors)``. Never raises: every event is handled
|
|
741
|
+
inside its own try/except so one bad event (an unresolved link, a
|
|
742
|
+
machine-picking failure) cannot stop the rest of the *page* — mirroring
|
|
743
|
+
`_push`'s per-row isolation. It CAN, deliberately, stop the watermark: the
|
|
744
|
+
first dispatch failure freezes it at the position just before that event,
|
|
745
|
+
so a still-broken link or a still-claimed Gate A is retried every tick
|
|
746
|
+
rather than silently skipped — the same "an event is marked consumed only
|
|
747
|
+
once the dispatch itself has succeeded" guarantee this module's docstring
|
|
748
|
+
promises, just enforced by a cursor now instead of a shared flag. Events
|
|
749
|
+
already looked at earlier are still walked (and, if newly actionable,
|
|
750
|
+
still acted on) even while frozen — only the PERSISTED watermark holds
|
|
751
|
+
still, so isolation and no-silent-drop both hold at once.
|
|
752
|
+
"""
|
|
753
|
+
if config is None:
|
|
754
|
+
return 0, []
|
|
755
|
+
consumed = 0
|
|
756
|
+
errors: list[str] = []
|
|
757
|
+
|
|
758
|
+
initial_at, initial_rowid = portal_store.get_verdict_watermark()
|
|
759
|
+
commit_at, commit_rowid = initial_at, initial_rowid
|
|
760
|
+
scan_at, scan_rowid = initial_at, initial_rowid
|
|
761
|
+
blocked = False
|
|
762
|
+
|
|
763
|
+
for _page_num in range(pages):
|
|
764
|
+
page = portal_store.events_after_verdict_watermark(
|
|
765
|
+
scan_at, scan_rowid, limit=limit
|
|
766
|
+
)
|
|
767
|
+
if not page:
|
|
768
|
+
break
|
|
769
|
+
for rowid, event in page:
|
|
770
|
+
scan_at, scan_rowid = event.received_at, rowid
|
|
771
|
+
if event.handled_at is not None:
|
|
772
|
+
# Already dispatched by an earlier pass — e.g. this tick's
|
|
773
|
+
# commit point is frozen behind a still-failing sibling from a
|
|
774
|
+
# PRIOR tick and this one was successfully handled back then,
|
|
775
|
+
# before that sibling ever failed. Nothing new to do; just
|
|
776
|
+
# let the scan move past it without re-dispatching.
|
|
777
|
+
if not blocked:
|
|
778
|
+
commit_at, commit_rowid = scan_at, scan_rowid
|
|
779
|
+
continue
|
|
780
|
+
verdict = _signoff_verdict(event)
|
|
781
|
+
if verdict is None:
|
|
782
|
+
if not blocked:
|
|
783
|
+
commit_at, commit_rowid = scan_at, scan_rowid
|
|
784
|
+
continue
|
|
785
|
+
if _normalize_verdict(verdict) != "changes_requested":
|
|
786
|
+
# Includes "approved". Whether an approved verdict should
|
|
787
|
+
# auto-record `coord gate-a --approved` (coord/gate_a.py) or
|
|
788
|
+
# wait for a separate operator confirmation is an open policy
|
|
789
|
+
# question (#2509) — deliberately not decided here. Leaving
|
|
790
|
+
# `handled_at` unset means a future consumer can still see it
|
|
791
|
+
# via `unhandled_events()`; advancing the watermark just means
|
|
792
|
+
# THIS consumer will not look at it again, which is separate.
|
|
793
|
+
if not blocked:
|
|
794
|
+
commit_at, commit_rowid = scan_at, scan_rowid
|
|
795
|
+
continue
|
|
796
|
+
try:
|
|
797
|
+
_amend_from_verdict(config, event)
|
|
798
|
+
except Exception as exc: # noqa: BLE001 — one bad event must not stop the page
|
|
799
|
+
errors.append(
|
|
800
|
+
f"verdict {event.event_id} ({event.submission_id}): {exc}"
|
|
801
|
+
)
|
|
802
|
+
logger.warning(
|
|
803
|
+
"portal sync: could not act on changes-requested verdict "
|
|
804
|
+
"for submission %s",
|
|
805
|
+
event.submission_id,
|
|
806
|
+
exc_info=True,
|
|
807
|
+
)
|
|
808
|
+
blocked = True
|
|
809
|
+
continue
|
|
810
|
+
portal_store.mark_event_handled(event.event_id, now=now)
|
|
811
|
+
consumed += 1
|
|
812
|
+
if not blocked:
|
|
813
|
+
commit_at, commit_rowid = scan_at, scan_rowid
|
|
814
|
+
if blocked or len(page) < limit:
|
|
815
|
+
break
|
|
816
|
+
|
|
817
|
+
if (commit_at, commit_rowid) != (initial_at, initial_rowid):
|
|
818
|
+
portal_store.set_verdict_watermark(commit_at, commit_rowid)
|
|
819
|
+
return consumed, errors
|
|
820
|
+
|
|
821
|
+
|
|
508
822
|
def _push(
|
|
509
823
|
client: Any, *, limit: int, now: float | None
|
|
510
824
|
) -> tuple[int, int, int, list[str]]:
|
|
@@ -777,6 +777,15 @@ def _portal_sync_tick(config: Config): # noqa: ANN201 — coord.portal_sync.Syn
|
|
|
777
777
|
internet and an outage there must never touch dispatch, merge, or any
|
|
778
778
|
verdict. The caller's try/except is the belt to that braces.
|
|
779
779
|
|
|
780
|
+
As of #2509 (PDR-4), one of `sync_tick`'s phases *is* a verdict: it
|
|
781
|
+
drains events pulled but not yet consumed
|
|
782
|
+
(``coord.portal_store.unhandled_events``) and, for each
|
|
783
|
+
`changes-requested` sign-off, dispatches a targeted Gate-A contract
|
|
784
|
+
amendment (``coord.mock_author.dispatch_acceptance_mock``) against the
|
|
785
|
+
milestone PDR-1's link (``coord portal link``) resolves — the same
|
|
786
|
+
``coord acceptance mock --amend`` an operator would type by hand, now
|
|
787
|
+
triggered by the client's own portal comment instead.
|
|
788
|
+
|
|
780
789
|
Extracted as a module-level function so tests can call it directly without
|
|
781
790
|
wiring up the async ``_tick_loop`` infrastructure (mirrors
|
|
782
791
|
``_passive_tick`` / ``_sync_issues_tick``).
|