tester(ET): auto-commit from tester run_id=571
This commit is contained in:
@@ -1,123 +1,107 @@
|
||||
---
|
||||
result: FAIL # PASS | FAIL — машинный вердикт, UPPERCASE
|
||||
result: PASS # PASS | FAIL — машинный вердикт, UPPERCASE
|
||||
work_item: ORCH-100
|
||||
stage: testing
|
||||
author_agent: tester
|
||||
status: fail
|
||||
status: pass
|
||||
created_at: 2026-06-10
|
||||
model_used: claude-opus-4-8
|
||||
type: test-report
|
||||
work_item_id: ORCH-100
|
||||
---
|
||||
|
||||
# Test Report — ORCH-100 — FND/F1b: sidecar-watchdog
|
||||
# Test Report — ORCH-100 — FND/F1b: sidecar-watchdog (re-test)
|
||||
|
||||
> Машинный вердикт читается ТОЛЬКО из frontmatter (`result:`, UPPERCASE). Негативный токен
|
||||
> (`FAIL`) — авторитетен.
|
||||
> Повторный прогон после цикла `testing → development → review`. Прежний блокер прошлого прогона
|
||||
> (`tests/test_queue.py::TestRetry::test_finalize_job_requeue_then_fail`) снят fix-коммитом
|
||||
> `2040de3` (test-only autouse-фикстура `_isolate_runs_dir` в `tests/conftest.py`, изолирующая
|
||||
> `settings.runs_dir` от ambient prod-log pollution; `src/**` не тронут). Полный регресс снова зелёный.
|
||||
|
||||
## Окружение
|
||||
- Python: 3.12.13
|
||||
- pytest: 8.3.3 (plugins: cov-5.0.0, anyio-4.13.0, asyncio-0.23.8)
|
||||
- Дата: 2026-06-10
|
||||
- Worktree: `/repos/_wt/orchestrator/feature_ORCH-100-fnd-f1b-sidecar-watchdog`
|
||||
(ветка `feature/ORCH-100-fnd-f1b-sidecar-watchdog`) — тесты прогнаны из рабочего дерева
|
||||
именно этой задачи, НЕ из общего `/repos/orchestrator`.
|
||||
(ветка `feature/ORCH-100-fnd-f1b-sidecar-watchdog`, HEAD `a153c8e`, fix `2040de3` в истории) —
|
||||
тесты прогнаны из рабочего дерева именно этой задачи, НЕ из общего `/repos/orchestrator`.
|
||||
|
||||
## Smoke API (read-only)
|
||||
| Эндпоинт | Результат |
|
||||
|----------|-----------|
|
||||
| `GET /health` | OK — `{"status":"ok","service":"orchestrator"}` |
|
||||
| `GET /status` | OK — задача `ORCH-100` (id 85) в стадии `testing`, активный набор задач отдан |
|
||||
| `GET /queue` | OK — блоки `serial_gate` **И** `auto_labels` присутствуют в полезной нагрузке (анти-регресс смока ORCH-088 соблюдён) |
|
||||
| `GET /metrics` (ORCH-099, потребляется F1b) | OK — конверт `{schema_version=1, generated_at, clk_tck, stages, queue, agents, cost}` цел |
|
||||
| `GET /status` | OK — валидный JSON, активный набор задач отдан |
|
||||
| `GET /queue` | OK — блоки `serial_gate` (ORCH-088) **И** `auto_labels` (ORCH-089) присутствуют в полезной нагрузке (анти-регресс смока соблюдён) |
|
||||
|
||||
Smoke зелёный, прод-контейнер не трогался (только чтение).
|
||||
|
||||
## Результаты
|
||||
|
||||
### Профильная сюита F1b — `tests/watchdog/`
|
||||
**66 passed** (0 failed). Полностью зелёная — это собственно поставка F1b (отдельный
|
||||
sidecar-демон: решающая функция, парсинг `/metrics`, детект orchestrator-down, never-raise,
|
||||
read-only docker, изолированный транспорт, kill-switch, compose-инвариант, анти-дубль диск-алерта).
|
||||
**66 passed** (0 failed) — собственно поставка F1b: решающая функция, парсинг `/metrics`, детект
|
||||
orchestrator-down, never-raise, read-only docker, изолированный транспорт, kill-switch,
|
||||
compose-инвариант, анти-дубль диск-алерта.
|
||||
|
||||
### Полный регресс орка — `pytest tests/`
|
||||
**1 failed, 1616 passed** (`tests/test_queue.py::TestRetry::test_finalize_job_requeue_then_fail`).
|
||||
|
||||
```
|
||||
tests/test_queue.py:189: in test_finalize_job_requeue_then_fail
|
||||
assert get_job(jid)["status"] == "failed" # 2 >= 2 -> failed
|
||||
E AssertionError: assert 'queued' == 'failed'
|
||||
E - failed
|
||||
E + queued
|
||||
```
|
||||
|
||||
#### Классификация падения (верифицировано независимо)
|
||||
- `git diff origin/main...HEAD --stat -- 'src/**'` → **пусто** ⇒ ORCH-100 не меняет `src/**`
|
||||
ни одной строкой.
|
||||
- `git diff origin/main...HEAD -- tests/test_queue.py` → **пусто** ⇒ файл теста байт-в-байт
|
||||
идентичен `origin/main`.
|
||||
- Падение **детерминированно** и воспроизводится в изоляции (2/2 прогона), не артефакт
|
||||
порядка тестов.
|
||||
- **Вывод:** падение — **pre-existing на `main`**, НЕ вызвано F1b и **структурно неустранимо
|
||||
в рамках ORCH-100** (ТЗ §2 прямо запрещает правки `src/**`). Это реальное, обоснованное
|
||||
красное (тест ловит расхождение логики requeue→finalize с transient-backoff в
|
||||
`launcher`), а не флап окружения.
|
||||
**1617 passed** (0 failed, 1 warning — pre-existing Pydantic V2 deprecation в `src/config.py:8`,
|
||||
не относится к ORCH-100). `src/**` не изменён за всю ветку (`git diff origin/main...HEAD -- 'src/**'`
|
||||
→ пусто) ⇒ контракт `/metrics` (ORCH-099), `STAGE_TRANSITIONS`/`QG_CHECKS`/`check_*`/схема БД — целы.
|
||||
|
||||
## Сопоставление с тест-планом (`04-test-plan.yaml`)
|
||||
|
||||
| TC ID | Описание | Тест-функция / модуль | Результат |
|
||||
|-------|----------|------------------------|-----------|
|
||||
| TC-01 | not-alerting & ≥threshold → ALERT | `test_decision.py::test_tc01_not_alerting_active_alerts` (+ inactive→none) | PASS |
|
||||
| TC-02 | alerting & cooldown НЕ истёк → NONE (throttle) | `test_decision.py::test_tc02_alerting_active_in_cooldown_is_none` | PASS |
|
||||
| TC-03 | alerting & cooldown истёк → REALERT | `test_decision.py::test_tc03_alerting_active_cooldown_elapsed_realerts` | PASS |
|
||||
| TC-04 | alerting & вернулось ниже порога → RECOVERY | `test_decision.py::test_tc04_alerting_recovers_when_inactive` | PASS |
|
||||
| TC-05 | детект orchestrator-down (timeout/refused/5xx/нечит. тело) → ALERT + debounce | `test_orch_down.py` (7 тестов) | PASS |
|
||||
| TC-06 | never-raise per-source/per-tick/per-send | `test_never_raise.py` (3 теста) | PASS |
|
||||
| TC-07 | kill-switch инертен; пороги/интервалы/таймауты из env | `test_config_killswitch.py` (4 теста) | PASS |
|
||||
| TC-08 | интеграция: полный тик при down орке (1 алерт + throttle + recovery; всё ломается — тик не падает) | `test_tick_orch_down_integration.py` (2 теста) | PASS |
|
||||
| TC-09 | self-hosting safety: docker GET-only, без start/stop/restart/exec | `test_docker_readonly.py` (5 тестов) | PASS |
|
||||
| TC-10 | независимый транспорт: свои токен/chat, без импорта `src/notifications.py`/`src` | `test_notify_isolation.py` (6 тестов) | PASS |
|
||||
| TC-11 | толерантность `/metrics`: неизвестное поле игнор, опц. отсутствие ок, рост schema_version → warning | `test_metrics_parse.py` (10 тестов) | PASS |
|
||||
| TC-12 | compose-инвариант: отдельный сервис `orchestrator-watchdog`, build `watchdog/`, restart, mem_limit, docker.sock `:ro` | `test_compose_service.py` (7 тестов) | PASS |
|
||||
| TC-13 | анти-дубль диск-алерта (согласовано с ORCH-063) | `test_disk_alert_dedup.py` (3 теста) | PASS |
|
||||
| **TC-14** | **регресс орка: полный `pytest tests/` зелёный; `src/**` не изменён; `/metrics`-контракт цел** | `tests/` | **FAIL** |
|
||||
| TC ID | Описание | Тест-функция / модуль | Покрытый AC | Результат |
|
||||
|-------|----------|------------------------|-------------|-----------|
|
||||
| TC-01 | not-alerting & ≥threshold → ALERT (один на пересечение) | `test_decision.py::test_tc01_*` (active + inactive→none) | AC-2 | PASS |
|
||||
| TC-02 | alerting & cooldown НЕ истёк → NONE (throttle) | `test_decision.py::test_tc02_alerting_active_in_cooldown_is_none` | AC-2 | PASS |
|
||||
| TC-03 | alerting & cooldown истёк → REALERT | `test_decision.py::test_tc03_*` (elapsed + no_last_alert) | AC-2 | PASS |
|
||||
| TC-04 | alerting & вернулось ниже порога → RECOVERY | `test_decision.py::test_tc04_alerting_recovers_when_inactive` | AC-2 | PASS |
|
||||
| TC-05 | детект orchestrator-down (timeout/refused/5xx/нечит. тело) → ALERT + debounce | `test_orch_down.py` (7 тестов) | AC-2/AC-3 | PASS |
|
||||
| TC-06 | never-raise per-source/per-tick/per-send | `test_never_raise.py` (3 теста) | AC-3 | PASS |
|
||||
| TC-07 | kill-switch инертен; пороги/интервалы/таймауты из env (не хардкод) | `test_config_killswitch.py` (4 теста) | AC-4 | PASS |
|
||||
| TC-08 | интеграция: полный тик при down орке (1 алерт + throttle + recovery; всё ломается — тик не падает) | `test_tick_orch_down_integration.py` (2 теста) | AC-2/AC-3 | PASS |
|
||||
| TC-09 | self-hosting safety: docker GET-only, без start/stop/restart/exec | `test_docker_readonly.py` (5 тестов) | AC-6 | PASS |
|
||||
| TC-10 | независимый транспорт: свои токен/chat, без импорта `src/notifications.py`/`src` | `test_notify_isolation.py` (6 тестов) | AC-2/AC-6 | PASS |
|
||||
| TC-11 | толерантность `/metrics`: неизвестное поле игнор, опц. отсутствие ок, рост schema_version → warning | `test_metrics_parse.py` (10 тестов) | AC-1 | PASS |
|
||||
| TC-12 | compose-инвариант: отдельный сервис `orchestrator-watchdog`, build `watchdog/`, restart, mem_limit, docker.sock `:ro` | `test_compose_service.py` (7 тестов) | AC-1/AC-4/AC-6 | PASS |
|
||||
| TC-13 | анти-дубль диск-алерта (согласовано с ORCH-063) | `test_disk_alert_dedup.py` (3 теста) | AC-5 | PASS |
|
||||
| TC-14 | регресс орка: полный `pytest tests/` зелёный; `src/**` не изменён; `/metrics`-контракт цел | `tests/` (1617 passed) | AC-7 | PASS |
|
||||
|
||||
**TC-14 детально (смешанный исход → FAIL по букве):**
|
||||
- ✅ `src/**` не изменён (диск-проверка пуста).
|
||||
- ✅ `/metrics`-контракт (ORCH-099) не сломан (конверт цел, смок зелёный).
|
||||
- ❌ полный `pytest tests/` **НЕ зелёный** — 1 pre-existing красное (см. выше).
|
||||
- Поскольку TC-14 ожидает **PASS** по условию «полный `pytest tests/` зелёный», а суммарный
|
||||
прогон репозитория красный — **TC-14 = FAIL**. Это единственный FAIL; все 13 профильных
|
||||
TC (TC-01…TC-13) зелёные.
|
||||
**Покрытие:** все 14 TC из `04-test-plan.yaml` выполнены, сопоставлены с AC-1…AC-7
|
||||
(`03-acceptance-criteria.md`) и зелёные.
|
||||
|
||||
## Сопоставление с критериями приёмки (`03-acceptance-criteria.md`)
|
||||
|
||||
| AC | Покрытие | Результат |
|
||||
|----|----------|-----------|
|
||||
| AC-1 — sidecar отдельным контейнером собирает 4 источника | TC-12 + коллекторы host/deps/docker/metrics | PASS |
|
||||
| AC-2 — пороговый алерт: один на пересечение + throttle + recovery + орк-down | TC-01…TC-05 | PASS |
|
||||
| AC-1 — sidecar отдельным контейнером собирает 4 источника | TC-11/12 + коллекторы host/deps/docker/metrics | PASS |
|
||||
| AC-2 — пороговый алерт: один на пересечение + throttle + recovery + орк-down | TC-01…TC-05/08/10 | PASS |
|
||||
| AC-3 — изоляция: падение орка не роняет sidecar | TC-05/06/08 | PASS |
|
||||
| AC-4 — тонкость, kill-switch, конфиг-пороги | TC-07/12 | PASS |
|
||||
| AC-5 — анти-дубль диск-алерта (ORCH-063) | TC-13 | PASS |
|
||||
| AC-6 — self-hosting safety (только чтение/алерт) | TC-09/10 | PASS |
|
||||
| AC-7 — инфра-доки + `pytest` зелёный + docs/CHANGELOG | `07-infra-requirements.md` ✅, CHANGELOG ✅, доки ✅; **но полный `pytest tests/` НЕ зелёный** | **FAIL** (под-условие «полный `tests/` зелёный» нарушено) |
|
||||
| AC-6 — self-hosting safety (только чтение/алерт) | TC-09/10/12 | PASS |
|
||||
| AC-7 — инфра-доки + `pytest` зелёный + docs/CHANGELOG | `07-infra-requirements.md` ✅, CHANGELOG ✅, доки ✅, полный `pytest tests/` 1617 passed ✅ | PASS |
|
||||
|
||||
## Вывод pytest
|
||||
|
||||
### Полный регресс (`pytest tests/ -q`)
|
||||
```
|
||||
........................................................................ [100%]
|
||||
1617 passed, 1 warning in 65.33s (0:01:05)
|
||||
```
|
||||
|
||||
### Профильная сюита (`pytest tests/watchdog/ -v`)
|
||||
```
|
||||
collected 66 items
|
||||
... (все 66 PASSED) ...
|
||||
======================== 66 passed, 1 warning in 0.57s =========================
|
||||
```
|
||||
|
||||
## Эскалация
|
||||
Падение `tests/test_queue.py::TestRetry::test_finalize_job_requeue_then_fail` — **обоснованный
|
||||
pre-existing FAIL на `main`**, не относящийся к F1b и **неустранимый в области ORCH-100** (правки
|
||||
`src/**` запрещены ТЗ §2). Откат на `development` в рамках ORCH-100 его **не починит** (разработчик
|
||||
F1b не вправе трогать `src/**`). **Рекомендация (зеркало эскалации reviewer'а в `12-review.md`):**
|
||||
Owner/планировщику завести **отдельную баг-задачу** (метка `Bug`, маршрут ORCH-019) на починку
|
||||
`test_finalize_job_requeue_then_fail` в `src/launcher`-логике requeue→finalize. Без неё прод-выкат
|
||||
ORCH-100 всё равно упрётся в downstream merge-gate re-test (ORCH-043 гоняет `pytest tests/` на
|
||||
догнанной ветке) по причине, не относящейся к F1b.
|
||||
Нет открытых эскалаций. Прежний pre-existing красный тест (`test_finalize_job_requeue_then_fail`)
|
||||
снят fix-коммитом `2040de3` (изоляция `settings.runs_dir`, test-only, `src/**` не тронут) и
|
||||
независимо подтверждён зелёным в этом прогоне. Отдельная баг-задача более не требуется.
|
||||
|
||||
## Итог
|
||||
**FAIL.**
|
||||
|
||||
- Поставка F1b сама по себе полностью зелёная: `tests/watchdog/` 66/66 PASS, smoke (`/health`,
|
||||
`/status`, `/queue`, `/metrics`) зелёный, все профильные TC-01…TC-13 + AC-1…AC-6 — PASS.
|
||||
- Однако **полный регресс репозитория `pytest tests/` красный** (1 pre-existing fail, 1616 pass)
|
||||
→ TC-14 и под-условие AC-7 «полный `tests/` зелёный» нарушены → машинный вердикт `result: FAIL`.
|
||||
- Тестер не помечает красный регресс зелёным (`❌ не подгонять тесты под код`). Падение —
|
||||
exogenous к F1b и требует отдельной баг-задачи (эскалация выше), а не доработки ORCH-100.
|
||||
**PASS** — полный регресс `pytest tests/` зелёный (1617 passed), профильная сюита sidecar-watchdog
|
||||
66/66 PASS, smoke API (`/health`/`/status`/`/queue` с блоками `serial_gate` + `auto_labels`) read-only
|
||||
прошёл без регресса. Каждый TC (TC-01…TC-14) выполнен и сопоставлен с AC-1…AC-7. Блокеров нет.
|
||||
Задача готова к переходу на `deploy-staging`.
|
||||
|
||||
Reference in New Issue
Block a user