6.0 KiB
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НЕ вmain→False, даже если существует merged docs-PR той же ветки (mockpr_already_merged/Gitea возвращает merged docs-PR).shaвmain→True. - 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 + Planeset_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.md→merge: union; тест: два последовательных ребейза/слияния с правкой## [Unreleased]НЕ дают конфликта, обе записи сохранены в результирующемCHANGELOG.md. - FAIL: атрибут отсутствует/не применяется ИЛИ возникает конфликт-маркер при ребейзе.
AC-5 — Регресс-гард ловит откат соседнего кода (FR-5)
После деплоя main без маркера ранее-merged задачи → alert, задача НЕ done.
- PASS: тест: симуляция
main, где deployed SHA есть, но набор маркеров уменьшился (или deployed SHA НЕ предок main) →_handle_merge_verifyHOLD + 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_prno-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.