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