Files
orchestrator/docs/work-items/ORCH-090/12-review.md

115 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
verdict: APPROVED
work_item: ORCH-090
stage: review
author_agent: reviewer
status: approved
created_at: 2026-06-09
model_used: claude-opus-4-8
type: review
work_item_id: ORCH-090
version: 2
---
# Review ORCH-090 — Механизм отмены задачи: статус STOP (re-review, attempt 2)
## Summary
Повторный review после фикса блокирующего P1 из предыдущей итерации (`12-review.md` v1).
Реализация STOP-отмены аккуратна и канонична (leaf `src/cancel.py` never-raise, kill-switch
`stop_status_enabled`, fail-closed маршрутизация по образцу `confirm_deploy`/ORCH-059, аддитивные
идемпотентные миграции). Кросс-каттинг `{done}``{done, cancelled}` проведён исчерпывающе и
консистентно (serial_gate / task_deps / stages / db / job_reaper / queue_worker), в точности по
adr-0026.
**Оба ранее блокировавших/важных дефекта закрыты и покрыты содержательными тестами:**
- **P1 (был blocker) — ИСПРАВЛЕН.** `cancel.in_critical_window` сужен: удержание merge-lease без
бегущего актора (`_task_has_running_actor`) на стадии `deploy` в ожидании `Confirm Deploy` теперь
НЕ считается критическим окном → немедленный полный сброс, который сам отпускает lease (шаг 3c).
Тесты `test_d7_lease_held_idle_parking_is_not_critical`,
`test_d7_lease_held_with_running_actor_still_critical`,
`test_d7_stop_on_deploy_awaiting_confirm_full_resets` (последний прямо проверяет
`stage='cancelled'` + удалённую ветку + `current_lease_holder is None`). Сверено по коду
`src/cancel.py::in_critical_window` (стр. 100158) и `stage_engine.cancel_task` — wedge
self-hosting-репо устранён.
- **P2 (был should-fix) — ИСПРАВЛЕН.** Deferred-ветка `cancel_task` шлёт алерт только при первом
переходе (`first = set_task_cancel_requested(...)`, далее `if first:`); повторный STOP в
критическом окне даёт `deferred-already-pending` без повторного уведомления. Тест
`test_d7_repeated_stop_in_critical_window_no_duplicate_notify` (ровно 1 notify).
Полный регресс `pytest tests/` зелёный (**1349 passed**); `tests/test_stop_status.py` — 30 кейсов
(TC-01…TC-14 + D7), покрывают AC-1…AC-10 и оба фикса.
Оси проверки: ✅ ТЗ/AC (AC-1…AC-10, включая ранее проваленный AC-7) · ✅ ADR (соответствие
adr-0026/ADR-001; см. P2-нит ниже) · ✅ качество кода · ✅ документация.
## Findings
### P0 — Blocker
- (нет)
### P1 — Must fix
- (нет)
### P2 — Should fix
- [ ] **Work-item ADR-001 §D7 не синхронизирован с фиксом P1 (running-actor-уточнение).**
`docs/work-items/ORCH-090/06-adr/ADR-001-stop-cancel-task.md` §D7 (стр. 189201) по-прежнему
определяет критическое окно как «задача держит merge-lease … / merge в процессе» — **без**
оговорки «И активно бегущий актор», которую фактически реализует код
(`cancel.in_critical_window` + `_task_has_running_actor`) после фикса P1. Авторитетные
golden-source доки уже синхронизированы (`CLAUDE.md` — абзац «Уточнение P1 (ORCH-090 review)»;
`docs/architecture/README.md` стр. 316317 «P1-уточнение»; `CHANGELOG.md` — буллет «Фикс P1»),
поэтому витрина проекта корректна и это **не** P0 «src изменён, доки не обновлены». Но per
«documentation = golden source» работа-айтемный ADR (запись именно этого архитектурного решения)
должен честно отражать итоговую семантику — как это уже сделано для уточнения D4. Предложение:
добавить в §D7 строку-уточнение «merge-lease критичен ТОЛЬКО при бегущем акторе; припаркованное
ожидание `Confirm Deploy` обратимо → немедленный сброс» (ссылка на review P1). Не блокирует.
### P3 — Nice to have
- [ ] **«Завис» `cancel_requested_at` на успешно задеплоенной задаче → вечный `pending` в
`GET /queue`** (перенесено из v1, не адресовано). При SUCCESS-деплое `run_deploy_finalizer`
вызывает `cancel_task(force=True)`, который видит `stage='done'` → «already-terminal» no-op и
**не очищает** `cancel_requested_at`; `db.cancelled_tasks_snapshot` считает
`pending = cancel_requested_at IS NOT NULL AND stage != 'cancelled'` → done-задача с бывшим
deferred-STOP навсегда показывается «pending». Чисто наблюдаемость; предложение — очищать
`cancel_requested_at` при честном no-op после завершения.
- [ ] **adr-0026 п.6 (post-deploy monitor «не тикает по отменённой задаче») в коде не реализован**
(перенесено из v1). Фактически безвреден и недостижим: post-deploy наблюдение идёт только ПОСЛЕ
`done`, а STOP на `done` — no-op. Рекомендация: снять пункт из adr-0026 как нерелевантный либо
добавить дешёвый терминал-гард для строгого соответствия ADR.
- [ ] **Косметика:** «рваная» строковая склейка комментария relaunch-hole в
`src/webhooks/plane.py` (стр. 345351) — собрать в одну строку для читаемости.
## Документация
**Обновлена полностью и качественно — отдельных blocking-findings нет.** Проверено пофайльно:
- `README.md` — таблица env (`ORCH_STOP_STATUS_ENABLED`/`ORCH_STOP_STATUS_REPOS`), раздел «Отмена
задачи: статус STOP (ORCH-090)», обновлён список job-статусов (`cancelled`), инфра-предусловие.
- `docs/architecture/README.md` — раздел STOP со статусом «реализовано», блок `stop` в `/queue`,
раздел «База данных» (колонки/тумбстон/статусы) **и P1-уточнение** (стр. 316317).
- `docs/architecture/internals.md``STAGE_TRANSITIONS` (сток `cancelled`), терминал-предикат
`{done,cancelled}`, job-статусы.
- `CHANGELOG.md` (`feat:` + отдельный буллет «Фикс P1»), `CLAUDE.md` (раздел «Отмена задачи: статус
STOP (ORCH-090)» с абзацем «Уточнение P1»), `.env.example` — согласованы.
- ADR: локальный `06-adr/ADR-001-stop-cancel-task.md` + сквозной
`docs/architecture/adr/adr-0026-stop-cancel-task.md`; уточнение D4 (тумбстон `plane_issue_id`)
отражено в коде и доках. Единственный gap — §D7 локального ADR не дотянут до running-actor-фикса
(P2 выше).
- Раздела README «Известные ограничения», который ORCH-090 закрывал бы (ORCH-079), нет — обзорная
витрина не рассинхронена.
**Трассировка маркеров (TRACEABILITY.md):** правки маркированных инвариантов `serial_gate`/ORCH-088
и `task_deps`/ORCH-026 сверены с их ADR — расширение терминал-набора до `{done,cancelled}` сохраняет
FIFO-семантику (`t2.id < jobs.task_id`) и dep-готовность (терминальный предшественник), инварианты
не сломаны. `STAGE_TRANSITIONS` exit-гейты / `QG_CHECKS` / `check_*` — не тронуты (подтверждено
анти-регресс-снапшотами, зелёные).
## Вердикт
`APPROVED`оба ранее найденных дефекта (P1 wedge при STOP в ожидании Confirm Deploy; P2
дубль-уведомления в deferred-ветке) исправлены и покрыты содержательными тестами; полный регресс
зелёный (1349 passed). Остаются только P2 (синхронизация §D7 локального ADR) и P3 (наблюдаемость/
косметика) — не блокируют приёмку, желательны к устранению попутно.