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
