112 lines
6.8 KiB
YAML
112 lines
6.8 KiB
YAML
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
|