feat(bug-fast-track): cheaper/shorter pipeline route for bug-fix tasks (ORCH-019) #115

Merged
admin merged 0 commits from feature/ORCH-019- into main 2026-06-10 04:03:53 +03:00
Owner

ORCH-019 — Багфикс-трек: упрощённый/дешёвый маршрут конвейера для багов

Задача с меткой Plane Bug идёт укороченным маршрутом — пропускается стадия architecture (отдельный прогон opus-агента architect + ADR + exit-гейт check_architecture_done); тяжёлая аналитика заменяется облегчённым пакетом (короткий bug-report + обязательный план регресс-теста, но всё равно все 4 файла analysis).

Корневой инвариант (NFR-1): срезается ТОЛЬКО аналитика/архитектура — все Quality Gate'ы и под-гейты исполняются без изменений. STAGE_TRANSITIONS / реестр QG_CHECKS / сигнатуры check_* / machine-verdict ключи (verdict:/result:/deploy_status:/staging_status:/security_status:/coverage_status:) — байт-в-байт прежние. Маршрутизация багфикса — свойство планировщика, не гейт.

Что сделано (по ADR-001 / adr-0032)

  • D1 классификация: новый leaf src/bug_fast_track.py (never-raise). bug_fast_track_applies(repo) (локально, без сети) ПЕРВЫМ; is_bug_task через labels.has_label (ORCH-089, источник истины — Plane API). Чтение метки только в start_pipeline, никогда в горячем claim_next_job (NFR-4).
  • D2 хранение: аддитивная идемпотентная колонка tasks.track TEXT DEFAULT 'full' + db.set_task_track/get_task_track.
  • D3 routing-override: врезка в advance_stage на ребре выхода из analysis (track='bug'development/developer); get_next_stage/get_agent_for_stage/STAGE_TRANSITIONS чистые, 1:1.
  • D4: гейт analysis не тронут (lite-аналитик эмитит все 4 файла).
  • D5 эскалация: POST /bug-fast-track/escalate?work_item=<id> сбрасывает track 'bug'→'full'.
  • D6 область/флаги: bug_fast_track_enabled (kill-switch) / _label (Bug) / _repos (CSV; пусто → self-hosting only).
  • D7 наблюдаемость: блок bug_fast_track в GET /queue + отметка 🐞 в Telegram-карточке.

Гейт стадии

check_ci_green — зелёный CI на ветке. Локально: ruff чисто (мои файлы), pytest tests/ -q1551 passed.

Откат

ORCH_BUG_FAST_TRACK_ENABLED=false → старт и маршрут 1:1 как до ORCH-019 (нулевая регрессия; остаточная колонка track безвредна).

Инфра-предусловие

Создать метку Bug в Plane-проекте ORCH (её отсутствие = fail-safe полный цикл).

Детали — docs/work-items/ORCH-019/06-adr/ADR-001-bug-fast-track.md, сквозной docs/architecture/adr/adr-0032-bug-fast-track.md.

Refs: ORCH-019

🤖 Generated with Claude Code

