Files
orchestrator/docs/work-items/ORCH-098/13-test-report.md
claude-bot 917acf3e1e
All checks were successful
CI / test (push) Successful in 57s
CI / test (pull_request) Successful in 56s
tester(ET): auto-commit from tester run_id=582
2026-06-10 10:52:53 +03:00

6.5 KiB
Raw Permalink 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-098 testing tester pass 2026-06-10 claude-opus-4-8 test-report ORCH-098

Test Report — ORCH-098 — FND: машинный журнал уроков

Окружение

  • Python: 3.12.13
  • pytest: 8.3.3 (pytest-cov 5.0.0, anyio 4.13.0, asyncio 0.23.8)
  • Worktree: /repos/_wt/orchestrator/feature_ORCH-098-fnd/ (ветка feature/ORCH-098-fnd)
  • Дата: 2026-06-10

Предусловия

  • Review-вердикт (12-review.md): APPROVED (блокеров нет, все findings P2/P3 advisory).
  • Smoke API (read-only, prod 8500):
    • GET /health{"status":"ok","service":"orchestrator"}
    • GET /status200, активные задачи отдаются (ORCH-098 в стадии testing).
    • GET /queue200; присутствует блок serial_gate (ORCH-088) и auto_labels (ORCH-089) в полезной нагрузке — смок-регресса нет.
    • Примечание: прод-контейнер 8500 несёт ещё не задеплоенный код (без блока lessons в /queue) — это ожидаемо (ORCH-098 не выкатан в прод), на смок-вердикт не влияет.

Результаты — покрытие тест-плана (04-test-plan.yaml)

Прогон: cd /repos/_wt/orchestrator/feature_ORCH-098-fnd && pytest tests/ -v --tb=short. Все TC из тест-плана исполнены и сопоставлены с критериями приёмки (03-acceptance-criteria.md).

TC ID Тип Описание AC Тест (tests/test_lessons.py) Результат
TC-01 unit init_db() создаёт lessons идемпотентно, все поля BR-1 AC-1 test_tc01_table_idempotent_and_fields PASS
TC-02 unit Нуллабельные колонки атрибуции attribution/target_repo/target_domain, update проставляет позже AC-2 test_tc02_attribution_columns_nullable_and_settable PASS
TC-03 unit record() вставляет строку (source auto/manual), возвращает id, created_at заполнен AC-3/AC-5 test_tc03_record_inserts_and_returns_id PASS
TC-04 unit never-raise при падающей БД: record/get/update/snapshotNone/[]/{} без исключения AC-6 test_tc04_never_raise_on_db_error PASS
TC-05 unit kill-switch lessons_enabled=False — инертность (no-op, без БД) AC-7 test_tc05_kill_switch_inert PASS
TC-06 unit get_lessons фильтрует type/status/repo/work_item, limit, ORDER BY id DESC AC-4 test_tc06_filters_limit_order PASS
TC-07 unit update_lesson меняет status/attribution/target_*/related_task + updated_at; неизв. id безопасен AC-5 test_tc07_update_and_unknown_id PASS
TC-07b unit (доп.) дедуп source=auto в окне; source=manual всегда проходит AC-3/AC-5 test_tc07b_auto_dedup_and_manual_passthrough PASS
TC-08 integration Автозапись gate-fail: откат в _handle_qg_failure_rollbacks → строка gate_failure с контекстом AC-3 test_tc08_gate_failure_autorecord PASS
TC-09 integration Автозапись transient/HOLD: транзиент-ветка пишет урок; сбой записи не ломает горячий путь AC-3/AC-6 test_tc09_transient_autorecord_and_never_raise PASS
TC-10 integration GET /lessons → 200 с фильтрами; GET /queue несёт блок lessons; чтение не мутирует AC-4 test_tc10_get_endpoints PASS
TC-11 integration POST /lessons (manual+атрибуция), POST /lessons/{id} обновляет; при выключенном флаге {enabled:false} AC-5/AC-7 test_tc11_post_endpoints_and_killswitch PASS
TC-12 unit Инварианты конвейера не тронуты: STAGE_TRANSITIONS/QG_CHECKS/machine-verdict неизменны AC-8 test_tc12_pipeline_invariants_untouched PASS

Итог покрытия: 12/12 TC тест-плана исполнены и сопоставлены с AC-1…AC-9 → PASS. AC-9 (полный регресс зелёный + новый test_lessons.py) подтверждён прогоном ниже.

Вывод pytest

Полный регресс (tests/):

================== 1630 passed, 1 warning in 71.78s (0:01:11) ==================

(единственный warning — PydanticDeprecatedSince20 в src/config.py, не связан с ORCH-098, предсуществующий.)

Целевой модуль (tests/test_lessons.py):

collected 13 items
tests/test_lessons.py::test_tc01_table_idempotent_and_fields PASSED      [  7%]
tests/test_lessons.py::test_tc02_attribution_columns_nullable_and_settable PASSED [ 15%]
tests/test_lessons.py::test_tc03_record_inserts_and_returns_id PASSED    [ 23%]
tests/test_lessons.py::test_tc04_never_raise_on_db_error PASSED          [ 30%]
tests/test_lessons.py::test_tc05_kill_switch_inert PASSED                [ 38%]
tests/test_lessons.py::test_tc06_filters_limit_order PASSED              [ 46%]
tests/test_lessons.py::test_tc07_update_and_unknown_id PASSED            [ 53%]
tests/test_lessons.py::test_tc07b_auto_dedup_and_manual_passthrough PASSED [ 61%]
tests/test_lessons.py::test_tc08_gate_failure_autorecord PASSED          [ 69%]
tests/test_lessons.py::test_tc09_transient_autorecord_and_never_raise PASSED [ 76%]
tests/test_lessons.py::test_tc10_get_endpoints PASSED                    [ 84%]
tests/test_lessons.py::test_tc11_post_endpoints_and_killswitch PASSED    [ 92%]
tests/test_lessons.py::test_tc12_pipeline_invariants_untouched PASSED    [100%]
======================== 13 passed, 1 warning in 1.55s =========================

Итог

PASS — полный регресс зелёный (1630 passed), все 12 TC тест-плана исполнены и сопоставлены с критериями приёмки, smoke API read-only (/health//status//queue) в норме (блоки serial_gate и auto_labels присутствуют). Задача готова к переходу на deploy-staging.