# Критерии приёмки — ORCH-046

Work Item ID: ORCH-046
Stage: analysis
Author: analyst
Date: 2026-06-06

Каждый критерий имеет чёткое условие PASS/FAIL. Reviewer/Tester проверяют по
этому списку.

## AC-1 — Дословные P0/P1 findings ревьюера в task_desc

**Условие:** при reviewer REQUEST_CHANGES (откат `review`/`testing` →
`development`) строка `task_desc`, переданная в `enqueue_job("developer", …)`,
содержит ДОСЛОВНЫЙ текст findings уровня P0/P1 из `12-review.md` (не только
ссылку).

- **PASS:** в `task_desc` присутствуют дословные строки P0/P1 пунктов из секции
  `## Findings` файла `12-review.md`.
- **FAIL:** `task_desc` содержит только ссылку на файл, без текста findings (при
  наличии валидного файла с P0/P1).

## AC-2 — Причина падения тестера в task_desc

**Условие:** при tester FAIL (`check_tests_passed`, откат `testing` →
`development`) строка `task_desc` содержит причину падения: `reason` из гейта +
релевантный фрагмент тела `13-test-report.md`.

- **PASS:** `task_desc` содержит `reason` И непустой фрагмент тела отчёта
  (вывод pytest / FAIL-строки / Итог), когда отчёт валиден.
- **FAIL:** `task_desc` содержит только ссылку на файл без причины/фрагмента
  (при наличии валидного отчёта).

## AC-3 — Ссылка на полный файл сохранена

**Условие:** в обеих ветках (reviewer, tester) `task_desc` по-прежнему содержит
ссылку на полный файл-артефакт (`docs/work-items/<id>/12-review.md` /
`13-test-report.md`) как дополнительный контекст.

- **PASS:** путь к файлу присутствует в `task_desc` в обоих сценариях.
- **FAIL:** ссылка на файл удалена/отсутствует.

## AC-4 — Парсер устойчив к отсутствию/битому файлу (graceful)

**Условие:** `extract_review_findings(path)` и `extract_test_failures(path)`
НИКОГДА не бросают исключение; при отсутствующем/нечитаемом/битом файле
возвращают `""`, а вызывающий код в `stage_engine` делает fallback на прежнюю
ссылку-строку.

- **PASS:** на несуществующем пути, пустом файле, файле без секций, битом
  markdown/YAML — функции возвращают `""` без исключения; `advance_stage`
  отрабатывает откат как раньше (ссылка-строка в `task_desc`).
- **FAIL:** любое исключение наружу из парсера или из `advance_stage` из-за
  парсинга.

## AC-5 — Тесты зелёные + новые юнит-тесты парсера

**Условие:** существующие тесты не сломаны; добавлены юнит-тесты парсера,
покрывающие: findings есть / findings пусто / битый YAML(frontmatter) / только
P3 (нет P0/P1).

- **PASS:** `python -m pytest tests/ -q` зелёный; `tests/test_review_parse.py`
  содержит как минимум кейсы: P0/P1 присутствуют → текст возвращён; нет
  findings/только P2-P3 → `""`; битый файл → `""`; отсутствующий путь → `""`;
  для test-report: FAIL-фрагмент извлечён / пустой отчёт → `""`.
- **FAIL:** падение существующих тестов или отсутствие перечисленных кейсов.

## AC-6 — Retry-счётчик и rollback НЕ изменены по поведению

**Условие:** логика `_developer_retry_count`, `MAX_DEVELOPER_RETRIES = 3`,
последовательность откатов и поля `AdvanceResult` (`rolled_back_to`,
`enqueued_agent`, `enqueued_job_id`, `alerted`) идентичны прежним.

- **PASS:** существующие тесты `test_stage_engine.py` на rollback/retry зелёные;
  при 4-м заходе по-прежнему alert вместо enqueue; меняется только текст
  `task_desc`.
- **FAIL:** изменилось число retry, порядок вызовов, или значения полей
  `AdvanceResult`.

## AC-7 — Out-of-scope не затронут

**Условие:** не изменены: `check_*` гейты, реестр `QG_CHECKS`, сигнатуры
публичных функций (`advance_stage`, `_run_qg`, `check_*`), webhook-пути, формат
Plane-комментариев.

- **PASS:** `git diff` не содержит изменений в `src/qg/checks.py` (логика
  гейтов), сигнатурах публичных функций, `src/webhooks/*`,
  `usage.build_status_comment`; `test_qg_registry_snapshot` зелёный.
- **FAIL:** любое из перечисленного изменено.

## AC-8 — Документация и ADR обновлены (golden source)

**Условие:** правка ядра → заведён ADR (`06-adr/`), обновлён `CHANGELOG.md`, при
необходимости — `docs/architecture/README.md`/`internals.md` (раздел Stage
Engine / Откаты).

- **PASS:** присутствует `docs/work-items/ORCH-046/06-adr/ADR-001-*.md`; в
  `CHANGELOG.md` есть запись ORCH-046.
- **FAIL:** ADR или запись в CHANGELOG отсутствуют.