## ORCH-019 — Багфикс-трек: упрощённый/дешёвый маршрут конвейера для багов Задача с меткой Plane `Bug` идёт укороченным маршрутом — **пропускается стадия `architecture`** (отдельный прогон opus-агента `architect` + ADR + exit-гейт `check_architecture_done`); тяжёлая аналитика заменяется облегчённым пакетом (короткий bug-report + обязательный план регресс-теста, но всё равно все 4 файла analysis). **Корневой инвариант (NFR-1):** срезается ТОЛЬКО аналитика/архитектура — все Quality Gate'ы и под-гейты исполняются без изменений. `STAGE_TRANSITIONS` / реестр `QG_CHECKS` / сигнатуры `check_*` / machine-verdict ключи (`verdict:`/`result:`/`deploy_status:`/`staging_status:`/`security_status:`/`coverage_status:`) — байт-в-байт прежние. Маршрутизация багфикса — свойство планировщика, **не** гейт. ### Что сделано (по ADR-001 / adr-0032) - **D1 классификация:** новый leaf `src/bug_fast_track.py` (never-raise). `bug_fast_track_applies(repo)` (локально, без сети) ПЕРВЫМ; `is_bug_task` через `labels.has_label` (ORCH-089, источник истины — Plane API). Чтение метки только в `start_pipeline`, никогда в горячем `claim_next_job` (NFR-4). - **D2 хранение:** аддитивная идемпотентная колонка `tasks.track TEXT DEFAULT 'full'` + `db.set_task_track`/`get_task_track`. - **D3 routing-override:** врезка в `advance_stage` на ребре выхода из `analysis` (`track='bug'` → `development`/`developer`); `get_next_stage`/`get_agent_for_stage`/`STAGE_TRANSITIONS` чистые, 1:1. - **D4:** гейт `analysis` не тронут (lite-аналитик эмитит все 4 файла). - **D5 эскалация:** `POST /bug-fast-track/escalate?work_item=<id>` сбрасывает `track` `'bug'→'full'`. - **D6 область/флаги:** `bug_fast_track_enabled` (kill-switch) / `_label` (`Bug`) / `_repos` (CSV; пусто → self-hosting only). - **D7 наблюдаемость:** блок `bug_fast_track` в `GET /queue` + отметка 🐞 в Telegram-карточке. ### Гейт стадии `check_ci_green` — зелёный CI на ветке. Локально: `ruff` чисто (мои файлы), `pytest tests/ -q` — **1551 passed**. ### Откат `ORCH_BUG_FAST_TRACK_ENABLED=false` → старт и маршрут 1:1 как до ORCH-019 (нулевая регрессия; остаточная колонка `track` безвредна). ### Инфра-предусловие Создать метку **`Bug`** в Plane-проекте ORCH (её отсутствие = fail-safe полный цикл). Детали — `docs/work-items/ORCH-019/06-adr/ADR-001-bug-fast-track.md`, сквозной `docs/architecture/adr/adr-0032-bug-fast-track.md`. Refs: ORCH-019 🤖 Generated with [Claude Code](https://claude.com/claude-code)
admin added 6 commits 2026-06-10 03:58:16 +03:00
A task carrying the Plane `Bug` label takes a shortened route that skips the
`architecture` stage (one opus architect run + ADR + check_architecture_done),
replacing heavy analysis with a lite package (bug-report + mandatory regression
test plan). EVERY Quality Gate / sub-gate runs UNCHANGED — the route is a
scheduler property, not a gate (root invariant NFR-1): STAGE_TRANSITIONS /
QG_CHECKS / check_* / machine-verdict keys are byte-for-byte preserved.

- src/bug_fast_track.py: new leaf (never-raise) — bug_fast_track_applies (local,
  network-free, checked first), is_bug_task (labels.has_label, Plane API source),
  skips_architecture (pure DB-backed routing predicate), snapshot.
- src/db.py: additive idempotent tasks.track column (TEXT DEFAULT 'full') +
  set_task_track / get_task_track helpers (missing/NULL -> 'full', fail-safe).
- src/stage_engine.py: routing-override on the analysis-exit edge (track='bug' ->
  development/developer, skipping architect); brd-review-clock stamp extended to
  analysis->development. get_next_stage/get_agent_for_stage stay pure.
- src/webhooks/plane.py: classify task as bug in start_pipeline (applies-first
  short-circuit; never-raise -> full cycle on any error).
- src/main.py: additive bug_fast_track block in GET /queue + POST
  /bug-fast-track/escalate (reset 'bug'->'full' to return to the full cycle).
- src/config.py: bug_fast_track_enabled / _label / _repos flags (empty CSV ->
  self-hosting only).
- src/notifications.py: optional 🐞 marker on the bug-track card (never-raise).
- Prompts: analyst.md (lite bug package + escalation), reviewer.md (regression-
  test axis) — 52d canon preserved.
- Docs: CLAUDE.md, README.md (env + API + section), docs/architecture/README.md,
  CHANGELOG.md, .env.example.
- Tests: tests/test_bug_fast_track*.py + test_db_migrations.py + queue block
  (TC-01..TC-15). Full regression green (1551 passed).

Kill-switch ORCH_BUG_FAST_TRACK_ENABLED=false -> 1:1 pre-ORCH-019 (zero
regression; residual track column harmless).

Refs: ORCH-019

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tester(ET): auto-commit from tester run_id=562
All checks were successful
CI / test (push) Successful in 50s
CI / test (pull_request) Successful in 52s
5ecc870897
admin force-pushed feature/ORCH-019- from 06b025061e to 5ecc870897 2026-06-10 03:58:16 +03:00 Compare
admin added 1 commit 2026-06-10 04:03:53 +03:00
deploy(ORCH-036): finalize SUCCESS for ORCH-019
All checks were successful
CI / test (push) Successful in 47s
CI / test (pull_request) Successful in 47s
758a732422
admin merged commit ff20c3827a into main 2026-06-10 04:03:53 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/orchestrator#115