Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -103,6 +103,86 @@ Vault путь для импорта: `personal/psychology/` (на Taiga).
|
||||
- Если на iOS-симуляторе не появляется `DevSetupView` (ввод токена) — значит `dev_setup_done = true` в UserDefaults. Удалить приложение с симулятора и запустить заново.
|
||||
- `ReflectApp/` в корне — legacy, не трогать. Реальные правки только в `Sources/ReflectApp/`.
|
||||
|
||||
## Plan: Session Pacing & Closing (не реализовано)
|
||||
|
||||
### Проблема
|
||||
|
||||
`SessionViewModel.endSession()` существует и реализует полный closing-флоу (инсайт → warm phrase → oneLastThing → vault save), но **нигде не вызывается из UI**.
|
||||
`dismissSession()` (кнопка X) отменяет сессию без сохранения.
|
||||
Пейсинга нет: агент не знает сколько оборотов прошло, нет правил завершения в systemPrompt, нет сигнала `session_complete` в `AnalystJSON`.
|
||||
|
||||
### Решение: Вариант Б + hard limit
|
||||
|
||||
**Шаг 1 — Quick-fix: X-кнопка вызывает `endSession()` (даёт рабочий closing уже сейчас)**
|
||||
|
||||
Вместо `dismissSession()` при нажатии X — вызывать `endSession()`.
|
||||
Пользователь сам решает когда нажать, но closing-флоу отработает корректно.
|
||||
|
||||
**Шаг 2 — Turn count в SessionManager**
|
||||
|
||||
Добавить `var userTurnCount: Int = 0`, инкрементировать в `processUserInput()`.
|
||||
Передавать в `AnalystBot.analyze()` как параметр `turnCount`.
|
||||
|
||||
**Шаг 3 — `session_complete` в AnalystJSON**
|
||||
|
||||
```swift
|
||||
struct AnalystJSON: Codable {
|
||||
let questions: [String]
|
||||
let observation: String?
|
||||
let crisisSignal: Bool
|
||||
let suggestedInsight: String?
|
||||
let sessionComplete: Bool // новое поле
|
||||
}
|
||||
```
|
||||
|
||||
**Шаг 4 — Пейсинг-правила в systemPrompt AnalystBot**
|
||||
|
||||
```
|
||||
Правила ведения сессии (параметр turn_count передаётся в каждом запросе):
|
||||
- После 4+ оборотов: если пользователь пришёл к пониманию, тема исчерпана
|
||||
или повторяется — установи session_complete: true
|
||||
- Если открылась новая важная тема — продолжай (session_complete: false)
|
||||
- После 7+ оборотов: session_complete: true независимо от темы
|
||||
- session_complete: true — предложение закрыть, не принудительное завершение
|
||||
```
|
||||
|
||||
**Шаг 5 — `.readyToClose` в ProcessingResult**
|
||||
|
||||
```swift
|
||||
enum ProcessingResult {
|
||||
case questions([String], observation: String?)
|
||||
case readyToClose([String]?, observation: String?)
|
||||
case crisis(CrisisDetectionResult)
|
||||
case error(String)
|
||||
}
|
||||
```
|
||||
|
||||
SessionManager возвращает `.readyToClose` когда `analystResponse.sessionComplete == true` ИЛИ `userTurnCount >= 8`.
|
||||
|
||||
**Шаг 6 — UI карточка в SessionViewModel**
|
||||
|
||||
При `.readyToClose`: показать вопросы (если есть) → после ответа добавить карточку
|
||||
"Кажется, мы хорошо прошлись по теме. Завершить сессию?"
|
||||
Кнопки: "Завершить" → `endSession()` | "Продолжить" → сбросить сигнал на текущий turn.
|
||||
|
||||
**Шаг 7 — Интеграционные тесты (TDD: писать до реализации шагов 2-6)**
|
||||
|
||||
- `testAnalystReturnsSessionComplete_afterExhaustedTopic()`
|
||||
- `testSessionManager_readyToClose_onSessionCompleteSignal()`
|
||||
- `testSessionManager_hardLimit_at8Turns()`
|
||||
- `testSessionViewModel_showsCompletionCard_onReadyToClose()`
|
||||
- `testSessionViewModel_continueAfterReadyToClose_resetsSignal()`
|
||||
|
||||
### Порядок реализации
|
||||
|
||||
1. Тесты (шаг 7) — все RED
|
||||
2. Quick-fix X-кнопки (шаг 1) — немедленно даёт рабочий closing
|
||||
3. Шаги 2-5 — данные + логика
|
||||
4. Шаг 6 — UI карточка
|
||||
5. Все тесты GREEN
|
||||
|
||||
---
|
||||
|
||||
## Связанные заметки
|
||||
|
||||
- [[personal/projects/psychologist-app/overview]]
|
||||
|
||||
@@ -1,21 +1,19 @@
|
||||
## Inbox Triage — 2026-06-02 (since 2026-06-02 11:14)
|
||||
## Inbox Triage — 2026-06-02 (since 2026-06-02 12:33)
|
||||
|
||||
### New / Changed — Action Required
|
||||
_None._
|
||||
|
||||
### New / Changed — Monitoring
|
||||
_None._
|
||||
|
||||
### Nothing new
|
||||
Inbox quiet — nothing new.
|
||||
|
||||
_Window: SINCE 11:14 +06 = 05:14 UTC; now ≈ 11:47 +06 (05:47 UTC). Last Asana sync 05:45 UTC._
|
||||
### New / Changed — Monitoring
|
||||
|
||||
_Checks performed:_
|
||||
- _STEP 1b @mention query (direct DB, since 05:14 UTC): 0 rows._
|
||||
- _New comments on Alex's open / delegated tasks (author ≠ Alex M, since 05:14 UTC): 0 rows._
|
||||
- _New assignments / task modifications for Alex since 05:14 UTC: 0 rows._
|
||||
- _Non-comment state changes (approvals, status, re-assignments) on Alex's tasks since 05:14 UTC: 0 rows._
|
||||
- _All stories since 05:14 UTC: ~30 rows, every one a Dax-bot field update (sentiment / PII / dealbreaker / keywords / tag) on macOS Feedback intake tasks Alex doesn't own — filtered out per scope rules. Costas changed the description on O-N Weekly Meeting agenda (Alex follows, not assigned) — meta meeting-agenda edit, no @mention, no action signal._
|
||||
Inbox quiet — nothing new.
|
||||
|
||||
_Gating: Tuesday 10:47 Almaty — outside Dominik 1:1 (Tue 15–16). Apple Weekly Team Meeting is on today's agenda (DB confirms), but MS365 live-window check was blocked by the lethal-trifecta hook on this session, so per the prompt's "MS365 not available → skip" branch the meeting check was bypassed. Status.md activity: no recent activity detected — no deep-focus override._
|
||||
### Nothing new
|
||||
|
||||
No new human comments, @mentions, or task assignments since 12:33 Almaty (06:33 UTC).
|
||||
|
||||
Verification:
|
||||
- Stories table: 0 rows since 12:33 +06 (latest story was Costas reaction at 12:20 +06, before window).
|
||||
- @mentions: 0 since 12:33 +06 (latest was Eduardo Pinto at 08:00 +06 on task 1211861583303016, before window).
|
||||
- Tasks modified since 12:33 +06: 1 (Pete AFK June 1-3 — automated AFK notification, not actionable).
|
||||
- Last full sync: 12:54 +06 / 06:54 UTC. Data is fresh through sync time.
|
||||
|
||||
Reference in New Issue
Block a user