--- type: review work_item_id: ORCH-086 verdict: APPROVED version: 1 --- # Review ORCH-086 ## Summary Терминал-скип и `state_uuid`-dedup распространены на путь F-1 реконсилятора, закрывая F-1-пробел ORCH-068 (ложное «ET-002 done разблокирована (потерян webhook)»). Изменение полностью локализовано в `src/reconciler.py` (новый `_resolve_issue_status` + врезка ранних гардов в `_reconcile_gate_task` + переиспользование резолва в `_is_blocked_or_needs_input` через опц. аргументы с `_UNSET`-sentinel для обратной совместимости). Реализация 1:1 соответствует ТЗ (TR-1/TR-2/TR-3) и ADR-001 (D1–D4). `STAGE_TRANSITIONS`, `QG_CHECKS`, схема БД, сигнатуры `advance_stage`/`advance_if_gate_passed`/ `_note_unblock`, форма `status()`/`GET /queue`, config-флаги — без изменений. Контракт never-raise сохранён на всех новых путях. Полный прогон `pytest tests/ -q` зелёный — 1069 passed. ## Findings ### P0 — Blocker - (нет) ### P1 — Must fix - (нет) ### P2 — Should fix - (нет) ## Документация Обновлена в том же PR, соответствует требованию «golden source наравне с кодом» (CLAUDE.md §2, TRZ §8): - `docs/architecture/README.md` — раздел Reconciler F-1 дополнен блоком ORCH-086 (терминал-скип + dedup на F-1, единый fetch на тик, безусловность относительно `reconcile_skip_blocked_enabled`). - `CHANGELOG.md` — запись `fix:` ORCH-086 с описанием корня (причины A/B) и фикса (D1–D4). - `docs/work-items/ORCH-086/06-adr/ADR-001-reconciler-f1-terminal-skip-and-dedup.md` — присутствует, Accepted, описывает решение, порядок гардов, семантику ошибок и отклонённые альтернативы. - API не менялось → обновление таблицы API не требуется. Per-work-item ADR достаточно (точечный фикс существующего компонента, не сквозное решение — обосновано в §«Область и масштаб»). ## Контроль качества - Тесты содержательные, не тривиальные: TC-86-01..09/11 (`tests/test_reconciler.py`) покрывают терминал по группе `completed`/`cancelled`, fallback по логическому ключу при пустых `groups`, DB-side `cancelled` без обращения к Plane, проброс/dedup `state_uuid`, анти-регресс легитимного unblock, never-raise без ложного уведомления, независимость терминал-скипа от Guard-2-флага; TC-86-10 (`tests/test_reconciler_plane.py`) — неизменность формы `status()`; TC-86-12 — зелёный регресс-прогон. Сопутствующая правка `tests/test_orch026_task_deps.py` корректно адаптирует мок Guard 2 под новую сигнатуру и держит резолв offline. - `task.get("plane_id") or task.get("plane_issue_id")` в `_resolve_issue_status` — дословный перенос ранее протестированной логики Guard 2 (ORCH-060), регрессии нет.