Skip to content

Commit ec41b06

Browse files
committed
docs(sessions): v0.7.1 会话体验批次文档与豁免登记
1 parent d2de787 commit ec41b06

7 files changed

Lines changed: 178 additions & 4 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,27 @@
33
本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 与 [SemVer](https://semver.org/lang/zh-CN/)。
44
各版本的深度版本文档见 [docs/versions/](docs/versions/)。
55

6+
## [0.7.1] - 2026-08(开发中)
7+
8+
### 新增
9+
10+
- **会话体验小版本(REQ-135~137,2026-08-19 头脑风暴)**:
11+
- 会话↔笔记双向关联:`notes.session_id` 列迁移(删除会话 `SET NULL` 只断关联不删笔记——笔记是用户资产;旧数据诚实 NULL 不猜不填);`list_sessions` 返回 `SessionListItem`(has_note/note_id/note_title/has_content 子查询标记);`artifact_to_note` 同步写关联(口径统一)
12+
- 批量转笔记 `batch_session_to_note`:≤50 条、部分成功语义(单条失败不阻塞、跳过原因显式回传)、重复 id 去重、跳过已转防重复;`convert_to_note` 核心提取——单条与批量共用同一过滤管线(REQ-081/082 原则延续)
13+
- 会话页管理台重构:列表状态徽标(录制中/待转/已转笔记/异常)+ 状态/转化筛选 + 排序(新→旧/旧→新/时长)+ 批量操作栏(批量转笔记/批量删除,确认框说明笔记保留)+ 行内一键「转笔记」(4 步→1 步,转完就地变「查看笔记 →」)+ 双模式搜索整合(标题本地即时过滤/转写内容段搜索)
14+
- 会话↔笔记双向互跳:会话「查看笔记 →」直达笔记页并定位;笔记行「来源会话 →」跳回会话详情(复用 A4 focusSessionId 模式)
15+
- 状态实时性根治:`active` prop(切页刷新)+ `live:status`/`session:fused` 事件驱动刷新——display:none 挂载不刷新导致的"采集中"残留消除;新完成会话顶部提示条(📬 N 个已完成采集);操作反馈升级为自绘 toast(3s 自动消失);空态引导 + 无结果"清除筛选" + 加载态
16+
- 详情面板拆出 `SessionDetailPanel`(豁免清单拆分计划落地),质量报告/大纲/视图模式下沉为面板内部状态
17+
18+
### 测试
19+
20+
- 单测 945 个(+13):notes 迁移补列与旧数据 NULL / list_sessions 四象限标记 / 删会话 SET NULL 保笔记 / find_note_by_session 取最新 / 批量转 6 用例(全成功/跳过录制中与重复/已转跳过/不存在/超限/部分失败不阻塞)
21+
22+
### 变更
23+
24+
- `list_sessions` 返回类型改为 `SessionListItem`(前端同步新契约;`db_ocr_search`/`search_session_segments` 内部适配包装结构)
25+
- 会话删除语义明确:转写/OCR/图集级联删除不变,关联笔记保留(SET NULL)
26+
627
## [0.7.0] - 2026-08(开发中)
728

829
### 新增
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# ADR-014: 会话↔笔记关联与批量转化(notes.session_id 列 + SessionListItem 标记)
2+
3+
## 状态
4+
5+
已接受(2026-08-19 用户评审:会话页交互与效率增强——管理控制台 + 转化流水线)
6+
7+
## 日期
8+
9+
2026-08-19
10+
11+
## 背景
12+
13+
会话页被用户定位为"视频→笔记"的生产流水线(课堂助手产出会话 → 会话库管理并转化为笔记)。头脑风暴确认五个痛点,其中三个根因指向数据模型缺口:
14+
15+
1. **转化状态不可见**:`notes.source='classroom'` 不记录来源会话——数据模型无法回答"该会话转没转过笔记",列表无法显示已转/未转。
16+
2. **会话↔笔记关联弱**:无关联链路,双向互跳(会话→笔记、笔记→来源会话)不可实现。
17+
3. **转化流程繁琐无批量**:必须进详情 → 切预览视图 → 点转笔记(4 步);无批量转化命令。
18+
19+
另有列表管理类痛点(不可筛不可批、状态过期不刷新)为纯前端/事件层问题,不涉及数据模型。
20+
21+
约束:`Session` 结构被 `list_sessions`/`get_session_detail`/`list_session_courses`/前端多处消费,直接加字段需改全部构造点与 serde 契约,风险高;删除会话的既有语义是级联删除子表(转写/OCR/产物),但**笔记是用户资产,不应随会话级联删除**。
22+
23+
## 决策
24+
25+
1. **notes 表加 `session_id` 列**(`ensure_column` 幂等迁移,`ON DELETE SET NULL` + `idx_notes_session` 索引):
26+
- 删除会话只断开关联、不删笔记(SET NULL 语义——与级联删除转写/OCR/图集的既有行为刻意区分)。
27+
- 旧数据诚实处理:历史 `classroom` 笔记无关联信息 → 保持 NULL(不猜不填);用户可在详情页重新转换建立关联。
28+
- 一个会话可多次转换(详情页"转为笔记"= 有意的重新生成):`find_note_by_session` 按 `created_at DESC, id DESC` 取最新,历史笔记保留可手动删。
29+
- 手写笔记(create_note/save_draft_as_note/process_to_note)不写 session_id(手动路径无来源会话);`artifact_to_note` 写 session_id(产物→笔记同样是会话转化,has_note 口径统一)。
30+
31+
2. **新契约 `SessionListItem`**(包装而非扩展 `Session`,隔离风险):
32+
- `{ session, has_note, note_id, note_title, has_content }`,camelCase 序列化(与 CourseGroup/SegmentHit 同口径)。
33+
- `list_sessions` / `list_session_courses` 均返回带标记条目(课程分组模式同样显示转化状态)。
34+
- `has_content`(有转写段或 OCR 块)为"待转化"判定依据——空会话不进入待转。
35+
- 实现:SQL 子查询(EXISTS + 最新笔记子查询),列表 ≤200 条量级,零额外往返。
36+
37+
3. **批量转笔记 `batch_session_to_note(ids)`**(≤50 条):
38+
- 从 `session_to_note` 提取 `convert_to_note` 核心(注入 `Db + UiJunkList`,纯编排可单测),单条与批量共用同一过滤管线(延续 REQ-081/082"单一管线双出口一致性"原则)。
39+
- **部分成功语义**:单条失败不阻塞其他;跳过规则显式回传原因(无效 id/进行中/已转/会话不存在),不静默。
40+
- 重复 id 静默去重;批量转**跳过已有笔记**的会话(防重复笔记);DB 读错误视为硬失败中止(库损坏时继续处理无意义)。
41+
42+
4. **前端列表层**(纯前端,无后端改动):状态/转化筛选 + 排序(本地过滤)、行内一键转笔记、批量操作栏(转笔记/删除)、会话↔笔记双向互跳(`focusNoteId` / `onOpenSessions`,复用 A4 的 focusSessionId 模式)、`active` prop + `live:status`/`session:fused` 事件驱动刷新(根治 display:none 挂载不刷新导致的"采集中"残留)。
43+
44+
## 备选方案
45+
46+
### 方案 A:notes 加 session_id 列(选定)
47+
- 优点:最小 schema 变更(1 列 + 索引,`ensure_column` 幂等);SET NULL 天然表达"断关联不删数据";子查询实现零往返。
48+
- 缺点:旧数据无法追溯归属(诚实降级为 NULL);多次转换需"取最新"语义。
49+
50+
### 方案 B:独立关联表 session_notes(session_id, note_id)
51+
- 优点:1:N 关系显式化,可携带转换时间/次数等元数据。
52+
- 缺点:多一张表 + 双写事务;当前需求(最新一篇 + has_note)用不上关系元数据;YAGNI。
53+
54+
### 方案 C:Session 结构直接加 has_note 字段
55+
- 优点:无需新类型。
56+
- 缺点:所有构造点(create/list/get/测试)与 serde 契约全改,破坏面大;列表标记与详情标记语义不同(详情不需要),污染核心类型。
57+
58+
## 选择理由
59+
60+
- 方案 A 以最小变更覆盖三个痛点的数据根因;SET NULL 与"笔记是用户资产"的产品原则一致(删除会话不丢笔记,与级联删除原料的既有语义形成明确分工)。
61+
- 方案 B 的关系元数据当前无消费方,等"转换历史/覆盖管理"真实出现再升级不迟(列迁移向后兼容,届时可平滑加表)。
62+
- 方案 C 破坏面与收益不成比例;`SessionListItem` 包装保持 `Session` 契约稳定(前端/后端其余消费方零改动)。
63+
64+
## 影响
65+
66+
### 正面影响
67+
- 列表转化状态可见(已转/待转/录制中/异常),筛选与批量操作落地。
68+
- 行内转化 4 步→1 步;批量转化部分成功语义(失败原因显式)。
69+
- 会话↔笔记双向互跳闭环;删除会话不再误删笔记。
70+
- 列表状态实时(事件驱动 + 切页刷新),"采集中"残留根治。
71+
72+
### 负面影响
73+
- 旧 `classroom` 笔记显示未关联(诚实 NULL)——可经详情页重新转换建立关联。
74+
- `list_sessions` 返回类型变更:前端消费方需同步 `SessionListItem` 形状(本批次一并更新);`db_ocr_search`/`search_session_segments` 等内部消费方适配包装结构(已更新)。
75+
- 批量转跳过已转会话(防重复)——用户如需"重新生成"走详情页单条路径(行为有意的区分)。
76+
77+
## 关联
78+
79+
- 设计文档:[sessions-ux-efficiency-design](../superpowers/specs/2026-08-19-sessions-ux-efficiency-design.md)
80+
- 数据模型起点:[ADR-004](./ADR-004-session-data-model.md)(sessions 三表);[ADR-006](./ADR-006-session-segments-derived-view.md)(原料/派生分离原则——本决策不改原料层)
81+
- 验收:v0.7.1 版本文档([versions/v0.7.1](../versions/v0.7.1.md))

‎docs/adr/README.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
| ADR-009 | [OCR 推理 GPU 卸载(CUDA EP + 三层检测 + 回退链)](./ADR-009-ocr-gpu-offload.md) | 已接受 | 2026-08 |
1717
| ADR-010 | [补缝式 AI(Gap-filling AI):本地失败块定向云端增强](./ADR-010-gap-filling-ai.md) | 已接受 | 2026-08-18 |
1818
| ADR-011 | [网格差异 OCR 触发重做(含 UI 面板抑制)](./ADR-011-grid-diff-ocr-trigger.md) | 提议 | 2026-08-19 |
19+
| ADR-012 | [流式 ASR 质量修复批次(对齐/合并/重打分)](./ADR-012-streaming-asr-quality-fixes.md) | 已接受 | 2026-08-19 |
20+
| ADR-013 | [实时会话引擎预热与播放暂停驱动](./ADR-013-live-session-preload-and-playback-pause.md) | 已接受 | 2026-08-19 |
21+
| ADR-014 | [会话↔笔记关联与批量转化(notes.session_id 列 + SessionListItem 标记)](./ADR-014-session-note-association.md) | 已接受 | 2026-08-19 |
1922

2023
## 编号规则
2124

‎docs/product/requirements-pool.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,18 @@
152152
| REQ-134 | IMG-2 图片内容裁剪/去白边:版面区域框复用 | P2 | 已排期 | v0.7.0 | 查漏 IMG-2;图像流存储配套 |
153153
| REQ-088 | 图注生成(本地规则):关键图一句话图注(OCR 高频词×转写摘要交叉);影子层基础设施 | P2 | 已排期 | v0.7.0 | 图像复用 REQ-088 自 V1.0 提前;为 REQ-094 影子 schema 铺路 |
154154

155+
### v0.7.1 · 会话体验小版本(2026-08-19 头脑风暴:会话页交互与效率增强)
156+
157+
> 2026-08-19 头脑风暴(用户:会话库是"视频→笔记"生产流水线):管理控制台 + 转化流水线(A+B 合并);
158+
> 设计文档 [sessions-ux-efficiency-design](../superpowers/specs/2026-08-19-sessions-ux-efficiency-design.md);
159+
> 数据模型变更 [ADR-014](../adr/ADR-014-session-note-association.md)。
160+
161+
| ID | 需求 | 优先级 | 状态 | 目标版本 | 备注 |
162+
|----|------|--------|------|---------|------|
163+
| REQ-135 | 转化状态可视化 + 会话↔笔记双向关联:notes.session_id 列(SET NULL 保笔记)+ SessionListItem 标记(has_note/note_id/has_content)+ 笔记页「来源会话 →」互跳 | P1 | 已排期 | v0.7.1 | 旧 classroom 笔记诚实 NULL(不猜不填);详情页重新转换可建立关联;artifact_to_note 同步写关联(口径统一) |
164+
| REQ-136 | 批量转笔记:batch_session_to_note(≤50、部分成功语义、跳过规则显式回传)+ 列表行内一键转笔记(4 步→1 步)+ 已转会话显示「查看笔记 →」 | P1 | 已排期 | v0.7.1 | convert_to_note 核心提取(单条/批量共用单一管线,REQ-081/082 原则延续);批量跳过已转防重复,详情页保留有意重新生成 |
165+
| REQ-137 | 会话列表管理增强:状态/转化筛选 + 排序 + 批量删除(笔记保留)+ 双模式搜索整合(标题/转写内容)+ 事件驱动刷新(live:status/session:fused/切页 active)+ 新完成提示条 + 空态/加载态 | P1 | 已排期 | v0.7.1 | display:none 挂载不刷新导致的"采集中"残留根治(TD-004 副作用);筛选本地过滤零后端改动 |
166+
155167
### V1.0 · 体验增强(远期)
156168

157169
| ID | 需求 | 优先级 | 状态 | 目标版本 | 备注 |

‎docs/standards/line-limit-exemptions.md‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,19 @@
1010
| app/src-tauri/src/engine.rs | ~439 | 引擎池装配(双 worker 编排 + ADR-009 设备状态 + M5 词表纠错 + M7 心跳/失败/缓存计数);上下文参数与共享状态注入点多,拆出需跨模块传 10+ 参数 | 若再增长:worker 循环与请求处理拆至 engine_worker.rs |
1111
| app/src-tauri/src/lib.rs | ~562 | Tauri 装配层(setup 初始化 + 决策链路 + 21+ command 注册);全部为声明与装配,拆分会破坏注册可读性 | 若再增长:setup 初始化块拆至 app_setup.rs |
1212
| app/src-tauri/src/vocab.rs | ~373 | 词表域(存储/纠错/候选提取/n-gram 分词)内聚;分词纯逻辑与存储同域便于单测 | 若再增长:collect_tokens/split_runs 拆至 vocab_tokens.rs |
13-
| app/src-tauri/src/db_sessions.rs | ~309 | 会话仓储(会话/段/OCR 块/建议查询);SQL 与行映射内聚 | 若再增长:recent_ocr_texts 等建议查询拆至 db_sessions_queries.rs |
13+
| app/src-tauri/src/db_sessions.rs | ~330 | 会话仓储(会话/段/OCR 块/建议查询);SQL 与行映射内聚;v0.7.1 列表标记子查询 | 若再增长:recent_ocr_texts 等建议查询拆至 db_sessions_queries.rs |
1414
| app/src/pages/ClassroomPage.tsx | ~548 | 装配层页面:左栏配置区(就绪清单/窗口选择/实时捕获/视频导入/OCR 设备/词表/素材)+ 右栏内容区;2026-08 审查硬拆(>600 违规)已拆出 ClassroomRightPane(右栏)与 MaterialInputPanel(素材+提取)回归 548 | 若再增长:将实时捕获卡片拆出 LiveCaptureCard(状态与事件监听下沉) |
1515
| app/src-tauri/src/video_profile.rs | ~394 | v0.5.0 M1(REQ-043):档案域(类型/检测投票/记忆偏好/JSON IO)内聚;档案常量数据已拆至 video_profile_data.rs | 若再增长:检测投票与记忆偏好拆至 video_profile_detect.rs |
1616
| app/src-tauri/src/layout_analyzer.rs | ~475 | v0.5.0 M3(REQ-047):规则版版面分析(行/列投影 + 表格线检测 + 区域分类启发式)内聚于同一分类管线;六轮审查再增(公式启发加固 + 低信息纯色方差滤除)至 ~475 | 若再增长:区域分类启发式拆至 layout_classify.rs |
1717
| app/src-tauri/src/artifact_templates.rs | ~501 | v0.5.0 M7(REQ-052):五档案模板函数(讲义/步骤卡/摘要/对话纪要/会议纪要)内聚于同一模板域,各模板共享原料注入签名 | 若再增长:会议/访谈模板拆至 artifact_templates_meeting.rs |
18-
| app/src-tauri/src/db.rs | ~345 | v0.5.0 M9 增长:notes + sessions 三表 schema + ensure_column 幂等迁移(v0.5.0 M1/M4 两列迁移 + v0.7.0 M1 REQ-103 volume 列)+ 行映射;SQL 与迁移内聚 | 若再增长:ensure_column 迁移拆至 db_migrations.rs |
18+
| app/src-tauri/src/db.rs | ~470 | v0.5.0 M9 增长:notes + sessions 三表 schema + ensure_column 幂等迁移(v0.5.0 M1/M4 两列迁移 + v0.7.0 M1 REQ-103 volume 列 + v0.7.1 notes.session_id 列)+ 行映射;SQL 与迁移内聚 | 若再增长:ensure_column 迁移拆至 db_migrations.rs |
1919
| app/src-tauri/src/region_tracker.rs | ~422 | v0.4.0 M2(REQ-037)起:ROI 跟踪状态机(播放区域检测/锁定聚簇/重扫/前台切换冻结)+ 纯函数单测内联;与 RoiTracker 状态强耦合 | 若再增长:lock_roi/prior_roi 纯函数拆至 region_lock.rs |
2020
| app/src-tauri/src/commands_refine_inner.rs | ~301 | v0.5.0 模型版:课后精修编排(清单构建/降级决策/引擎懒加载/逐候选识别/产物回填/HTML→MD 转换)内聚于精修执行域 | 若再增长:html_to_markdown 拆至 html_table_md.rs |
2121
| app/src-tauri/src/structure_models.rs | ~320 | v0.5.0 模型版:模型清单/独立状态机下载器(进度事件/.part 原子写/按需启用三分类)+ 2026-08 磁盘就绪判定(disk_done)内聚 | 若再增长:download_one 拆至 structure_download.rs |
2222
| app/src-tauri/src/symbol_normalize.rs | ~370 | v0.6.0 M1(REQ-060):口语符号映射域(映射表/上下文守卫/中文数字解析)内聚;数字解析与守卫共享字符判定 | 若再增长:parse_chinese_number/replace_number_runs 拆至 symbol_numbers.rs |
23-
| app/src/pages/SessionsPage.tsx | ~390 | v0.6.0 M6 增长:会话列表(课程分组/段搜索)+ 详情(三视图/质量卡片/大纲侧栏/降级横幅)装配层内聚 | 若再增长:列表与详情拆至 SessionListPanel.tsx / SessionDetailPanel.tsx |
24-
| app/src-tauri/src/commands_session.rs | ~350 | v0.6.0 M6 增长:会话命令域(CRUD/笔记预览单一管线/质量报告/课程分组/段搜索)内聚于会话生命周期域 | 若再增长:course/search 拆至 commands_session_extra.rs |
23+
| app/src/pages/SessionsPage.tsx | ~250 | v0.7.1 硬拆落地(原 ~390 登记):编排层(列表/详情状态 + 事件刷新 + 转化删除操作)回归 ≤300 行 | 无需拆分(已 ≤300) |
24+
| app/src/components/SessionListPanel.tsx | ~411 | v0.7.1 拆分产物:列表域 UI(双模式搜索/筛选排序/课程分组折叠/批量操作栏/内联转化)内聚——筛选/排序/选择为面板本地状态 | 若再增长:批量操作栏与列表项拆至 SessionListRow.tsx |
25+
| app/src-tauri/src/commands_session.rs | ~420 | v0.6.0 M6 增长 + v0.7.1:会话命令域(CRUD/单一管线/质量报告/课程分组/段搜索/批量转笔记)内聚于会话生命周期域;批量测试独立文件 | 若再增长:course/search 拆至 commands_session_extra.rs |
2526
| app/src-tauri/src/note_filter.rs | ~390 | v0.6.0 M1(REQ-082/085):笔记过滤域(过滤链 + 边界段分类 + AI 判定应用 + 画面要点净化)内聚于单一管线(双出口一致性由构造保证) | 若再增长:boundary_candidates/apply_ai_decisions 拆至 note_filter_ai.rs |
2627
| app/src-tauri/src/fusion_tests.rs | ~392 | 融合测试域(ADR-005 四规则 + REQ-062 概率加权 + REQ-103 音量透传 + REQ-111 切分对齐)单模块 #[path] 挂载;测试文件沿用单模块模式未拆 | 若再增长:REQ-111 切分对齐组拆至 fusion_split_tests.rs |
2728
| app/src-tauri/src/analysis.rs | ~344 | v0.5.0 M2 起结构化分析编排域(章节/重点/术语/讲者 + v0.7.0 M1.5 事件消费 + M2 step_boundaries/practice_segments/player_actions 三字段 + 审查修复按类型判定);各机制输出聚合内聚于单一分析函数 | 若再增长:build_chapter_signals 事件版拆至 analysis_signals.rs |

‎docs/versions/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
| v0.5.0 | [v0.5.0.md](./v0.5.0.md) — 第五阶段:视频类型优化+版面分析与结构化提取+图片配套+产物体系+AI 补缝前置 | 发版文档(代码已交付,真机验收待执行) |
1515
| v0.6.0 | [v0.6.0.md](./v0.6.0.md) — 第六阶段:提取质量与信任+性能资源+会话体验(REQ-059~087,含 ADR-011/012) | 发版文档(开发完成 2026-08-19,M7 真机验收待执行) |
1616
| v0.7.0 | [v0.7.0.md](./v0.7.0.md) — 第七阶段:信任收尾+存储使能+类型扩展(三通道模型;REQ-088/098~134,37 项) | 发版文档(开发完成 2026-08-19,M4 真机验收待执行) |
17+
| v0.7.1 | [v0.7.1.md](./v0.7.1.md) — 会话体验小版本:管理控制台+转化流水线(REQ-135~137,含 ADR-014) | 发版文档(开发完成 2026-08-19,真机验收待执行) |
1718

1819
## 沉淀规则
1920

0 commit comments

Comments
 (0)