work_item: ORCH-046 description: > Тест-план для встраивания дословного текста findings reviewer/tester в task_desc при заворотах деву. Покрывает новый парсер src/review_parse.py (graceful, never-raise) и две rollback-ветки src/stage_engine.py. tests: # --- Парсер review findings (extract_review_findings) ------------------- - id: TC-01 type: unit description: "extract_review_findings возвращает дословный текст P0/P1 при их наличии в 12-review.md" module: tests/test_review_parse.py covers: [AC-1, AC-5] expected: PASS - id: TC-02 type: unit description: "extract_review_findings возвращает '' когда есть только P2/P3 (нет must-fix P0/P1)" module: tests/test_review_parse.py covers: [AC-5] expected: PASS - id: TC-03 type: unit description: "extract_review_findings возвращает '' для отсутствующего файла (несуществующий путь), без исключения" module: tests/test_review_parse.py covers: [AC-4] expected: PASS - id: TC-04 type: unit description: "extract_review_findings возвращает '' для битого/пустого файла или markdown без секции ## Findings, без исключения" module: tests/test_review_parse.py covers: [AC-4, AC-5] expected: PASS - id: TC-05 type: unit description: "extract_review_findings усекает очень длинные findings до лимита с маркером truncated" module: tests/test_review_parse.py covers: [AC-1] expected: PASS # --- Парсер test failures (extract_test_failures) ---------------------- - id: TC-06 type: unit description: "extract_test_failures извлекает релевантный фрагмент тела (Вывод pytest / FAIL-строки / Итог) из 13-test-report.md с result: FAIL" module: tests/test_review_parse.py covers: [AC-2, AC-5] expected: PASS - id: TC-07 type: unit description: "extract_test_failures возвращает '' для отсутствующего файла, без исключения" module: tests/test_review_parse.py covers: [AC-4] expected: PASS - id: TC-08 type: unit description: "extract_test_failures возвращает '' для битого/пустого отчёта (нет тела/секций), без исключения" module: tests/test_review_parse.py covers: [AC-4, AC-5] expected: PASS # --- Интеграция со stage_engine (rollback task_desc) ------------------- - id: TC-09 type: integration description: "advance_stage: reviewer REQUEST_CHANGES -> в enqueue_job('developer') task_desc содержит дословные P0/P1 findings И ссылку на 12-review.md" module: tests/test_stage_engine.py covers: [AC-1, AC-3] expected: PASS - id: TC-10 type: integration description: "advance_stage: tester check_tests_passed FAIL -> task_desc содержит reason + фрагмент 13-test-report.md И ссылку на файл" module: tests/test_stage_engine.py covers: [AC-2, AC-3] expected: PASS - id: TC-11 type: integration description: "advance_stage: reviewer REQUEST_CHANGES при отсутствующем/битом 12-review.md -> graceful fallback, task_desc = прежняя ссылка-строка, без исключения" module: tests/test_stage_engine.py covers: [AC-4, AC-3] expected: PASS - id: TC-12 type: integration description: "advance_stage: rollback/retry поведение неизменно — последовательность откатов, _developer_retry_count, alert на 4-й заход, поля AdvanceResult" module: tests/test_stage_engine.py covers: [AC-6] expected: PASS # --- Регресс / неизменность out-of-scope ------------------------------ - id: TC-13 type: integration description: "Реестр QG_CHECKS не изменён (snapshot), гейты check_* нетронуты" module: tests/test_qg_registry_snapshot.py covers: [AC-7] expected: PASS - id: TC-14 type: integration description: "Полный регресс существующего набора зелёный: python -m pytest tests/ -q" module: tests/ covers: [AC-5, AC-6, AC-7] expected: PASS