Да, это разумный ход.

Ты сейчас предлагаешь **не добивать eval в вакууме**, а **замкнуть рабочий контур**:

* вопрос от человека;
* декомпозиция;
* выбор маршрута;
* поход в базу;
* сбор результата;
* человекочитаемый ответ в диалоговом окне.

И это реально полезнее следующего слоя “искусственной чистоты”, потому что вы уже уткнулись в потолок слепых прогонов.

## Что фиксируем по стратегии

### 1. Разметку не отменяем, а ставим на паузу

Не выбрасываем идею, а **откладываем до появления 30–40 реальных полевых вопросов**.

То есть:

* synthetic eval остаётся как вспомогательный контур;
* основной следующий шаг — не policy-lab, а **рабочий диалоговый режим**.

### 2. Новая цель этапа

Не “ещё лучше понять язык на тестах”, а:
**собрать первый end-to-end assistant loop поверх уже существующей decomposition-логики.**

### 3. Что даст этот этап

Он даст не абстрактные проценты, а понимание:

* как вообще ощущается система в диалоге;
* где она тупит реально;
* где поиск не дотягивает;
* где ответ не собирается;
* где декомпозиция полезна;
* где интерфейс мешает;
* где нужен второй проход LLM на финальную сборку ответа.

И вот это уже будет очень ценная конкретика.

---

# ТЗ: переход к диалоговому режиму поверх текущего decomposition-контура

## 1. Цель этапа

Добавить в текущую тестовую GUI **второй режим работы — Assistant Mode**, чтобы можно было:

* задать вопрос в диалоговом интерфейсе;
* прогнать его через текущую decomposition / normalization pipeline;
* выполнить поиск/маршрутизацию по существующим путям;
* собрать ответ;
* показать ответ в человекочитаемом диалоговом формате.

Текущий режим decomposition/debugging при этом **сохраняется**.

---

## 2. Что фиксируем как решение

### Решение

На текущем этапе:

* **останавливаем расширение synthetic-разметки и synthetic-eval**;
* **не тратим время на дальнейшие искусственные прогоны без боевых вопросов**;
* переключаемся на **сборку диалогового рабочего контура**;
* позже, после получения полевых вопросов, возвращаемся к:

  * разметке,
  * policy eval,
  * уточнению маршрутов и fallback’ов.

Комментарий:
Это не отказ от eval-подхода.
Это смена приоритета: сначала — usable loop, потом — field-based hardening.

---

## 3. Что должно получиться на выходе

В GUI должны быть доступны **два режима**:

### A. `Decomposition Mode`

Сохраняется текущий debug-режим:

* raw input;
* decomposition output;
* fragments;
* flags;
* route status;
* fallback status;
* trace/debug панели.

### B. `Assistant Mode`

Новый диалоговый режим:

* чатоподобное окно;
* ввод сообщения;
* отправка сообщения;
* выполнение pipeline;
* получение итогового ответа;
* отображение ответа как сообщения ассистента;
* опционально раскрытие технических деталей.

---

## 4. Главная идея Assistant Mode

Assistant Mode не должен быть “просто ещё одним текстовым полем”.

Он должен работать как поверхностный пользовательский интерфейс над уже существующей внутренней логикой:

**User message → decomposition → scope filter → route → retrieval/query → answer composition → assistant reply**

Важно:

* decomposition слой остаётся;
* deterministic routing остаётся;
* fallback policy остаётся;
* просто поверх этого появляется **человеческий вход и человеческий выход**.

---

## 5. Поведение Assistant Mode

## 5.1. Вход

Пользователь пишет сообщение в обычном диалоговом окне.

Примеры:

* один вопрос;
* длинный вопрос;
* сомнение;
* мягкая формулировка;
* несколько связанных мыслей;
* в будущем — multi-intent.

## 5.2. Внутренний пайплайн

После отправки сообщения система должна:

1. прогнать сообщение через `normalizer_v2.x`;
2. получить fragments / flags / scope;
3. отбросить out-of-scope части;
4. определить routed / no-route / clarification;
5. если есть исполнимые fragments — отправить их в backend retrieval/query layer;
6. получить промежуточные результаты;
7. собрать из них **человекочитаемый ответ**;
8. показать его пользователю в чате.

## 5.3. Выход

На экране пользователь должен видеть не JSON и не route flags, а нормальный ответ.

---

## 6. Два режима интерфейса

## 6.1. Переключатель режима

В интерфейсе нужен явный переключатель:

* `Assistant`
* `Decomposition`

Вариант реализации:

* toggle;
* tabs;
* segmented control.

## 6.2. Требование

Состояние режимов должно быть разделено, но использовать общий backend.

То есть:

* один и тот же backend pipeline;
* разные UI-представления.

---

## 7. Assistant Mode — состав интерфейса

## 7.1. Основная область

Чатоподобная лента сообщений:

* сообщения пользователя;
* сообщения ассистента;
* системные статусы по желанию.

## 7.2. Поле ввода

Обычное текстовое поле + кнопка отправки.

## 7.3. Состояния ответа

Во время выполнения показывать:

* `Разбираю запрос`
* `Проверяю контур`
* `Определяю маршрут`
* `Ищу данные`
* `Собираю ответ`

Можно в упрощённом виде.

## 7.4. Дополнительная панель

Опционально:

* кнопка `Показать разбор`
* которая раскрывает:

  * fragments,
  * route,
  * fallback,
  * scope,
  * trace id.

Комментарий:
По умолчанию это не должно мешать диалогу, но для отладки очень полезно.

