# 📋 ТЕХНИЧЕСКОЕ ЗАДАНИЕ: ИНТЕГРАЦИЯ MIXED-INITIATIVE LLM-АГЕНТА
**Ветка:** `027-dataset-llm-orchestration`
**Контекст:** Архитектура автоматического ревью датасетов (US1) и подготовки к запуску (US3) реализована отлично. Требуется переработать процесс "Clarification" (US2) из жесткого модального опросника в полноценный контекстно-зависимый диалог с LLM-агентом (Смешанная инициатива / Mixed-Initiative), а также закрыть архитектурные риски (PII, Concurrency).

Тебе необходимо выполнить задачу в два этапа.

---

## ЭТАП 1: Обновление спецификаций (Директория `specs/027-dataset-llm-orchestration/`)

Твоя первая задача — актуализировать проектную документацию, чтобы она отражала новую парадигму взаимодействия пользователя и агента, а также закрывала дыры в безопасности.

**1. Обновить `ux_reference.md`:**
*   **Отказ от модалок:** Заменить концепцию `ClarificationDialog` на интеграцию диалога в выдвижную правую панель `AssistantChatPanel`.
*   **Mixed-Initiative:** Описать, что диалог может быть инициирован как системой (очередь `Clarification Queue`), так и пользователем (свободные вопросы агенту по контексту датасета, например: *"Почему этот фильтр помечен как partial?"*).
*   **Inline-взаимодействие (Context Actions):** Дописать появление микро-кнопок `[✨ Спросить ИИ]` / `[✨ Улучшить]` рядом с неразрешенными фильтрами (`unresolved`), предупреждениями валидации и полем Бизнес-summary в основном Workspace.
*   **Визуальный фокус:** Зафиксировать правило: когда агент задает вопрос по конкретному фильтру/полю в чате, карточка этого элемента в центральной колонке UI подсвечивается (highlight/glow).
*   **Confirmation Cards:** Описать интерактивные виджеты внутри ленты чата для опасных операций (например, подтверждение запуска датасета в SQL Lab), опирающиеся на `AssistantConfirmationRecord`.

**2. Обновить `spec.md` (Functional Requirements):**
*   Добавить **FR-045**: Система должна позволять пользователю задавать свободные вопросы по контексту загруженного датасета (профиль, фильтры, маппинги, SQL).
*   Добавить **FR-046**: Агент должен уметь принимать команды на естественном языке для изменения состояния сессии (например: *"Одобри все маппинги"*, *"Сгенерируй превью SQL"*).
*   Изменить **FR-013**: Уточняющие вопросы должны задаваться не в изолированном окне, а в контексте глобального чата ассистента.

**3. Обновить `contracts/api.yaml` и `data-model.md`:**
*   **Связь чата и сессии:** В `AssistantMessageRequest` добавить опциональное поле `dataset_review_session_id: string`.
*   **Оптимистичные блокировки:** В сущность `DatasetReviewSession` (и DTO `SessionDetail`) добавить поле `version: integer` для предотвращения состояния гонки (Race Condition) при совместном редактировании сессии коллабораторами (пользователь + агент).
*   **PII Masking:** В `data-model.md` для `ImportedFilter` явно указать требование маскирования чувствительных данных (`raw_value`) перед отправкой контекста в LLM.

**4. Обновить `contracts/modules.md`:**
*   В `DatasetReviewOrchestrator` добавить связь `@RELATION: [EXPOSES_STATE_TO] -> [AssistantApi]`.
*   В описание `ClarificationEngine` добавить, что он маршрутизирует свои запросы через `AssistantChatPanel`.

---

## ЭТАП 2: Реализация доработок в кодовой базе (Frontend & Backend)

На основе обновленных спеков реализуй архитектурные и UI/UX изменения в коде.

### 🛠️ 2.1 Backend: Архитектура, Безопасность и Инструменты Агента
1.  **PII Data Masking:** 
    *   Где: `backend/src/core/utils/superset_context_extractor.py` или слой подготовки промпта.
    *   Что: Реализовать фильтрацию/маскирование значений фильтров (например, email, SSN), извлеченных из Superset, *до* того, как они попадут в контекст LLM. Агенту нужны только ключи и структура для маппинга, а не сырые PII-данные.
