# 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).