Files
orchestrator/docs/work-items/ORCH-073/03-acceptance-criteria.md

6.0 KiB
Raw Permalink Blame History

03 — Критерии приёмки: ORCH-073

Каждый критерий — однозначный PASS/FAIL. Reviewer/Tester проверяют буквально.

AC-1 — Код 067/069/071 одновременно в main (G1)

origin/main содержит одновременно: plane_issue_link + кликабельный заголовок (ORCH-067), qg0_title_max (ORCH-069), verify_merged_to_main (ORCH-071).

  • PASS: все три маркера присутствуют, счётчики > 0: git grep -c plane_issue_link origin/main -- src/notifications.py > 0; git grep -c qg0_title_max origin/main -- src/ > 0; git grep -c verify_merged_to_main origin/main -- src/merge_gate.py > 0.
  • FAIL: хотя бы один маркер == 0.

AC-2 — verify_merged_to_main подтверждает merge ТОЛЬКО по SHA-в-main (FR-1)

verify_merged_to_main(repo, branch, sha) возвращает True только когда sha — реальный предок origin/main.

  • PASS: unit-тест: sha НЕ в mainFalse, даже если существует merged docs-PR той же ветки (mock pr_already_merged/Gitea возвращает merged docs-PR). sha в mainTrue.
  • FAIL: функция возвращает True при sha не в main из-за merged docs-PR.

AC-3 — Воспроизведение исходного багаНЕ done + alert (FR-1/FR-2)

Задача с merged docs-PR, но БЕЗ merged code-PR (SHA не в main): merge-verify НЕ CONFIRMED.

  • PASS: _handle_merge_verify возвращает HOLD (intervened) → задача остаётся на deploy, НЕ done, отправлен alert «not merged» (Telegram + Plane set_issue_blocked). Mock воспроизводит сценарий ORCH-067/069.
  • FAIL: задача доходит до done / нет alert.

AC-4 — .gitattributes CHANGELOG.md merge=union (FR-4)

В корне репо есть .gitattributes с CHANGELOG.md merge=union.

  • PASS: файл существует, git check-attr merge CHANGELOG.mdmerge: union; тест: два последовательных ребейза/слияния с правкой ## [Unreleased] НЕ дают конфликта, обе записи сохранены в результирующем CHANGELOG.md.
  • FAIL: атрибут отсутствует/не применяется ИЛИ возникает конфликт-маркер при ребейзе.

AC-5 — Регресс-гард ловит откат соседнего кода (FR-5)

После деплоя main без маркера ранее-merged задачи → alert, задача НЕ done.

  • PASS: тест: симуляция main, где deployed SHA есть, но набор маркеров уменьшился (или deployed SHA НЕ предок main) → _handle_merge_verify HOLD + alert «main regressed», НЕ done.
  • FAIL: регресс соседнего кода не пойман, задача done.

AC-6 — Happy-path без ложных alert (INV-5 / AC-5 ТЗ)

Код реально в main (deployed SHA — предок origin/main) → задача done штатно, без ложного alert; для non-self репо (enduro) merge/verify без изменений.

  • PASS: тест happy-path: SHA в main → verify_merged_to_main=True, _handle_merge_verify возвращает «advance» (не intervened); non-self репо → под-гейт no-op.
  • FAIL: ложный alert на корректном merge ИЛИ изменение поведения для enduro.

AC-7 — Идемпотентность по SHA-в-main (INV-4)

Повторный прогон/reaper уже-слитой задачи (SHA в main) → no-op, без второго merge.

  • PASS: тест: re-drive задачи с SHA-в-main → merge_pr no-op («already-merged»/idempotent), второго Gitea POST merge нет; задача остаётся done.
  • FAIL: второй merge / дубликат / ошибка.

AC-8 — Документация и тесты обновлены (правило агентов §2/§6)

  • PASS: обновлены CHANGELOG.md (Unreleased), docs/architecture/README.md (раздел merge-verify под FR-1 + регресс-гард FR-5), создан ADR в docs/work-items/ORCH-073/06-adr/; pytest зелёный (pytest tests/ -q).
  • FAIL: доки/ADR не обновлены ИЛИ pytest красный.

AC-9 — G4 аудит задокументирован

Причина docs-only merge (code-PR не слит, pr_already_merged засчитал docs-PR) зафиксирована в ADR/06-adr, корень устранён (FR-1+FR-2+FR-3).

  • PASS: ADR содержит раздел «Root cause / G4 audit» с воспроизведением и устранением.
  • FAIL: аудит отсутствует.

AC-10 — Воспроизведение на staging «исправлено навсегда» (G3/AC-9 ТЗ)

2 задачи, обе с правкой CHANGELOG.md, прогнаны через staging → обе доезжают в main без потери кода друг друга.

  • PASS: зафиксировано в 15-staging-log.md: оба набора маркеров присутствуют в main после обоих merge; ни одна правка CHANGELOG не вызвала конфликт/откат.
  • FAIL: код одной задачи затёрт другой ИЛИ конфликт CHANGELOG.

AC-11 — self-hosting safety сохранена (INV-2/INV-3)

  • PASS: merge только через PR-API (без force-push в main); прод-контейнер не падал в рамках задачи; ручной Confirm Deploy сохранён.
  • FAIL: force-push в main / рестарт прод-контейнера в рамках merge / обход Confirm Deploy.