---

## 8. Логика ответа в Assistant Mode

## 8.1. Если вопрос in-scope и routed

Ассистент должен сформировать ответ по результатам retrieval/query.

Ответ должен быть:

* человекочитаемый;
* собранный под вопрос;
* без сырого технического мусора.

## 8.2. Если вопрос требует clarification

Ассистент задаёт уточняющий вопрос в чат.

Пример:

* “Могу проверить это в контуре компании, но нужно уточнить период или участок учёта.”

## 8.3. Если вопрос out-of-scope

Ассистент отвечает вежливым fallback’ом.

Пример:

* “Я работаю только с данными и бухгалтерическим контуром текущей компании. Этот вопрос относится к общей бухгалтерской практике, а не к данным вашей базы.”

## 8.4. Если вопрос частично in-scope

Ассистент отвечает по допустимой части и отдельно помечает, что остальное вне доступного контура.

---

## 9. Нужен отдельный слой answer composition

Это важно.

Сейчас decomposition и routing — это ещё не финальный ответ человеку.
Нужен отдельный блок:

### `answer_composer`

Он получает:

* исходный user message;
* fragments;
* route results;
* retrieved data/result payloads;
* fallback states;

и собирает:

* один связный ответ для человека.

Комментарий:
Да, ты правильно понимаешь:
если исходное сообщение человека было многослойным, ответ не должен приходить как 5 несвязанных кусков JSON.
Нужен **второй проход на human-readable response**.

---

## 10. Что не делаем сейчас

На этом этапе **не делаем**:

* финальный production-grade assistant;
* память диалога на 100 ходов;
* суперсложную agent orchestration;
* автоматическую доразметку eval;
* полную полевую разметку synthetic наборов;
* бесконечную шлифовку policy.

Сейчас задача — **замкнуть usable loop**.

---

## 11. Что backend должен уметь

Нужен единый assistant pipeline endpoint.

Примерно так:

### `POST /api/assistant/message`

Вход:

* user message
* session id
* mode = assistant

Внутри:

* run normalizer
* resolve execution state
* route fragments
* call retrieval/query handlers
* compose answer
* return assistant response + debug payload

Выход:

```json
{
  "ok": true,
  "assistant_reply": "string",
  "conversation_item": {...},
  "debug": {
    "trace_id": "...",
    "fragments": [...],
    "fallback_type": "...",
    "route_summary": [...]
  }
}
```

---

## 12. Что сделать в GUI технически

## 12.1. Новая вкладка / режим

Добавить Assistant Mode без удаления текущего Decomposition Mode.

## 12.2. История диалога

Сделать хранение сообщений в рамках текущей сессии:

* user messages;
* assistant replies;
* debug ids.

Пока достаточно session-scoped памяти без сложного persistence.

## 12.3. Debug drawer

У каждого ответа можно открыть:

* decomposition;
* fragments;
* scope;
* routes;
* fallback;
* trace_id.

---

## 13. Что логировать

Нужно логировать для каждого сообщения:

* `session_id`
* `message_id`
* `user_message`
* `normalizer_output`
* `resolved_execution_state`
* `routes`
* `fallback_type`
* `retrieval/query payloads`
* `assistant_reply`
* `trace_id`

Комментарий:
Это потом очень пригодится, когда пойдут реальные полевые вопросы.

---

## 14. Что использовать как тестовые данные сейчас

Пока нет боевых полевых 30–40 вопросов, допускается использовать:

* уже собранные сложные synthetic вопросы;
* ваши старые troublesome вопросы;
* 10–20 кривых пользовательских формулировок.

Но это уже только для smoke test UI и pipeline, не для финального truth-eval.

---

## 15. Что будет следующим этапом после этого

После того как Assistant Mode заработает, следующий этап:

* собрать 30–40 боевых полевых вопросов;
* прогнать их уже через реальный диалоговый контур;
* сохранить логи;
* на их основе вернуться к:

  * разметке,
  * eval policy,
  * hardening маршрутов,
  * fine-tuning clarification/no-route policy.

То есть сейчас мы строим **инструмент для получения настоящей конкретики**, а не выдуманной.

---

## 16. Артефакты, которые должен выдать Codex

1. `docs/assistant_mode_spec.md`
2. обновлённый GUI с переключателем:

   * `Assistant`
   * `Decomposition`
3. backend endpoint для assistant loop
4. `answer_composer` слой
5. session-based chat history
6. debug drawer / expandable technical view
7. `docs/assistant_mode_flow.md`
8. `docs/known_limits_before_field_eval.md`

---

## 17. Критерии приёмки

Этап считается принятым, если:

1. в GUI есть два режима:

   * decomposition
   * assistant
2. assistant mode позволяет:

   * ввести вопрос,
   * прогнать pipeline,
   * получить финальный человекочитаемый ответ
3. out-of-scope / clarification / partial fallback работают в диалоге
4. decomposition mode не сломан
5. debug-информация доступна, но не мешает основному UX
6. история сообщений в рамках сессии работает
7. можно использовать контур как рабочую тестовую песочницу для будущих полевых вопросов

---

## 18. Короткий итог

Сейчас правильный ход такой:

**останавливаем blind eval hardening,
не тратим силы на synthetic-разметку,
и переводим систему в usable dialog mode,
чтобы уже на реальных вопросах смотреть, где она работает, а где нет.**

---

Если хочешь, я следующим сообщением сделаю ещё **короткую версию этого ТЗ для прямой вставки в Codex**, без пояснений и комментариев.
