124 lines
8.3 KiB
Markdown
124 lines
8.3 KiB
Markdown
---
|
||
work_item: ORCH-110
|
||
stage: analysis
|
||
author_agent: analyst
|
||
status: ready-for-review
|
||
created_at: 2026-06-15
|
||
model_used: claude-opus-4-8
|
||
escalate: 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 (регресс инцидента) |
|