# Final Answer Composer Spec

## 1. Назначение

`answerComposer` преобразует нормализованные retrieval results в один user-facing ответ на русском языке.

Реализация:

- `backend/src/services/answerComposer.ts`

Вход:

- `userMessage`
- `routeSummary`
- `retrievalResults[]` (уже в unified schema)

Выход:

- `assistant_reply` (текст для пользователя)
- `reply_type`
- `fallback_type`

## 2. Приоритеты ответа

Порядок разрешения:

1. `out_of_scope` fallback.
2. `clarification` fallback (если factual результатов нет).
3. `error`, если есть только ошибки retrieval.
4. `empty`, если запрос валиден, но найдено 0 результатов.
5. `partial`, если есть полезные данные, но покрытие неполное.
6. `factual`, если есть корректные результаты без fallback-конфликта.

## 3. Типы ответов

### `factual`

- данные найдены;
- даётся краткий итог + компактная сводка.

### `empty`

- корректный запрос, но выдача пустая.

### `partial`

- часть вопроса обработана;
- часть недоступна/пустая/ошибочная.

### `clarification`

- нужно уточнение периода/документа/счёта/контрагента.

### `out_of_scope`

- запрос не относится к учётному контуру компании.

### `error`

- техническая ошибка retrieval.

## 4. Контентные правила

User-facing текст:

- только русский;
- без route names;
- без `trace`, `fallback_type`, `planned routes`;
- без служебного planner/debug языка.

Технические детали живут только в `debug` payload.

## 5. Форматирование factual-ответа

Composer умеет кратко форматировать несколько типов retrieval:

- `chain`: акцент на цепочки контрагент/документы/операции.
- `ranking`: топ/ранжирование.
- `list`: список записей (в т.ч. риск-объекты).
- `object/summary`: компактный факт-блок.

Если результатов много, выдаётся только верхняя часть (top-N), остальное остаётся в debug payload.
