---
work_item: ORCH-094
stage: analysis
author_agent: analyst
status: ready-for-review
created_at: 2026-06-09
model_used: claude-opus-4-8
---

# 03 — Критерии приёмки (Acceptance Criteria): ORCH-094 — флапп deploy-статусов у терминальной (done) задачи

Work Item: **ORCH-094** · Repo: **orchestrator** · Стадия: analysis

Формат: каждый критерий имеет **PASS** (что должно быть истинно для приёмки) и **FAIL** (что
считается провалом). Reviewer/CI проверяет их буквально по файлам репозитория и/или прод-проверкой.

---

## AC-1 — Терминальная задача стабильно держит Done

**Условие:** задача с БД `stage=done` и 0 активных job'ов, выставленная в Plane=`Done`, наблюдается
≥10 минут (воспроизводящий тест на 061-подобной фикстуре и/или прод-проверка на ORCH-061).
- **PASS:** за окно наблюдения **ни одного** авто-перехода в `Awaiting Deploy`/`Monitoring after
  Deploy`; статус остаётся `Done`. В тесте: после выставления `Done` ни один кодовый путь орка не
  порождает PATCH deploy-статуса для этой задачи.
- **FAIL:** зафиксирован хотя бы один авто-переход done-задачи в `Awaiting`/`Monitoring`, либо флапп
  продолжается.

---

## AC-2 — Идемпотентное схождение к Done для done-задачи

**Условие:** для задачи с БД `stage IN ('done','cancelled')` инициируется любой источник sync
(реконсилятор-тик, монитор-тик, прямой вызов setter'а deploy-статуса).
- **PASS:** результат — `Done` (для `done`) / корректный терминал (для `cancelled`); промежуточный
  deploy-статус (`Awaiting`/`Deploying`/`Monitoring`) **не** выставляется; повторный вызов на
  уже-`Done` — no-op (без PATCH-маятника). Подавление логируется (что/почему).
- **FAIL:** sync для done-задачи выставляет промежуточный deploy-статус, либо повторные вызовы
  качают `Done ⟷ deploy-статус`.

---

## AC-3 — Детерминированный конец post-deploy-monitor, без «зомби»-тиков

**Условие:** post-deploy-monitor отрабатывает свой жизненный цикл (HEALTHY до исчерпания
`post_deploy_budget` тиков, либо DEGRADED).
- **PASS:** по достижении HEALTHY/N-тиков → `set_issue_done` + маркер `done`; **после завершения —
  0 последующих статус-PATCH** для этой задачи (тест: монитор отработал → последующих
  `set_issue_*`-вызовов нет). Тик при БД=`done`/отсутствии активного основания → немедленный no-op
  без PATCH. После рестарта контейнера тики завершённого окна не воскресают.
- **FAIL:** после завершения монитора фиксируется хотя бы один статус-PATCH; либо «зомби»-тик
  выполняется без активного job'а/при БД=done и шлёт статус; либо `arm_monitor` повторно ставит
  `Monitoring` уже-done-задаче.

---

## AC-4 — Регресс: рабочий deploy-цикл реально деплоящейся задачи

**Условие:** реально деплоящаяся 063-подобная задача проходит self-deploy.
- **PASS:** последовательность статусов `Awaiting Deploy → Deploying → Monitoring after Deploy →
  Done` работает в точности как до ORCH-094; Phase A/B/C, merge-gate, post-deploy HEALTHY-окно,
  freeze-на-DEGRADED (ORCH-088) — не затронуты; терминал-aware гард (FR-2) **не** подавляет
  легитимный `Monitoring` у нетерминальной задачи.
- **FAIL:** любой шаг рабочего deploy-цикла нетерминальной задачи изменён/подавлён/сломан.

---

## AC-5 — Наблюдаемость, безопасность, документация, зелёный pytest

**Условие:** реализация завершена.
- **PASS:**
  - Лог однозначно показывает **кто (функция/путь) и почему** ставит deploy-статус, и что/почему
    подавлено терминал-aware гардом (FR-4).
  - never-raise: новая логика не бросает исключений в горячих путях; сетевая ошибка Plane → безопасная
    деградация. Не трогаются `main`/force-push/прод-контейнер/детач-деплой.
  - `STAGE_TRANSITIONS` / `QG_CHECKS` / machine-verdict ключи — без изменений; новая логика под
    kill-switch (`False` → прежнее поведение 1:1); не-self репозитории не затронуты.
  - `pytest tests/ -q` зелёный; добавлены тесты по `04-test-plan.yaml`.
  - **Источник флаппа задокументирован** (что это было) в `06-adr/ADR-NNN-…` + `CHANGELOG.md`;
    обновлены `CLAUDE.md` / `docs/architecture/README.md` (golden source).
- **FAIL:** нет логирования caller/причины; new-логика бросает/без флага; тронуты гейты/verdict-ключи;
  красный pytest; источник флаппа не задокументирован; затронут не-self репозиторий.

---

## Сводная матрица AC ↔ FR/BR

| AC | Покрывает |
|----|-----------|
| AC-1 | BR-1 / FR-1 |
| AC-2 | BR-2 / FR-2 |
| AC-3 | BR-3, BR-4 / FR-3 |
| AC-4 | BR-5 / FR-2, FR-5 |
| AC-5 | BR-6, BR-7 / FR-4, FR-5, NFR-1…NFR-5 |
