Skip to content

Commit dca7a9a

Browse files
committed
docs(adr): v0.12.0 M7——ADR-021/022/023 落档
- ADR-021:笔记正文源多态(detect_body_source 抽象层;M1 已交付) - ADR-022:WGC 窗口级捕获三级降级链(WGC→DXGI→GDI;M2 待实施) - ADR-023:视频会话 OCR 下线 + vision-exp 精修图片理解(含图片上传授权红线; M5 精修侧已交付) - adr/README 与 versions/README 状态同步(M1/M4/M5-精修侧已交付)
1 parent a44bf00 commit dca7a9a

5 files changed

Lines changed: 209 additions & 4 deletions

File tree

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# ADR-021: 笔记正文源多态——`detect_body_source` 抽象层
2+
3+
## 状态
4+
5+
已接受(v0.12.0 M1,2026-08-23 规划定稿)——已实施并交付。
6+
7+
## 日期
8+
9+
2026-08-23
10+
11+
## 背景
12+
13+
`filter_note`(REQ-082)把 `segments`(转写段)硬编码为唯一正文源,`ocr_blocks`(OCR 块)始终为辅助画面要点不入 markdown。对视频会话这是正确设计(关键帧信息密度低,OCR 文本质量不稳),但对图文会话(`kind=photo`,ADR-020)——用户手动框选、OCR 文本即意图——导致转笔记时 markdown 只有标题,正文为空。这是设计债:`(segments, ocr_blocks)` 二元组缺乏"哪个是正文"的表达层。
14+
15+
## 决策
16+
17+
我们将引入 `BodySource` 枚举(`Transcript` / `OcrDirect` / `Empty`)+ `detect_body_source` 纯函数,`filter_note` 内部按来源分派到不同过滤链:
18+
19+
```
20+
segments ──┐
21+
├→ detect_body_source ─→ Transcript ─→ 既有口语过滤链(视频,零改动)
22+
ocr_blocks ─┘ → OcrDirect ─→ 精简 OCR 过滤链(图文,新增)
23+
→ Empty ─→ 标题仅
24+
```
25+
26+
- `Transcript` → 既有口语过滤链(逻辑逐字节不变——零回归风险)。
27+
- `OcrDirect` → `filter_note_from_ocr` 精简链:排序 → 置信过滤(0.5,与 photo_capture 同口径)→ 符号归一(**跳过口语净化**——OCR 文本无结巴/口头禅/碎片)→ 相邻去重 → markdown 组装("图文提取"标注段)。
28+
- `Empty` → 标题仅 markdown(无可用正文的诚实降级,不 panic)。
29+
30+
`refresh_screen_points` / `apply_ai_decisions` / `render_note_structure` 按 `body_source` 分流,防覆盖 OCR 正文(图文会话无时间轴叙述结构,章节插入不适用)。
31+
32+
引用 photo_capture 已有规则:用户框选即意图,OCR 文本不过 UI 垃圾黑名单(与视频链路"OCR 辅助画面要点"语义分离——OCR 文本在图文会话中是正文本身)。
33+
34+
## 备选方案
35+
36+
### 方案 A:打补丁——过滤链内特判 `kind=photo`
37+
- 优点:改动最小。
38+
- 缺点:把"正文来源"拍进过滤链,语义仍被 `kind` 绑定;未来导入 PDF/网页截图转笔记需再造一条特判分支——不可扩展,重蹈硬编码覆辙。
39+
40+
### 方案 B:正文源多态抽象(**选定**)
41+
- 优点:`detect_body_source` 是独立抽象层,新正文源(PDF / 网页截图)只加变体 + 对应过滤链,不改既有 Transcript 路径核;与 `kind` 字段解耦(未来导入语音会话同路径)。
42+
- 缺点:一次性引入枚举 + 分派 + 三路 match,改动面略大。
43+
- 适用场景:长期重构,多正文源演进。
44+
45+
## 选择理由
46+
47+
正文源多态是长期重构而非打补丁。`BodySource` 枚举把"哪个是正文"提升为数据层语义,过滤链核只按来源分派,为未来"导入 PDF/网页截图直接转笔记"提供架构地基(仅需新增 `BodySource::PdfDirect` + 对应过滤链)。Transcript 路径零改动消除回归风险。
48+
49+
## 影响
50+
51+
### 正面影响
52+
- 修复纯图文会话转笔记空内容的 P0 设计债。
53+
- 正文来源表达层化,未来多源扩展只加变体。
54+
55+
### 负面影响 / 代价
56+
- `filter_note` 新增枚举 + 分派 + `filter_note_empty`;`NoteFilterResult` 增加 `body_source` / `ocr_body` 两个 serde-skip 内部字段。
57+
58+
### 风险
59+
- Empty 分支对"空转写段 + 辅助字幕 OCR 块"的视频会话 edge case 由"保留 ocr_screens"变为"标题仅"——与设计一致性(Empty=标题仅)相符,属有意行为。
60+
61+
## 合规性验证
62+
63+
- `cargo test note_filter`(`detect_body_source` 黄金 6 用例、`filter_note_from_ocr` 7 用例、`filter_note_with_empty_segments` 新语义)。
64+
- 纯图文会话转笔记 → markdown 含 OCR 识别文本 + "图文提取"标注段;视频会话转笔记 → 零变化(回归护栏)。
65+
66+
## 相关决策
67+
68+
- ADR-020: 会话类型字段(图文会话)
69+
- ADR-010: AI gap-filling 隐私契约
70+
71+
## 参考
72+
73+
- docs/versions/v0.12.0.md(正文源多态 M1)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# ADR-022: WGC 窗口级捕获——三级降级链
2+
3+
## 状态
4+
5+
提议(v0.12.0 M2,2026-08-23 规划定稿;待实施)
6+
7+
## 日期
8+
9+
2026-08-23
10+
11+
## 背景
12+
13+
当前 DXGI Desktop Duplication 是显示器级捕获,窗口上方覆盖的 UI(弹窗/任务栏/通知)会入镜;GDI BitBlt 降级更差,遮挡完全无法避免。目标窗口被遮挡导致采集内容含遮挡物(能力债)。
14+
15+
## 决策
16+
17+
我们将新增 WGC(Windows.Graphics.Capture,Win 10 1903+)后端,构建三级降级自愈链:
18+
19+
```
20+
WGC(主,窗口级,Win 10 1903+)
21+
↓ AcquireNextFrame 失败 / 安全桌面 / 窗口最小化
22+
DXGI Desktop Duplication(降级 1,屏幕级+窗口裁剪,当前主路径)
23+
↓ 远程桌面 / 锁屏 / 设备丢失
24+
GDI BitBlt(兜底,全场景可用)
25+
```
26+
27+
- 新增 `capture/wgc_capture.rs`(WinRT 异步帧回调 → 通道同步化,`capture()` 保持同步接口——上层 Worker 零改动,变化检测/双速率调度/OCR 编排全部复用)。
28+
- `ScreenCaptureSampler` 扩展为三级链:新增 `CaptureBackend { Wgc, Dxgi, Gdi }`,`try_create_backend` 逐级尝试(WGC → DXGI → GDI),`capture()` 按当前后端路由,失败自动降级下一级。
29+
- WGC 初版编译期 `#[cfg(windows)]` gate——Win 10 1903 以下回退 DXGI/GDI(旧系统行为零变化)。
30+
- 三级链不引入新不确定性:WGC 最小化场景不回退到 DXGI 后不尝试自动切回——沿用 DXGI 已有 30s 周期重建(TD-033 快速节流同理)。
31+
32+
## 备选方案
33+
34+
### 方案 A:继续 DXGI,只在窗口裁剪上增强
35+
- 优点:无新依赖。
36+
- 缺点:DXGI 是显示器级,窗口遮挡本质无法规避——治标不治本。
37+
38+
### 方案 B:WGC 主路径 + 三级降级(**选定**)
39+
- 优点:WGC 窗口级捕获真正抗遮挡(弹窗/任务栏/通知不入镜);三级链覆盖不稳定场景(安全桌面/全屏独占 DX 游戏/最小化/远程桌面/无 DWM)。
40+
- 缺点:WinRT FFI 复杂度;Win 10 1903 以下不可用(编译期 gate 回退)。
41+
- 适用场景:窗口被遮挡是用户核心痛点。
42+
43+
## 选择理由
44+
45+
WGC 提供真正的窗口级捕获,是唯一能规避窗口遮挡的方案。三级降级链保证在 WGC 不稳定的各类场景(UAC 安全桌面、全屏独占 DX 游戏、窗口最小化、远程桌面、Server Core 无 DWM)不 panic 且行为与当前一致,最大化兼容性。
46+
47+
## 影响
48+
49+
### 正面影响
50+
- 目标窗口被遮挡时捕获内容为窗口实际内容(非遮挡物)。
51+
52+
### 负面影响 / 代价
53+
- 新增 WinRT FFI 模块(异步转同步的通道化样板);`ScreenCaptureSampler` 增加后端状态机。
54+
55+
### 风险
56+
- WGC WinRT 异步回调 → 通道同步的 FFI 复杂度;需真机验证各降级路径(安全桌面/远程桌面/锁屏)。
57+
58+
## 合规性验证
59+
60+
- 目标窗口被遮挡时捕获内容为窗口实际内容;远程桌面会话自动降级 DXGI/GDI 且不 panic;窗口关闭/最小化按现有 DXGI/GDI 逻辑兜底;`cargo build` 通过。
61+
62+
## 相关决策
63+
64+
- ADR-002: DXGI 屏幕捕获
65+
- ADR-007: 实时会话生命周期(30s 周期重建)
66+
67+
## 参考
68+
69+
- docs/versions/v0.12.0.md(WGC 窗口级捕获 M2)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# ADR-023: 视频会话 OCR 下线 + AI 精修图片理解(vision-exp)
2+
3+
## 状态
4+
5+
已接受(v0.12.0 M5,2026-08-23 用户裁决;精修侧已实施交付,画面要点降级侧待真机验证)
6+
7+
## 日期
8+
9+
2026-08-23
10+
11+
## 背景
12+
13+
本地 PaddleOCR 对视频**全帧画面要点**提取质量差(动态模糊/复杂版面/小字/干扰物)——同一引擎在字幕/图文场景效果好(质量债)。且图片上传是最敏感的隐私动作,需独立授权闸门。
14+
15+
## 决策
16+
17+
- **本地 OCR 只做字幕(视频)+ 图文采集(photo 会话)**——视频会话不再做全帧 OCR。
18+
- **关键帧纯图**(存图不识别);存图触发从"OCR 文本非空"解耦为"grid diff 变化 + 时间间隔"。
19+
- **vision-exp 图片理解(可选增强,仅视频会话,并入 AI 精修)**:不做独立提取命令——精修时若 `vision_refine_enabled` 开启,屏卡图随转写文本一并送 `deepseek-v4-flash-vision-exp`(content 数组多模态),精修输出直接含画面要点;屏卡缩略图走现有 `attach_images`。
20+
- **图文会话 OCR 已足够,不启用 vision**(用户决策:仅视频会话使用)。
21+
- **图片精修可选性**:`vision_refine_enabled` 开关(默认关)——图片上传最敏感,独立闸门;关闭则精修纯文本(现有行为零变化)。
22+
- **AI 强化链条总开关**:复用现有 `AiSettings.enabled`(全局闸门,默认关)——关闭则采集期领域识别/AI 复核/精修/补充全部拒绝(已有 `content_gate` 门控)。
23+
24+
**隐私红线(ADR-010 扩展)**:图片上传默认关(`vision_refine_enabled` 默认 false + 全局 `enabled` 默认关);关闭时精修走纯文本(零变化);图片仅随精修切片请求上传,不作独立提取。
25+
26+
## 备选方案
27+
28+
### 方案 A:保留视频全帧本地 OCR,仅调参增强
29+
- 优点:无架构改动。
30+
- 缺点:本地 OCR 在动态模糊/复杂版面根本性不可靠——调参治标不治本,且维持全帧 OCR 的算力/成本。
31+
32+
### 方案 B:视频全帧 OCR 下线 + vision-exp 精修图片理解(**选定**)
33+
- 优点:质量债根治(关键帧纯图,不识别);画面要点经 vision-exp 高质量提取并并入精修;图片上传独立闸门 + 默认关,隐私可控。
34+
- 缺点:画面要点提取依赖云端 vision(需授权 + 有条件);离线降级 = 无画面要点(纯图存证)。
35+
- 适用场景:视频会话以转写为主体,画面要点为增强。
36+
37+
## 选择理由
38+
39+
本地 OCR 质量差的根因是引擎对视频全帧的鲁棒性不足——降级为"只做字幕/图文采集"规避该根因。画面要点本属增强,交给 vision-exp 高质量提取并在精修时随切片上云,同时以独立闸门 + 默认关满足图片隐私红线。
40+
41+
## 影响
42+
43+
### 正面影响
44+
- 视频会话不再产生低质全帧 OCR;画面要点提取质量提升(vision-exp);图片上传可控。
45+
46+
### 负面影响 / 代价
47+
- 关闭开关时视频会话精修无画面要点(纯文本);图片随精修上云需用户授权(默认关)。
48+
49+
### 风险
50+
- vision-exp 画面要点抽取质量依赖云端模型(未实测校准);需真机验证采集端改动(video 会话不再 OCR 全帧)。
51+
52+
## 合规性验证
53+
54+
- 视频会话关键帧纯图(无 OCR 文字);开启图片开关后精修请求含屏卡图、输出含画面要点;关闭开关精修纯文本零变化;图文会话不受影响;`enabled=false` 时精修命令拒绝。
55+
56+
## 相关决策
57+
58+
- ADR-010: AI gap-filling 隐私契约(本 ADR 扩展图片授权)
59+
- ADR-011: grid diff OCR 触发
60+
61+
## 参考
62+
63+
- docs/versions/v0.12.0.md(视频画面要点降级 + vision 提取 M5)

