---
name: avtero-schema-cap-retry-lossy
description: "Автеро — превышение max_length в поле честности запускает LLM-ретрай всего JSON, который молча теряет backend-only флаги (oem_source/needs_check); любое накапливаемое текстовое поле обязано само себя обрезать до лимита схемы"
metadata: 
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
  modified: 2026-07-30T06:14:49.640Z
---

Через час после фикса #188 (честностные оговорки для отечественного филлера) тот же
запрос дал два разных результата: прямой вызов функции — `oem_source=domestic_tecdoc,
needs_check=True`; тот же запрос через боевой `/api/ask` — `oem_source='',
needs_check=False`, а `check_note` пересказан своими словами. Причина не в филлере, а
в том, что `check_note` ограничен `max_length=300` в схеме (`app/schemas.py:70`), и
накопление нескольких оговорок (#188 сам это ввёл) превысило лимит.

**Механизм, а не совпадение:** `ValidationError` на этом поле уходит в
`_retry_validation` (`orchestrator.py:2305`) — та отдаёт ВЕСЬ JSON модели с просьбой
«перепиши строго по схеме». Модель пересобирает ответ своими словами и **теряет
backend-only поля** (`oem_source`, `needs_check`), потому что в промпте о них нет ни
слова — она видит только текст `check_note`, а не флаги вокруг него.

**Обнаружено сравнением, не логом ошибки:** прямой вызов функции против того же
запроса через HTTP на одной и той же детали. Без этого сравнения регресс остался бы
незамеченным — оба измерения по отдельности выглядели правдоподобно.

**Фикс:** защитная обрезка в `_coerce_schema_slips` (уже существующая функция для
детерминированного near-miss-ремонта перед валидацией) — теперь режет `check_note`
до 300 символов ДО проверки, которая запускает ретрай.

**Общий вывод, шире одного файла:** любое поле пайплайна с `max_length`, которое КОД
может удлинять (накопление, конкатенация), обязано само себя обрезать в месте записи
или прямо перед валидацией. Полагаться на «обычно укладывается» нельзя — превышение
лимита в одном косметическом поле молча стирает детерминированные флаги честности во
всей структуре, потому что путь восстановления после ошибки валидации в этом проекте
идёт через LLM-пересборку, а не через локальный ремонт поля.

Связано: [[avtero_make_brand_matching_class]] (тот же день, тот же паттерн: слой
честности можно тихо обойти), [[deployed_is_not_running]] (тот же паттерн: два
честных измерения дают ложную уверенность, если их не свести вместе).
