Files
orchestrator/docs/work-items/ORCH-113/03-acceptance-criteria.md

6.2 KiB
Raw Blame History

work_item, stage, author_agent, status, created_at, model_used, escalate
work_item stage author_agent status created_at model_used escalate
ORCH-113 analysis analyst ready-for-review 2026-06-15 claude-opus-4-8 full-cycle

03 — Критерии приёмки (Acceptance Criteria): ORCH-113 — BUG: job-reaper не должен повторно запускать финализацию deploy-staging, пока жив исходный finalizer

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

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


AC-1 — Нет второго прогона edge-гейтов при живом finalizer'е

Условие: job на deploy-staging с exit_code=0, finished_age_s >= reaper_finalize_grace_s, но исходный monitor/finalizer ещё жив (сигнал живости присутствует).

  • PASS: reaper не вызывает _gate_driven_advance/advance_stage для этого job; второй прогон security / merge-gate / локального re-test / coverage / image-freshness не запускается; reaper логирует defer.
  • FAIL: reaper запускает повторный advance_stage / любой edge-под-гейт, пока finalizer жив.

AC-2 — Идемпотентность и строгое владение состоянием

Условие: монитор финализирует deploy-staging и параллельно срабатывает reaper-тик для того же job/stage.

  • PASS: тяжёлый прогон edge-гейтов (merge-gate / локальный re-test) исполняется ровно один раз для пары (job, stage); актор без владения состоянием не выполняет побочных шагов (мерж/re-test/ rollback).
  • FAIL: второй локальный re-test/merge-gate запускается для того же job/stage без владения состоянием (двойное исполнение edge-гейтов).

AC-3 — Мёртвый finalizer по-прежнему добивается

Условие: monitor/finalizer на deploy-staging реально умер посреди финализации (сигнал живости отсутствует/протух), job завис в running.

  • PASS: reaper за ограниченное время добивает job по существующему контракту (retry в пределах бюджета, иначе failed + Telegram; Tier-3 backstop как предохранитель); reaper для deploy-staging не превращён в no-op.
  • FAIL: мёртвый finalizer на deploy-staging не добивается reaper'ом (зомби-job блокирует очередь).

AC-4 — Нет ложного отката и расхождения состояния после успешного deploy

Условие: сценарий инцидента ORCH-111 — долгая (> grace) финализация deploy-staging при зелёном staging_status: SUCCESS, deploy/finalizer параллельно доходит до deploy_status: SUCCESS / merge PR.

  • PASS: задача не откатывается deploy-staging → development параллельной reaper-веткой; developer-retry не инкрементируется ложно; у задачи единственное консистентное терминальное/стадийное состояние (сходимость, не расхождение).
  • FAIL: задача откатана deploy-staging → development и/или начислен ложный developer-retry, в то время как deploy фактически успешен; ветки состояния расходятся.

AC-5 — Инварианты и контракт reaper сохранены

Условие: аудит диффа и поведения при выключенном kill-switch.

  • PASS: STAGE_TRANSITIONS / QG_CHECKS / каждый check_* / machine-verdict ключи / схема существующих таблиц — байт-в-байт; БД-правки только аддитивные (_ensure_column / CREATE TABLE IF NOT EXISTS); reaper остаётся never-raise per unit; выключенный флаг → прежнее поведение; правки не рестартят прод и не пушат main; сквозной инвариант reaper_max_running_s > Σ gate-work + grace (ORCH-065/109/110) сохранён.
  • FAIL: изменены STAGE_TRANSITIONS/QG_CHECKS/семантика check_*/machine-verdict ключи или схема существующих таблиц; reaper может бросить исключение из тика; флаг False меняет поведение; нарушен сквозной бюджетный инвариант.

AC-6 — Обязательный регресс-тест и зелёный полный прогон

Условие: запуск тест-сюита репозитория.

  • PASS: добавлен регресс-тест инцидента ORCH-111 (TC-05 в 04-test-plan.yaml), красный на коде до фикса и зелёный после; полный pytest tests/ -q зелёный.
  • FAIL: регресс-теста нет, либо он зелёный и до фикса (не воспроизводит баг), либо полный регресс tests/ красный.

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

AC Покрывает
AC-1 BR-1 / BR-3 / FR-1
AC-2 BR-2 / FR-2
AC-3 BR-4 / FR-4
AC-4 BR-5 / FR-5
AC-5 NFR-1 / NFR-2 / NFR-3 / NFR-6 / FR-3
AC-6 BR-1…BR-5 (регресс-доказательство)