work_item: ORCH-019
stage: analysis
author_agent: analyst
status: ready-for-review
created_at: 2026-06-10
model_used: claude-opus-4-8
title: "Багфикс-трек: классификация по метке, укороченный маршрут, сохранность гейтов, fail-safe"
framework: pytest
scope: >
  Покрывает: классификацию задачи как бага по метке Plane (ORCH-089-аппарат), маршрутизацию
  багфикса в обход стадии architecture, сохранность ВСЕХ Quality Gate'ов, обязательность
  регресс-теста, эскалацию в полный цикл, fail-safe → полный цикл, наблюдаемость/метрику,
  аддитивность и композицию с serial-gate/auto-label/coverage. Вне покрытия: реальный
  Plane/Gitea I/O (мокается), роутинг моделей ORCH-13, LLM-авто-триаж сложности.
notes: >
  Сетевые вызовы Plane (fetch_issue_labels/get_project_labels) мокаются. Полный регресс tests/
  должен оставаться зелёным. Тесты на сохранность гейтов проверяют НЕИЗМЕННОСТЬ QG_CHECKS/check_*/
  вердикт-ключей — это анти-регресс корневого инварианта (NFR-1). Финальные имена модулей/функций
  (labels.py vs новый bug_fast_track.py; tasks.track колонка) фиксирует архитектор — TC привязаны
  к поведению, имена путей уточняются на стадии разработки.

tests:
  - id: TC-01
    type: unit
    description: "is_bug_task() возвращает True для issue с меткой 'Bug' (has_label True); метка читается из Plane API, не из payload."
    module: tests/test_bug_fast_track.py
    expected: PASS

  - id: TC-02
    type: unit
    description: "is_bug_task() возвращает False при отсутствии метки, неоднозначной метке или labels=None (fail-safe)."
    module: tests/test_bug_fast_track.py
    expected: PASS

  - id: TC-03
    type: unit
    description: "bug_fast_track_applies(repo): первым проверяется локальная область (enabled + CSV repos) до любого сетевого вызова; выключенный флаг → False без обращения к has_label."
    module: tests/test_bug_fast_track.py
    expected: PASS

  - id: TC-04
    type: unit
    description: "never-raise: исключение в fetch_issue_labels/get_project_labels не пробрасывается — is_bug_task деградирует в False (полный цикл)."
    module: tests/test_bug_fast_track.py
    expected: PASS

  - id: TC-05
    type: unit
    description: "Маршрут багфикса: для bug-задачи следующая стадия после analysis = development (architecture пропущена); для не-баг задачи = architecture."
    module: tests/test_bug_fast_track_routing.py
    expected: PASS

  - id: TC-06
    type: unit
    description: "STAGE_TRANSITIONS структурно не изменён: набор стадий и рёбер байт-в-байт прежний (анти-регресс)."
    module: tests/test_bug_fast_track_routing.py
    expected: PASS

  - id: TC-07
    type: unit
    description: "Реестр QG_CHECKS и сигнатуры check_* не изменены багфикс-треком; вердикт-ключи (verdict/result/deploy_status/staging_status/security_status/coverage_status) сохранены по имени и регистру."
    module: tests/test_bug_fast_track_gates.py
    expected: PASS

  - id: TC-08
    type: integration
    description: "E2E багфикс-трек: bug-задача проходит development→review→testing→deploy-staging→deploy с исполнением всех гейтов (check_ci_green/reviewer_verdict/tests_passed/staging/deploy + под-гейты security/merge/coverage/image-freshness), минуя architecture."
    module: tests/test_bug_fast_track_e2e.py
    expected: PASS

  - id: TC-09
    type: integration
    description: "start_pipeline: issue с меткой Bug (флаг вкл, репо применим) создаёт задачу на багфикс-треке; issue без метки — на полном цикле (точка входа analysis + маршрут с architecture)."
    module: tests/test_bug_fast_track_e2e.py
    expected: PASS

  - id: TC-10
    type: integration
    description: "Fail-safe: при bug_fast_track_enabled=False путь старта и маршрут идентичны прежним (нулевая регрессия) — задача с меткой Bug идёт полным циклом."
    module: tests/test_bug_fast_track_e2e.py
    expected: PASS

  - id: TC-11
    type: integration
    description: "Эскалация: после снятия метки Bug / решения 'баг сложный' задача проходит штатный маршрут с architecture (возврат в полный цикл)."
    module: tests/test_bug_fast_track_escalation.py
    expected: PASS

  - id: TC-12
    type: unit
    description: "check_analysis_approved/check_analysis_complete не блокирует ложно облегчённый багфикс-пакет, но сохраняет прежнюю проверку для не-баг задач (требование FR-6)."
    module: tests/test_bug_fast_track_gates.py
    expected: PASS

  - id: TC-13
    type: integration
    description: "GET /queue содержит аддитивный read-only блок bug_fast_track (enabled/repos/label/счётчик/метрика); существующие ключи неизменны; ошибка построения блока не роняет эндпоинт."
    module: tests/test_queue_endpoint.py
    expected: PASS

  - id: TC-14
    type: integration
    description: "Композиция: багфикс-задача учитывается serial-gate (ORCH-088) как обычная задача репо и не обходит его; autoApprove/autoDeploy (ORCH-089) применимы на багфикс-треке."
    module: tests/test_bug_fast_track_composition.py
    expected: PASS

  - id: TC-15
    type: unit
    description: "Миграция (если введена колонка tasks.track) аддитивна и идемпотентна: повторный init_db/_ensure_column не падает; дефолт 'full' для существующих строк."
    module: tests/test_db_migrations.py
    expected: PASS
