6.5 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 |
|---|---|---|---|---|---|---|---|---|
| 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 /status→200, активные задачи отдаются (ORCH-098 в стадииtesting). ✅GET /queue→200; присутствует блок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/snapshot → None/[]/{} без исключения |
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.