[2026-06-02] taiga-vault: personal/projects/psychologist-app/session-design.md personal/vault-sync-smoketest.md

This commit is contained in:
Taiga
2026-06-02 11:17:41 +00:00
parent 074a1630e0
commit 54c540d0a8
2 changed files with 69 additions and 1 deletions
@@ -526,6 +526,74 @@ func startSession() {
---
---
## 12. План работ — актуальный (обновлено 2026-06-02)
### 12.1 Реализовано ✅
- `AnalystResponse.sessionComplete: Bool` + AnalystJSON backward-compatible
- `ProcessingResult.readyToClose([String]?, observation:)`
- `SessionManager.userTurnCount`, `consecutiveShortAnswerCount`, hard limit 8 ходов
- `SessionManager.continueSession()`, `detectIncompleteSession()`, `resumeOrStart()`
- `FatigueContext`, `IncompleteSessionState`, `SessionResumeResult`
- NarratorBot: legit-маркер, injection guard, off-topic директива, детекция настроения/усталости
- AnalystBot: turnCount/startTime/duration/messageCount/fatigueCtx → user message; пейсинг-правила в systemPrompt
- SessionViewModel: `showCompletionPrompt`, `showCompletionCard()`, `continueAfterCompletion()`
- CardData: `isCompletion: Bool`
- 182 теста, 0 фейлов
### 12.2 Ближайшие задачи
#### A. UI-связка карточки завершения (5 строк)
`onQuickReply` в SessionView: если `card.isCompletion` → "Завершить" → `endSession()`, "Продолжить" → `continueAfterCompletion()`. Без этого карточка есть, но кнопки не работают.
#### B. Session Recovery при входе (~20 строк)
Заменить `startSession()` на `resumeOrStart()` при открытии SessionView. При `.resumed` — восстановить карточки из `session.messages` (видимые .analyst сообщения). При `.startedAfterPartialSummary` — показать "В прошлый раз..." первой карточкой.
#### C. UX: одна карточка + growing input [НОВОЕ]
- Одна карточка одновременно на экране (не список)
- При открытии клавиатуры карточка уходит вверх над орбом, не скрывается
- Поле ввода: `TextEditor` с `axis: .vertical`, растёт по мере набора, word-wrapped
#### D. generateSessionInsight — полный анализ с инструментами [ОБЯЗАТЕЛЬНО]
**Проблема:** сейчас `generateSessionInsight()` — простой `introService.complete()` (Haiku, один вызов без инструментов, с обрезкой контента). Никакой связи с историей сессий.
**Требование:** агент анализирует ВСЮ сессию, без программной обрезки, с доступом к прошлым сессиям для сравнения паттернов.
**Реализация:**
- Заменить `introService.complete()` на `analystBot.completeWithTools()` (те же инструменты: `search_sessions`, `read_session`, `get_index`, `read_profile`)
- Передавать полный диалог текущей сессии (все сообщения user + analyst)
- Промпт: синтез инсайта + сравнение с паттернами из прошлых сессий
- Контекстного окна Sonnet (200k) достаточно для любой бытовой сессии без chunking
- Chunking как крайний fallback только если диалог > ~150k символов
**Что меняется в data flow:**
```
Было: generateSessionInsight → Haiku.complete(prefix_500_chars) → строка
Стало: generateSessionInsight → Sonnet.completeWithTools(full_dialogue + tools) → строка
↳ может вызвать search_sessions("паттерн X") → сравнить с прошлым
↳ может вызвать read_profile() → уточнить контекст
↳ возвращает инсайт с учётом всей истории
```
#### E. insights.md — финальный инсайт не записывается [БАГ]
`saveSessionToProfile()` пишет в `observations/Www.md` и `index.md`, но **не вызывает** `ProfileManager.appendInsight()`. Итог: `insights.md` (который читает AnalystBot через `read_profile`) не обновляется после сессии. Добавить одну строку в `saveSessionToProfile()`.
#### F. insights.md — suggestedInsight по ходу диалога [БАГ]
`suggestedInsight` от аналитика добавляется в `session.insights` (в памяти), но в `insights.md` не пишется до конца сессии. Если сессия прервана через X — инсайт теряется. Писать немедленно при получении.
### 12.3 Следующая итерация
- mood_delta → Orb visual feedback (Section 9.4)
- save_session app API tool для агента (Section 7.5)
- Vault sync архитектура: on-device → vault отдельным job (Section 11.4)
- Retention protocol при пропущенных сессиях (Section 5)
- Android Skip совместимость новых типов
---
## 6. Открытые вопросы
- [ ] Как именно Narrator детектирует что вопросы в 3-м лице и нужно переформулировать? Prompt rule или регекс-паттерн?
@@ -536,7 +604,6 @@ func startSession() {
- [ ] mood_delta — достаточно ли 3 значений, нужна ли шкала -2..+2?
- [ ] Vault sync архитектура: когда/как экспортировать on-device сессии в vault,
чтобы агент не имел прямого доступа к ФС мака?
- [ ] generateSessionInsight: заменить prefix(500) на полный диалог с token-truncation?
## Связанные заметки