Skip to content

Commit 911e539

Browse files
committed
docs(adr): v0.12.4 版本文档与版本号 0.12.3→0.12.4
- 新增 docs/versions/v0.12.4.md:视频画面要点纯图 + 预览锚点 chip 完整性修复 - CHANGELOG Unreleased 条目 + versions 索引行 + ADR-023 状态行补充 - tauri.conf.json/Cargo.toml/Cargo.lock/package.json 版本号同步 0.12.4
1 parent 5b67c77 commit 911e539

8 files changed

Lines changed: 107 additions & 6 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@
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-
## [Unreleased] - 2026-08-21
6+
## [Unreleased] - 2026-08-23
7+
8+
### v0.12.4 视频会话画面要点纯图落地 + 笔记预览时间戳锚点 chip 化(2026-08-23 交付,详见 [docs/versions/v0.12.4.md](docs/versions/v0.12.4.md))
9+
10+
- **P0 视频画面要点残留 OCR 文字(用户 0.12.1 复测)**:v0.12.0 M5(ADR-023)帧侧只删了全帧 OCR 兜底与明文路径,残留两条仍产 OCR 文字的分支——直播路径 `!is_subtitle` 布局分析后仍调 `region_ocr_blocks`(`region=full` 入库),导入路径关键帧不归档图片 + 中区域 OCR。修复:直播 `else` 纯关键帧归档(零 OCR);导入关键帧无条件纯图归档(`rgb_to_bgra`),仅字幕 OCR 门控保留,删中区域 OCR;展示层 `build_view_screens` 按 kind 分派(photo 保留 ADR-021 OCR 文本屏不变,video 走 `build_keyframe_screens` 纯图屏);`get_session_detail`/`preview_session_note`/`manual_capture_inner` 三处接入
11+
- **P0 笔记预览原始时间戳锚点外露**:`[⏱ 00:00]([[ts:233]])` 在预览(未精修)阶段仍原文显示——v0.11.5 chip 只落了正式渲染(`NoteMarkdown`),漏了两个轻量字符串渲染器(`NotePreviewView.renderMarkdown`/`RefineWorkbench.renderMd`)。修复:`utils/html.ts` 新增 `renderTimestampAnchors`(已转义文本上先章头后段落,输出与正式笔记同款可跳转 chip),两个渲染器全分支接入
12+
- **会话详情面板 kind 感知**:photo「画面要点(OCR)」/ video「画面要点(关键帧纯图)」标题与空态文案区分,`(原始 N 块)` 提示仅 photo
13+
- **退役机制标注**:残留 OCR 相关机制按 `#[allow(dead_code)]` + `@ai-context` 保留(region_ocr/layout_cache/grid_from_bgra/save_crop),不删除
14+
- 验证:Rust 新增 3 单测(纯图屏逐图/无图空屏/按 kind 分派)全量 1547 通过(3 失败为预存基线:ai_client 默认 Provider 断言旧 SiliconFlow、note_filter 两条黄金用例,HEAD 复现与本版无关);`tsc --noEmit` 零错误 / vitest 全绿(新增 5 项锚点 chip 用例)/ vite 构建通过 / clippy 零新增警告
715

816
### v0.12.3 浮窗死锁修复 + 浮窗交互/架构升级 + 精修工作台契约修复(2026-08-23 交付,详见 [docs/versions/v0.12.3.md](docs/versions/v0.12.3.md))
917

‎app/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "app",
33
"private": true,
4-
"version": "0.12.3",
4+
"version": "0.12.4",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",

‎app/src-tauri/Cargo.lock‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎app/src-tauri/Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "entropydecrease"
3-
version = "0.12.3"
3+
version = "0.12.4"
44
description = "熵减 - 视频知识提取与持久化(本地优先)"
55
authors = ["Aparencia"]
66
edition = "2021"

