code-coordinator 0.5.326__tar.gz → 0.5.328__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.326 → code_coordinator-0.5.328}/PKG-INFO +1 -1
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/PKG-INFO +1 -1
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/scm_version.json +2 -2
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agent.py +30 -8
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/portal.py +6 -3
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dao.py +11 -1
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/db.py +132 -1
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/decomposition_chat.py +220 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/merge_queue.py +14 -2
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/state.py +44 -7
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dao.py +82 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_db.py +403 -33
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_decomposition_chat.py +453 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_merge_queue.py +95 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_state.py +143 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.claude/commands/board.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.claude/commands/complete-session.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.claude/commands/coordinator.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.githooks/_lib.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.githooks/post-checkout +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.githooks/post-commit +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.githooks/post-merge +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/workflows/auto-release.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/workflows/publish.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/workflows/test.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.gitignore +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/CLAUDE.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/GOAL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/LICENSE +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/MANIFEST.in +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/README.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/SOURCES.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/dependency_links.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/entry_points.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/requires.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/scm_file_list.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/top_level.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/__init__.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/_board_mapping.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/acceptance.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/acceptance_drivers.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agent_app.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agent_update.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agents/opencode/.gitignore +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agents/opencode/agents/work.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agents/opencode/routing.jsonc +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/approved_work.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/audit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/auto_loop.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/block_log.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/board_schema.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/board_service.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/board_wire.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/brain.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/branch_model.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/bug_intake.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/cargo_cache.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/ci_fix.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/ci_github.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/ci_gitlab.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/ci_store.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/claim.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/cli.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/client.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/__init__.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/_common.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/acceptance.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/agent_ops.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/audit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/dispatch.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/dispatch_workers.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/drive.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/drive_queue.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/gate_a.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/gates.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/issues.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/lifecycle.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/machine.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/merge.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/milestone.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/plan_followup.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/plans.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/pr.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/release.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/repo.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/report.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/review.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/scorecard.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/sessions.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/setup.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/status.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/store_migrate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/terminal.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/test_gate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/tui.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/comments.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/config.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/config_reload.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/confirm_test.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/conflict_fix.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/__init__.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/fixture.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/index.html +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/server.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/terminal.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dead_end.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/README.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy_manifest.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy_units.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deps.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/diagnose.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dispatch.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dist_name.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/drive.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/drive_queue.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/drive_state.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/events.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/failure_class.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/filelock.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/fleet_config_health.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/forge_availability.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/freshness.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/gate_a.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/gate_b.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/gate_snapshot.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/gates.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/github_ops.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/github_throttle.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/goal.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/graph_health.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/__init__.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/aggregate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/__init__.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/_ci_pin.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/agent_install.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/cargo_targets.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/claude_binary.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/disk.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/fleet_board.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/fleet_deploy_lanes.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/fleet_phantom.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/fleet_unit_drift.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/graph.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/graphify_cli.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/index_lock.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/plan_usage.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/release_cordon.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/repo_state.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/spawned_coord.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/stalled_pipeline.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/timer_active.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/toolchain.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/unit_drift.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/unit_enablement.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/worktrees.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/cli.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/context.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/fleet_snapshot.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/models.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/pypi.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/registry.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/render.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/units.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/hooks.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/housekeeping.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/interactive.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/issue_store.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/issues_sync_status.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/liveness_auditor.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/machine_onboard.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/machine_pause.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/milestone_chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/milestone_dispatch.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/milestone_gate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/milestone_order.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/mock_author.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/models.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/network.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/new_issue_chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/__init__.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/baseline.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/cli.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/collect.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/digest.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/models.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/predicate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/service.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/store.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/transport.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notify.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/openapi.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/overlap_fence.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/overlap_predict.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/parentage.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/parentage_github.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/pipeline.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/plan_parser.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/plans.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/platform_paths.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/portal_bridge.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/portal_store.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/portal_sync.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/pr_body_lint.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/prereqs.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/progress.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/__init__.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/base.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/claude.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/claude_pty.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/opencode.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/queue_diagnose.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/reconcile.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/reconcile_tick.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/refine_chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/release_cordon.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/release_propagate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/release_verify.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/release_window.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/repo_dormancy.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/repo_edit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/repo_onboard.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/reports.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/rest_schema.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/revalidate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/review.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/scorecard.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/self_health.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/serve_app.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/portal-followup/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/release-now/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/update-issue/SKILL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/smoke.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/spend_ceiling.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/split_work.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/sql.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/stage_projection.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/store_migrate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/test_author.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/test_chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/test_orchestrator.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/test_report.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/tui_release.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/usage.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/usage_limits.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/usage_rollup.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/worker_events.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coordinator.example.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-agent.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-db-backup.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-db-backup.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-db-backup.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-drive-queue.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-drive-queue.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-failure-notify.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-failure-notify.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-fleet-watchdog.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-fleet-watchdog.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-notify.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-notify.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-release-propagate.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-release-propagate.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-release-window.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-release-window.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-serve.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web-dist-build.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web-dist-build.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web-dist-build.timer +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web-rollback.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web.service +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/node-shim.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_COORD_TUI_CI.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_COORD_WEB_CI.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_COORD_WEB_DIST.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/AGENT_OPERATIONS.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ARCHITECTURE.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ARCH_SECURITY_GATES.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/COCKPIT.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/COST_DISCIPLINE.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/CROSS_PLATFORM.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/CUSTOMER_FACING_APPS.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/CUSTOMER_PORTAL.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/DRIVE_QUEUE.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/EPHEMERAL_WORKERS.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/FORGE_MIGRATION.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/GRAPHIFY_SETUP.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ISSUE_GUIDANCE.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/MAC_MINI.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/NOTIFIER.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/OPENCODE_VERIFICATION.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/OPERATING_GOTCHAS.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/OPERATOR_GUIDES.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ORACLE_LOOP.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/PHONE_WEBAPP.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/PIPELINE_V2.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/PLATFORM_EVOLUTION.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/SECOND_BACKEND.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/STORE_SERVICE.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/TEST_FIRST_BUG_LANE.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/WEB_CONTROL_CENTER.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/WSL_WINDOWS_WORKER.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/README.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/_tokens.css +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/issue-detail.html +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/pipeline-narrow.html +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/pipeline-wide.html +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/graphify-out/.gitignore +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/install-agent.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/pyproject.toml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/audit_review_verdict_overrides.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/bootstrap-shared.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/build-worker-image.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/coordinator-machine.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/epic-down.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/epic-up.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/preflight.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/provision-worker.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/tailnet-acl.hujson +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/verify-github-token.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/codegen.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-test-runner.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-venv-rollback.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/drive-batch.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/extract-coord-tui.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/fleet_watchdog.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/gen_board_fixture.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/gen_mock_index.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/next_release_tag.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/run_tests_in_populated_home.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/run_tests_without_gh.sh +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/smoke_437_interactive.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/verify_878_review_capture.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/verify_release_published.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/verify_release_wheel.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/setup.cfg +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/SMOKE_SET.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/__init__.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/conftest.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/contract.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/manifest.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/contract.md +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/manifest.yml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/tsconfig.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/backends.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/conftest.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/board-pipeline-basic.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/opencode_run_sample.jsonl +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/all_pass.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/global_setup_crash.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/mixed_fail.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/retry_then_pass.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/skip.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/truncated.json +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_acceptance.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_acceptance_drivers.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_api_error.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_app.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_branch_base.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_branch_capture.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_config_free_1712.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_deploy_units_endpoint.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_dirty_worktree.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_graph_self_heal.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_health_h3.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_idle_restart.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_push_failure.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_reap.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_repos_and_pull.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_restart_services_endpoint.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_skills_self_heal.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_startup_diagnostics.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_update.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_update_bluegreen.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_usage_limit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_zero_commit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ambient_home_isolation.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approve_dependency_busy_2804.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approve_reject_plan.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approve_usage_gate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approved_work_2532.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approved_work_2996.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_assignment_already_recorded_daemon.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_audit_log.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_audit_outcome.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_audit_query.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_auto_loop.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_auto_release_publish_2035.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_backend_selection.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_base_checkout_restore.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_block_log.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_cap_762.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_fixture.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_read_path.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_schema.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_service.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_state.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_wire.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_brain.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_branch_model.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_bug_intake.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_build_worker_image_env_update.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cargo_cache.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_check_gh_argv_containment.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_acceptance_gate_1950.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_fix.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_gitlab.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_parity_2091.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_store.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_claim.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_claude_md_budget.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_acceptance.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign_interactive_remote.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign_provider.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign_repo_drift_2219.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_audit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_chat_continue.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_decide.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_capability_rules.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_config_provenance.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_forge_availability.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_graph.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_self.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_test_coverage.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_doctor.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_doctor_config_free_1801.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_drive.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_drive_queue.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_escalate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_fix_headless_review.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_gate_a.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_install_drift.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_install_skills.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_issue_comment.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_issue_create_label.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_issue_reopen.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_issue_view_list.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_merge.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_assign.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_capture.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_chat_add_child.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_gate_b.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_gate_c.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_order.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_ship.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_network.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_new_issue_chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_plans.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_portal.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_pr.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_pull_artifact.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_queue.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_reattach_sessions.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_refine_board.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_release_preflight.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_release_propagate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_release_window.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_repo_2220.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_scorecard.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_set_review_findings.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_advisory_terminal.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_contested_tag.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_merge_queue.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_provider.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_review_finalizing.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_test_failed_tag.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_usage_limit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_sync_comments_873.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_test_plan.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_track.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_tui_update.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_wait.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_client_base_install.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_client_resource_migration_1946.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_commands_common.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_comments.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_completion_summary.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_acceptance.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_audit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_pricing.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_usage_gate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_confirm_test.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_conflict_fix.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_conflict_fix_semantic.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_baseline.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_populated_home.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_routing.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_toolchain.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_uat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_web_sse_restart_live.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coordinator_machine.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cross_platform_imports.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard_api.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard_fixture.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard_terminal.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard_terminal_live.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dead_end.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_coord_db_backup.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_coord_web_dist.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_coord_web_rollback.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_drive_queue_unit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_failure_notify_unit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_manifest.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_notify_unit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_units_lane.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_web_unit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deprecation_telemetry.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deps.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_diagnose.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dispatch.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dispatch_target_validation.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dist_name.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_done_housekeeping.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_blocked_rendering.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_launch_argv.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_roll_pending.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_state.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_tmux.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_epic_up_capability_detection.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_epic_up_image_provenance.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_errors.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_events.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_failure_class.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_filelock.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fix_of_force_override.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fleet_config_health.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fleet_health_probes.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fleet_health_snapshot.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fleet_watchdog.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_forge_availability.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_freshness.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gate_a.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gate_b.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gate_snapshot_staleness.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gates.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gather_fleet_tmux_sessions.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gen_mock_index.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_generated_rust_fixture.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_generated_rust_requests.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_generated_types_fixture.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_github_ops.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_github_throttle.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_goal.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_graph_health.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_graph_selfheal_absent_2237.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_handoff.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_checks.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_cli.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_cli_graph.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_config.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_context.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_coord_tui_ci_pin.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_coord_web_ci_pin.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_deploy_lane_facts.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_fix.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_incident_regression.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_issues_sync_staleness.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_pypi.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_registry.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_release_cordon_probe.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_timer_active.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_toolchain.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_unit_drift.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_unit_enablement.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_wedged_drive_queue.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_hooks.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_human_attended_437.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_init.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_install_agent_venv_2911.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_integration.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_briefing_echo.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_pane_log_2541.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_prefill_state.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_session_relaunch.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_test_verdict_backstop.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_token_attribution.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_worktree.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_issue_store_seam.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_issues_sync_status.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_liveness_auditor.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_liveness_notify.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_lock_contention_ratchet.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_machine_onboard.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_machine_pause.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_merge_verify.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_dispatch.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_gate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_order.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_seam.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_mock_author.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_model_tiering.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_models.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_models_config_labels.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_needs_attention.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_network.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_new_issue_chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_next_release_tag.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_node_shim.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_baseline.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_cli.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_collect.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_config.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_drive_seam.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_isolation.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_predicate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_quiet_hours.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_service.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notify.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notify_drain.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_openapi.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_operational_defaults.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_overlap_fence.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_overlap_predict.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_packaged_deploy_units.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_parentage.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_paste_landed.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_pipeline.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_followup_approve_plan_command.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_followup_pr_command.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_followup_review_command.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_only.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_parser.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_platform_paths.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_portal_bridge.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_portal_config.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_portal_store.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_portal_sync.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_pr_body_lint.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_prereqs.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_production_db_guard.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_progress.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_provider_seam.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_providers.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_providers_config_labels.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_providers_pty.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_py_rust_mirror_inventory.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_quiet_hours.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_quiet_hours_store_2146.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reap_merged_sessions.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reap_stale_interactive_tick.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_branch.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_completions.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_merges.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_no_agent_record.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_tick.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_usage_limit_done.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_refine_chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_cordon_2101.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_cordon_deadlock_2240.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_cordon_stuck_2490.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_propagate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_propagate_threshold.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_roll_between_legs_2854.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_roll_window_handoff.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_unified_1242.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_verify.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_window.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_remote_auto_prune.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_remote_interactive_reaper.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_add.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_dormancy.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_edit_2220.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_graph_fleet_2237.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_onboard_2220.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_report_result_push.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reports.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_retry.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_retry_advisory_1606.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_retry_type_1636.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_revalidate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_end_review_without_verdict.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_parse_failure_diagnostic.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_reaffirm.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_state.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_verdict_backstop.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_verdict_override_audit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_verdict_relay.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_zero_commits.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_scoped_review_wiring.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_scorecard.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_self_health.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_serve.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_serve_app_board_trim.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_serve_rest_routes.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_session.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_slice_issue_attribution.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_smoke.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_smoke_live_checkout_restore.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_smoke_workflow.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_spend_ceiling.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_spend_ceiling_coordinator.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_split.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_split_work.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_sql_dialect.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_sqlite_connect_ratchet.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stage_projection.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stale_busy_reviewer_697.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stalled_pipeline.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_state_review_findings_daemon.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_status_fleet_footer.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stop_1567.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_store_contract.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_store_migrate.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stuck.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_terminal_command.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_author.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_chat.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_orchestrator.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_report.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_verdict_parsing.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_verdict_transcript_floor.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_text_io_encoding_audit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_thin_client_board_audit.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_thin_client_config_load_1080.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_thin_client_daemon_routing_906.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_tmux_host.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_tmux_session.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_transcript_floor.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_usage.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_usage_limits.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_usage_rollup.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_venv_live_install_2121.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_version_single_source.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_watch.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_env_venv_isolation.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_events.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_image_pin_sync.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_safety.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_test_scoping.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worktree.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worktree_rmtree_chokepoint.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_write_parity.py +0 -0
- {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/write_parity.py +0 -0
|
@@ -4027,14 +4027,36 @@ response (a session that silently chose to file instead of asking is \
|
|
|
4027
4027
|
exactly the failure this design exists to prevent); the submission's \
|
|
4028
4028
|
OUTCOME, AUDIENCE, DONE DEFINITION, and CONSTRAINTS; its mapped repo(s); \
|
|
4029
4029
|
`coordinator.yml` topology context for those repo(s) (depends_on, which \
|
|
4030
|
-
machines claim each repo);
|
|
4031
|
-
|
|
4032
|
-
|
|
4033
|
-
|
|
4034
|
-
|
|
4035
|
-
answered
|
|
4036
|
-
|
|
4037
|
-
|
|
4030
|
+
machines claim each repo); a HOUSE STACK section (#2997) naming what the \
|
|
4031
|
+
REST of this org's registered repos already run and deploy on, which \
|
|
4032
|
+
managed services are already in use and already paid for, and any coord \
|
|
4033
|
+
gate that assumes a particular host; and a RUNNING CONTEXT section \
|
|
4034
|
+
rendering the submission's full ledger so far — every question asked and \
|
|
4035
|
+
(if answered) its answer, every decision on record (current and archived, \
|
|
4036
|
+
archived ones carrying WHY they were ruled out), and the current \
|
|
4037
|
+
narrative. Read RUNNING CONTEXT before doing anything else: never re-ask a \
|
|
4038
|
+
question already answered there, and never re-propose a decision already \
|
|
4039
|
+
archived there without new information that changes the calculus — cite \
|
|
4040
|
+
the existing entry's seq/reason if the operator or a re-briefed fact \
|
|
4041
|
+
brings it up again.
|
|
4042
|
+
|
|
4043
|
+
**HOUSE STACK is context, not a mandate** — you may still propose \
|
|
4044
|
+
something outside it when it genuinely fits better (a greenfield repo is \
|
|
4045
|
+
not required to inherit the fleet's stack). But you may never propose a \
|
|
4046
|
+
stack/architecture/hosting/vendor decision in SILENCE about it: if HOUSE \
|
|
4047
|
+
STACK names a service that's a plausible fit and you're proposing \
|
|
4048
|
+
something else, you MUST record the house-stack option itself as a \
|
|
4049
|
+
considered-and-rejected alternative (`coord portal decision propose` \
|
|
4050
|
+
naming it, then `coord portal decision reject ... "<why it loses>"`) in \
|
|
4051
|
+
the SAME iteration you propose your own recommendation — the same \
|
|
4052
|
+
"record every alternative you seriously considered and ruled OUT" rule the \
|
|
4053
|
+
PROPOSE terminal move already requires below applies to the house stack \
|
|
4054
|
+
first, not last. The failure this closes (#2997, SUB-1EA1D3) was a session \
|
|
4055
|
+
proposing a brand-new vendor for a greenfield repo with FOUR rejected \
|
|
4056
|
+
alternatives on record and Cloudflare — the stack the rest of the org \
|
|
4057
|
+
already runs and pays for — never mentioned in any of them. Silence, not \
|
|
4058
|
+
disagreement, was the bug; a reasoned rejection is a completely fine \
|
|
4059
|
+
outcome.
|
|
4038
4060
|
|
|
4039
4061
|
You can always re-fetch the live ledger mid-session with:
|
|
4040
4062
|
|
|
@@ -731,6 +731,7 @@ def _run_decompose_chat_interactive(
|
|
|
731
731
|
build_decomposition_chat_briefing,
|
|
732
732
|
describe_unapproved_submission,
|
|
733
733
|
fetch_running_context,
|
|
734
|
+
house_stack_context,
|
|
734
735
|
render_running_context_section,
|
|
735
736
|
repo_topology_context,
|
|
736
737
|
resolve_approved_submission,
|
|
@@ -794,6 +795,7 @@ def _run_decompose_chat_interactive(
|
|
|
794
795
|
# that the Ask move would "refuse loudly" — no longer true.
|
|
795
796
|
|
|
796
797
|
topology_context = repo_topology_context(cfg, repos)
|
|
798
|
+
house_stack = house_stack_context(cfg, exclude_repos=repos)
|
|
797
799
|
discuss_mode, discuss_reason = select_discuss_mode(cfg, submission, discuss_override=discuss)
|
|
798
800
|
running_context = render_running_context_section(fetch_running_context(submission_id))
|
|
799
801
|
briefing = build_decomposition_chat_briefing(
|
|
@@ -802,6 +804,7 @@ def _run_decompose_chat_interactive(
|
|
|
802
804
|
discuss=discuss_mode,
|
|
803
805
|
discuss_reason=discuss_reason,
|
|
804
806
|
running_context_section=running_context,
|
|
807
|
+
house_stack_context_section=house_stack,
|
|
805
808
|
)
|
|
806
809
|
|
|
807
810
|
repo_path = str(_Path(machine.repo_path(repos[0]) or str(_Path.cwd())).expanduser())
|
|
@@ -819,9 +822,9 @@ def _run_decompose_chat_interactive(
|
|
|
819
822
|
seed_prompt = (
|
|
820
823
|
f"Intake session for portal submission {submission_id} "
|
|
821
824
|
f"(MODE: {mode_word} — {discuss_reason}): read the full context at "
|
|
822
|
-
f"{brief_path} (submission fields, repo topology,
|
|
823
|
-
"context ledger so far) and let's work through it.
|
|
824
|
-
"ATTENDED session: state your read and your PROPOSED exit, then stop "
|
|
825
|
+
f"{brief_path} (submission fields, repo topology, the house stack, "
|
|
826
|
+
"and the running-context ledger so far) and let's work through it. "
|
|
827
|
+
"This is an ATTENDED session: state your read and your PROPOSED exit, then stop "
|
|
825
828
|
"and wait for me — write nothing until I answer (#2867)."
|
|
826
829
|
)
|
|
827
830
|
|
|
@@ -393,6 +393,15 @@ class SqliteStore:
|
|
|
393
393
|
forward-compatible stand-in the issue asks for (#1039 can replace the
|
|
394
394
|
semantics without a wire-shape change — it's still one integer).
|
|
395
395
|
Fail-open to 0 so a missing/pre-migration table never 503s the board.
|
|
396
|
+
|
|
397
|
+
#2983: that fail-open needs a rollback to actually be fail-open on
|
|
398
|
+
Postgres. This runs inside a caller's ``with closing(self._connect())``
|
|
399
|
+
block alongside many other reads (``_board_meta``, ``_round_number``,
|
|
400
|
+
every ``_table`` call in ``board_projection``), and Postgres aborts the
|
|
401
|
+
whole transaction on a failed statement — so a missing ``audit_log``
|
|
402
|
+
took out every *sibling* read on that connection too, producing
|
|
403
|
+
precisely the 503 this guard exists to prevent. Nothing uncommitted
|
|
404
|
+
can be lost: ``SqliteStore``'s connections are opened read-only.
|
|
396
405
|
"""
|
|
397
406
|
try:
|
|
398
407
|
cutoff = time.time() - _AUDIT_RECENT_WINDOW_SECONDS
|
|
@@ -400,7 +409,8 @@ class SqliteStore:
|
|
|
400
409
|
conn, "SELECT COUNT(*) AS n FROM audit_log WHERE ts >= ?", (cutoff,)
|
|
401
410
|
).fetchone()
|
|
402
411
|
return int(row["n"]) if row else 0
|
|
403
|
-
except sql.driver_error(conn):
|
|
412
|
+
except sql.driver_error(conn) as exc:
|
|
413
|
+
db_mod.rollback_after_driver_error(conn, exc) # #2983: caller reuses `conn`
|
|
404
414
|
return 0
|
|
405
415
|
|
|
406
416
|
# ── public reads ────────────────────────────────────────────────────────────
|
|
@@ -429,6 +429,79 @@ def close() -> None:
|
|
|
429
429
|
|
|
430
430
|
_T = TypeVar("_T")
|
|
431
431
|
|
|
432
|
+
|
|
433
|
+
# ── Recovering a connection after a swallowed driver error (#2983) ──────────
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
def _board_connection_if_open() -> Any | None:
|
|
437
|
+
"""This process's already-open board connection, or ``None`` (#2983).
|
|
438
|
+
|
|
439
|
+
Deliberately NOT :func:`get_connection`: this is called from inside a
|
|
440
|
+
driver-error handler, where *opening* a connection that wasn't open
|
|
441
|
+
before would be a surprising side effect (and, on the SQLite path,
|
|
442
|
+
would create the database file). It only ever hands back a connection
|
|
443
|
+
something else already opened — the ``override_connection()``/SQLite
|
|
444
|
+
singleton, else THIS thread's Postgres connection, mirroring
|
|
445
|
+
:func:`get_connection`'s own precedence order.
|
|
446
|
+
"""
|
|
447
|
+
if _conn is not None:
|
|
448
|
+
return _conn
|
|
449
|
+
return getattr(_pg_thread_local, "conn", None)
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def rollback_after_driver_error(conn: Any | None, exc: BaseException) -> None:
|
|
453
|
+
"""Clear the aborted transaction *exc* left behind on *conn*, so a
|
|
454
|
+
handler that swallowed *exc* and keeps using the same connection still
|
|
455
|
+
has a usable one (#2983).
|
|
456
|
+
|
|
457
|
+
**The rule this implements.** After catching a driver error through the
|
|
458
|
+
dialect seam (``except sql.driver_error(conn):`` /
|
|
459
|
+
``except sql.driver_errors():``), a handler that intends to CONTINUE on
|
|
460
|
+
the same connection must roll back first. A handler that re-raises need
|
|
461
|
+
not. Postgres aborts the *whole* transaction on any failed statement,
|
|
462
|
+
so without this every statement issued afterwards on that connection —
|
|
463
|
+
for the rest of the process, since ``coord.db``'s connection is a
|
|
464
|
+
process-/thread-lived singleton — raises
|
|
465
|
+
``psycopg.errors.InFailedSqlTransaction``. That is what made the whole
|
|
466
|
+
#2597/#2689/#2784 degrade-gracefully layer inert or actively harmful on
|
|
467
|
+
the second backend: guards written to *prevent* a crash caused one.
|
|
468
|
+
SQLite has no such concept — a failed statement there leaves the
|
|
469
|
+
connection perfectly usable — which is exactly why every one of these
|
|
470
|
+
21 handler sites read as correct for years.
|
|
471
|
+
|
|
472
|
+
**Gated on the exception, not on the connection's dialect.** *exc* is a
|
|
473
|
+
Postgres driver error iff it carries a SQLSTATE (``psycopg3``'s
|
|
474
|
+
``.sqlstate``, ``psycopg2``'s ``.pgcode`` — the same pair
|
|
475
|
+
:func:`is_lock_contention_error` dispatches on, for the same #2719
|
|
476
|
+
reason: no config flag, no driver import). Keying off that rather than
|
|
477
|
+
``sql.detect_dialect(conn)`` makes "SQLite behaviour is byte-identical
|
|
478
|
+
to before #2983" true *by construction* rather than by argument: a
|
|
479
|
+
``sqlite3.Error`` has no SQLSTATE, so this returns without touching the
|
|
480
|
+
connection and no SQLite caller can lose uncommitted work it expected
|
|
481
|
+
to survive into the next statement (``retry_on_locked``'s multi-
|
|
482
|
+
statement writers being the case where that would actually be
|
|
483
|
+
observable). #2982's sibling fix in ``_migrate_add_columns`` predates
|
|
484
|
+
this helper and rolls back unconditionally; it is correct there (the
|
|
485
|
+
only uncommitted statement at that point is the one that just failed)
|
|
486
|
+
and is deliberately left as-is.
|
|
487
|
+
|
|
488
|
+
A ``None`` *conn* is a no-op — see :func:`_board_connection_if_open`,
|
|
489
|
+
which may legitimately have nothing to hand over. A failure of the
|
|
490
|
+
rollback itself is suppressed: this runs inside an ``except`` block
|
|
491
|
+
whose original exception is the interesting one, and masking it with a
|
|
492
|
+
secondary error from the recovery attempt would be strictly worse than
|
|
493
|
+
leaving the connection unrecovered.
|
|
494
|
+
"""
|
|
495
|
+
if conn is None:
|
|
496
|
+
return
|
|
497
|
+
if getattr(exc, "sqlstate", None) is None and getattr(exc, "pgcode", None) is None:
|
|
498
|
+
return # not a Postgres driver error — nothing was aborted
|
|
499
|
+
try:
|
|
500
|
+
conn.rollback()
|
|
501
|
+
except Exception: # noqa: BLE001 — never mask the caught driver error
|
|
502
|
+
pass
|
|
503
|
+
|
|
504
|
+
|
|
432
505
|
# #2538: a handful of consecutive short retries — long enough to ride out a
|
|
433
506
|
# concurrent writer (the daemon's own passive tick, another `coord merge`/
|
|
434
507
|
# `coord notify` invocation) that only holds the DB for a moment, short
|
|
@@ -517,6 +590,7 @@ def is_lock_contention_error(exc: BaseException) -> bool:
|
|
|
517
590
|
def retry_on_locked(
|
|
518
591
|
write: Callable[[], _T],
|
|
519
592
|
*,
|
|
593
|
+
conn: Any | None = None,
|
|
520
594
|
attempts: int = _LOCK_RETRY_ATTEMPTS,
|
|
521
595
|
base_delay: float = _LOCK_RETRY_BASE_DELAY_S,
|
|
522
596
|
) -> _T:
|
|
@@ -547,12 +621,58 @@ def retry_on_locked(
|
|
|
547
621
|
``coord.state._record_dispatched_assignment_local``, whose caller —
|
|
548
622
|
``coord.auto_loop._dispatch_fix`` — treats it as a declined dispatch
|
|
549
623
|
rather than letting it crash the whole run).
|
|
624
|
+
|
|
625
|
+
Transaction recovery, and whether "retry" means anything on Postgres
|
|
626
|
+
(#2983)
|
|
627
|
+
------------------------------------------------------------------
|
|
628
|
+
SQLite's ``SQLITE_BUSY`` retry model is "the statement never ran; the
|
|
629
|
+
lock is held elsewhere; the transaction is untouched" — so re-running
|
|
630
|
+
*write* verbatim is exactly the right move, and has been since #2538.
|
|
631
|
+
Postgres's three contention SQLSTATEs
|
|
632
|
+
(:data:`_POSTGRES_LOCK_CONTENTION_SQLSTATES`) are contention-shaped in
|
|
633
|
+
the same way, but they ALSO abort the whole transaction. That makes the
|
|
634
|
+
retry loop *worse than useless* on Postgres without recovery: attempt 2
|
|
635
|
+
onwards raises ``InFailedSqlTransaction`` instead of re-attempting the
|
|
636
|
+
write, ``is_lock_contention_error`` reads False for it, and the loop
|
|
637
|
+
bails out on attempt 2 re-raising the wrong error — the #2597/#2689
|
|
638
|
+
retry budget silently reduced to a single attempt.
|
|
639
|
+
|
|
640
|
+
So the answer to "does SQLite's retry model have a Postgres analogue at
|
|
641
|
+
all, or should the retry just be a no-op there?" is: it has one, and it
|
|
642
|
+
is the standard Postgres idiom — **roll back, then re-run the whole
|
|
643
|
+
transaction.** Every *write* callable in this tree is already a
|
|
644
|
+
self-contained transaction (its own statements followed by its own
|
|
645
|
+
``conn.commit()``), which is precisely what makes re-running it after a
|
|
646
|
+
rollback correct rather than a partial replay. Hence
|
|
647
|
+
:func:`rollback_after_driver_error` before both the retry and the final
|
|
648
|
+
re-raise: after the re-raise the connection must still be usable too,
|
|
649
|
+
because ~13 of this tree's callers catch that exception and *swallow*
|
|
650
|
+
it (a cache mirror whose upstream GitHub write already landed must not
|
|
651
|
+
turn into a 503), then keep using the same singleton connection.
|
|
652
|
+
Recovering here rather than in each of those handlers is what keeps the
|
|
653
|
+
guarantee in one place: **when this function returns OR raises, it has
|
|
654
|
+
not left an aborted transaction behind.**
|
|
655
|
+
|
|
656
|
+
*conn* is the connection *write* writes through, needed only for that
|
|
657
|
+
rollback. It defaults to :func:`_board_connection_if_open` because
|
|
658
|
+
every call site in this tree writes through ``get_connection()``
|
|
659
|
+
(``coord.state``, ``coord.merge_queue``, ``coord.audit``,
|
|
660
|
+
``coord.commands.merge``), so the default is correct for all of them
|
|
661
|
+
and none had to be churned; pass it explicitly if you ever write
|
|
662
|
+
through a different connection. Rolling back an innocent already-
|
|
663
|
+
committed connection would be a no-op anyway — every writer here
|
|
664
|
+
commits immediately — and the rollback is skipped entirely unless the
|
|
665
|
+
caught exception carries a Postgres SQLSTATE, so the SQLite path is
|
|
666
|
+
byte-identical to before #2983.
|
|
550
667
|
"""
|
|
551
668
|
delay = base_delay
|
|
552
669
|
for attempt in range(1, attempts + 1):
|
|
553
670
|
try:
|
|
554
671
|
return write()
|
|
555
672
|
except sql.driver_errors() as exc:
|
|
673
|
+
rollback_after_driver_error(
|
|
674
|
+
conn if conn is not None else _board_connection_if_open(), exc
|
|
675
|
+
)
|
|
556
676
|
if not is_lock_contention_error(exc) or attempt >= attempts:
|
|
557
677
|
raise
|
|
558
678
|
time.sleep(delay)
|
|
@@ -619,10 +739,21 @@ def _read_schema_version(conn: sqlite3.Connection) -> int:
|
|
|
619
739
|
the current ``_DB_SCHEMA_VERSION`` and skips the write path entirely —
|
|
620
740
|
until the next bump (#2675: that skip is exactly what silently dropped
|
|
621
741
|
two `_migrate_add_columns` entries when they landed without one).
|
|
742
|
+
|
|
743
|
+
#2983: the "table doesn't exist yet" swallow below needs its own
|
|
744
|
+
rollback — #2982's fix is one layer downstream and does not cover this.
|
|
745
|
+
On a fresh Postgres database this is the FIRST statement `_open_postgres`
|
|
746
|
+
-> `_migrate_if_needed` runs, it errors (`UndefinedTable`), and that
|
|
747
|
+
aborts the transaction; the caller then continues on the same connection
|
|
748
|
+
straight into `_fix_schema_version_table`'s `CREATE TABLE IF NOT
|
|
749
|
+
EXISTS`, which raises `InFailedSqlTransaction`. So on Postgres the
|
|
750
|
+
brand-new-database path — the one case this guard exists for — could
|
|
751
|
+
never get past its own first statement.
|
|
622
752
|
"""
|
|
623
753
|
try:
|
|
624
754
|
row = sql.execute(conn, "SELECT MAX(version) FROM schema_version").fetchone()
|
|
625
|
-
except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
|
|
755
|
+
except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
|
|
756
|
+
rollback_after_driver_error(conn, exc) # #2983: caller keeps using `conn`
|
|
626
757
|
return 0 # table doesn't exist yet
|
|
627
758
|
if row is None or row[0] is None:
|
|
628
759
|
return 0
|
|
@@ -409,6 +409,209 @@ def pick_decomposition_chat_machine(cfg: "Config", repos: list[str]) -> "Machine
|
|
|
409
409
|
return None
|
|
410
410
|
|
|
411
411
|
|
|
412
|
+
# ── #2997: HOUSE STACK — the fleet's existing stack, not just this
|
|
413
|
+
# submission's mapped repo(s). See the module briefing (SUB-1EA1D3, the
|
|
414
|
+
# grocery-list submission) for why this section exists: a MODE: DISCUSS
|
|
415
|
+
# iteration proposed Vite+React+Supabase for a greenfield repo without ever
|
|
416
|
+
# weighing Cloudflare — the stack every other repo in this org already runs
|
|
417
|
+
# and pays for — because nothing in the briefing carried it. This section is
|
|
418
|
+
# CONTEXT, not a mandate (the design sketch's own framing): a session may
|
|
419
|
+
# still propose something else, but the system prompt (coord/agent.py) is
|
|
420
|
+
# what requires it to then record the house alternative as a
|
|
421
|
+
# considered-and-rejected decision rather than staying silent about it.
|
|
422
|
+
|
|
423
|
+
#: Root-level marker file -> the stack signal its mere presence implies.
|
|
424
|
+
#: Deliberately mechanical and small, same posture as `_SEEDED_ROOT_FILES`
|
|
425
|
+
#: above: cheap to check, cheap to extend, wrong at worst by omission (a
|
|
426
|
+
#: repo using something unlisted here just contributes nothing) never by a
|
|
427
|
+
#: false positive.
|
|
428
|
+
_ROOT_STACK_MARKERS: dict[str, str] = {
|
|
429
|
+
"wrangler.toml": "Cloudflare Workers/Pages (wrangler.toml)",
|
|
430
|
+
"Cargo.toml": "Rust (Cargo.toml)",
|
|
431
|
+
"package.json": "Node/TypeScript (package.json)",
|
|
432
|
+
"pyproject.toml": "Python (pyproject.toml)",
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
#: Same idea, scoped to `.github/workflows/` — a deploy LANE is a workflow
|
|
436
|
+
#: file, not a root marker.
|
|
437
|
+
_WORKFLOW_STACK_MARKERS: dict[str, str] = {
|
|
438
|
+
"deploy-cloudflare.yml": "Cloudflare Pages deploy (.github/workflows/deploy-cloudflare.yml)",
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
#: `wrangler.toml` binding keys -> the managed Cloudflare service they name
|
|
442
|
+
#: (Cloudflare's own `wrangler.toml` schema) — read only when the file is
|
|
443
|
+
#: actually present, so this never guesses at a service that isn't wired up.
|
|
444
|
+
_WRANGLER_BINDING_MARKERS: dict[str, str] = {
|
|
445
|
+
"d1_databases": "Cloudflare D1 (bound in wrangler.toml)",
|
|
446
|
+
"r2_buckets": "Cloudflare R2 (bound in wrangler.toml)",
|
|
447
|
+
"kv_namespaces": "Cloudflare KV (bound in wrangler.toml)",
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
#: Keywords worth a mention when they show up in a repo's own `CLAUDE.md` —
|
|
451
|
+
#: the design sketch's "cheapest read from each repo's own CLAUDE.md" half,
|
|
452
|
+
#: for a lane that leaves no marker file at all (e.g. Cloudflare Access,
|
|
453
|
+
#: which is edge config, never a repo artifact — coord-portal's own
|
|
454
|
+
#: `docs/CUSTOMER_PORTAL.md` names it in prose, not in a file this module
|
|
455
|
+
#: could otherwise detect). Casefolded substring match: a false positive
|
|
456
|
+
#: here only adds one extra weighed line, never a wrong guess about what
|
|
457
|
+
#: exists, since the word is genuinely present in the repo's own docs.
|
|
458
|
+
_CLAUDE_MD_KEYWORD_MARKERS: dict[str, str] = {
|
|
459
|
+
"cloudflare access": "Cloudflare Access (mentioned in CLAUDE.md)",
|
|
460
|
+
"cloudflare pages": "Cloudflare Pages (mentioned in CLAUDE.md)",
|
|
461
|
+
"cloudflare d1": "Cloudflare D1 (mentioned in CLAUDE.md)",
|
|
462
|
+
"cloudflare r2": "Cloudflare R2 (mentioned in CLAUDE.md)",
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
def _repo_stack_signals(repo_github: str, branch: str) -> list[str]:
|
|
467
|
+
"""Mechanical, best-effort stack signals for *repo_github* on *branch* —
|
|
468
|
+
root-level marker files, known deploy-workflow files under
|
|
469
|
+
`.github/workflows/`, and (when `wrangler.toml` is present) the managed
|
|
470
|
+
Cloudflare services it binds.
|
|
471
|
+
|
|
472
|
+
**Degrades gracefully** (#2997 acceptance criterion): any lookup
|
|
473
|
+
failure, or a repo with nothing recognisable, returns `[]` rather than a
|
|
474
|
+
guess — this feeds an informational briefing section, not a gate, so
|
|
475
|
+
silence is always the safe failure mode.
|
|
476
|
+
|
|
477
|
+
"Any lookup failure" is meant literally, hence the deliberately broad
|
|
478
|
+
``except Exception`` guards below rather than the narrow
|
|
479
|
+
``RuntimeError``/``ValueError`` pair an earlier revision used. The
|
|
480
|
+
Contents-API seam this walks is not exception-typed end to end:
|
|
481
|
+
``github_ops.list_repo_dir`` indexes ``entry["name"]`` on whatever JSON
|
|
482
|
+
came back (``KeyError``/``TypeError`` on a malformed or
|
|
483
|
+
unexpectedly-shaped payload), and ``_gh`` itself is a subprocess
|
|
484
|
+
boundary that a caller lower in the stack can surface as ``OSError``.
|
|
485
|
+
None of those are worth turning an *informational* paragraph into a
|
|
486
|
+
hard failure of ``coord portal decompose-chat`` for — a crash here
|
|
487
|
+
costs the operator the whole intake session, while a swallowed lookup
|
|
488
|
+
costs one unweighed line.
|
|
489
|
+
"""
|
|
490
|
+
from coord import github_ops # noqa: PLC0415
|
|
491
|
+
|
|
492
|
+
try:
|
|
493
|
+
root_files, root_dirs = _dir_entries(repo_github, "", branch)
|
|
494
|
+
except Exception: # noqa: BLE001 - informational section, never a gate
|
|
495
|
+
return []
|
|
496
|
+
|
|
497
|
+
signals = [label for marker, label in _ROOT_STACK_MARKERS.items() if marker in root_files]
|
|
498
|
+
|
|
499
|
+
def _file_text(path: str) -> str:
|
|
500
|
+
"""*path*'s contents on *branch*, or ``""`` on any lookup failure."""
|
|
501
|
+
try:
|
|
502
|
+
text = github_ops.get_repo_file(repo_github, path, branch)
|
|
503
|
+
# `isinstance` rather than a bare return: a Contents-API payload
|
|
504
|
+
# that decodes to something other than text must not turn a
|
|
505
|
+
# substring probe below into a `TypeError`.
|
|
506
|
+
return text if isinstance(text, str) else ""
|
|
507
|
+
except Exception: # noqa: BLE001 - see the docstring
|
|
508
|
+
# Covers `binascii.Error` (a ValueError subclass) from
|
|
509
|
+
# `get_repo_file_with_sha`'s `base64.b64decode` on a malformed
|
|
510
|
+
# Contents-API response, `GhError` from the subprocess boundary,
|
|
511
|
+
# and anything else the seam can surface: this feeds an
|
|
512
|
+
# informational section, not a gate, so a failed read degrades
|
|
513
|
+
# to "no signal" rather than blowing up the briefing build.
|
|
514
|
+
return ""
|
|
515
|
+
|
|
516
|
+
def _entries(path: str) -> tuple[list[str], list[str]]:
|
|
517
|
+
"""``(files, dirs)`` under *path*, or ``([], [])`` on any failure."""
|
|
518
|
+
try:
|
|
519
|
+
return _dir_entries(repo_github, path, branch)
|
|
520
|
+
except Exception: # noqa: BLE001 - see the docstring
|
|
521
|
+
return [], []
|
|
522
|
+
|
|
523
|
+
if "wrangler.toml" in root_files:
|
|
524
|
+
wrangler_text = _file_text("wrangler.toml")
|
|
525
|
+
signals += [
|
|
526
|
+
label for key, label in _WRANGLER_BINDING_MARKERS.items() if key in wrangler_text
|
|
527
|
+
]
|
|
528
|
+
|
|
529
|
+
if "CLAUDE.md" in root_files:
|
|
530
|
+
claude_md_text = _file_text("CLAUDE.md").casefold()
|
|
531
|
+
signals += [
|
|
532
|
+
label for key, label in _CLAUDE_MD_KEYWORD_MARKERS.items() if key in claude_md_text
|
|
533
|
+
]
|
|
534
|
+
|
|
535
|
+
if ".github" in root_dirs:
|
|
536
|
+
_, gh_dirs = _entries(".github")
|
|
537
|
+
if "workflows" in gh_dirs:
|
|
538
|
+
wf_files, _ = _entries(".github/workflows")
|
|
539
|
+
signals += [
|
|
540
|
+
label for marker, label in _WORKFLOW_STACK_MARKERS.items() if marker in wf_files
|
|
541
|
+
]
|
|
542
|
+
|
|
543
|
+
return signals
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
def house_stack_context(cfg: "Config", exclude_repos: list[str] | None = None) -> str:
|
|
547
|
+
"""Render the HOUSE STACK briefing section: what the *rest* of the
|
|
548
|
+
fleet's repos already run and deploy on, derived mechanically from each
|
|
549
|
+
registered repo's tracked files rather than hand-maintained (the design
|
|
550
|
+
sketch's own preference — a hand-maintained approved-stack list rots and
|
|
551
|
+
suppresses the reasoning the decision archive exists to capture).
|
|
552
|
+
|
|
553
|
+
*exclude_repos* is normally the submission's own mapped repo(s) — the
|
|
554
|
+
one(s) actually being decomposed, which say nothing about "the REST of
|
|
555
|
+
the fleet" even when they aren't greenfield.
|
|
556
|
+
|
|
557
|
+
A repo that contributes no recognisable signal (no CLAUDE.md, no known
|
|
558
|
+
marker file, no known workflow file) is omitted from the per-repo list
|
|
559
|
+
entirely — #2997's "degrades gracefully" criterion: nothing beats a
|
|
560
|
+
wrong guess. When *no* repo in the fleet contributes anything, the whole
|
|
561
|
+
section reads as empty rather than asserting a managed-services list or
|
|
562
|
+
a host-coupled gate that nothing here actually evidences.
|
|
563
|
+
|
|
564
|
+
One sick repo never costs the operator the whole intake session: each
|
|
565
|
+
repo's probe is isolated, so a lookup that blows up for `acme/api`
|
|
566
|
+
still leaves `acme/coord-portal`'s Cloudflare signal in the rendered
|
|
567
|
+
section. This section is built on the critical path of *every*
|
|
568
|
+
`coord portal decompose-chat` (headless and `--interactive` alike) —
|
|
569
|
+
an informational paragraph must never be able to abort a dispatch.
|
|
570
|
+
"""
|
|
571
|
+
exclude = set(exclude_repos or [])
|
|
572
|
+
per_repo: list[str] = []
|
|
573
|
+
saw_cloudflare = False
|
|
574
|
+
for repo_cfg in cfg.repos:
|
|
575
|
+
if repo_cfg.name in exclude:
|
|
576
|
+
continue
|
|
577
|
+
branch = repo_cfg.default_branch or "main"
|
|
578
|
+
try:
|
|
579
|
+
signals = _repo_stack_signals(repo_cfg.github, branch)
|
|
580
|
+
except Exception: # noqa: BLE001 - one repo must not sink the section
|
|
581
|
+
continue
|
|
582
|
+
if not signals:
|
|
583
|
+
continue
|
|
584
|
+
per_repo.append(f"- {repo_cfg.name} ({repo_cfg.github}): {'; '.join(signals)}")
|
|
585
|
+
if any("Cloudflare" in s for s in signals):
|
|
586
|
+
saw_cloudflare = True
|
|
587
|
+
|
|
588
|
+
if not per_repo:
|
|
589
|
+
return (
|
|
590
|
+
"HOUSE STACK (fleet-wide, #2997): no recognisable stack/deploy signal on any "
|
|
591
|
+
"other registered repo — nothing to weigh here."
|
|
592
|
+
)
|
|
593
|
+
|
|
594
|
+
lines = [
|
|
595
|
+
"HOUSE STACK (fleet-wide, not just this submission's mapped repo(s) — #2997):",
|
|
596
|
+
*per_repo,
|
|
597
|
+
"",
|
|
598
|
+
"This is CONTEXT, not a mandate: propose something else if it genuinely fits "
|
|
599
|
+
"better, but if you do, record the house-stack alternative as a "
|
|
600
|
+
"considered-and-rejected decision with a reason (`coord portal decision propose` "
|
|
601
|
+
"then `coord portal decision reject ... \"<why the house stack loses>\"`) instead "
|
|
602
|
+
"of leaving it unweighed.",
|
|
603
|
+
]
|
|
604
|
+
if saw_cloudflare:
|
|
605
|
+
lines.append("")
|
|
606
|
+
lines.append(
|
|
607
|
+
"Gate that assumes a host: `coord portal enqueue-preview` reads a Cloudflare "
|
|
608
|
+
"Pages PREVIEW deployment URL created per-PR by `cloudflare/pages-action` "
|
|
609
|
+
"(docs/CUSTOMER_PORTAL.md) — choosing a different host means the #2359 "
|
|
610
|
+
"customer preview-approval gate does not apply without new coord work."
|
|
611
|
+
)
|
|
612
|
+
return "\n".join(lines)
|
|
613
|
+
|
|
614
|
+
|
|
412
615
|
def repo_topology_context(cfg: "Config", repos: list[str]) -> str:
|
|
413
616
|
"""One paragraph of `coordinator.yml` topology per mapped repo — the
|
|
414
617
|
"coordinator.yml topology context ... the same way docs/CUSTOMER_PORTAL.md's
|
|
@@ -442,6 +645,7 @@ def build_decomposition_chat_briefing(
|
|
|
442
645
|
discuss: bool,
|
|
443
646
|
discuss_reason: str,
|
|
444
647
|
running_context_section: str = "",
|
|
648
|
+
house_stack_context_section: str = "",
|
|
445
649
|
) -> str:
|
|
446
650
|
"""Compose the seed briefing the worker sees as its first user message.
|
|
447
651
|
|
|
@@ -454,6 +658,15 @@ def build_decomposition_chat_briefing(
|
|
|
454
658
|
pane already shows the operator (ms-67 contract §4b: "nothing hidden
|
|
455
659
|
between 'looks right in the panel' and 'is what the session got'"),
|
|
456
660
|
plus everything #2749's ledger has accumulated across prior iterations.
|
|
661
|
+
|
|
662
|
+
**#2997:** also carries a HOUSE STACK section (*house_stack_context_section*,
|
|
663
|
+
normally :func:`house_stack_context`'s output) — the fleet's existing
|
|
664
|
+
stack and infrastructure conventions, which used to be entirely absent
|
|
665
|
+
from this briefing. That gap is what let a MODE: DISCUSS iteration on a
|
|
666
|
+
greenfield repo propose a brand-new vendor (Supabase) without ever
|
|
667
|
+
weighing the Cloudflare stack the rest of this org already runs and
|
|
668
|
+
pays for (SUB-1EA1D3, this issue's own measured regression case). Empty
|
|
669
|
+
by default so every existing caller/test keeps working unchanged.
|
|
457
670
|
"""
|
|
458
671
|
submission_id = submission.get("submission_id", "")
|
|
459
672
|
repos = submission.get("repos") or []
|
|
@@ -484,6 +697,11 @@ def build_decomposition_chat_briefing(
|
|
|
484
697
|
parts.append("COORDINATOR.YML TOPOLOGY CONTEXT:")
|
|
485
698
|
parts.append(topology_context)
|
|
486
699
|
parts.append("")
|
|
700
|
+
parts.append(
|
|
701
|
+
house_stack_context_section.strip()
|
|
702
|
+
or "HOUSE STACK (fleet-wide, #2997): (not computed for this briefing)"
|
|
703
|
+
)
|
|
704
|
+
parts.append("")
|
|
487
705
|
parts.append(
|
|
488
706
|
running_context_section.strip()
|
|
489
707
|
or "RUNNING CONTEXT (from the portal ledger): (none yet — first iteration)"
|
|
@@ -677,6 +895,7 @@ def dispatch_decomposition_chat(
|
|
|
677
895
|
machine = picked
|
|
678
896
|
|
|
679
897
|
topology_context = repo_topology_context(config, repos)
|
|
898
|
+
house_stack = house_stack_context(config, exclude_repos=repos)
|
|
680
899
|
discuss_mode, discuss_reason = select_discuss_mode(
|
|
681
900
|
config, submission, discuss_override=discuss
|
|
682
901
|
)
|
|
@@ -687,6 +906,7 @@ def dispatch_decomposition_chat(
|
|
|
687
906
|
discuss=discuss_mode,
|
|
688
907
|
discuss_reason=discuss_reason,
|
|
689
908
|
running_context_section=running_context,
|
|
909
|
+
house_stack_context_section=house_stack,
|
|
690
910
|
)
|
|
691
911
|
|
|
692
912
|
resolved_model = config.models.default
|
|
@@ -42,7 +42,7 @@ from coord.ci_store import (
|
|
|
42
42
|
summarize,
|
|
43
43
|
summarize_counts,
|
|
44
44
|
)
|
|
45
|
-
from coord.db import get_connection, retry_on_locked
|
|
45
|
+
from coord.db import get_connection, retry_on_locked, rollback_after_driver_error
|
|
46
46
|
from coord.forge_availability import MERGE_GATE_REFUSAL_KINDS, record_merge_gate_refusal
|
|
47
47
|
from coord.models import (
|
|
48
48
|
CLOSES_ISSUE_TYPES,
|
|
@@ -3812,11 +3812,23 @@ def _archived_merged_issue_keys(conn: sqlite3.Connection) -> set[tuple[str, int]
|
|
|
3812
3812
|
"SELECT repo_name, issue_number FROM merge_queue_archive WHERE state = ?",
|
|
3813
3813
|
(MERGED,),
|
|
3814
3814
|
).fetchall()
|
|
3815
|
-
except sql.driver_errors(): # #2784: not just sqlite3.OperationalError
|
|
3815
|
+
except sql.driver_errors() as exc: # #2784: not just sqlite3.OperationalError
|
|
3816
3816
|
# "no such table" surfaces as a *different* driver-named exception
|
|
3817
3817
|
# per backend (sqlite3.OperationalError vs psycopg.errors.
|
|
3818
3818
|
# UndefinedTable), so this must go through the dialect seam or the
|
|
3819
3819
|
# not-yet-archived case becomes an uncaught crash on Postgres.
|
|
3820
|
+
#
|
|
3821
|
+
# #2983: and catching it is only half the job. `conn` here is the
|
|
3822
|
+
# process-lived `get_connection()` singleton, which the caller
|
|
3823
|
+
# (`merged_issue_keys`, and in turn `enqueue_approved_work` /
|
|
3824
|
+
# `staging_items`) keeps writing and reading through long after this
|
|
3825
|
+
# returns — on Postgres the swallowed UndefinedTable aborts that
|
|
3826
|
+
# connection's transaction, so the "archive doesn't exist yet"
|
|
3827
|
+
# degrade turned every subsequent statement into
|
|
3828
|
+
# InFailedSqlTransaction. Nothing uncommitted is at risk: this
|
|
3829
|
+
# function only reads, and on Postgres the abort had already
|
|
3830
|
+
# discarded anything pending regardless.
|
|
3831
|
+
rollback_after_driver_error(conn, exc)
|
|
3820
3832
|
return set()
|
|
3821
3833
|
return {(r["repo_name"], r["issue_number"]) for r in rows}
|
|
3822
3834
|
|