2.  **Optimistic Locking (Борьба с Race Conditions):**
    *   Где: `backend/src/services/dataset_review/repositories/session_repository.py`.
    *   Что: Реализовать проверку поля `version` при сохранении `DatasetReviewSession`. В случае конфликта (кто-то другой, включая агента, уже изменил сессию) выбрасывать `StaleDataError` -> HTTP 409 Conflict.
3.  **Интеграция контекста датасета в Ассистента:**
    *   Где: `backend/src/api/routes/assistant.py` (`_plan_intent_with_llm`, `_build_tool_catalog`).
    *   Что: Если в запросе передан `dataset_review_session_id`, подгружать `DatasetProfile`, `ImportedFilters` и `ValidationFindings` в системный промпт (System Prompt) ассистента, чтобы он мог отвечать на вопросы по датасету.
4.  **Новые Tools (Интенты) для Агента:**
    *   Где: `backend/src/api/routes/assistant.py` -> `_dispatch_intent`.
    *   Что: Научить агента вызывать методы `DatasetReviewOrchestrator`. Добавить инструменты: `APPROVE_MAPPINGS` (одобрить ворнинги), `SET_FIELD_SEMANTICS` (переписать описание колонки), `GENERATE_SQL_PREVIEW` (триггер компиляции).
5.  **Garbage Collection сессий:**
    *   Где: `backend/src/core/task_manager/cleanup.py` (или аналог).
    *   Что: Написать scheduled-таску для жесткого удаления (hard delete) брошенных/архивированных сессий обзора (например, старше 30 дней), чтобы БД не переполнялась снепшотами SQL и графами контекста.

### 🎨 2.2 Frontend: Реактивный Workspace и Чат
1.  **Интеграция AssistantChatPanel (Slide-out Drawer):**
    *   Где: `frontend/src/routes/datasets/review/[id]/+page.svelte` (`DatasetReviewWorkspace`).
    *   Что: Внедрить вызов боковой панели ассистента `AssistantChatPanel`. Убедиться, что при её открытии контент Workspace сдвигается или корректно перекрывается, не теряя контекста SQL-превью и фильтров. Удалить старый `ClarificationDialog` (модалку).
2.  **Контекстные кнопки (Inline Triggers ✨):**
    *   Что: В компоненты `ValidationFindingsPanel.svelte`, `ExecutionMappingReview.svelte` и карточки фильтров добавить микро-кнопки `[✨ Спросить ИИ]`.
    *   Действие: По клику открывать `assistantChat` store и отправлять предзаполненный скрытый контекстный промпт (например, *"Объясни проблему с фильтром X и предложи решение"*).
3.  **Визуальная синхронизация (State Reactivity):**
    *   Что: Когда агент через чат задает вопрос по `field_id` или `filter_id` (Clarification Queue), соответствующий элемент в Workspace должен получать CSS-класс подсветки (glow/highlight).
    *   Как: Связать `ClarificationStateResult` из стора сессии с рендером строк в `SemanticLayerReview.svelte` и списках фильтров.
4.  **Confirmation Cards в ленте чата:**
    *   Где: `frontend/src/lib/components/assistant/AssistantChatPanel.svelte`.
    *   Что: Для команд, требующих `AssistantConfirmationRecord` (например, запуск в SQL Lab), рендерить внутри чата специальный виджет: *"Вы уверены, что хотите запустить этот контекст? [Отменить][Запустить]"*.
5.  **Debounce для SQL Preview:**
    *   Где: `frontend/src/lib/components/dataset-review/CompiledSQLPreview.svelte`.
    *   Что: Предотвратить спам запросами к Superset API. Если пользователь или агент быстро меняют маппинги, статус превью становится `stale`. Запрос на перегенерацию должен отправляться либо по явной кнопке, либо с debounce-задержкой 2-3 секунды после окончания потока изменений.

### ⚙️ Правила выполнения для Агента:
1. **Не ломать инварианты:** Сохранить принцип **WYSIWWR (What You See Is What Will Run)**. LLM *никогда* не должна генерировать финальный SQL-код сама. LLM собирает параметры, а SQL компилирует только Superset (`SupersetCompilationAdapter`).
2. **Семантическое логирование:** Любые изменения состояния сессий на бэкенде оборачивать в `belief_scope` (`logger.reason()`, `logger.reflect()`), как указано в системных контрактах.
3. По завершении этапа 1, дождись утверждения (или переходи к Этапу 2 автономно, если находишься в режиме Auto-Execute), строго следуя обновленным контрактам `api.yaml`.
