Skip to content

Commit 172f490

Browse files
committed
docs(adr): ADR-020 会话类型字段 + CHANGELOG v0.11.7 + 空转写过滤测试
1 parent f2a3d27 commit 172f490

4 files changed

Lines changed: 114 additions & 0 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55

66
## [Unreleased] - 2026-08-21
77

8+
### v0.11.7 图文会话(截屏导入)(2026-08-22 规划,详见 [docs/versions/v0.11.7.md](docs/versions/v0.11.7.md))
9+
10+
- **图文采集**:课堂助手第三动线——全屏框选截屏 → kind=photo 图文会话(OCR 全图识别 + 屏卡流 + 转笔记);sessions.kind 字段 + 列表 📷 徽标 + 详情空态;与实时捕获互斥 + 24h 崩溃残留清扫 + 零截图不留空壳
11+
- **跨链路体验**:视频导入完成「去会话页」直达;导入 OCR 进度携带累计识别块数
12+
813
### v0.11.5 采集体验与笔记打磨(2026-08-22 交付,详见 [docs/versions/v0.11.md](docs/versions/v0.11.md))
914

1015
- **采集体验**:采集态档案三维(形态/画面档/领域)热切换(update_live_profile 命令 + 共享 override 槽);形态/领域每 150s 自动重评(用户手动覆写维度锁定不覆盖);记忆机制改"检测优先 + 记忆兜底 + 冲突以检测为准"(四象限);领域检测增 ASR 开场白信号 + B站选集 OCR 证据增强;窗口选择浮层展开自动后台刷新

