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