9.6 KiB
result, work_item, stage, author_agent, status, created_at, model_used, type, work_item_id
| result | work_item | stage | author_agent | status | created_at | model_used | type | work_item_id |
|---|---|---|---|---|---|---|---|---|
| FAIL | ORCH-100 | testing | tester | fail | 2026-06-10 | claude-opus-4-8 | test-report | ORCH-100 |
Test Report — ORCH-100 — FND/F1b: sidecar-watchdog
Машинный вердикт читается ТОЛЬКО из frontmatter (
result:, UPPERCASE). Негативный токен (FAIL) — авторитетен.
Окружение
- 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.
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} цел |
Smoke зелёный, прод-контейнер не трогался (только чтение).
Результаты
Профильная сюита F1b — tests/watchdog/
66 passed (0 failed). Полностью зелёная — это собственно поставка F1b (отдельный
sidecar-демон: решающая функция, парсинг /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), а не флап окружения.
Сопоставление с тест-планом (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-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) зелёные.
Сопоставление с критериями приёмки (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-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/ зелёный» нарушено) |
Эскалация
Падение 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.
Итог
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.