Skip to content

Latest commit

 

History

History
475 lines (335 loc) · 69.5 KB

File metadata and controls

475 lines (335 loc) · 69.5 KB

v0.20:ASR 质量增强系列(自验证路线 · P0~P2)

状态:系列文档——v0.20.0(REQ-263)、v0.20.1(REQ-264267)已实施(并行线 2026-09-05/06 收口);v0.20.2(REQ-268270)已实施(2026-09-06 本线:fc8e862/f168fa0/9612216/05494f4/1904c2c/19ca5cb);v0.20.3(REQ-292302)已实施(2026-09-06 本线:c78e2947dd8af2 提交链——底座/裁决/周回顾批/SOP/完成史/练习/问题/封存/模型卡接线);v0.20.4(REQ-303305)已实施(2026-09-06 本线:c47e3941f0bace 提交链——URL 采集内核/扩展收件薄壳/整页快照静态档;渲染型 wry DOM 快照与截图兜底、扩展商店发布登记后置);v0.20.5(信息架构批:行动域页独立)已实施(2026-09-06 本线:5a4a1f28/b78ddae7——行动中心独立顶层「✅ 行动」Tab + 任务写回 notes 域广播 + NotesPage ≤600 压线拆件) 状态补注:v0.20.1 与 v0.20.2 为并行双线开发(同 dev 仓库线性合流,无冲突);实施过程持续与另一线交叉提交,见各 REQ 行哈希 依据:repowiki(.qoder/repowiki)盘点 + 代码互证 + 最新技术对标(asr-optimization-plan 决策稿);用户裁决:① 人工验证不可行 → 验证一律代码自验证 ② 立项范围 C(P0P2) 关联:ADR-030(已接受)· ADR-003/012 · REQ-263270 · v0.19 检索层(同受转写质量影响)

一句话

给 ASR 链路装上"能自测的尺子 + 有数据的默认值 + 导入同级的离线质量档 + 自动发现术语错闭环":新增 bin/asr_eval 自验证 harness(字幕信道做内置参考 → CER/混淆画像/A-B 矩阵/CI 回归门),随后用同一把尺子完成参数族定案(预处理默认/VAD/端点/融合/去重)、DTW 漂移校正接线、热词加固与注入扩展、实时会话全量离线精修(采纳/回退)、ASR 同音混淆画像→纠错/热词闭环,以及可选的 LLM 文本校对(建议制·默认关·语音不出本机)。

自验证路线(本系列主纲,ADR-030 决策 1/2)

  • 参考信道:外挂/内嵌字幕轨(~100%)> 字幕 OCR 多帧投票(~99%)> 会话内字幕段;无参考素材不进 CER(只做稳定性/画像/回归)。
  • harness bin/asr_eval:批量样本 → 转写(流式/离线、参数矩阵、预处理开关)→ dtw_align 对齐 → cer.rs CER → 同音错对画像 → A/B 对比表 → 回归退出码(CI)。
  • fixtures 固化首批有参考样本;结论只作相对对比与回归,不宣称绝对指标。

批次与 REQ 映射

版本 批 内容 REQ
v0.20.0 P0 asr_eval harness + 参考信道策略 + fixtures/CI 回归 + 首轮自测报告(含漂移分布);规范口径修订(AGENTS/ADR-003,Silero 未接线留痕) REQ-263
v0.20.1 P1 DTW 漂移校正生产接线;参数定案族(预处理默认定案 + VAD/端点/重打分/融合/去重阈值 A/B 标定 + 配置化/档案化);热词加固与注入源扩展;重打分积压验证与 drain REQ-264~267
v0.20.2 P2 会话全量离线精修(S4 全量第二遍 + 段级 diff + 采纳/回退);ASR 混淆画像→纠错/热词闭环(共现才替换·确认制);可选 LLM 文本校对(建议制·默认关·仅文本上云) REQ-268~270

验收门槛(全部代码自验证)

  • harness 回归退出码挂 CI;fixtures goldens 全绿(cargo test);每批产出 A/B 结论页;
  • 精修采纳流单测(原料不可变断言);画像闭环单测(共现才替换/确认制);content_gate 默认关路径测试;
  • 全量回归:cargo test / clippy / vitest / tsc。

边界(红线延续)

原料层(session_segments 原文)永不可变;模型文件不入库/下载走既有镜像与本地归档;语音不出本机(文本级 AI 走 content_gate 双闸门默认关 + 审计);跨运行时换芯(FunASR/FireRed/Qwen3 系)与语音上云需另行 ADR + 用户授权(ADR-030 决策 8)。


并行支线规划(2026-09-05 用户裁决立项 · REQ-292~305 已登记):v0.20 系列扩展批——笔记三段管线(后处理功能区 + 核心处理 γ + web 采集进料管道)

状态:已立项(2026-09-05 用户裁决:行动/SOP 后处理与 web 采集素材线均落位 v0.20 系列实现;批号草案 v0.20.3 后处理批 / v0.20.4 web 采集批,ASR 主纲 v0.20.0~2 先行) 依据:笔记全流程三阶段讨论(预处理→核心处理→后处理);GitHub 参照(Obsidian Tasks / Joplin / Process Street / Atuin / runbook 系)与四路深研(任务方法论 / 清单科学 / SOP 软件全景 / 集成形态);来源 URL 见文末 关联:核心处理 γ 已定案(本节);「复习到期」节奏本体属闪卡引擎轮次规划,本支线只留接口;预处理见 web 采集进料管道

v0.20 系列批次(2026-09-05 落位)

批 内容 REQ
v0.20.0~0.20.2 ASR 质量增强(主纲,见上,2026-09-03 立项 C) REQ-263~270
v0.20.3 · 后处理批 行动底座 / 行动中心裁决队列 / 周回顾仪式 / 迁出通道集 / SOP 执行与演进 / 完成史 / 练习条目 / 问题清单 / 封存标记 / M 接线(本节全部设计层:决策/G1-G7/数据模型/交互/命令面) REQ-292~302
v0.20.4 · 素材批 web 采集阶段 1 内核(kind=web 会话)→ 阶段 2 扩展薄壳 → 阶段 3 整页快照(Foresight 定案) REQ-303~305
v0.20.5 · 信息架构批 行动中心从笔记页剥离独立为顶层「✅ 行动」域页(ActionCenterPanel 页面化 + ActionPage 壳 + 组侧栏入口/徽标移除);任务写回 3 命令补发 notes 域变更事件;NotesPage/GroupSidebar 拆件压线(spec) —(结构重构,无新增 REQ)

批内实施序为草案(ASR 批先行);实施规划轮可再调;REQ 登记见需求池「v0.20 系列立项批」。

一句话

给"学习产生的行动与程序"装上执行闭环:**Act(待办)**经裁决漏斗内建/迁出并统一沉淀完成史;**H(程序)**变成可执行、可复盘、可演进、用户可自定义的 SOP。

背景(三段管线语境)

  • 预处理 = 采集/净化(课堂捕获 + web 采集第三条进料管道 规划)
  • **后处理(本支线)**消费"带类型标注的原子块"——该契约由核心处理提供;v1 先用结构信号(- [ ] 任务行 / StepCard 步骤卡 / - ☑️ 待办 产物行),不阻塞
  • 完成的产品语义承接既有哲学:组是唯一容器、产物进学习闭环即止;不做通用任务管理/工作区

决策记录(2026-09-05 用户逐项裁决)

# 分叉 裁决
1 功能区架构 待办 / SOP 两区分设,共用行动底座(任务索引+回写原子层+完成史)
2 待办形态 裁决漏斗替代清单墙:捕捉 → 聚合(计划日/逾期标红/搁置,不造伪死线)→ 周回顾裁决队列(执行/改期/转闪卡/迁出/有意识放弃留因)→ 完成史
3 Act 归宿 判定树两问:驱动"习得"?在熵减上下文内执行?——双"是"→内建(练习条目 / SOP run / 学习行动[找料/剪藏等 app 内执行的习得服务动作,G1 补录]);否则→迁出(内容上下文随迁出文本携带)
4 迁出回执 策略 A:放手+手动回填——迁出只记事件(快照+链接+时间),外部完成与否由外部系统记;周回顾可手动回填"已完成"入史;不做 API 轮询回调(入站依赖/违背本地优先)
5 SOP 模板 用户自定义是一等约束:三源创建(课堂素材半自动草稿 / 框选任意段生成 / 从零手写)→ 机器只产草稿,人永远是作者;步骤增删排序、要素(预期结果/参数/暂停点)、双模式标注均可编辑
6 SOP 执行 双模式执行器(READ-DO 单步引导 / DO-CONFIRM 总览核对)+ 暂停点 + 每步预期结果(可观测信号)+ 证据自评(关键步骤数值/照片/输出必填)+ 轻分支(失败点→跳过/降级/重试)
7 SOP 演进 run 史驱动版本化修订:run 档案聚合高频失败步 → 修订建议(用户裁决,AI 只拟稿);执行即保鲜(run 结束对比源笔记提示"有出入?");复跑对比;失败点→练习卡(接口)
8 完成史 completion_history 统一留痕(done/abandoned/exported/reverted),周回顾原料 + 成长轨迹唯一数据源——完成即证据
9 明确不做 四象限/标签体系/协作推送/日历集成/AI 自动排程/强截止日/通用项目管理 · 多用户/审批/定时调度/合规审计/BPMN/视频自动生成/组织治理 · 断签零容忍计数(打卡须宽容)

