Files
orchestrator/docs/work-items/ORCH-069/01-brd.md

5.3 KiB
Raw Blame History

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:

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 самостоятельно.

Следствие: вполне валидные осмысленные заголовки длиной 81200 символов отклоняются на входе конвейера без бизнес-причины.

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