‎docs/adr/README.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
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 |
2626
| ADR-020 | [会话类型字段(图文会话)](./ADR-020-session-kind-field.md) | 已接受 | 2026-08-22 |
27-
| ADR-021 | 笔记正文源多态——`detect_body_source` 抽象层(图文会话 OCR 进笔记正文) | 提议(v0.12.0 M1,待写) | 2026-08-23 |
28-
| ADR-022 | WGC 窗口级捕获——三级降级链(WGC→DXGI→GDI) | 提议(v0.12.0 M2,待写) | 2026-08-23 |
29-
| ADR-023 | 视频会话 OCR 下线 + AI 精修图片理解(含隐私授权契约) | 提议(v0.12.0 M5,待写) | 2026-08-23 |
27+
| ADR-021 | [笔记正文源多态——`detect_body_source` 抽象层(图文会话 OCR 进笔记正文)](./ADR-021-note-body-source-polymorphism.md) | 已接受(v0.12.0 M1,已交付) | 2026-08-23 |
28+
| ADR-022 | [WGC 窗口级捕获——三级降级链(WGC→DXGI→GDI)](./ADR-022-wgc-window-capture.md) | 提议(v0.12.0 M2,待实施) | 2026-08-23 |
29+
| ADR-023 | [视频会话 OCR 下线 + AI 精修图片理解(含隐私授权契约)](./ADR-023-video-ocr-offline-vision-extract.md) | 已接受(v0.12.0 M5,精修侧已交付) | 2026-08-23 |
3030

