architect(ET): auto-commit from architect run_id=558
All checks were successful
CI / test (push) Successful in 46s

This commit is contained in:
2026-06-10 03:25:36 +03:00
parent 13739c0b47
commit 62a63ba0c6
7 changed files with 539 additions and 0 deletions

View File

@@ -373,6 +373,43 @@ Phase A ждёт ручного `Confirm Deploy`, ORCH-059). ORCH-089 снима
`docs/work-items/ORCH-089/06-adr/ADR-001-auto-label-gates.md`,
`docs/work-items/ORCH-089/07-infra-requirements.md`.
### Багфикс-трек: укороченный маршрут для багов (ORCH-019 — design)
Задача с меткой Plane `Bug` идёт по **укороченному** маршруту `analysis(lite) → development →
review → testing → deploy-staging → deploy → done`, **минуя стадию `architecture`** (отдельный
прогон opus-агента `architect` + ADR + exit-гейт `check_architecture_done`). **Корневой инвариант
(NFR-1):** срезается ТОЛЬКО аналитика/архитектура; ни один Quality Gate / под-гейт
(security/merge/coverage/image-freshness) / вердикт-ключ — НЕ ослаблен (урок ET-8). Аддитивно, под
kill-switch, per-repo, never-raise, fail-safe → полный цикл; `STAGE_TRANSITIONS`/`QG_CHECKS`/
`check_*` — **не трогаются**.
- **Багфикс-трек = свойство планировщика/точки входа, НЕ Quality Gate.** Классификация —
leaf `src/bug_fast_track.py` (never-raise, образец `serial_gate`/`labels`): метка `Bug`
читается аппаратом ORCH-089 (`labels.has_label` + `plane_sync.fetch_issue_labels`), задача
помечается `track='bug'`. `applies(repo)` (локально, без сети) — ПЕРВЫМ; `has_label` (сеть) —
только при `applies==True`; чтение метки **только** в `start_pipeline`, никогда в горячем
`claim_next_job` (NFR-4 anti-stall).
- **Хранение типа** — аддитивная колонка `tasks.track TEXT DEFAULT 'full'` (`_ensure_column`,
паттерн `tasks.cancelled_at` ORCH-090); читается в `advance_stage` из БД, не из сети.
- **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`).
- **Гейт `analysis` не трогаем** — `check_analysis_complete`/`check_analysis_approved` байт-в-байт;
lite-аналитик эмитит все 4 файла (01-bug-report / 02-03 краткие заглушки / 04 план обязательного
регресс-теста, BR-4). Экономия — пропуск всей стадии `architecture`, не число файлов.
- **Эскалация** (обратимость BR-5) — `POST /bug-fast-track/escalate?work_item=<id>` сбрасывает
`track→'full'` (+ self-escalate мини-аналитика) → задача идёт через `architecture`.
- **Флаги** (`config.py`): `bug_fast_track_enabled` (kill-switch), `bug_fast_track_label`
(дефолт `Bug`), `bug_fast_track_repos` (CSV; **пусто → self-hosting only**). `False`/неприменимый
репо → путь старта и маршрут **байт-в-байт** прежние (нулевая регрессия для enduro и orchestrator).
- **Наблюдаемость (AC-7):** read-only блок `bug_fast_track` в `GET /queue` (флаг/область/метка +
счётчик `track='bug'` + метрика экономии стадий/agent-runs/токенов/времени из `agent_runs`); лог
на решение о маршруте; опц. `🐞` в Telegram-карточке.
- **Инфра-предусловие:** создать метку `Bug` в Plane-проекте ORCH; её отсутствие = `has_label`
False = полный цикл (fail-safe).
Подробнее: [adr-0032](adr/adr-0032-bug-fast-track.md), детально —
`docs/work-items/ORCH-019/06-adr/ADR-001-bug-fast-track.md`,
`docs/work-items/ORCH-019/08-data-requirements.md`.
### STOP / отмена задачи: терминал `cancelled` + закрытие дыры релонча (ORCH-090 — реализовано)
До ORCH-090 не было штатного способа отменить задачу (ручная хирургия по БД/процессам) и

View File

@@ -0,0 +1,95 @@
---
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>

View File

@@ -106,6 +106,17 @@ claude.exe --print --system-prompt --allowedTools Read,Write,Edit,Bash
Примечание: переход `review → testing` использует `check_reviewer_verdict` (читается из frontmatter `12-review.md`); `development → review``check_tests_local` (оркестратор сам прогоняет тесты, не зависит от Gitea CI).
**Багфикс-трек: routing-override на ребре выхода из `analysis` (ORCH-019 — design).** Для задачи
с `tasks.track='bug'` (помечена в `start_pipeline` по метке Plane `Bug` через аппарат ORCH-089)
`advance_stage` на шаге 3 переопределяет результат `get_next_stage('analysis')`: `next_stage`
`development` (вместо `architecture`), а на шаге 4 `next_agent``developer` (вместо `architect`)
→ стадия `architecture` и её exit-гейт `check_architecture_done` для багфикса не исполняются.
`STAGE_TRANSITIONS`/`get_next_stage`/`get_agent_for_stage` остаются чистыми (1:1) — override живёт
только в `advance_stage`. Чистый предикат `bug_fast_track.skips_architecture(track)` (leaf
`src/bug_fast_track.py`, never-raise) под `bug_fast_track_enabled`; `track` читается из БД, не из
сети (NFR-4). `False`/неприменимый репо → маршрут байт-в-байт прежний. Детали —
[adr-0032](adr/adr-0032-bug-fast-track.md).
### 6. Review Bounce
При REQUEST_CHANGES: