78 lines
6.0 KiB
Markdown
78 lines
6.0 KiB
Markdown
# 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 той же
|
||
ветки (mock `pr_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 + 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.md` → `merge: 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.
|