Files
orchestrator/docs/work-items/ORCH-100/13-test-report.md
claude-bot b0e3a5d044
All checks were successful
CI / test (push) Successful in 46s
CI / test (pull_request) Successful in 47s
tester(ET): auto-commit from tester run_id=568
2026-06-10 09:16:51 +03:00

9.6 KiB
Raw Blame History

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.