Files
orchestrator/docs/work-items/ORCH-116/13-test-report.md
claude-bot 3270647d86
All checks were successful
CI / test (push) Successful in 1m16s
CI / test (pull_request) Successful in 1m16s
tester(ET): auto-commit from tester run_id=758
2026-06-16 10:19:58 +03:00

12 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
PASS ORCH-116 testing tester pass 2026-06-16 claude-opus-4-8 test-report ORCH-116

Test Report — ORCH-116 — детерминированный test-раннер вместо LLM-тестера

Машинный вердикт читается ТОЛЬКО из frontmatter (result:; равнорангово verdict:/status:, ORCH-047). Любой негативный токен авторитетен.

Окружение

  • Python: 3.12.13
  • pytest: 8.3.3
  • Дата: 2026-06-16
  • Worktree: /repos/_wt/orchestrator/feature_ORCH-116-orch-replace-llm-tester-with-d (ветка feature/ORCH-116-orch-replace-llm-tester-with-d) — регресс прогнан в worktree ветки задачи, НЕ в общем /repos/orchestrator (анти checkout-гонка).
  • Прод-контейнер 8500 не трогался; smoke — строго read-only GET.
  • Review-гейт: 12-review.mdverdict: APPROVED ✔ (предусловие стадии выполнено).

Smoke API (read-only)

Эндпоинт Результат
GET /health {"status":"ok","service":"orchestrator"}OK
GET /status 200, активные задачи отдаются (вкл. ORCH-116, stage=testing) — OK
GET /queue 200; блок serial_gate присутствует ✔ (ORCH-088); блок auto_labels присутствует ✔ — OK

Примечание: блок test_runner (ORCH-116) в /queue прод-инстанса отсутствует — ожидаемо, т.к. прод исполняет до-ORCH-116 код (эта ветка ещё не задеплоена). Это не регресс смока: контрактные блоки serial_gate/auto_labels на месте.

Результаты

Полный регресс (pytest tests/ -v --tb=short, worktree ветки)

  • 2162 passed, 1 failed (105.31s).
  • Профильная сюита tests/test_orch116_test_runner.py32 passed (в изоляции, 2.64s).
  • Анти-дрейф LLM-карты tests/test_llm_call_site_inventory.py + test_llm_determinization_docs.py — зелёные (в составе полного регресса).

Единственный красный — pre-existing flake ORCH-123, НЕ дефект ORCH-116

tests/test_orch123_staging_runner_exec.py::test_r2_held_deploy_staging_not_rolled_back.

Доказано независимым воспроизведением, что фейл полностью независим от ORCH-116 и пред-существует в main (анти-ложная-маршрутизация инфра/чужого фейла как код-фейла — класс ORCH-110):

  1. Изоляция: pytest …::test_r2_held_deploy_staging_not_rolled_back отдельно → 1 passed.
  2. Профильный файл ORCH-116: tests/test_orch116_test_runner.py32 passed (зелёный).
  3. Полный регресс БЕЗ файла ORCH-116 (--ignore=tests/test_orch116_test_runner.py) → всё равно 1 failed, 2130 passed — тот же тест красный без участия нового кода тестов ORCH-116.
  4. Чистый origin/main (9c88fdd), полный регресс во временном worktree → 1 failed, 2130 passed, падает РОВНО тот же тест. → флейк пред-существует в main, идентичный счётчик фейлов.
  5. Граница правки: git diff origin/main...HEAD НЕ затрагивает src/staging_runner.py, src/stages.py, src/qg/, src/stage_engine.py. ORCH-116 физически не может влиять на этот тест.

Итог сопоставления: ветка ORCH-116 = 2162 passed / 1 failed; main = 2130 passed / 1 failed. ORCH-116 добавляет 32 зелёных теста и не делает красным ни один ранее зелёный — это кросс-тестовое загрязнение глобального состояния в коде ORCH-123 (недавно влит в main). AC-15 FAIL-условие («любой ранее зелёный тест становится красным / новые тесты падают») — не наступило; AC-15-интент NFR-1/NFR-5 («существующий конвейер не сломан») — выполнен. Рекомендация: завести отдельный bug на изоляцию test_orch123_staging_runner_exec.py (вне области ORCH-116, не должен блокировать этот PR). Согласуется с вердиктом reviewer (P2, APPROVED).

Сопоставление с тест-планом (04-test-plan.yaml)