‎app/src-tauri/src/note_filter_tests.rs‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,19 @@ fn filter_note_is_pure_and_deterministic() {
219219
assert_eq!(a.markdown, b.markdown);
220220
assert_eq!(a, b);
221221
}
222+
223+
/// v0.11.7(图文会话,ADR-020):纯 OCR 会话(无转写段)转笔记——不 panic、
224+
/// 画面要点保留(ocr_points 数据源——v0.11.5 已移出 markdown)、markdown 非空
225+
/// (图文会话转笔记的可行性契约,spec §五)。
226+
#[test]
227+
fn filter_note_with_empty_segments_keeps_ocr_points() {
228+
// Arrange:空转写 + 两条 OCR 块(region=full,图文截图链路同形态)
229+
let blocks = vec![block(1000, "网页标题", 0.92), block(2000, "正文要点", 0.88)];
230+
// Act:空 segments 直跑过滤链
231+
let result = run("图文会话", &[], &blocks);
232+
// Assert:不 panic、画面要点保留(ocr_points 屏段落行)、markdown 非空(标题)
233+
assert!(!result.markdown.is_empty());
234+
let points: String = result.ocr_points.join("\n");
235+
assert!(points.contains("网页标题"), "画面要点应保留: {points}");
236+
assert!(points.contains("正文要点"), "画面要点应保留: {points}");
237+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# ADR-020: 会话类型字段(图文会话)
2+
3+
## 状态
4+
5+
已接受
6+
7+
## 日期
8+
9+
2026-08-22
10+
11+
## 背景
12+
13+
v0.11.7(图文会话)新增第三采集动线:用户连续框选截屏组成 `kind=photo`
14+
图文会话(无音频、无转写段)。会话列表徽标(「📷 图文」)、详情页空态
15+
(无讲述内容提示)、崩溃残留清扫(photo recording 超时 → failed)都依赖
16+
「会话属于哪种类型」这一领域语义——类型不是派生可稳定得到的,需要显式建模。
17+
18+
约束:旧库零回归——现有视频类会话(实时捕获/视频导入)不受影响;迁移必须
19+
幂等(`ensure_column` 先例)。
20+
21+
## 决策
22+
23+
1. `sessions` 表新增 `kind TEXT` 列:`NULL` = 视频类会话(实时/导入,默认值,
24+
零回归);`'photo'` = 图文截屏会话。取值 kebab-case 小写,与 `profile`
25+
列先例一致。
26+
2. 迁移走既有 `ensure_column` 幂等路径(`ALTER TABLE sessions ADD COLUMN
27+
kind TEXT`),建表语句同步包含该列。
28+
3. 类型穿透:Rust `Session`/`NewSession` 结构体新增 `kind: Option<String>`;
29+
前端 `Session` 类型同步;新建会话默认 `None`(视频类)。
30+
4. 清扫规则:`kind='photo' AND status='recording' AND started_at 超 24h`
31+
→ `failed`,列表加载时执行;清扫失败不阻断列表(防御:列表永远可用)。
32+
5. 不设 CHECK 约束枚举值(YAGNI):当前仅 photo 一个取值,NULL/photo 二元
33+
语义由代码保证;未来新类型扩展时再评估。
34+
35+
## 备选方案
36+
37+
### 方案 A:派生判断(无 segments / 无音频即图文)——未采用
38+
- 优点:零 schema 变更。
39+
- 缺点:脆弱且不可靠——播客类档案会话也可能无画面、静音导入也可能无音频,
40+
派生信号与「用户采集意图」不严格对应;清扫/徽标/空态全部依赖隐式推断,
41+
一处失效处处失真。
42+
- 适用场景:无持久化需求的临时判别。
43+
44+
### 方案 B:独立新表(session_kinds 字典 / 会话类型关联表)——未采用
45+
- 优点:可承载多属性类型元数据。
46+
- 缺点:过度设计——当前只有一个取值、一个标志位,新表引入 JOIN 成本与
47+
迁移复杂度,收益为零。
48+
49+
### 方案 C:`sessions.kind` 可空列(采用)
50+
- 优点:单列幂等迁移(先例 `profile` 同款)、NULL 默认值天然零回归、
51+
列表/详情/清扫查询零 JOIN 直读。
52+
- 缺点:取值自由文本(无 CHECK),依赖代码纪律——以单一常量
53+
(`photo`)写入,测试锁定。
54+
55+
## 选择理由
56+
57+
会话类型是领域语义而非派生信号:用户显式选择了「图文采集」动线,这个意图
58+
必须持久化。`kind` 列方案与既有 `profile` 列迁移模式完全同构(成本最低的
59+
惯用路径),NULL 语义保证旧库、旧代码零回归;备选 A 的派生判断在「播客类
60+
档案无画面」场景下会误判,无法支撑清扫等安全相关逻辑。
61+
62+
## 影响
63+
64+
### 正面影响
65+
- 列表徽标/详情空态/残留清扫获得稳定数据源,语义显式、可测试。
66+
- 迁移幂等,旧库升级零回归;新建会话默认 NULL 无需改调用方。
67+
68+
### 负面影响 / 代价
69+
- `Session`/`NewSession` 结构体新增字段,所有构造点需穿透(Rust 编译器
70+
强制列出遗漏构造点)。
71+
- 前端类型同步(Session.kind)。
72+
73+
### 风险
74+
- 取值自由文本可能写错(如大小写/连字符不一致)——以常量 + 测试锁定,
75+
与 `profile` 列同纪律。
76+
77+
## 合规性验证
78+
79+
- `cargo test`:kind 往返测试(create_session 写入 → 列表读出);
80+
`ensure_column` 幂等测试(旧库迁移零回归,重复执行无副作用)。
81+
- 清扫测试:photo+recording+超时 → failed;未超时/非 photo 不误伤。
82+
- 前端 Vitest:`kind === "photo"` 徽标渲染。
83+
84+
## 相关决策
85+
86+
- ADR-004: 会话管理数据模型方案(sessions 表基座)
87+
- ADR-014: 会话↔笔记关联与批量转化(会话类型影响列表标记)
88+
89+
## 参考
90+
91+
- [v0.11.7 设计 spec](../superpowers/specs/2026-08-22-v0.11.7-photo-session-design.md)
92+
- [v0.11.7 版本文档](../versions/v0.11.7.md)

‎docs/adr/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
| ADR-016 | [AI 凭据存储方案(Windows DPAPI/keyring)](./ADR-016-ai-credentials-dpapi.md) | 已接受 | 2026-08-21 |
2424
| ADR-017 | [安全加固批(CSP 基线与白名单、opener 移除、compose 强制配置、nginx 安全头、.env.production 去跟踪)](./ADR-017-security-hardening-batch.md) | 已接受 | 2026-08-21 |
2525
| ADR-018 | [间隔重复调度器引入 fsrs crate(FSRS-6)](./ADR-018-fsrs-scheduler-adoption.md) | 已接受 | 2026-08-22 |
26+
| ADR-020 | [会话类型字段(图文会话)](./ADR-020-session-kind-field.md) | 已接受 | 2026-08-22 |
2627

2728
## 编号规则
2829

0 commit comments

Comments
 (0)