3131
## 编号规则
3232

‎docs/versions/README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
| v0.11.5 | [v0.11.md](./v0.11.md#v0115-交付采集体验与笔记打磨11-项2026-08-22-用户裁决立项) — 采集体验与笔记打磨(档案采集中可改+记忆机制修正 / 识别率增强 / 窗口刷新 / 编号序号化 / 新颖度变化区域 / 水印 A+B+C / 产物视图下线+精修懒自动 / 精修工作台 / 锚点剥离 / 画面要点移出笔记 / 笔记页树形合并+缩略图,2026-08-22 交付) | 版本文档(代码已交付 2026-08-22,真机验收待执行) |
3030
| v0.11.6 | [v0.11.6.md](./v0.11.6.md) — AI 平台化:Provider 抽象 + 能力声明化 + 产出策略定制(三层;M1→M3 排期) | 版本文档(规划中 2026-08-22) |
3131
| v0.11.7 | [v0.11.7.md](./v0.11.7.md) — 图文会话:截屏导入 + 跨链路采集体验同步(kind 字段 + 5 命令 + 框选遮罩;排期于 v0.11.6 之后) | 版本文档(规划中 2026-08-22) |
32-
| v0.12.0 | [v0.12.0.md](./v0.12.0.md) — 图文与窗口捕获重塑:正文源多态 + WGC 抗遮挡 + 系统级截屏覆盖层 + DeepSeek 默认化 + vision 精修 + 采集浮窗化(M1-M7,七项改进修正五个断裂) | 版本文档(规划定稿 2026-08-23,设计完成待实施) |
32+
| v0.12.0 | [v0.12.0.md](./v0.12.0.md) — 图文与窗口捕获重塑:正文源多态 + WGC 抗遮挡 + 系统级截屏覆盖层 + DeepSeek 默认化 + vision 精修 + 采集浮窗化(M1-M7,七项改进修正五个断裂) | 版本文档(规划定稿 2026-08-23;M1/M4/M5-精修侧已交付,其余待实施) |
3333

3434
## 沉淀规则
3535

0 commit comments

Comments
 (0)