Commit 76b3421b4eee810f6d3946c9bd714cf86ffc170f

Authored by yibo
1 parent ae6f7002

docs(lifelog): HANDOFF 写清「15min 自动 ≠ 10min 会话间隔」+ 同步纪要现状

- §六 加最易混淆点:纪要 WorkManager periodic 每 15min(Android 硬下限,
  改间隔须 UPDATE 策略)自动扫已结束会话;UI「会话间隔 10min」是切分规则,
  与跑纪要频率无关。附 502 并发坑的解法(AtomicBoolean + 7min 预算 + 不 retry)。
- 文件清单:SummaryScheduler/Worker 描述同步(互斥/预算/15min)+ 补 SummaryProgress。
- 纪要后端接线改为「UI 可选 2B/4B/Hermes,经 ChatConfig 解析」。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Showing 1 changed file with 6 additions and 3 deletions
lifelog-recorder/HANDOFF.md
@@ -46,8 +46,9 @@ app/src/main/kotlin/com/lemon/lifelog/ @@ -46,8 +46,9 @@ app/src/main/kotlin/com/lemon/lifelog/
46 │ ├── ChatConfig.kt — 聊天端点配置(本地 8080/2b/4b 存 SharedPreferences;Hermes 走 BuildConfig) 46 │ ├── ChatConfig.kt — 聊天端点配置(本地 8080/2b/4b 存 SharedPreferences;Hermes 走 BuildConfig)
47 │ └── ChatClient.kt — OpenAI 兼容流式客户端(本地目标传 enable_thinking=false) 47 │ └── ChatClient.kt — OpenAI 兼容流式客户端(本地目标传 enable_thinking=false)
48 ├── summary/ 48 ├── summary/
49 -│ ├── SummaryWorker.kt — ★ 会话级纪要:按时间间隔切会话 → 本地 llama-swap 2B  
50 -│ └── SummaryScheduler.kt — WorkManager periodic + enqueueUniqueWork(KEEP) 去重 49 +│ ├── SummaryWorker.kt — ★ 会话级纪要:切会话 → 选定后端(ChatConfig) 出纪要;AtomicBoolean 并发互斥 + 7min 单轮预算 + 不 retry
  50 +│ ├── SummaryProgress.kt — worker→UI 实时进度 singleton(纪要 tab 的 console)
  51 +│ └── SummaryScheduler.kt — WorkManager periodic 每 15min(UPDATE 策略) + 手动 enqueueUniqueWork
51 ├── service/ 52 ├── service/
52 │ ├── RecorderService.kt — 前台服务,pipeline 主体 ←★ 改 ASR 流程改这里 53 │ ├── RecorderService.kt — 前台服务,pipeline 主体 ←★ 改 ASR 流程改这里
53 │ ├── RecorderState.kt — StateFlow 把服务状态推到 UI 54 │ ├── RecorderState.kt — StateFlow 把服务状态推到 UI
@@ -243,7 +244,9 @@ skills: @@ -243,7 +244,9 @@ skills:
243 ~/start-llama.sh — launcher(起 llama-swap),被 Magisk service.d 调用 244 ~/start-llama.sh — launcher(起 llama-swap),被 Magisk service.d 调用
244 ``` 245 ```
245 246
246 -- **App 接线**:`ChatConfig` 本地默认 `8080`/`2b`/`4b`(SharedPreferences 可改);`keys.properties` = `8642`(对话的 Hermes 选项 → Kimi);`SummaryWorker.LLM_BASE_URL/LLM_MODEL` = `8080`/`2b`(纪要,已解耦 keys.properties)。 247 +- **App 接线**:`ChatConfig` 本地默认 `8080`/`2b`/`4b`(SharedPreferences 可改);`keys.properties` = `8642`(对话的 Hermes 选项 → Kimi)。纪要后端 UI 可选(2B/4B/Hermes),存 `prefs[summary_backend]`,worker 经 `ChatConfig.targetById` 解析端点(与对话共用配置)。
  248 +- **⚠️「15min 自动」≠「10min 会话间隔」**(最易混):纪要由 WorkManager periodic **每 15min**(Android periodic 硬下限,做不到更短;改间隔必须用 `ExistingPeriodicWorkPolicy.UPDATE`,KEEP 不覆盖旧排程)自动跑一次,扫**已结束**的会话。UI 里「会话间隔 10min」是**切分规则**——多长静音算另一场,跟跑纪要频率毫无关系。要比 15min 更勤只能换 AlarmManager 精确闹钟。
  249 +- **502 坑**:periodic + 手动 + retry 并发打同一个 llama-server 上游 → llama-swap `context canceled` → 502。已用 worker 内 `AtomicBoolean` 互斥 + 7min 单轮预算 + 不 `Result.retry()` 解决(见 SummaryWorker)。
247 - **Qwen3.5 默认开思考**:纪要 + 本地对话都要传 `chat_template_kwargs:{enable_thinking:false}` 否则 token 被 `<think>` 吞、流式开头吐字面 `"null"`(org.json.optString 坑,ChatClient.parseDelta 已用 `isNull` 防)。 250 - **Qwen3.5 默认开思考**:纪要 + 本地对话都要传 `chat_template_kwargs:{enable_thinking:false}` 否则 token 被 `<think>` 吞、流式开头吐字面 `"null"`(org.json.optString 坑,ChatClient.parseDelta 已用 `isNull` 防)。
248 - **G3 实测**(Q4,热降频):2B ~12 t/s 生成 / 65 prefill(一篇纪要 ~48s);4B ~4 / 24(~2.6min)。 251 - **G3 实测**(Q4,热降频):2B ~12 t/s 生成 / 65 prefill(一篇纪要 ~48s);4B ~4 / 24(~2.6min)。
249 - 启动器手测:`su -G 3003 10302 -c 'bash ~/start-llama.sh'`,再 `curl 127.0.0.1:8080/v1/models`。 252 - 启动器手测:`su -G 3003 10302 -c 'bash ~/start-llama.sh'`,再 `curl 127.0.0.1:8080/v1/models`。