行动底座与两区要点

底座:md 任务行为唯一真相(v1 不引入新符号)→ task_index 增量索引(保存钩子维护,聚合走 SQLite 不走全库扫描)→ 回写原子层(行解析→状态迁移纯函数→写回源行,全入口收敛)→ completion_history。

① 待办功能区(Act):产物遗留行归一化(- ☑️ 待办 → 可裁决条目,可「提炼为任务行」)→ 聚合视图(计划日/搁置)→ 周回顾裁决队列(含"转闪卡/放弃留因"——不留死尸的机制是裁决不是自动清理)→ 迁出适配器(保底三件套:复制 todo.txt 行/导出 .todo.txt/邮件说明;scheme 通道 Todoist todoist://quickadd + 滴答 x-callback 先探测注册;REST+token 二期进 keyring 复用 ADR-016 DPAPI;Google Tasks/MS To Do/Vikunja 自填 endpoint 后置)。

② SOP 执行功能区(H):三源创建模板(课堂素材半自动提炼=复用截图/OCR/转写时间线,Scribe 映射但不做录屏识别)→ 双模式执行 + run 快照档案(runs/run_steps:轨迹/失败点/耗时,正文保持可复跑)→ 版本化演进 → 个人操作档案。

③ 学习联动接口(预留,本体归闪卡/复习轮次):练习类 Act 节奏化(次数/时长/难度/熟练度=闪卡之外第二条复利曲线);「该练了」按曲线浮出(不建待办,trane 范式);失败点→练习卡——本支线只定义数据接口与完成史沉淀。

参照依据(节选,深研 URL 全表见 Foresight 落档轮)

  • 任务侧:GTD 五步架构 / Things 双日期+Someday / Todoist 活动日志 / MS To Do「我的一天」/ done-list 与断签实证(Duolingo streak 研究、JCR 破罐破摔)/ trane、艾宾浩斯排程(行动到期复习先例)
  • 清单侧:《清单革命》(暂停点/关键项/两类执行)· WHO 手术清单 · AAPM「清单是持续演进文档」· SRE runbook(触发条件+命令+预期输出+验证步)· 实验 protocol · Cooklang(参数化步骤)· SDCA/PDCA
  • 软件侧:Process Street(模板-运行实例分离)/ Trainual(SOP+测验)/ Scribe(录屏成稿)/ SweetProcess(无执行层反例)/ Atuin Desktop(可执行文档,docs that don't rot)/ ChecklistFabrik / driver.js、Shepherd
  • 集成侧:PARA 归档 / Logseq done 回填诉求 / Obsidian Tasks 语义状态层(SQLite 增量索引替代其全库扫描)/ 思源任务插件双写与收费化反例

开放项(登记不阻塞)

  1. 待办聚合视图与 SOP 执行入口的 UI 位(交互规划轮定)
  2. 完成时间戳:v1 只落索引列,不写正文行内(避免污染可复跑模板)
  3. 循环执行(.+ / ++ / + 三型)P2,作任务配置字段不作文法
  4. REQ 编号登记(需求池)与核心处理/闪卡轮次的衔接裁决
  5. run 完成后可选写一行 meta 到正文末尾(默认关)

2026-09-06 审查登记(TD-2026-09-06-A~H 摘要,权威清单见归档)

  • A 有效轴窗边裁剪:跨采纳窗段覆盖 ≥60% 整段让位,窗外 ≤40% 内容可能缺位(clip 未实现——注释自我矛盾待修)
  • B 校对执行模型:async 内同步分块请求阻塞 worker(长会话),重复 run 未清上次 pending(护栏部分已修)
  • C 保鲜 diff:SOP run 结算仅比首步;start 时段漂移 stale 提示未实现
  • D 执行器差异:READ-DO/CONFIRM 渲染无实质差异;证据图片三入口上传流未接(现为相对路径输入)
  • E SE 覆盖:封存过滤仅 NotesPage 默认列表(复习面/检索/组视图未覆盖)
  • F web 后置:kind=web 预览后端未统一路由(前端已规避);渲染型快照与截图兜底、扩展商店发布未做
  • G 基建:token 非 CSPRNG/ACL 注释漂移;行数豁免登记已按实测更新(命令层/前端文件见 line-limit-exemptions.md)
  • H 未接线面:完成史 reverted 事件、GoalsPage 回顾流接入、set_task_disposition/练习暂停归档 UI/工具栏「生成 SOP」选区入口

场景走查补录(2026-09-05 · G1-G7 裁决)

方法:以「眼影晕染进阶」技能场景全流程走查(捕捉→裁决→执行→复盘)反推缺口,逐项裁决定案。

# 缺口 裁决
G1 素材获取类 Act("找 2 篇文剪藏")无处可归 判定树确认内建第三类学习行动(app 内执行、服务于习得);决策记录 #3 已修订
G2 练习需要周期 练习条目带周期字段:v1 daily|manual;.+/++/+ 三型循环 P2 统一(配置字段不作文法);缺勤宽容只记史
G3 证据从哪来 run_steps.evidence 复用图片三入口(剪贴板/文件/外链)+ notes-images/ + import_note_image,存相对路径
G4 修订建议 v1 纯本地聚合提示("步骤 N 累计失败 M 次");AI 拟稿后置(AiSettings 闸门 + 精修协议,默认关)
G5 迁出后正文行处置 标 [x] + 迁出事件入史(通道/链接入 meta);完成时间戳只落史不落正文
G6 SOP 模板形态 模板=段落行范围引用(note_id+start/end line),编辑段落即编辑模板无双写;run 快照与当前段 diff 驱动"执行即保鲜"
G7 "转闪卡"裁决 周回顾队列预留"转卡"出口动作,本体接闪卡引擎接口(本规划不实现)

数据模型草稿(v1 · 六张新表 + 复用链,2026-09-05)

① task_index——正文任务行增量索引(真相仍在 md 行;只作聚合查询缓存,无回写职责) id / note_id FK / line_no / task_text(快照去前缀) / status todo|done / disposition generic|learning|practice|sop|export / plan_date NULL / created_at / updated_at · UNIQUE(note_id,line_no) 维护:note 保存钩子(versioned_save 路径)重扫重建索引——行号漂移由"重扫式刷新"吸收;勾选仍走既有字符级回写(NoteMarkdown 先例)。

② practice_items——练习条目(内建①类) id / note_id NULL / kb_concept_id NULL / text / frequency daily|manual / goal NULL / mastery NULL(1-5) / next_due NULL / status active|paused|archived / created_at / updated_at 打点 = completion_history 事件(practice_tick);练习曲线由史聚合,不另建 tick 表(YAGNI)。

③ sop_templates——SOP 模板 = 段落行范围引用 id / note_id / name / start_line / end_line / mode readdo|confirm / created_at / updated_at 无双写:编辑段落=编辑模板;版本化=复用 notes 既有 versioned_save 版本链(不建模板独立版本表)。

④ sop_runs + ⑤ sop_run_steps——执行档案 sop_runs: id / template_id FK / note_id / mode / status active|done|aborted / started_at / finished_at sop_run_steps: id / run_id FK / step_no / text_snapshot / status todo|done|skipped|failed / evidence_path NULL / failure_note NULL / checked_at NULL

⑥ completion_history——完成史(统一证据,唯一数据源) id / ts / event_type done|abandoned|exported|export_manual_done|practice_tick|sop_run / source_type task_line|practice_item|sop_run|learning_action|export / source_id NULL / note_id NULL / text(快照) / note NULL(放弃原因等) / meta JSON NULL(迁出通道/链接等)

复用链:SOP 版本化→notes 版本链;证据图→图片三入口+notes-images/;AI 拟稿→AiSettings+精修协议(后置);REST 凭据→ADR-016 keyring(后置);迁移→既有迁移机制。

命令面落位(占位):commands_tasks.rs(索引/裁决)· commands_sop.rs(模板/run)· commands_history.rs(史/回填)。

交互层草稿(2026-09-05 · 三块新 UI + 触点改造,全锚定既有组件)

①「✅ 行动中心」(待办裁决 + SOP 库 + 完成史)

  • 入口:笔记页组侧栏顶行,与 🎴 复习 N 并列 ✅ 行动 N(N=逾期+到期徽标,复用 GroupSidebar 全量入口模式;行动跨组聚合故入口在组侧栏)
  • 形态:全屏 Overlay(锚定 ReviewSessionOverlay「复习面 UI 最小化」先例)三页签:
    • 裁决队列:逾期·标红 / 计划日 / 搁置 / 待提炼(产物 ☑️ 行)——每条行操作:✓完成 · 📅改期 · 🎴转卡 · ⤴迁出(通道菜单) · ✗放弃(留一行原因)
    • SOP 库:模板 + 最近 run + 失败频次徽标
    • 完成史:周视图条(周回顾裁决仪式);同时喂 GoalsPage 既有回顾流时间线(不建第二通道)
  • 周回顾裁决队列 = 行动中心仪式视图——"裁决机制而非自动清理"

② SOP 执行模式(Overlay 双态)

  • 入口:笔记阅读态步骤段落 / 模板库行 →「▶ 执行」(建 run 后全屏执行 Overlay,ReviewSessionOverlay 样式)
  • 单步卡:做法 + 预期结果 + 证据上传(关键步骤必填)+ ✓完成 / ✗失败+原因 / ⏭跳过;顶部 [逐步引导|总览核对] 切换(READ-DO/CONFIRM);暂停点提示条;上次失败步骤 ⚠ 徽标(复跑对比)
  • 单步引导交互锚定 InterviewDialog(目标访谈四步向导先例)
  • 结束 → 结算页:轨迹 / 失败点 / 保鲜 diff("笔记有出入?")/ 归档入史

③ 捕捉与提炼触点(零新入口哲学)

  • 捕捉零成本:编辑器写 - [ ] 即被 task_index 自动收录,不新增捕捉 UI
  • 产物 ☑️ 行 → 行动中心「待提炼」页签一键「提炼为任务行」(转标准 - [ ] 插回笔记)
  • SOP 模板生成:编辑态选中步骤段落 → 工具栏「生成 SOP」(写行范围引用,不复制正文——G6)
  • 🎴 转卡动作:先置灰提示规划中(G7 预留)

明确不做(交互层 YAGNI)

全局热键/浮动待办条(浮窗技术底座留给采集不扩权)· 日历视图/四象限/看板 · 完成史图表库依赖(轻量自绘,复用知识画布自绘先例)

命令面草稿(2026-09-05 · 三模块 + 共享原子层)

共享回写原子层(纯逻辑先行)

parse_task_line(text) -> {is_task, status, payload}(认 - [ ]/- [x]/- ☑️ 待办)· migrate_status(line, to) -> line(字符级,NoteMarkdown 同源逻辑提纯)· replace_line(body, line_no, new_text) -> body 前端编辑器勾选 / 行动中心操作 / 未来通知全入口收敛于此;全部配单测。

commands_tasks.rs

命令 要点
list_action_queue filter{scope, tab: overdue|planned|someday|unrefined};task_index JOIN notes
set_task_plan_date 只落索引列不进正文(计划日是元数据)
resolve_task done→[x];abandon→[x]+史留 reason;to_card / export(channel) 出口
export_tasks / list_export_channels clipboard_todotxt | file_todotxt | scheme_todoist | scheme_ticktick(先探测注册)
manual_fill_export_done 周回顾手动回填 → export_manual_done
set_task_disposition learning|practice|sop|export 纠偏

commands_sop.rs

命令 要点
create_sop_template 校验范围在正文内、≤50 步
list_sop_templates / delete_sop_template 删除不动正文(只删引用)
start_sop_run 启动时校验段漂移(当前段 vs 上次快照不符 → stale 提示)
run_step_update done|skipped|failed + evidence_path(白名单 notes-images/)+ failure_note
finish_sop_run 结算统计 + 保鲜 diff + 写 completion_history(sop_run)
list_sop_runs / get_sop_run 轨迹回看
suggest_sop_revisions v1 纯本地聚合(步骤 N 失败 M 次);AI 拟稿后置

commands_history.rs

list_completion_history(week/source_type/scope 过滤——同时喂回顾流)· batch_weekly_resolve(单事务周回顾批提交)

横切

  • 事件:data:tasks / data:sop 并入 v0.19.4 通用变更事件总线(行动中心徽标订阅刷新)
  • 校验:入参白名单/长度/一致性;属主校验(既有 IPC 红线)
  • capabilities 增补新命令域;前端钩子 useActionQueue / useSopRuns / useCompletionHistory

核心处理规划(γ · 分类型特化,2026-09-05 用户裁决定案)

定位契约:输入 = 预处理四源初稿(课堂/图文/web/自我编辑,web 见 web-capture-ingestion-path);输出 = 8 类语义标注与去向裁定,供后处理裁决漏斗消费。

原则

只为"值得长期调用"的类型建正式机制——全量强制标注不成立(用户无余力逐段分类),W/Y 等类型靠结构与搜索(不加税)。提炼动作记录的类型标记为副产品(类型视图 P2)。

类型 × 机制分工表

8 类 核心处理动作 归属 新增量
W 事实/术语 零新增——TermAnchor→kb 概念、Table/Formula/CodeBlock 结构块已覆盖 kb 体系(已有) 无
Y 因果 零机制——理解即过,整篇可检索 — 无
H 程序 提炼为 SOP(入口见交互层) 后处理 SOP 区 无
M 模型 提炼为模型卡:笔记段/素材 → 卡草稿(定义+应用案例留空+源引用)→ 复习面 闪卡体系(model 卡先例存在) 接线(先核对现有 model 卡生成路径防双轨)
Me 洞见 问题化正式机制(本轮裁决:独立问题清单) questions 表 + 行动中心「❓ 问题」页签 新表 + 提炼入口
Act 行动 提炼为任务行 → 裁决漏斗 后处理待办区 无
SE 情绪 tag 标记 + 默认排除(#树洞 类;列表/复习面默认不可见,设置可显) tags(已有)+ 视图过滤 低
AI 审美 氛围 tag(已有)+ 随机漫步入口 tags(已有) P2
未标注内容 保持整篇初稿,靠 FTS/混合检索 检索层(已有) 无

questions 表草稿(Me 正式机制)

id / note_id NULL(来源笔记) / kb_concept_id NULL / text(问句) / context NULL(来源段快照+回链) / status open|answered|archived / answer_ref NULL(答沉淀处回链:笔记/卡) / created_at / updated_at

  • 提炼入口:笔记段 →「转为问题」(text=用户改写问句或原疑问,context=段快照+note 回链)
  • 视图:行动中心第四页签「❓ 问题」——open/answered 分区,供输出创作前翻看、复盘原料
  • 出口:答沉淀后「转为复习卡」(QAPair 语义,G7 同接口,P2)

三段管线总览(本支线收口)

预处理 ──→ 核心处理(γ) ──→ 后处理
四源初稿    提炼动作+分类型   裁决漏斗/SOP/练习
+结构线索   正式机制(M/Me/    +完成史/问题清单
            Act/SE·AI)
  • 已有机制大量复用:TermAnchor→kb / model 卡 / SOP 入口 / 提炼动线(碎片→笔记/闪卡先例)
  • 提炼入口分布各区,类型语义只有一份——无第二套"分类系统"

开放项(登记)

  1. M「提炼为模型卡」接线前核对现有 model 卡生成路径(RouteInfoPopover「model 卡可纳入体系」),防双轨
  2. AI 随机漫步入口(氛围 tag 消费面)P2
  3. 类型视图(按类型聚合浏览已标注块)P2
  4. 「问题→复习卡」出口 P2(G7 接口)
  5. questions 与知识体系问句(若有)的关系核对——kb 层核对后接线

v0.20.1 交付记录(ASR 批 P1,2026-09-05 完成)

状态:四 REQ 全部交付(REQ-264/265/266/267 → 需求池均已实施);全量回归 2159 通过 / 0 失败;clippy 零新增告警。 关联:标定结论页(归档) · 首轮报告(归档)

REQ 交付内容 提交
REQ-264 DTW 漂移校正生产接线:correct_drift_if_any(段数 ≥3、200ms~15s 带内采纳)+ rewrite_with_fusion 融合前校正 fc1e65a
REQ-265 端点参数档案化骨架(StreamingAsrConfig rule1/2/3 字段化 + asr-params.json + from_env 双装配点)+ harness 流式档与注入面 + 首轮 A/B 标定定案:rule3 默认 8s→12s(5/5 一致改善)、rule1 维持 2.4s 4caadc9 55cbd02 c433485
REQ-266 热词加固:tokens 表外字过滤崩溃防护单测 ×4 + title_hotword_candidates(品牌/纯数字剔除、限量去重)+ preheat title 参数 + 前端接线 7abc9a3 85a836c
REQ-267 重打分积压与停止 drain 防线核实(live-loop 8s 宽限 drain + engine 超时排空已存在)+ 排空专用单测(积压逐条 Err 清空) c433485

前置:streaming zipformer fp16 四件套模型下载就位(hf-mirror,models/streaming-zipformer/,同步应用数据目录——设置页模型管理状态 ready);harness 流式档真模型端到端冒烟通过。

族内余项登记(续延标定批):VAD 预热/窗口/倍率、重打分门限、融合 gap/SIM/权重、去重阈值 A/B;预处理默认定案复核;REQ-267 慢速档回放=真链路集成级(真机会话实测登记)。

豁免登记(2026-09-06 六维审查):bin/asr_eval.rs 386 行(300-600 档)——CLI 编排单用途(双信道+双路+参数注入+回归门),拆分会反损内聚,硬限 600 内维持;审查其余即修见 归档审查报告(提交 152cf56)。


v0.20.5 交付记录(信息架构批,2026-09-06 完成)

状态:已实施(2026-09-06 本线:5a4a1f28 + b78ddae7);设计依据 2026-09-06-action-domain-page-design spec(含交互遗漏审计 D7) 裁决:意图分层——「做(行动裁决/SOP/练习/问题)」从笔记页剥离为顶层域页;入口=仅顶部「✅ 行动」Tab(组侧栏按钮/逾期徽标移除);复习域页/收件箱留原处(二期预留);NotesPage 压回 ≤600(TD-2026-09-06-G 拆件义务);版本 v0.20.5(v0.21 系列留给执行型智能体)

变更 内容 提交
后端事件补发 task_complete/task_abandon/task_refine_unrefined 写正文成功后补发 DataDomain::Notes(batch_weekly_resolve 已有广播——commands_after.rs;task_set_plan_date 正文零污染不发);IPC 层无 mock-app 基建,发射为包装层单行 + 核心测试与手工走查覆盖(先例同 batch_weekly_resolve) 5a4a1f28
组件页面化 ActionCenterOverlay → components/action-center/ActionCenterPanel(去遮罩/关闭按钮,页面自适应;refreshToken 变化=全量重载);嵌套 SOP 执行器/🎯练习/❓问题弹层原样保留 b78ddae7
导航与拆件 App.tsx +1「✅ 行动」Tab(保活挂载 + active 门控,TD-004 模式);NotesPage 删行动中心全部残留并将阅读头动作组拆 NoteHeaderActions(641→575 行);GroupSidebar 删 ✅ 行动按钮与徽标(469→455 行);action_badge_count 命令保留不删(API 面不缩小) b78ddae7
测试与回归 ActionCenterPanel/ActionPage 新增 5 例关键路径(挂载全量拉取/三页签/切回重载);GroupSidebar.test 清理 6 处 onOpenAction + 徽标 mock;全量 vitest 576/576、tsc 0、cargo 2254/0 b78ddae7

开放项滚动:复习域页独立(二期——ReviewSessionOverlay 全页化 + 全量到期卡 + 组过滤器,spec §9 域模型已容纳);顶层 Tab >8 时导航分组收纳(观察项,spec §9);🎴 转卡 G7 预留置灰不变;豁免表旧登记行(616/572/442 等)按既有纠偏风格与新行共存留档。


v0.20.6 交付记录(批 1:AI 任务数据安全与刷新修复,2026-09-09 完成)

状态:审查清单批 1 五项全部交付(REQ-306/307 → 需求池已备注);范围 = ai_tasks 任务域(id 序列/启动恢复)+ AI 任务前端视图(对话页刷新/标题口径/采纳链/语义说明);采集/暂停/笔记域/会话页等其余审查项不在此批。 缺陷根因回顾:任务 id 序列每启动从 1 开始、仅按「succeeded 且未采纳」恢复集越位——DB 中已采纳/failed/proofread/goal_plan 行 id 更大时,重启后新任务复用旧 task_id,INSERT OR REPLACE 静默顶替历史行(含已采纳结果/成本/轨迹)。

变更 内容 提交
id 序列数据安全 db_ai_tasks 新增 max_ai_task_id()(SELECT MAX(task_id) 全表——覆盖所有状态行)+ commands_ai_refine 新增 task_seq_lower_bound(cur, db_max) 纯函数;app_setup 启动恢复块改为以 DB 全表最大 id 为序列基准(查询失败降级旧恢复集口径);配单测:全状态行 max(回归形状:已采纳 80/failed 120/running 95 → 120)、空表 0、序列下限不回退与 u64::MAX 饱和 90ba5e19
ChatPage 刷新缺口 ChatPage 新增 active prop(App 注入 page==="chat"):切回重同步任务列表 + 静态数据(会话/笔记标题映射)10s 时效重拉(AiConversationDock F9 同口径,首激活懒加载——原挂载即拉改);新增 ai:task-update 终态事件常驻订阅(成功/失败判定同 App.tsx toast 口径)→ 重拉列表 + 详情打开时重取(ref 镜像读最新选中);隐藏期完成的任务侧栏即时新增,切回亦兜底重拉 23b349a3
标题按 target_kind 分发 entityLabel 新增 taskRefKind/taskRefLabel(单一来源:refine 按 target_kind 分流、enrich 恒笔记级、NULL 旧数据 session 兜底——与 TaskConversationView 跳转分发同口径);ChatSidebar/ChatPage/AiConversationDock 三处标题解析改走纯函数(笔记级精修原错查会话标题表)+ 单测 23b349a3
AiTaskPanel 采纳链 refine 采纳按 target_kind 分发:note → ai_note_refine_apply(noteId,笔记现有版本加 ai-refine 版本),session/NULL → ai_refine_apply(sessionId 建基线笔记)——原恒传 sessionId 使笔记级任务误入会话链报「会话不存在」 23b349a3
AI 任务段语义说明 ChatSidebar「🤖 AI 任务」段加说明文案(条目=精修/补充任务轨迹、来源会话或笔记、非 💬 聊天会话、结果可采纳)+ 段头 tooltip——最小改动不加组件 23b349a3
测试与回归 Rust:cargo test --test app_lib_tests(db_ai_tasks 组 11/11 通过);前端:entityLabel.test 新增 taskRefKind/taskRefLabel 两组用例,全量 vitest 581/581、tsc 0 错误;全量 Rust 2255 通过 + 1 环境抖动(ffmpeg 10s cmd 超时,隔离重跑通过) 90ba5e19 + 23b349a3

环境注记:本机 cargo test --lib 不可用为仓库已知(隐式 lib test 目标无 build.rs comctl32 v6 manifest,加载 system32 comctl32 5.82 报 0xc0000139——Cargo.toml 注释有载);统一走显式 [[test]] app_lib_tests 目标。

开放项滚动:批 1 之外的其余审查项(采集/暂停/笔记域/会话页等)待后续批;精修任务重试在笔记级(ai_note_refine 失败重试入口)与任务面板的闭环一致性可后续核对。


v0.20.7 交付记录(批 2:采集暂停核心,2026-09-09 完成)

状态:用户 11 项问题 1/2/3 全部交付(REQ-308/309/310 → 需求池已备注);范围 = 采集暂停域(来源状态机/漏边沿补偿/前台自动暂停/前端单一状态源);架构决策见 ADR-031,设计见 2026-09-09 spec([ ] 已归档)。 缺陷根因回顾:暂停只置共享布尔、事件与引擎 reset 全在主循环 500ms 轮询边沿(flush 内同步 SenseVoice 整句重打分有界 3s/句)→ 延迟数秒;暂停-恢复落入轮询间隙 → 边沿不可见、引擎不 reset、无事件记录;恢复侧无边界切断 → 链式合并跨暂停;媒体/手动双轨事件 + 前端多窗口自维护状态 → 切页/事件丢失后 UI 回退。

变更 内容 提交
暂停来源状态机 新 pause_state.rs:PauseSource(manual/media/foreground,kebab serde)+ manual 锁存/auto 条件互不解除/解除瞬间重评估 真值表 + PauseShared{paused,total_paused_ms,seq,edge 槽,reason} request 单写入点;audio_loopback SessionPause 换装(re-export 别名保留)并做物理暂停区间实测记账(快速往返静默语义文档化);12 例单测 ea33da20
暂停边沿收敛与漏边沿补偿 streaming_asr flush_no_rescore()(跳过 SenseVoice,标点 fallback 保留;停止路径重打分不变)+ reset() 注释失真修正;persist flush 参数化 rescore:bool;暂停边沿块迁出至新 live_session_pause.rs(纯函数 plan_edge_observation:delta 0/1/2/更大、own_pending 吸收防伪合成、每次至多合成一对、恢复时刻 clamp 保 DB 单调;13 例单测);DB Pause/Resume 载荷 {source}、live:paused/resumed 载荷 {reason};manager 改 request(Manual)+paused_reason();LiveSessionStatus.paused_reason a7fa886e
前台离开自动暂停 新 foreground_pause.rs:anchor_eligible(hwnd 锚定 + ocr_enabled)+ ForegroundGate 250ms×2 滞回(先例 fa1647aa);windows.rs is_self_hwnd(GetAncestor(GA_ROOT) 进程比对,自窗中性防误停);frame.rs auto_paused 删除、全部直写点收敛 request(Media)、前台采样 250ms 节拍;6 例单测 8933167d
前端单一状态源(reducer+provider) types/live.ts PauseSource/PauseChangeEvent/pausedReason + liveCaptureState 纯 reducer(守卫错分类/三态文案/看门狗判定;16 例单测)+ useLiveCaptureControl provider(挂载拉取含 reason + 事件 + 5s 看门狗 + 守卫错自愈 + pending/notice 辅助态;live:error 保 starting 即时退出) b2a5d900
三窗接入与 reason 文案 App 拆 App()/MainShell()、主窗与 float 分支各包一层 provider、徽标 context 化三态文案(删 6 个重复监听);ClassroomPage 779→724(删双状态/双监听/双看门狗,四动作接 hook,auto 暂停禁用+title 提示);CaptureFloatPanel reason 单一来源+pending;LiveActivityPanel 删自订阅;useLiveSessionEvents 暂停职责剥离;grep 收口:live:paused/resumed 订阅仅剩 provider、media-* 全仓零订阅;顺带修复刷新后徽标空白旧债 3c4867fd

环境注记:批 2a 每提交树隔离 worktree 下 cargo check 通过;HEAD 全量 cargo test --test app_lib_tests 2287 通过 / 0 失败 / 6 ignored(未与 vitest 并行);前端全量 vitest 597/597、tsc --noEmit 0 错误;新文件行数审查纠偏(2026-09-09):pause_state 336 / live_session_pause 317→353(审查修复轮 1 后)/ foreground_pause 227 / useLiveCaptureControl.tsx 298——前两者超 300 按 300-600 档登记豁免表(原 ≤300 口径失真)。

偏差登记(实施备案):① b2a5d900 单提交含 JSX-in-.ts 语法缺陷(无消费方、不影响他文件),3c4867fd 以 git mv→.tsx 修复,历史保留未改写(AGENTS 禁 force push);② useLiveSessionEvents/LiveActivityPanel 采「完全移除暂停职责」强于设计稿 reason 化(防双轨更彻底);③ context 增补 pending/notice 两个 UI 辅助态;④ 课堂卡长文案 vs 徽标/浮窗/右栏三短文案的分层;⑤ 手动暂停期 auto 条件到达只记不动作、手动解除瞬间机器化重评估(800-807 兜底保留)。

真机验收清单(登记):三窗暂停态一致性 / media 随播随停文案与自动继续 / foreground 切走-切回自动暂停-恢复 / 快速连点无红错终态=最后动作 / reason 切换 manual 持锁 / 刷新后状态还原(徽标不再空白)/ 停止路径浮窗关闭与融合卡 / start 未确认 20s 收口文案。

开放项滚动:前台判定阈值需真机标定(alt-tab 快速往返/置顶弹窗);双屏「并排看+写」若误停频繁可加可见性门控选项(待用户裁决);live:media-paused/resumed Rust 侧仍发但前端零订阅——清理候选;用户 11 项问题 4~11(会话页交互/复习页/排序置顶/空组清理/滚动留白/精修差异/选中右键)待批 3 起交付。


v0.20.8 交付记录(批 3:笔记滚动留白 + 精修差异化显示,2026-09-09 完成)

状态:用户 11 项问题 9/11 交付(REQ-311/312 → 需求池已备注);范围 = 笔记阅读/编辑三滚动面底部留白 + RefineWorkbench 行级染色与差异视图;其余问题(4~8、10)待批 4 起。

变更 内容 提交
统一底部留白 新增 utils/contentBreather.ts:BOTTOM_BREATHER_CSS = max(96px, 33vh)(注释 Why/边界);阅读容器(NoteReadingView :243)、CM 主题(RichEditorView .cm-content)、textarea 降级(NoteEditView)三面同源消费;滚动锚点/布局/渲染语义零改动 f0f1f501
diff_markdown_ops 薄命令 commands_notes_version 新增整篇有序行级 diff 流命令(复用 note_diff::diff_markdown/diff_stats 纯函数;camelCase 响应 + kebab 外部标签契约);3 例 AAA 单测(有序流顺序/空侧全量标记/serde 契约);lib.rs 注册;无 DB/存储改动 e1cbb3fd
工作台行级染色 + 差异视图 新 utils/refineDiff.ts(94 行纯工具:ops 按栏流序对齐/md 行级渲染/并排与单列三态,配色参照 VersionPanel:added #047857/#ecfdf5、removed #b91c1c/#fef2f2 删除线、unchanged #6b7280);RefineWorkbench(402→471):会话级/笔记级/只读三入口统一对实际展示两版文本调 diff_markdown_ops(不采用 taskResult.diff——基线含锚点草稿会与剥离锚点展示文本错位,注释 Why);左栏 removed 删除线红、右栏 added 绿;顶栏「并排/差异」切换(差异模式单列 ± 前缀、无徽标);底部按钮与采纳存储路径零改动;取数失败降级不染色 24522161
测试与回归 Rust 全量隔离 2290 通过/0 失败/6 ignored;前端全量 vitest 612/612(refineDiff 12 例 + RefineWorkbench 3 例);tsc 0 错误 f0f1f501 + e1cbb3fd + 24522161

偏差登记:① RefineWorkbench 471 行、RichEditorView 322 行为预存超限未登记债务(line-limit-exemptions.md 无记录,本批渲染内核外移 utils 控制增长,登记纠偏窗口);② 差异单列模式不带章节徽标(徽标依赖 refine 侧标题匹配插入,单列混排歧义),以三态色+±前缀+顶栏图例替代;③ 行级渲染为流划分逐行对齐,若未来改块级组合渲染需回落不染色(refineDiff.ts 头注释边界)。

真机走查建议(登记):长笔记三滚动面滚到底末行停靠距底约 1/3 视区(呼吸感);大纲/搜索锚点跳转不受影响;真实精修任务双栏染色、差异单列切换、含图片/表格/重复文本行会话的错配检查;笔记级与版本时间线只读对比两入口同口径;差异模式底部按钮行为与并排一致。

开放项滚动:用户 11 项问题 4(会话页交互矩阵)、5(AI 会话——已批 1 修数据层)、6(复习页独立)、7(排序置顶)、8(空组清理)、10(选中右键菜单)待批 4 起;行数豁免登记债(RefineWorkbench/RichEditorView 等)并入批量纠偏窗口。


v0.20.9 交付记录(批 4:会话页交互矩阵,2026-09-09 完成)

状态:用户 11 项问题 4 交付(REQ-313 → 需求池已备注);范围 = 会话列表选择模式/行右键菜单/行内改名 + 后端原子批量删除;课程分组=标题前缀派生视图非实体——移至组/合并/导出/归档已与用户确认排除。

变更 内容 提交
原子批量删除 新 commands_session_delete.rs:batch_delete_sessions(空 ids/超 200(对齐 LIST_LIMIT_MAX)/非法 id 报错、重复静默去重、deleted>0 才广播 Sessions+Notes 双域);db_sessions delete_sessions_batch(单事务逐条 DELETE,中途 RAISE 整体回滚——与单条 delete_session 全等:子表 FK 级联 + notes.session_id SET NULL 均由 PRAGMA foreign_keys=ON 负责);5 例单测(RAISE 触发器模拟中途失败回滚、四子表级联+笔记 SET NULL、与批量转笔记共存、空参/去重/宽容计数);types.rs BatchSessionDeleteResult 4b1f6933
选择模式/右键菜单/行内改名 SessionListPanel 重写:去 checkbox 列 → 工具栏「选择」+模式 chip、单击勾选(✓ 前缀+靛蓝,SessionListRow 新组件)、Ctrl/⌘ 加减、Shift 区间(可见行序锚定)、Esc 三级退出、列表变化自动裁剪选集;批量栏保留(批量转笔记/批量删除/取消+三态全选口径不变);新 SessionRowContextMenu(透明背板+ESC+坐标钳制+危险删除红字:打开详情/重命名/复制标题/转笔记(可转化才显)/删除);行内改名(Enter/Esc/失焦、自动聚焦全选、空标题或未变放弃、titleEcho 桥接分组态刷新空窗、busy 双保险防连点);SessionsPage 批量删除改调原子命令+成功清选集,改名打开中详情重拉 3dfc12d1 + df4866c7
测试与回归 Rust:delete 组 5/5 + commands_session 14/14 + db_sessions 15/15 无回退;前端全量 vitest 612/612(0 回退)、tsc 0 错误 4b1f6933 + 3dfc12d1

偏差登记:① 前端功能交织于同批文件,拆 4 个提交会产生不可编译中间态 → 合并为一个完整前端提交 + 一个防连点 fix;② 右键删除走单条动线(与详情页同 confirm)、批量删除走新命令(用户口径:右键无批菜单需求);③ 批量上限 200(对齐列表上限而非转笔记的 50——原子拒绝即全不删);④ 未发现单条 delete_session 的 notes 处理缺口(FK 负责,批量逐条同语句等价);⑤ 分组视图 groups 为快照不随总线刷新(既有架构),行内改名后分组态标题靠 titleEcho 即时显示,课程归属变化需重开关分组归位(既有口径)。

真机走查建议(登记):右键菜单五项与越界钳制;选择模式三通道(选择按钮/单击勾选/Ctrl 加减/Shift 区间/Esc 退出、退出后单击回详情);批量删除确认与 toast;行内改名(Enter/Esc/失焦、空标题放弃、web 会话改名);详情 ✎ 回归;批量转笔记与全选三态回归。

开放项滚动:用户 11 项问题 6(复习页独立)、7(排序置顶)、8(空组清理)、10(选中右键菜单)待批 5 起。


v0.20.10 交付记录(批 5:复习功能独立为顶层页,2026-09-09 完成)

状态:用户 11 项问题 6 交付(REQ-314 → 需求池已备注);范围 = 复习域页独立——新增第 9 个顶层 Tab「🔄 复习」(ReviewSessionOverlay 全页化 + 组过滤 + 到期数,spec §9 二期预留兑现)+ 笔记域入口深链化;无被动提醒裁决沿用行动域(组侧栏「🎴 复习 N」按钮与徽标移除,到期感知仅顶层 Tab 自身)。 关联:2026-09-09 复习域页设计 spec([ ] 已归档)(落档)· 行动域页 spec §9(二期预留方向)· v0.20.9 开放项滚动 · ADR-018/TD-004 先例

变更 内容 提交
会话组件全页化 ReviewSessionOverlay.tsx → components/review/ReviewSessionPanel.tsx(git mv 保历史):去 fixed/inset:0 遮罩与居中卡片,渲染为页面主体区(头部工具行 + 可滚内容列 maxWidth 640);front→reveal→四档评分流程语义、ESC 退出保护、PromoteCardButton(model 卡)不变;一轮上限 50→200(镜像后端 DUE_LIST_LIMIT_MAX=200——独立页打开即练,50 太小);完成/空队列收尾新增「✓ 回到总览」出口 f702d876
新 pages/ReviewPage 总览态头部:标题 + 全量到期数 + 「▶ 开始复习」+ 组过滤器 chips(全部(N)+ 到期>0 各组(N),按到期数降序);会话态=按所选范围挂载面板(「开始」语义=挂载即开一轮);空态引导两分支(全局无到期=卡源说明文案含 ⓘ「⚙ 生成闪卡」指引,不设页内生成按钮——无组上下文语义不清,开放项登记;本组无到期但别组有=引导换范围);纯归约抽 utils/reviewStats.ts(dueGroupRows/scopeDueCount/scopeLabel) f702d876
导航与深链 App.tsx Page 联合 + NAV_ITEMS 第 9 项「🔄 复习」(行动之后;顶层 Tab=9 触发 spec §9 收纳观察项——只登记不做收纳)+ focusReviewGroupId 跨页深链 state(保活挂载 div + active prop 透传) f702d876
笔记域拆件 NotesPage 删 review state/Overlay 宿主与 import(575→571 行),ⓘ「复习本组」经 onOpenReview 透传 App 转页组预选;GroupSidebar 删「🎴 复习 N」按钮与 dueTotal 拉取(455→444 行);RouteInfoPopover 按钮语义=深链回调(弹层其余功能零改动);count_due_cards 命令保留不删(API 面不缩小,行动域先例) f702d876
测试与回归 新增 ReviewPage 8 例(chips 到期数/范围开始挂载/会话退出重载/空态两分支/active 门控/深链消费与同组重触发/深链打断会话)、ReviewSessionPanel 4 例(front→back→四档推进→完成收尾/空队列防御/ESC 与退出)、reviewStats 4 例;GroupSidebar 测试清 count_due_cards mock + 入口唯一化护栏(无「🎴 复习」且不拉到期数、ⓘ 深链回调断言);RouteInfoPopover 深链断言 +1;全量 vitest 612→630、tsc 0 错;Rust 零改动——cargo test --test app_lib_tests -- flashcard scheduler 19/19 子集回归确认无涉 f702d876

偏差登记(实施备案):① 任务书建议 3 代码提交——遵循 b78ddae7 行动域先例合并为单代码提交(git mv + NotesPage 引用同步失效 + 接线原子不可拆,拆开即不可编译中间态);② 组过滤器 chips 只列到期>0 的组(到期 0 组不可作范围起点——避免死按钮;ⓘ 深链仍可达 0 到期组并显示范围空态引导);③ feed 地形组(碎片升卡落组)到期卡计入「全部」与逐组 chip(list_note_groups 原样呈现,未做笔记侧 feedCapture 开关过滤——复习面不过滤原料组开关,与旧全量 Overlay 口径一致);④ 会话中途切走 Tab 会话保活续练(display:none 保活红利)——与旧模态阻塞语义不同,登记为行为演进;深链到达时会话进行中=先退出会话(新意图优先,模态时代不可能并发两场复习);⑤ ReviewPage 逐组 count_due_cards 循环(无批量命令——既有命令面最小实现,组数数十级 Promise.all 并行可接受,未加 Rust 命令)。

真机走查建议(登记):9 Tab 渲染与 nav 宽度(13px 字号);复习页打开即见到期总数与各组 chips;切组过滤→开始复习按钮范围数字变化→全量/单组两路会话(出卡顺序=到期先后);卡片回忆→答案→四档评分→下一张推进;评完末张→完成收尾→回到总览→到期数已减;ⓘ「复习本组」深链(跳复习页且该组预选;同组重复深链两次均生效);组侧栏确认无「🎴 复习」按钮、导航无到期徽标(无被动提醒回归);会话中切走再切回=会话与统计状态保活且统计重载;全零到期空态文案与生成指引;ESC 退出本轮。

开放项滚动:顶层 Tab=9——spec §9 导航分组收纳观察启动(本批只登记不做收纳设计);复习页内一键生成闪卡入口(现指引到组 ⓘ「⚙ 生成闪卡」,如需页内入口需裁决组上下文形态);feed 组 chip 口径真机观察;会话中切走保活语义真机确认(与旧模态差异已登记);用户 11 项问题 7(排序置顶)、8(空组清理)、10(选中右键菜单)待后续批。


v0.20.11 交付记录(批 6:笔记与笔记组排序/置顶,2026-09-09 完成)

状态:用户 11 项问题 7 交付(REQ-315 → 需求池已备注);范围 = 组排序/置顶(note_groups.pin + note_group_orders 分区快照 + 组行右键菜单 + 分区「手排 ↺」复位 + 📌 行标记)+ 笔记显式上移/下移(补"必须拖一次"发现性缺口)+ 树视图置顶生效(gap③)+「固定→置顶」措辞统一(REQ-287 记录在案)。 关联:REQ-287(note_orders 独立表/快照基建原样扩展至组)· REQ-314(批 5)开放项滚动 · v0.20.10 交付记录

变更 内容 提交
后端排序域 db_migrations:note_groups.pin(NOT NULL DEFAULT 0,ensure_column 幂等)+ note_group_orders(group_id 主键、FK ON DELETE CASCADE——组即排序 scope 本体,删除即消亡,无笔记式跨 scope 复用故用级联而非 purge);types.rs NoteGroup.pin(serde default);db_note_groups:GROUP_COLUMNS 列序扩展(行映射索引同步)+ create 默认 0 + override_group_route 改显式事务(kind 变更=换分区——同事务清旧分区 seq 行,边界注释);新 db_note_group_orders.rs(104 行):pin 更新(updated_at 同步刷新=置顶区按时间定序动因)/load/save(分区快照先删后插,空 ids=分区回自动)/clear(单组回自动)/verify(归属+pin=0 守卫)+ 新 commands_group_orders.rs(107 行):update_note_group_pin / note_group_order_list / note_group_order_save / note_group_order_clear(kind 白名单/2000 上限/重复拒绝/归属校验/NoteGroups 域广播);lib.rs 注册;db 层单测 10 例(空表幂等/跨 kind 隔离快照覆盖/空 ids 复位/置顶与跨 kind 拒绝/删组级联/改判清行/pin 往返) 2c20d435
排序纯函数 + 笔记侧 新 utils/orderBuckets.ts(82 行核心三桶:置顶区 pin=1 按时间降序 → 手动 seq → 自动按时间降序;桶内稳定排序=并列保持输入序零摆动;shift/drop 原语)+ groupOrder.ts(49 行组包装)+ noteOrder.ts(43 行笔记包装)+ 20 例单测;NoteListView:scope 展示序替换 applyManual(树/未分组 pin 生效、手排组内 pin 也生效)、组头排序行装载(note_group_order_list + orderGroups 同侧栏规则)、右键上移/下移(自动组首移=可见序快照转手排,置顶/边界禁用)、拖拽落点重写(底序=置顶区外子序列;落置顶行=置顶区下沿;与既有序一致跳过保存;仅置顶拖拽不造快照)、moveToGroup 追加只写未置顶成员;NoteRowContextMenu:置顶/取消置顶措辞 + ↑↓ 上移/下移(树上下文才渲染)+ 置顶移动禁用提示;下拉「固定优先→置顶优先」;NoteReadingView/NotesPage 文案统一;前端用例 +14 5b61400f
组侧 UI 新 GroupRowContextMenu.tsx(131 行:置顶/取消置顶、上移、下移、回自动排序[仅该组有手动位时显]、打开信息——右键由直开 ⓘ 弹层改为操作菜单,ⓘ 按钮与弹层入口保留)+ 新 hooks/useGroupOrders.ts(123 行:序行装载+三操作+菜单可用性,纯函数在 utils 配单测,hook 只接线);GroupSidebar:分区行/过滤平铺改 orderGroups 渲染、分区头「手排 ↺」徽标(有手动位才显;点击=空快照整分区回自动)、右键菜单态与「打开信息」锚点合成、菜单动作经 useGroupOrders 落库(成功 onChanged 全量刷新);GroupSidebarRow 📌 置顶标记(行内最小视觉);GroupSidebar.test +7 例(菜单/置顶调用/移动快照/徽标复位/回自动/无徽标与 ESC) a7904585
测试与回归 Rust 全量隔离 2305 通过/0 失败/6 ignored(批 6 新增 10 例;未与 vitest 并行);前端全量 vitest 666/666(630 → +36:orderBuckets 9 + groupOrder 5 + noteOrder 6 + ctx 菜单 3 + 树视图 5 + 侧栏 7 + 文案 1);tsc --noEmit 0 错误;cargo clippy 无新增告警(新文件零告警) 2c20d435 + 5b61400f + a7904585

偏差登记(实施备案):① clear 授权口径=单组(group_id);分区整体回自动经 note_group_order_save(kind, []) 空快照表达(未另开命令——快照通道显式化,两入口均有 UI:菜单「回自动排序」/分区头「手排 ↺」);② LRU「最近使用自动置顶只作用于自动区」取最小一致改法:排序函数不含 recency 浮顶(现状 recency 从不重排分区内组序——置顶/手排组天然不被顶走),「最近使用」区保持快捷层原语义;规则与取舍注释在 orderBuckets.ts 文件头;③ 置顶项(笔记与组)上移/下移=禁用+title 提示(授权语义退路项,代价最小且可测:置顶区按更新时间定序,取消置顶后可移动);拖拽落置顶行=置顶区下沿插入;④ 三面共用排序规则的分区边界:组侧栏=精确 kind 分区调用;树组头/过滤平铺=跨 kind 单遍调用(seq 撞值稳定回落输入序);平铺 updated-desc 模式不置顶=排序模式语义保留(后端「置顶优先」消费面不变),树=置顶恒顶;其他组列表(复习页 chips/聊天页下拉)保留各自排序口径(到期数/最近),未接入——登记观察项;⑤ 快照只写「置顶区外」成员:存量手排行中的置顶 id 在下次整表覆写时清出(置顶区由 pin 列表达);封存(#树洞)隐藏笔记不在可见集,下次快照会清其旧手动位(REQ-287 快照=可见集覆写的既有边界,登记不修,恢复可见后回自动区尾部);⑥ 桶内稳定排序(同刻/同 seq 并列保持输入序)替代 id 决胜——树/平铺输入序来自后端时间序,稳定排序零额外摆动(纯函数注释 Why);⑦ 命令广播无可达性测试基建(AppHandle 不在命令测试面——与 note_orders 先例同),广播=结构式同款(成功落库后 emit NoteGroups),语义由 db 层 10 例 + 纯函数层 20 例覆盖。

真机走查建议(登记):组行右键菜单五项(置顶↔取消置顶、上移/下移边界与置顶禁用灰态+提示、回自动仅手动位组出现、打开信息弹层);分区头「手排 ↺」出现与一键复位(行序回时间序);LRU 与置顶共存(反复访问置顶/手排组不改变分区内位置;最近区照常显示);侧栏/树组头 📌 标记与置顶组段最前;树视图置顶区(各组内与未分组区——此前置顶仅平铺「置顶优先」生效);自动排序组内笔记右键下移→手排徽标出现且刷新后位置保持;置顶笔记右键=取消置顶+移动禁用提示;跨页刷新/重启后组置顶与手排保持;改判组类别(ⓘ)后该组落入新分区自动区(旧序位清零);全仓措辞 grep「固定」仅剩布局/窗口置顶等非笔记语义(置顶优先/取消置顶/置顶操作失败)。

开放项滚动:用户 11 项问题 8(空组清理——组删除语义批 6 未动)、10(选中右键菜单)待后续批;「其他组列表」组序消费面(复习页 chips 到期数序/聊天页下拉)真机观察是否需接排序规则;组侧栏「最近使用」区与置顶区的重复呈现密度观察。



v0.20.12 交付记录(批 7:笔记组空组自动清理,2026-09-09 完成)

状态:用户 11 项问题 8 交付(REQ-316 → 需求池已备注);范围 = 仅自动路由空组自动删除——路由产物组(source route/series 且 route_overridden=0)在本批写操作事务内被清空时,同事务判定五类残留(笔记/碎片/闪卡/结算/周契约)全零后复用既有删除语义删组;结果契约回传 autoCleanedGroups → 前端 toast「已自动清理空组:X、Y」留痕。 关联:REQ-315(批 6)开放项滚动 · REQ-294 哲学边界(备注见需求池 REQ-316 行)· v0.20.11 交付记录

变更 内容 提交
后端清理域 新 db_note_group_clean.rs(130 行):谓词单点=source IN ('route','series') AND route_overridden=0(manual 手动建组天然不在白名单、改判=用户接管永不自动删)+ 残留计数单点 group_residue(五类,与 get_group_delete_impact 同口径——影响面函数改接本函数,防两处 SQL 漂移)+ 行删除语义单点 delete_group_row(knowledge_links 两类引用先清再删行——手动 delete_group 与自动清理共用同一实现)+ auto_clean_empty_groups(conn, affected)(只对本次写操作影响到的组判定,无独立定时/全表清扫;同一事务内检查与删除原子);db_note_groups.rs 改接(delete_group 委托行删函数、group_delete_impact 五项复用 group_residue 只补 system_refs 反查);lib.rs 注册 190cb3c7
写路径收敛 五个「会使组变空」的写方法全部改显式事务并在提交前对源组调用自动清理:db_notes delete_note(先读旧组再删)与 update_note_group(移组源组);db_fragments delete_fragment / update_fragment_group / promote_fragment_to_note(碎片源组,笔记落回同组=组非空天然挡住)——返回结果契约扩展(NoteDeleteOutcome/NoteMoveOutcome/FragmentDeleteOutcome/FragmentGroupMoveOutcome/PromoteNoteOutcome 含 auto_cleaned);残留闸含组内闪卡:删碎片但卡保留的既有语义天然挡住组清理 190cb3c7
命令契约与广播 delete_note/move_note_to_group/delete_fragment/update_fragment_group/promote_fragment_to_note 返回结果契约扩展 autoCleanedGroups(组标题数组;无清理=空数组零变化);组域广播纪律:delete_note 清理发生才补发 NoteGroups(原无组域广播——防漏发)、碎片两命令清理发生才发(零变化不发)、move/promote 走既有 NoteGroups 通道无双发(清理在数据层事务内,广播仍单点) 190cb3c7
前端留痕 types/notes.ts 同步五结果契约;新 hooks/useTransientToast.tsx(72 行自绘 toast——批 4 会话页 toast 模式复用件)+ utils/groupClean.ts(autoCleanNotice 纯函数:空/null→null 零变化、多组「、」连接)+ 单测 4 例;调用方接线(无清理零变化):NotesPage 单删/批量删(批量逐条触发、聚合去重单次 toast)自绘 toast 呈现,NoteListView(批量移/拖拽跨组移/行右键移组)、NoteMoveToGroupMenu(阅读头移组)、GroupSidebar(拖拽归组)、RouteInfoPopover(移入/移出选中笔记)、FeedFragmentList(删碎片/升笔记)经可选 onCleanNotice 上抛 NotesPage 统一 toast;NotesPage 599 行(600 硬限内压线) 589b87ff
测试与回归 Rust 新增 16 例全绿(判定表:自动/系列/手动/改判/五类残留逐类挡/影响面外不碰/note_group_orders 级联卫生 + 写路径集成:删末篇/移走/删末碎片/移走碎片/升笔记跨组清源组/手动组与卡残留护栏);受触模块回归 65 例 + 既有全量隔离一次报告通过;前端 vitest 相关 46 例 + 全量一次报告、tsc 0 错误 190cb3c7 + 589b87ff

谓词与边界说明(复核口径):①「自动路由组」判定落在 note_groups 组行自身——source(route=结构密度路由/series=系列检测,两 create 点均在自动产物路径,note_group_assign/commands_fragments 可证)+ route_overridden=0(override_group_route 置 1=修改即记忆);单表可判,无近似、无跨表近似需求。②「空」=五类残留全零(与手动删除影响面同口径;knowledge_links 体系引用不算残留——删除语义本就清理引用,空组不可能有卡侧引用、组直引随删组清,与手动删组行为一致)。③ 清理发生在「使组变空的写操作」事务内——不存在独立定时/全表清扫任务(用户口径外不扩大);影响面=该次写操作读出的源组 id,helper 只判传入组。④ create_topic_group 复用既有自动主题组的场景(用户"创建"落回 source=route 空组)→ 该组仍属自动路由产物、下次变空会被清理——语义自洽(空组无用户投资;find_topic_group 复用键仍在,下次路由/建组自动重建),登记不改。⑤ 并发边界:连接 Mutex 串行 + 残留检查与删组同事务,无"检查后被并发写入"窗口;两并发写同时清空同组 → 后到者删组 affected=0 幂等跳过,无双重删除/报错。

偏差登记(实施备案):① 空组自动清理为删除语义(不留回收站)——与全 app 无软删先例一致(用户口径确认);② 命令层广播无可达性测试基建(AppHandle 不在命令测试面——与批 6 note_orders 先例同):广播=条件单行 emit,语义由 db 层写路径集成测试覆盖(删除即清、手动组/残留组不碰、无双发结构可审);③ 批量删 toast 观感=逐条 invoke 后端逐条触发清理,前端聚合去重后一批一次 toast(单条删除即时 toast);④ db_notes/db_fragments 写方法 from with_conn 改显式事务(既有 delete_group/override 同款先例)——删除+清理原子,杜绝"删除已提交但空组残留"半态。

真机走查建议(登记):自动路由组删最后一篇笔记 → toast「已自动清理空组:X」且组从侧栏即时消失;手动建空组不删(仍在侧栏);移走最后一篇笔记(菜单/拖拽/移出组)→ 源组清理 toast;有闪卡/结算/周契约残留的组删空内容后不删(组仍在);碎片收件箱删/升走 feed 空组(⚡ feed 分区不再堆 0 空组);批量删多组笔记观感(一批一次 toast);刷新/重启后无空组复活(清理已落库);置顶/手排过的自动空组删除后其序行无残留(重启侧栏无幽灵位)。

开放项滚动:用户 11 项问题 10(选中右键菜单)待后续批;「其他组列表」组序消费面(复习页 chips/聊天页下拉)真机观察继续登记;本批未覆盖理论路径(无卡删除命令/契约仅 upsert——无使组变空的独立路径,登记不改);结算归档(status 翻转不删行)+ 会话删除(notes SET NULL 不删笔记)经代码核实无空组风险,不硬接。

v0.20.13 交付记录(批 8:笔记选中文字右键菜单与行动联动,2026-09-09 完成)

状态:用户 11 项问题 10 交付(REQ-317 → 需求池已备注;11 项问题至此全部收口);范围 = 阅读/编辑两态选区感知右键菜单 + 首批授权动作接线(复制/全选/以对话处理/加入行动/转为问题/模型卡预填——动作矩阵与推迟理由见下);纯前端批:Rust 零改动。 关联:TD-2026-08-31-A(contenteditable 右键缺口——CM/正文选区面本批落地,状态更新见 2026-09-09 技术债清单)· REQ-274 dock 只读承诺 · REQ-300 question_create 命令面 · REQ-302 模型卡唯一生成链

变更 内容 提交
选区菜单纯逻辑 新 utils/noteSelectionMenu.ts(165 行):模式×动作矩阵构造(阅读 4 项/编辑 5 项,加入行动仅编辑态)、≤200 单行化截断(空白折叠+…收尾,任务行/问题/excerpt 共用口径)、任务行插入计划(锚定选区结束所在行行尾、整行含尾换行退上一行、空文档/越界防御)、坐标钳制、选区快照判定(锚/焦两端容器内才有效)——配 24 例 AAA 单测;新 utils/clipboardWrite.ts:统一剪贴板写(clipboard API → 隐藏 textarea execCommand 兜底,返回成败)——配 4 例单测 629b1a0b
共享自绘菜单 新 components/note-selection/SelectionActionMenu.tsx:背板(点击/右键即关)+ ESC capture 层拦截(编辑态先于 NotesPage 全局 ESC=退出编辑生效——防误退编辑)+ 坐标钳制 + 滚动/失焦/缩放收起 + 快照预览头 + 复制内联状态行(行菜单范式:复制后保持打开留痕),其余动作先关后委托宿主 629b1a0b
阅读态接线 NoteReadingView:正文容器=纯 Markdown 包装层(data-note-read-body,auxPanels 在容器外——跨容器选区不弹菜单);contextmenu 经 meaningfulSelection 判定(非空+锚焦两端在容器内)才弹;全选=容器全文 Range(selectNodeContents);复制=快照文本(菜单内执行);转问题/模型卡预填上抛 onSelectionAction;空选区维持现状静默 54938356
编辑态接线 RichEditorView:CM domEventHandlers contextmenu(主选区非空且 sliceDoc 非空串才弹;空选区保留现状);复制=打开瞬间 sliceDoc 快照;全选=全 doc 选区 dispatch(等效 CM select-all 命令路径,不引 @codemirror/commands 新依赖);加入行动=选区结束行行尾插 - [ ] ≤200 任务行(view.dispatch → 既有 onChange→自动保存→后端任务索引重扫通道,不 bypass 保存、不新写命令);转问题/模型卡预填上抛 54938356
行动编排与对话框 新 hooks/useNoteSelectionActions.ts(70 行):转问题=复用 REQ-300 question_create 命令面(text ≤200 单行化 + noteId 来源笔记回链 + toast 留痕「已转为问题——到 ✅ 行动 →❓ 问题清单可查看/回答」,幂等闸防连点);模型卡预填态=既有 ModelCardFromNoteDialog + initialExcerpt 一次性挂载预填(≤200 截断);新 components/note-selection/ModelCardDialogSlot.tsx 槽渲染(NotesPage 599 压线拆件);NotesPage 接线(header 🧠 模型卡入口共用 openModelCard("")) 54938356
测试与回归 前端新增 37 例(noteSelectionMenu 24 + clipboardWrite 4 + useNoteSelectionActions 4 + NoteReadingView 2 + RichEditorView 3——真 CM jsdom 全选/右键/插任务行/上抛);全量 vitest 709/709(672 → +37)、tsc --noEmit 0 错误;Rust 零改动(批 5 同口径无需回归) 629b1a0b + 54938356

动作矩阵(模式 × 动作 可用性):

动作 阅读态 编辑态 说明
复制 ✅ ✅ 阅读=DOM 选区快照;编辑=sliceDoc 快照;同一写剪贴板 util(API→execCommand 兜底)
全选 ✅ ✅ 阅读=正文容器全文;编辑=全 doc 选区 dispatch(等效 select-all)
以对话处理 ⛔ 不显 ⛔ 不显 授权退路落地:dock 会话视图 v1 只读、无面板内发送通道(REQ-274 同源承诺/防双实例流控);种子草稿需跨 App→ChatPage→NotesPage >3 组件深改 → 不伪实现,登记 TD-2026-09-09-B
加入行动 ⛔ 隐藏 ✅ V1 仅编辑态:选区结束行行尾插 - [ ] …(≤200);阅读态 DOM↔源码行映射缺失留后续,登记 TD-2026-09-09-C
转为问题 ✅ ✅ 复用 question_create 命令面 + noteId 回链 + toast(与 ❓ 清单「添加」同处理器)
模型卡预填 ✅ ✅ 打开既有 ModelCardFromNoteDialog 并预填 excerpt(≤200;REQ-302 唯一生成链不变)

偏差登记(实施备案):① 以对话处理按授权退路不显菜单项(改动面判据:dock 只读视图加发送通道即违背 REQ-274「在对话页继续」同源设计;ChatPage 草稿种子需 App/ChatPage/NotesPage 三层深改 >3 组件——两点均登记开放项不硬做);② 阅读态加入行动隐藏而非禁用(映射缺失时禁用项点了也没用=伪实现,隐藏+注释更诚实);③ 转为问题=直连 question_create(REQ-300 设计稿「用户改写问句」中间编辑未做——选段即问题 v1 语义,如需改写小表单后续加);④ 编辑态全选以全 doc 选区 dispatch 表达(等效 basicSetup select-all 命令;不新增 @codemirror/commands 直接依赖——依赖纪律);⑤ 菜单 ESC 用 capture+stopPropagation 拦截(NotesPage 全局 ESC=退出编辑监听挂载更早,普通 bubble 顺序会让 ESC 同时关菜单又退编辑);⑥ 阅读态选区快照在菜单打开瞬间捕获(菜单内点击会动焦点/选区——动作不依赖点击瞬间 DOM 选区仍存活);⑦ 真机侧 dock 面板与阅读/编辑菜单并存无 z 冲突(dock z 900/菜单 61/对话框 1000 分级不变)。

真机走查建议(登记):阅读态选中文字右键 → 五项/四项菜单按模式呈现、快照预览头正确、坐标贴边钳制与 ESC/点击外部收起;选中跨 auxPanels(版本时间线)或空选区右键不弹菜单(静默基线);复制(含权限拒绝场景兜底)与全选(正文整段高亮/Ctrl+C 可用);编辑态 Ctrl+A 后右键 → 加入行动在选区结束行后插 - [ ] … 且 2s 自动保存后重进阅读可见任务行、✅ 行动页待办可检索(索引重扫生效);编辑态 ESC 关菜单不误退编辑;阅读/编辑转问题 → toast 且 ❓ 问题清单(✅ 行动页)出现该问题(noteId 回链可查);两态模型卡预填 → 对话框 excerpt 已填 ≤200、创建走组内 model 卡(未归组引导归组行为不变);行级菜单/输入框小菜单/荧光笔弹层回归不受影响。

开放项滚动:TD-2026-09-09-A(NoteListView 超硬限预存债务正式登记)/B(以对话处理种子通道)/C(阅读态加入行动 DOM↔源码行映射)见 2026-09-09 技术债清单;用户 11 项问题 1-11 全部收口(1-3 批 2a/2b、4 批 4、5 批 1、6 批 5、7 批 6、8 批 7、9 批 3、10 批 8、11 批 3);11 项之外观察项(顶层 Tab 收纳/页内生成闪卡入口/「其他组列表」组序消费等)沿既有开放项继续滚动。