feat(merge-verify): guarantee idempotent open code-PR before merge_pr (ORCH-082) #82

Merged
admin merged 7 commits from feature/ORCH-082-orch-81-pr-merge-verify-hold into main 2026-06-09 01:06:25 +03:00
Owner

Closes ORCH-082. Гарантированный идемпотентный код-PR перед merge-verify (фикс ложного HOLD «no open PR», инцидент ORCH-074).

  • merge_gate.ensure_open_pr (never-raise, фильтр head==branch & base==main, гонка 409/422)
  • врезка в _handle_merge_verify ПЕРЕД merge_pr + _hold_pr_create_failed (distinct HOLD)
  • launcher._ensure_pr делегирован в ensure_open_pr (единый код создания PR)
  • защита ORCH-073 (SHA-в-main) неприкосновенна; kill-switch ORCH_MERGE_VERIFY_AUTOCREATE_PR_ENABLED; non-self no-op
  • тесты TC-01..12; README/CHANGELOG/.env.example обновлены

🤖 Generated with Claude Code

Closes ORCH-082. Гарантированный идемпотентный код-PR перед merge-verify (фикс ложного HOLD «no open PR», инцидент ORCH-074). - merge_gate.ensure_open_pr (never-raise, фильтр head==branch & base==main, гонка 409/422) - врезка в _handle_merge_verify ПЕРЕД merge_pr + _hold_pr_create_failed (distinct HOLD) - launcher._ensure_pr делегирован в ensure_open_pr (единый код создания PR) - защита ORCH-073 (SHA-в-main) неприкосновенна; kill-switch ORCH_MERGE_VERIFY_AUTOCREATE_PR_ENABLED; non-self no-op - тесты TC-01..12; README/CHANGELOG/.env.example обновлены 🤖 Generated with [Claude Code](https://claude.com/claude-code)
admin added 6 commits 2026-06-09 00:57:10 +03:00
Close the missing invariant "by merge-verify time the branch has an open
code-PR". The pipeline created a PR only on the developer path with a fresh
worktree commit (launcher._ensure_pr), so a branch (e.g. after a manual main
restore) could reach the deploy->done merge-verify under-gate PR-less ->
merge_pr returned "no open PR" -> a FALSE HOLD (ORCH-074 incident).

- merge_gate.ensure_open_pr(repo, branch) -> (status, detail): idempotent
  leaf-actor (never-raise). GET open PRs filtered head==branch AND base==main
  (identical to merge_pr/ORCH-073 FR-3 — auto docs-PR is not a code-PR) ->
  existed; else POST -> created; 409/422 race -> re-GET -> existed (no dup);
  any other error -> failed.
- stage_engine._handle_merge_verify: врезка after validated_revision and
  BEFORE merge_pr. created|existed -> proceed; failed -> honest HOLD via new
  _hold_pr_create_failed (note "pr-create-failed-hold", text distinguishable
  from the not-merged HOLD; task stays on deploy, NO rollback).
- launcher._ensure_pr delegated to ensure_open_pr (single PR-creation path,
  shared head==branch & base==main filter); the developer-only trigger is
  unchanged.
- ORCH-073 protection untouched & authoritative: merge is confirmed ONLY by
  verify_merged_to_main (SHA-in-main) + check_main_regression. Real un-merged
  code still HOLDs.
- Kill-switch ORCH_MERGE_VERIFY_AUTOCREATE_PR_ENABLED (default true); scope =
  merge_verify_applies (self-hosting / merge_verify_repos); non-self -> no-op;
  false -> ORCH-074 behaviour 1:1. No DB migration; main never push/force-push.
- Append ORCH-082 marker to MAIN_REGRESSION_MARKERS (append-only convention).
- conftest defaults the autocreate flag OFF (mirrors merge_verify_enabled) so
  unrelated deploy->done tests stay 1:1 (no network).

Tests: tests/test_orch082_ensure_pr.py (TC-01..05),
tests/test_orch082_merge_verify_autocreate.py (TC-06..12). Docs: README
merge-verify block (ORCH-082), CHANGELOG, .env.example.

Refs: ORCH-082

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tester(ET): auto-commit from tester run_id=411
All checks were successful
CI / test (push) Successful in 27s
CI / test (pull_request) Successful in 25s
039322001a
admin force-pushed feature/ORCH-082-orch-81-pr-merge-verify-hold from eeb442810e to 039322001a 2026-06-09 00:57:10 +03:00 Compare
admin added 1 commit 2026-06-09 01:01:57 +03:00
deploy(ORCH-036): finalize SUCCESS for ORCH-082
All checks were successful
CI / test (push) Successful in 24s
CI / test (pull_request) Successful in 24s
9834dae108
admin merged commit fc29ba76ec into main 2026-06-09 01:06:25 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/orchestrator#82