77 lines
5.3 KiB
Markdown
77 lines
5.3 KiB
Markdown
# BRD — ORCH-069: QG-0 title-лимит → параметр ORCH_QG0_TITLE_MAX (дефолт 200)
|
||
|
||
Work Item ID: ORCH-069
|
||
Тип: Enhancement (QoL / конфигурируемость)
|
||
Источник: Слава, 2026-06-08
|
||
Связано с: QG-0 (gate входа конвейера, `_qg0_errors`)
|
||
|
||
## 1. Проблема (As-Is)
|
||
QG-0 — первый quality gate конвейера. Он валидирует заголовок и описание задачи
|
||
до старта pipeline (`start_pipeline`) и в soft-режиме на `work_item.created`.
|
||
|
||
Верхний лимит длины заголовка задачи **захардкожен** в
|
||
`src/webhooks/plane.py:362`:
|
||
|
||
```python
|
||
if len(name) > 80:
|
||
errors.append("Title слишком длинный (максимум 80 символов)")
|
||
```
|
||
|
||
Лимит 80 — «гигиенический», а не структурный. Проверено, что **ниже по течению
|
||
ничего от значения 80 не зависит**:
|
||
- slug ветки режется независимо: `re.sub(...)[:30]` (`src/webhooks/plane.py:478`);
|
||
- БД `tasks.title TEXT` — без ограничения длины;
|
||
- Telegram-карточка использует `html.escape(title)` без обрезки;
|
||
- Plane хранит `name` самостоятельно.
|
||
|
||
Следствие: вполне валидные осмысленные заголовки длиной 81–200 символов
|
||
отклоняются на входе конвейера без бизнес-причины.
|
||
|
||
## 2. Цель (To-Be)
|
||
Вынести верхний лимит длины заголовка QG-0 в конфигурируемый параметр со
|
||
значением по умолчанию **200** (вместо текущего хардкода 80). Расширить лимит
|
||
безопасно, сохранив возможность регулировать его через окружение, как и
|
||
остальные `ORCH_*` настройки.
|
||
|
||
## 3. Бизнес-ценность
|
||
- Меньше ложных отклонений валидных задач на входе конвейера (QoL для постановщика).
|
||
- Лимит становится операционно настраиваемым без правки кода и редеплоя
|
||
(изменение env-переменной).
|
||
- Изменение чисто аддитивное и обратносовместимое: дефолт 200 > прежних 80, поэтому
|
||
все заголовки, проходившие раньше, проходят и теперь.
|
||
|
||
## 4. Объём (Scope)
|
||
### В объёме
|
||
- Новый параметр Settings `qg0_title_max` (env `ORCH_QG0_TITLE_MAX`, дефолт 200).
|
||
- Замена хардкода `> 80` на `> settings.qg0_title_max` в `_qg0_errors`.
|
||
- Динамический текст ошибки с подстановкой актуального лимита.
|
||
- Graceful-поведение при невалидном/пустом значении env → дефолт 200, без падения процесса.
|
||
- Документация: `.env.example`, `.env.staging.example`, `CHANGELOG.md`,
|
||
при необходимости README-таблица конфигов / `CLAUDE.md`.
|
||
- Юнит-тесты на `_qg0_errors` с разными лимитами.
|
||
|
||
### Вне объёма (Out of scope)
|
||
- Slug-логика `[:30]` (`src/webhooks/plane.py:478`) — самодостаточна, не трогать.
|
||
- Нижний лимит заголовка (`< 5`) и лимит description (`< 20`) — оставить как есть.
|
||
- Схема БД, реестры `STAGE_TRANSITIONS` / `QG_CHECKS`, контракты `handle_*`.
|
||
- Soft-QG-0 на `work_item.created` (там только warning) — логика валидации общая
|
||
(`_qg0_errors`), отдельных изменений не требует и не вносит.
|
||
|
||
## 5. Заинтересованные стороны
|
||
- Owner / постановщик задач (Слава) — снижение ложных отклонений.
|
||
- Агенты конвейера — поведение QG-0 при старте pipeline.
|
||
|
||
## 6. Ограничения и риски (self-hosting)
|
||
- Правка касается работающего в проде инструмента (self-hosting). Прод-контейнер
|
||
`orchestrator` в рамках задачи **не рестартить**; обязательна страховка
|
||
`deploy-staging` (8501).
|
||
- Риск минимален: изменение обратносовместимо, изолировано в одной функции и одном
|
||
новом параметре config.
|
||
|
||
## 7. Допущения
|
||
- Механизм чтения env — стандартный `pydantic_settings.BaseSettings` с
|
||
`env_prefix = "ORCH_"`, как у остальных параметров.
|
||
- «Невалидное/пустое значение → дефолт 200» — требование graceful-деградации:
|
||
процесс не должен падать на старте из-за мусора в `ORCH_QG0_TITLE_MAX`
|
||
(нюанс реализации pydantic-валидации передаётся архитектору, см. 02-trz §5).
|