diff --git a/docs/work-items/ORCH-086/12-review.md b/docs/work-items/ORCH-086/12-review.md new file mode 100644 index 0000000..10353d0 --- /dev/null +++ b/docs/work-items/ORCH-086/12-review.md @@ -0,0 +1,51 @@ +--- +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), регрессии нет.