96 lines
6.7 KiB
Markdown
96 lines
6.7 KiB
Markdown
---
|
||
work_item: ORCH-019
|
||
stage: architecture
|
||
author_agent: architect
|
||
status: proposed
|
||
created_at: 2026-06-10
|
||
model_used: claude-opus-4-8
|
||
---
|
||
|
||
# adr-0032: Багфикс-трек — укороченный маршрут конвейера для багов (ORCH-019)
|
||
|
||
## Статус
|
||
Proposed
|
||
|
||
## Контекст
|
||
|
||
Любая задача идёт по полному конвейеру `analysis → architecture → development → review → testing
|
||
→ deploy-staging → deploy → done`. Для мелкого бага стадия `architecture` (отдельный прогон
|
||
opus-агента `architect` + ADR + exit-гейт `check_architecture_done`) избыточна и тратит
|
||
токены/время (прецедент ET-9/ET-014 ~35 мин).
|
||
|
||
**Корневой инвариант (нерушимый):** упрощаем только *аналитику/архитектуру*; ни один Quality
|
||
Gate / под-гейт (security/merge/coverage/image-freshness) / exit-код deploy-хука — НЕ ослаблен
|
||
(урок ET-8: срезанная проверка = недоделка на проде).
|
||
|
||
Кросс-каттинговость: затрагивает семантику маршрутизации (`advance_stage`), вводит новый
|
||
leaf-компонент `src/bug_fast_track.py` и аддитивную колонку `tasks.track` → регистрируется
|
||
сквозным ADR.
|
||
|
||
## Решение
|
||
|
||
Багфикс-трек — **свойство планировщика/точки входа, НЕ Quality Gate**.
|
||
|
||
1. **Классификация** (`src/bug_fast_track.py`, leaf never-raise по образцу `serial_gate`/`labels`):
|
||
задача с меткой Plane `Bug` (`bug_fast_track_label`, читается аппаратом ORCH-089
|
||
`labels.has_label`) помечается `track='bug'`. `applies(repo)` (локально, без сети) — первым;
|
||
`has_label` (сеть) — только при `applies==True`; чтение метки **только** в `start_pipeline`,
|
||
никогда в горячем `claim_next_job` (anti-stall).
|
||
|
||
2. **Хранение** — аддитивная идемпотентная колонка `tasks.track TEXT DEFAULT 'full'`
|
||
(`_ensure_column`, паттерн `tasks.cancelled_at` ORCH-090); читается в `advance_stage` из БД
|
||
(не из сети).
|
||
|
||
3. **Routing-override** — `STAGE_TRANSITIONS` и `get_next_stage`/`get_agent_for_stage` остаются
|
||
**чистыми** (1:1). В `advance_stage`, на ребре выхода из `analysis`, при `track='bug'`:
|
||
`next_stage` → `development` (вместо `architecture`), `next_agent` → `developer` (вместо
|
||
`architect`). Багфикс физически минует стадию `architecture` → её exit-гейт
|
||
`check_architecture_done` и `06-adr/` для багфикса не исполняются.
|
||
|
||
4. **Гейт `analysis` не трогаем** — `check_analysis_complete`/`check_analysis_approved` байт-в-байт
|
||
прежние; lite-аналитик эмитит все 4 файла (01-bug-report / 02-03 краткие заглушки / 04 план
|
||
обязательного регресс-теста). Экономия — пропуск всей стадии `architecture`, не число файлов.
|
||
|
||
5. **Эскалация** (обратимость) — `POST /bug-fast-track/escalate?work_item=<id>` сбрасывает
|
||
`track→'full'` (+ self-escalate мини-аналитика); задача далее идёт через `architecture`.
|
||
|
||
6. **Условность/откат** — `bug_fast_track_enabled` (kill-switch), `bug_fast_track_label`,
|
||
`bug_fast_track_repos` (CSV; **пусто → self-hosting only**). `False`/неприменимый репо →
|
||
путь старта и маршрут **байт-в-байт** прежние.
|
||
|
||
7. **Наблюдаемость** — read-only блок `bug_fast_track` в `GET /queue` (флаг/область/метка +
|
||
счётчик `track='bug'` + метрика экономии из `agent_runs`); лог на решение о маршруте; опц.
|
||
`🐞` в Telegram-карточке.
|
||
|
||
## Кросс-каттинговые инварианты (НЕ нарушаются)
|
||
|
||
- `STAGE_TRANSITIONS` структурно не меняется (нет новых/удалённых стадий); `cancelled`/`done`
|
||
стоки и предикаты терминальности (ORCH-090) не затронуты.
|
||
- Реестр `QG_CHECKS`, сигнатуры `check_*`, вердикт-ключи (`verdict:`/`result:`/`deploy_status:`/
|
||
`staging_status:`/`security_status:`/`coverage_status:`), порядок под-гейтов — байт-в-байт.
|
||
- Врезка ORCH-019 в `advance_stage` — ТОЛЬКО на ребре выхода из `analysis`, ДО всех deploy-edge
|
||
под-гейтов (ORCH-022/043/027/058) и Phase A/B (ORCH-036/059) → их инварианты сохранены.
|
||
- Композиция с serial-gate (ORCH-088), auto-label (ORCH-089), coverage-gate (ORCH-027),
|
||
merge-gate (ORCH-043) — багфикс-задача остаётся обычной задачей репо.
|
||
|
||
## Последствия
|
||
|
||
- **+** Багфикс минует стадию `architecture` (основная экономия), гейты качества сохранены.
|
||
- **+** Аддитивно, под kill-switch, per-repo, never-raise, fail-safe → полный цикл; нулевая
|
||
регрессия для enduro и orchestrator при выключении.
|
||
- **−** lite-аналитик эмитит 02/03 заглушки (компромисс ради неизменности гейта); эскалация v1
|
||
требует операторского действия (авто-триаж сложности — будущее, ORCH-13/Вариант 3).
|
||
- **Откат:** `bug_fast_track_enabled=False` (мгновенно); колонка `tasks.track` аддитивна и
|
||
безвредна (дефолт `'full'`).
|
||
|
||
## Связанные решения
|
||
- ORCH-089 (auto-label) — переиспользуемый аппарат label-чтения: [adr-0018](adr-0018-auto-label-gates.md)
|
||
- ORCH-088 (serial gate) — композиция очереди репо
|
||
- ORCH-027 (coverage-gate) — структурный союзник BR-4: [adr-0029](adr-0029-coverage-gate.md)
|
||
- ORCH-090 (cancelled) — паттерн аддитивной колонки `tasks.*`: [adr-0026](adr-0026-stop-cancel-task.md)
|
||
|
||
## Ссылки
|
||
- Детальный ADR задачи: `docs/work-items/ORCH-019/06-adr/ADR-001-bug-fast-track.md`
|
||
- BRD/TRZ/AC: `docs/work-items/ORCH-019/01-brd.md`, `02-trz.md`, `03-acceptance-criteria.md`
|
||
</content>
|