8.3 KiB
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_branch (и coverage_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 (регресс инцидента) |