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

8.3 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-110 analysis analyst ready-for-review 2026-06-15 claude-opus-4-8 full-cycle

03 — Критерии приёмки (Acceptance Criteria): ORCH-110 — merge-gate re-test timeout

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

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


AC-1 — Зелёный путь не требует ручного вмешательства из-за инфра-таймаута

Условие: tester PASS + зелёный CI + ветка актуальна к origin/main, но локальный re-test merge-gate упирается в таймаут (смоделированное CPU-голодание/медленный прогон).

  • PASS: задача НЕ откатывается ложно как код-фейл и НЕ доходит до alert «Merge-gate still failing after N developer retries»; она доходит до deploy (возможно после ограниченного defer/повтора) или поднимает отдельный инфра-alert, отличимый от «developer must fix».
  • FAIL: таймаут → _handle_merge_gate_rollback на development с расходом developer-retry → manual-gate (текущее ошибочное поведение).

AC-2 — Инфра-таймаут классифицируется отдельно от красного re-test

Условие: check_branch_mergeable вернул FAIL по причине таймаута vs по причине красного теста.

  • PASS: таймаут маршрутизируется в транзиент-путь (defer/повтор/инфра-alert), красный re-test — в прежний rollback на development; пути различимы в коде и в логах/наблюдаемости.
  • FAIL: оба исхода идут одним путём отката на development.

AC-3 — Реальный красный re-test по-прежнему откатывает (анти-над-толерантность)

Условие: локальный re-test даёт детерминированно красный результат (реальный сбой теста, не таймаут).

  • PASS: задача откатывается на development + developer-retry (цель ORCH-043 сохранена), lease освобождается.
  • FAIL: красный re-test «толерируется» и задача продвигается/деплоится со сломанным кодом.

AC-4 — Нет осиротевших тест-процессов после таймаута

Условие: merge_gate.retest_branchcoverage_gate.measure_coverage) запущены против прогона, порождающего дочерние/внучатые процессы, и прогон превышает бюджет (таймаут).

  • PASS: по таймауту завершается всё дерево подпроцесса (включая внуков); живых оркестратор-спавненных pytest-процессов не остаётся; контракт возврата (False, "re-test timeout after <T>s") сохранён.
  • FAIL: прямой потомок убит, но внуки репарентируются и продолжают жить/грузить CPU.

AC-5 — Бюджет re-test согласован и уважает сквозные инварианты

Условие: конфигурация бюджета re-test и связанных таймаутов.

  • PASS: merge_retest_timeout_s имеет адекватный запас над фактическим временем сюита; соблюдено reaper_max_running_s > max(agent_timeout, бюджеты) + grace и согласование с merge_lock_timeout_s/coverage_run_timeout_s; малформный конфиг → дефолт + WARNING.
  • FAIL: бюджет оставлен впритык к времени сюита без обоснования, либо изменение бюджета ломает инвариант reaper/lease.

AC-6 — Контракт необходимости re-test зафиксирован и реализован

Условие: ветка не-behind (rebase no-op) + зелёный CI по этому HEAD.

  • PASS: поведение локального re-test соответствует контракту, выбранному архитектором в ADR (skip/scope/trust-CI-SHA и т. п.); re-test не является избыточной единственной точкой ложного отказа на коммите, уже подтверждённом CI; решение и его обоснование задокументированы в 06-adr/.
  • FAIL: контракт не определён/не реализован; полный re-test безусловно гоняется и при не-behind + зелёном CI.

AC-7 — Kill-switch и нулевая регрессия

Условие: флаг толерантности выключен; и/или не-self-hosting репозиторий (enduro).

  • PASS: поведение байт-в-байт как до ORCH-110 (таймаут → прежний rollback; те же тексты alert'ов); enduro-путь не затронут.
  • FAIL: при выключенном флаге/для enduro поведение изменилось.

AC-8 — Инварианты конвейера и self-hosting не тронуты

Условие: статический и поведенческий анализ изменений.

  • PASS: STAGE_TRANSITIONS / реестр QG_CHECKS / семантика check_* / machine-verdict ключи / схема БД — без изменений; никаких push/force-push в main (INV-4), merge только через Gitea PR API, прод-контейнер не рестартится; все публичные функции merge-gate/coverage остаются never-raise.
  • FAIL: изменён любой из перечисленных инвариантов, или исключение уходит в advance_stage.

AC-9 — Ограниченность транзиент-пути (anti-loop) + наблюдаемость

Условие: инфра-таймаут повторяется.

  • PASS: число повторов/defer ограничено и по попыткам, и по суммарному времени; исчерпание → один чёткий инфра-alert; событие видно в логах/GET /queue и отличимо от код-фейла.
  • FAIL: бесконечный bounce/повтор, либо молчаливое зависание без терминального сигнала.

AC-10 — Регресс-тест (красный до фикса, зелёный после)

Условие: наличие автоматического теста, воспроизводящего инцидент.

  • PASS: в tests/ есть тест, который на текущем коде падал бы (инфра-таймаут re-test → ложный rollback / выживший процесс), а после фикса зелёный; включён в полный регресс pytest.
  • FAIL: регресс-теста нет, либо он не воспроизводит инцидент.

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

AC Покрывает
AC-1 BR-1 / FR-1
AC-2 BR-2 / FR-1
AC-3 BR-6 / FR-4
AC-4 BR-3 / FR-2
AC-5 BR-4 / FR-3 / NFR-6
AC-6 BR-5 / FR-4
AC-7 NFR-2 / FR-5
AC-8 NFR-1 / NFR-3 / NFR-4 / FR-5
AC-9 NFR-5 / BR-7 / FR-6
AC-10 BR-1…BR-3 (регресс инцидента)