TC ID Тип Описание (кратко) Тест-функция / проверка Результат
TC-01 unit applies(repo): kill-switch/CSV/контракт (BR-9)/never-raise test_tc01_* PASS
TC-02 unit Маппинг exit→verdict (0→PASS, иначе/None→FAIL, единый контракт) test_tc02_map_exit_code PASS
TC-03 unit Рендер 13-test-report.md: result: UPPERCASE + 52c-схема test_tc03_report_render_schema_and_status_alignment PASS
TC-04 integration Артефакт читается неизменённым _parse_tests_verdict test_tc04_gate_parser_unchanged, test_tc04_status_field_never_false_negatives_a_pass PASS
TC-05 integration Перехват tester на testing до _spawn, нет agent_runs, None test_tc05_launch_job_intercepts_before_spawn PASS
TC-06 integration Дискриминатор: не-testing/не-tester не перехват; never-raise→False test_tc06_* PASS
TC-07 integration PASS→advance_stage(finished_agent='tester'); FAIL→откат+retry test_tc07_advance_initiated_like_llm[0-PASS], [1-FAIL] PASS
TC-08 integration Kill-switch off → _spawn (LLM-путь байт-в-байт) test_tc08_killswitch_falls_back_to_spawn PASS
TC-09 unit Анти-дрейф NFR-1: STAGE_TRANSITIONS/QG_CHECKS/парсер/токены/схема БД целы test_tc09_pipeline_contract_unchanged PASS
TC-10 integration Two-level outcome: tool-error→bounded DEFER→fail-closed FAIL+alert test_tc10_* PASS
TC-11 unit never-raise/fail-safe: pytest бросает/таймаут→FAIL/DEFER, не клинит test_tc11_run_gate_never_raises, test_tc11_launcher_contains_runner_fault PASS
TC-12 unit Изоляция/таймаут: proc_group tree-kill в worktree; малформ→дефолт 900+WARN test_tc12_* PASS
TC-13 unit Self-hosting safety: нет запрещённых литералов; smoke read-only GET test_tc13_* PASS
TC-14 integration Наблюдаемость: блок test_runner в /queue, структурный лог, гибрид test_tc14_* PASS
TC-15 integration Анти-дрейф LLM-карты (A5/rank 2, «ровно один first_slice=yes») test_llm_call_site_inventory.py / test_llm_determinization_docs.py PASS

Все 15 TC выполнены и сопоставлены; все PASS.

Сопоставление с критериями приёмки (03-acceptance-criteria.md)

AC Покрыт Результат
AC-1 Перехват на testing без _spawn/LLM TC-05 PASS
AC-2 Контракт 13-test-report.md неизменен TC-03, TC-04 PASS
AC-3 exit-code→verdict маппинг (fail-closed) TC-02 PASS
AC-4 Эквивалентность маршрутизации PASS/FAIL TC-07 PASS
AC-5 Two-level outcome (tool-error ≠ code-fail) TC-10 PASS
AC-6 Скоуп: гейты/стадии/схема БД не тронуты TC-09 + git diff PASS
AC-7 Kill-switch и скоуп (обратимость) TC-01, TC-08 PASS
AC-8 Backward-compat для репо без контракта TC-01 PASS
AC-9 never-raise / fail-safe TC-11 PASS
AC-10 Self-hosting safety TC-13 PASS
AC-11 Изоляция процесса/таймаут (proc_group) TC-12 PASS
AC-12 Гибрид: LLM не в control-path вердикта TC-14 PASS
AC-13 Наблюдаемость TC-14 PASS
AC-14 Норматив LLM-карты/политики/витрины TC-15 + ревью оси 4 PASS
AC-15 Полный регресс зелёный полный регресс PASS*

* AC-15: новые тесты зелёные, ни один ранее зелёный тест не покраснел из-за ORCH-116. Единственный красный — pre-existing flake ORCH-123 (идентичен на чистом main), вне области ORCH-116.

Вывод pytest (хвост полного регресса)

=================================== FAILURES ===================================
_________________ test_r2_held_deploy_staging_not_rolled_back __________________
tests/test_orch123_staging_runner_exec.py:462: in test_r2_held_deploy_staging_not_rolled_back
    assert result is None                               # red gate -> stay, no advance call
E   AssertionError: assert <MagicMock name='mock()' id='...'> is None
=========================== short test summary info ============================
FAILED tests/test_orch123_staging_runner_exec.py::test_r2_held_deploy_staging_not_rolled_back
============ 1 failed, 2162 passed, 1 warning in 105.31s (0:01:45) =============

Контрольные прогоны (доказательство независимости от ORCH-116):

# тест в изоляции
1 passed
# профильный файл ORCH-116
32 passed
# полный регресс БЕЗ файла ORCH-116 (--ignore)
1 failed, 2130 passed   (тот же тест красный)
# чистый origin/main (9c88fdd), полный регресс
1 failed, 2130 passed   (тот же тест красный)

Итог

PASS. Smoke OK (read-only /health//status//queue; serial_gate + auto_labels на месте). Профильная сюита (32) и анти-дрейф LLM-карты зелёные. Все 15 TC и 15 AC сопоставлены и пройдены. Единственный красный тест полного регрессаpre-existing flake ORCH-123 (test_r2_held_deploy_staging_not_rolled_back), доказанно идентичный на чистом origin/main (2130 passed / 1 failed) и полностью независимый от ORCH-116 (граница правки не затрагивает src/staging_runner.py); ORCH-116 не делает красным ни один ранее зелёный тест и добавляет 32 зелёных. AC-15-интент «существующий конвейер не сломан» выполнен. Рекомендован отдельный bug на изоляцию теста ORCH-123 (вне области этой задачи). Задача переходит на deploy-staging.