‎app/src-tauri/tauri.conf.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://schema.tauri.app/config/2",
33
"productName": "Entropydecrease",
4-
"version": "0.12.3",
4+
"version": "0.12.4",
55
"identifier": "com.entropydecrease.app",
66
"build": {
77
"beforeDevCommand": "npm run dev",

‎docs/adr/ADR-023-video-ocr-offline-vision-extract.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## 状态
44

5-
已接受(v0.12.0 M5,2026-08-23 用户裁决;已实施交付——精修侧 + 帧侧均落地,真机验证待执行)
5+
已接受(v0.12.0 M5,2026-08-23 用户裁决;已实施交付——精修侧 + 帧侧均落地;v0.12.4 补齐残留:直播/导入两条 region OCR 分支已删,展示层按 kind 分派纯图屏,真机验证待执行)
66

77
## 日期
88

‎docs/versions/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
| v0.12.1 | [v0.12.1.md](./v0.12.1.md) — OCR 引擎回归修复:oar-ocr auto-download 误关(v0.12.0 构建修复连带)+ 引擎就绪状态真实化(engine_ready 四处落地)+ 图文会话讲者分析误报修复 | 版本文档(代码已交付 2026-08-23,真机验收回归路径待执行) |
3434
| v0.12.2 | [v0.12.2.md](./v0.12.2.md) — 笔记页信息架构重构:三栏布局(组筛选/笔记列表/阅读编辑)+ 收件箱动线(二元论碎片→升笔记补口子)+ 路由信息收敛(ⓘ 弹层)+ 新建零对话框 | 版本文档(规划定稿 2026-08-23;**未启动,顺延为后续版本候选**) |
3535
| v0.12.3 | [v0.12.3.md](./v0.12.3.md) — 真机验收两雷同修:浮窗/覆盖层窗口创建死锁(sync 命令主线程建窗,wry#583)+ 精修工作台 serde camelCase 契约漏网(ruleMarkdown undefined.split 崩);附带浮窗交互层(双形态/拖拽吸附/穿透锁定/置顶/透明度/回主窗)与架构层(常驻预创建/状态收敛/capabilities 拆分) | 版本文档(代码已交付 2026-08-23,真机验收待执行) |
36+
| v0.12.4 | [v0.12.4.md](./v0.12.4.md) — 旧改动完整性修复:视频会话画面要点纯图落地(删直播/导入两条残留 region OCR,关键帧纯图归档,展示层按 kind 分派)+ 笔记预览时间戳锚点 chip 化(renderTimestampAnchors 接入两个轻量字符串渲染器) | 版本文档(代码已交付 2026-08-23,真机验收待执行) |
3637

3738
## 沉淀规则
3839

‎docs/versions/v0.12.4.md‎

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# v0.12.4:视频会话画面要点纯图落地 + 笔记预览时间戳锚点 chip 化
2+
3+
> 状态:代码已交付(2026-08-23,两项旧改动完整性修复)
4+
> 依据:用户对话 2026-08-23(①「视频会话中,画面要点应该是纯图片」——0.12.1 仍见 OCR 文字屏;
5+
> ②「笔记预览中(没有进行 AI 精修之前)仍有 `[⏱ 00:00]([[ts:233]])`」——预览阶段原始锚点 Markdown 外露)
6+
> 前置:v0.12.3(浮窗死锁修复)代码已交付;v0.12.2(笔记页信息架构重构)规划未启动,顺延为后续版本候选
7+
8+
## 一句话
9+
10+
两个"此前已裁决但未真正落地"的旧改动,本次补齐到**全链路生效**:
11+
12+
- **视频会话画面要点 = 关键帧纯图**(ADR-023):v0.12.0 M5 的帧侧改动只删了"全帧 OCR 兜底 + 明文路径",
13+
但**布局分析后的区域 OCR 分支**(`!is_subtitle` 时对版面区域做 `region_ocr_blocks`)仍存活,导入路径
14+
的中区域 OCR 也还在跑——0.12.1 的视频会话仍产出 OCR 文字画面。本次删除该分支 + 导入路径中区域 OCR,
15+
关键帧一律**纯图归档**(存图不识别),展示层按会话类型分派(photo 保留 OCR 文本屏,video 走纯图屏)。
16+
- **笔记预览时间戳锚点 chip 化**(v0.11.5):正式笔记(`NoteMarkdown`)的 `[⏱ MM:SS]([[ts:ms]])` 早已渲染为
17+
可跳转 chip,但**预览阶段的两个轻量字符串渲染器**(`NotePreviewView.renderMarkdown`、
18+
`RefineWorkbench.renderMd`)直接输出转义后文本——`[⏱ 00:00]([[ts:233]])` 原文外露。本次为两个渲染器
19+
统一接入 `renderTimestampAnchors`,与正式笔记同款 chip(颜色/虚线底/title 跳转)。
20+
21+
## 范围
22+
23+
| # | 项目 | 类型 | 落点 |
24+
|---|------|------|------|
25+
| 1 | 视频画面要点残留 region OCR(直播路径) | **P0** 修复 | `live_frame_process.rs`——删除 `!is_subtitle` 布局分析 + 区域 OCR 分支,`else` 纯关键帧归档 |
26+
| 2 | 视频画面要点残留区域 OCR(导入路径) | **P0** 修复 | `import.rs`/`import_frame.rs`——关键帧纯图归档(`rgb_to_bgra`),仅字幕 OCR 门控保留,删中区域 OCR |
27+
| 3 | 展示层纯图分派 | P1 契约 | `screens.rs`(`build_keyframe_screens`/`build_view_screens`)+ `get_session_detail`/`preview_session_note`/`manual_capture_inner` 三处接入 |
28+
| 4 | 预览时间戳锚点 chip 化 | **P0** 修复 | `utils/html.ts`(`renderTimestampAnchors`)+ `NotePreviewView.tsx`/`RefineWorkbench.tsx` 接入 |
29+
| 5 | 会话详情面板 kind 感知 | P2 信息 | `SessionDetailPanel.tsx`——photo「画面要点(OCR)」/ video「画面要点(关键帧纯图)」 |
30+
| 6 | 退役机制标注 | 伴随 | 退役 OCR 路径按 `#[allow(dead_code)]` + `@ai-context` 保留(region_ocr/layout_cache/grid_from_bgra/save_crop),不删除 |
31+
| 7 | 文档与治理 | 伴随 | 本版本文档 + CHANGELOG + 索引 + ADR-023 状态行 + 版本号 0.12.4 |
32+
33+
## 根因(Bug ①:画面要点残留)
34+
35+
- **帧侧**:`live_frame_process.rs` 的旧五段分支 `is_subtitle → 布局分析 → `layout_regions.is_empty()` 判断
36+
后**仍调用 `region_ocr_blocks` → `handle_full_frame`**——布局分析识别出的"正文区域"被当作 OCR 区域
37+
全文识别入库(`region=full`),视频会话画面要点在 0.12.1 仍是 OCR 文字屏。
38+
- **导入侧**:`import.rs` 的 `ocr_keyframes` 只按"有字幕才识别"做判断,无 OCR 的关键帧**不归档图片**;
39+
`import_frame.rs` 的中区域(MIDDLE_TOP/BOTTOM)OCR 对视频画面做区域识别——同样产出 OCR 文字。
40+
- **展示侧**:`get_session_detail`/`preview_session_note` 对视频会话仍无条件走 `build_screens`
41+
(OCR 文字屏构建),未按会话类型分派。
42+
43+
## 根因(Bug ②:预览锚点外露)
44+
45+
- 笔记真实渲染(注意 `NoteMarkdown` 组件)用 react-markdown 的 `a` 组件把 `( [[ts:ms]] )` 渲染为 chip;
46+
- 但**预览阶段**(未精修)走 `NotePreviewView.renderMarkdown` / `RefineWorkbench.renderMd` 两个轻量
47+
字符串渲染器——`escapeHtml` 后直接原文输出,`[⏱ 00:00]([[ts:233]])` 作为字面文本保留。
48+
- v0.11.5 只改了正式渲染组件,遗漏了两个字符串渲染器 → 预览仍见原始锚点。
49+
50+
## 修复方案
51+
52+
### ① 关键帧纯图(ADR-023 全链路)
53+
54+
- `live_frame_process.rs`:`else`(非字幕帧)→ **纯关键帧归档**(`handle_full_frame(&frame, &[], ...)`,
55+
`layout_changed=None`),零 OCR 调用;删除 `layout_cache` 参数(仅退役的布局分析使用)。
56+
- `import.rs`:`ocr_keyframes` 对每个关键帧**无条件归档纯图**(`SessionImageStore` + `rgb_to_bgra`),
57+
字幕 OCR 独立门控(`ocr_enabled`);进度消息「关键帧归档 i/N · 已识别字幕 N 块」。
58+
- `import_frame.rs`:删 MIDDLE_TOP/BOTTOM 常量与中区域 OCR,只保留底部字幕带。
59+
- `screens.rs`:新增 `build_keyframe_screens`(每个归档图一屏:`first_seen=last_seen=ts`、`image_ref`,
60+
无 title/body/labels/structure)+ `build_view_screens(kind, ...)` 分派器
61+
(photo→`build_screens` 保持 ADR-021 OCR 文本屏;video/None→纯图屏)。
62+
- 命令层接入:`get_session_detail`、`preview_session_note`(photo→`attach_images`)、
63+
`manual_capture_inner`(经 `kind` 分派)。
64+
- **保留边界**:`filter_note` 的转写路径统计/`ocr_screens` 未动;photo 会话 OCR 屏行为与 v0.12.1 完全一致;
65+
AI 精修 vision 提取(`vision_refine_enabled`)仍按 ADR-023 走屏卡图——本改动只消灭"视频画面要点出
66+
**本地 OCR 文字**"这一条路径。
67+
68+
### ② 预览锚点 chip
69+
70+
- `utils/html.ts` 新增纯函数 `renderTimestampAnchors(escaped)`:在**已转义**文本上先替换章头包裹形态
71+
`## 标题 [[⏱ MM:SS]([[ts:ms]])]`,再替换段落形态 `[⏱ MM:SS]([[ts:ms]])`(顺序契约:章头含段落子串,
72+
先章头防误吃);输出 `<span>` chip(teal 色、虚线底边、圆角、title+点击跳转语义),与 `NoteMarkdown` 一致。
73+
- `NotePreviewView.renderMarkdown` / `RefineWorkbench.renderMd` 全部渲染分支(`# `/`## `/`> `/`- `/段落)
74+
接入;img 分支不动。
75+
76+
## 测试
77+
78+
- Rust(`cargo test --test app_lib_tests`,新增 3 项):`keyframe_screens_one_per_archived_image`、
79+
`keyframe_screens_empty_without_images`、`view_screens_dispatches_by_kind`(photo 保留 OCR 屏 /
80+
video 纯图屏 / 无图空屏不落回)。
81+
- 前端 vitest(`html.test.ts` 新增 5 项):段落 chip、章头 chip、无锚点穿透、转义-替换次序注入安全、
82+
非数字分钟不误匹配。
83+
- 全量:Rust 1547 通过(3 失败为**预存基线问题**——`ai_client` 默认 Provider 断言 SiliconFlow 而
84+
v0.12.0 M4 已默认 DeepSeek;`note_filter` 两条黄金用例,均在未含本次改动的 HEAD 上复现);
85+
`tsc --noEmit` 零错误;vitest 全绿;vite 构建通过;clippy 零新增警告(既有警告均位于未改动文件)。
86+
87+
## 验证(真机待执行)
88+
89+
- 视频会话采集会话详情:画面要点清单为**图(缩略图卡)**,无 OCR 文字条目;点开为关键帧原图。
90+
- 导入视频(无字幕):关键帧已归档(session-images/<id>/full/*.webp),画面要点纯图。
91+
- 笔记预览(未精修):`[⏱ 00:00]([[ts:233]])` 不再原文显示,渲染为可点击 chip;精修后不变。
92+
- 图文(photo)会话:画面要点仍为 OCR 文本屏(回归不变)。

0 commit comments

Comments
 (0)