⚠️ 本文件是生成物 —— 行数与条目成员关系由node scripts/line-limits.mjs --write生成, 不要手改数字、手加行或手删行(会被node scripts/line-limits.mjs判为违规)。 「豁免理由」「拆分计划」两列由人工维护,生成器按路径保留(唯带(自动摘取,待细化)标记的是生成物、每次重摘);「已拆分 / 登记移除记录」节逐字保留。测量口径(唯一有效):文件全部行数(含空行),等价于
[System.IO.File]::ReadAllLines(path, UTF8).Count。⚠️ 禁用Get-Content数行(本机 PowerShell 5.1 + 码页gb2312会按 GBK 解码、吞换行、少算)与Measure-Object -Line(只数非空行)。规则:≤300 行无需登记;301–600 行须登记;>600 行必须硬拆,不允许豁免。
本表受棘轮守卫保护:只允许减少。每完成一个拆分,从
scripts/line-limits.mjs的FROZEN_OVER_LIMIT删掉对应一行。
| 文件 | 行数 | 说明 | 拆分计划 |
|---|
| 文件 | 行数 | 豁免理由 | 拆分计划 |
|---|---|---|---|
| app/src/App.tsx | 563 | 根装配(页面切换/焦点跨页直达状态机/全局事件监听)+ v0.20.5 行动页 + v0.20.10 批 5 复习页 Tab/深链/保活挂载(f702d876)——登记值 363 过期,实测纠偏 | 若再增长:焦点跨页直达 state 族拆至 useFocusRouting.ts |
| app/src/pages/ChatPage.tsx | 579 | AI 对话页编排;批 1(REQ-306/307)active 门控/终态订阅接线净增——2026-09-09 实测纠偏(登记值 529 过期) | 若再增长:任务工具条与发起流拆至 ChatTasksToolbar.tsx |
| app/src-tauri/src/db_migrations.rs | 573 | v0.20.11 批 6(REQ-315)再增:note_groups.pin ensure_column + note_group_orders 建表(+21,实测 573——登记值 492 过期;schema 单点收敛理由同左) | 若再增长:kb_* 与 chat_* 表 DDL 拆至 db_migrations_kb.rs |
| app/src-tauri/src/lib.rs | 572 | crate 根 322 mod + 15 #[cfg] = 337 行地板(Task 1 评审实测更正:原写「321 mod + 16 #[cfg]」,总数 337 不变;322 含本任务新增的 mod app_commands;);注册清单已移至 app_commands.rs(数据文件,同属 300–600 豁免带)—— 结构性下界,非欠账 |
已完成(批 0-C3 Task 1,2026-09-11);余下 161 行模块理由注释 + 装配逻辑,无进一步拆分标的 |
| app/src/types/knowledge.ts | 559 | 知识体系类型域(体系/节点/概念/模型/引用/审计/决策 + v0.13.8 画布契约 + v0.14.1 画布偏好枚举与下拉文案常量)——类型与文案常量同域防漂移(前端类型域拆分任务待执行) | 若再增长:画布偏好类型与文案拆至 types/canvas.ts |
| app/src-tauri/src/capture/audio_loopback.rs | 558 | ADR-007 重连机制(重试循环/退避/恢复回调)内聚于捕获线程实现,拆出需跨函数传递 COM 生命周期参数,内聚性优先;2026-08 A1 硬暂停(端点 Stop/Start + 暂停时长补偿 + 残留缓冲清空)再增 | 若再增长:将 run_capture_inner 拆至 audio_loopback_session.rs |
| app/src-tauri/src/screen_merge.rs | 548 | v0.7.3(REQ-155/158):屏级聚合纯函数域(聚类/行合并/角色分类/块去重)+ v0.7.5 净化纯函数(单字符/边缘条带/零跨度合并/图去重/包含率)——纯逻辑内聚便于单测 | 若再增长:零跨度合并与图去重拆至 screen_fix.rs |
| app/src/components/action-center/ActionCenterPanel.tsx | 538 | v0.20.5 行动中心独立页化:原 ActionCenterOverlay.tsx(509 行登记)更名迁移至 action-center/ 并去遮罩/关闭形态(refreshToken 切回重载)——编排内聚(TD-2026-09-06-G 预留目录兑现);2026-09-06 实测登记 | 若再增长:队列/历史/SOP 三区拆至 action-center/ 子组件 |
| app/src-tauri/src/commands_knowledge_core.rs | 529 | v0.13.1(REQ-202~205):知识体系命令域(概念/模型/引用/审计——commands 9-18)内聚;源 commands_knowledge.rs(18 命令 + 校验)超限按规格 §四拆,本文件承接后半;commands 薄壳 + inner 纯函数 + @ai-context 注释内聚于命令域 | 若再增长:引用与审计拆至 commands_knowledge_links.rs |
| app/src-tauri/src/live_frame_process.rs | 529 | v0.6.0 ADR-011 拆分产物:帧处理域(网格差异触发/两级判变/带外事件驱动/UI 面板抑制/字幕落库)内聚;process_frame 上下文参数 20+;H2 修复(OCR 热路径切超时变体)+ L2 修复(score 口径诚实化)行数微增 + v0.11.5 Task 2 新颖度变化区域接线再增 | 若再增长:handle_subtitle_frame 与 persist_voted_subtitle 拆至 live_subtitle_persist.rs |
| app/src-tauri/src/asr_merge.rs | 524 | v0.5.0 ADR-012 F4-1 语义合并域 + v0.7.0 M2 REQ-119 混排空格(spacing_for/merge_segments_with_spacing);合并决策与切分共用标点常量 | 若再增长:split_sentences/split_timestamps 拆至 asr_merge_split.rs |
| app/src-tauri/src/commands.rs | 523 | 命令装配域(AppState + 通用命令 + 导入管线编排);登记值 466 过期快照——2026-09-09 实测纠偏(含批 7 delete_note 结果契约 +12;600 硬限内压线) | 若再增长:导入管线命令拆至 commands_import.rs(既有登记计划) |
| app/src-tauri/src/video_profile_tests.rs | 522 | 档案测试域(12 档案断言矩阵 + 检测投票 + JSON 校准 + v0.13.6 领域记忆独立通道/旧 JSON 零迁移用例 + 审查回归(烘焙迁移/单字种子守卫))单模块 #[path] 挂载 | 若再增长:档案矩阵拆至 video_profile_data_tests.rs |
| app/src-tauri/src/engine.rs | 521 | 引擎池句柄与同步 API(双 worker 编排 + ADR-009 设备状态 + M7 心跳/失败/缓存计数 + 有界等待变体);三维复审 #5 超时排空机制(drain_asr/ocr_backlog)与 #3 ASR_FILE_TIMEOUT 文件级超时常量接入后,worker 主循环与请求协议按登记计划拆至 engine_worker.rs(见文末"已拆分"注记)回归本值 | 若再增长:排空机制与同步 API 变体拆至 engine_request.rs |
| app/src/components/GroupSidebar.tsx | 518 | v0.20.12 批 7(REQ-316)拖拽归组/ⓘ 弹层移组清理留痕透传(509→519;登记值过期纠偏) | 若再增长:体系引用拉取与徽标聚合拆至 useGroupSystemLinks.ts hook |
| app/src-tauri/src/ai_client.rs | 505 | v0.11.6 M1(AiClient::from_provider / from_settings_with_store / is_fallbackable / fallback_provider_ids)+ 2026-09-11 DeepSeek V4.1 适配(chat_plain 探活路径 / build_plain_payload / json 前置条件兜底接线 / thinking 策略落点 / 4xx 错误体透出——纯策略与提取逻辑已拆至 ai_request_policy.rs)——Provider 解析与错误分类内聚于 AiClient 域,构造入口与降级链纯函数同文件便于单测。旧登记 322 为过期快照,本次按实测纠偏 | 若再增长:fallback_provider_ids 拆至 ai_fallback.rs;payload 构造族拆至 ai_payload.rs |
| app/src/components/GroupSidebar.test.tsx | 497 | 覆盖串组场景——切换 ⓘ 弹层目标组时表单态必须重置(key=group.id修复):组 A 改了判类(未确认)→ 点组 B ⓘ → 弹层显示 B 且判类下拉回到 B.kind(防把 A 的选择误用到 B——路径: 改判误操作)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/db_sop.rs | 490 | v0.20.3(REQ-296/297)SOP 三表数据域(模板/run/步骤/保鲜/聚合)+ 审查加固(保链更新/幂等守卫/步数计数)内聚 | 若再增长:run 执行族拆至 db_sop_run.rs |
| app/src-tauri/src/live_session_persist.rs | 488 | 定稿落库域(persist_final/digest_merged/handle_final_event)+ P2 flush_tail_and_persist(停止/暂停共用尾句落库)内聚 | 若再增长:flush_tail_and_persist 与 digest_merged 拆至 live_session_persist_tail.rs |
| app/src-tauri/src/db_sessions.rs | 482 | 会话仓储;批 4 delete_sessions_batch + 审查修复轮 3(transaction() 改造)——2026-09-09 实测纠偏(登记值 394 过期) | 若再增长:recent_ocr_texts 等建议查询拆至 db_sessions_queries.rs |
| app/src/components/RefineWorkbench.tsx | 497 | 并排双栏(规则版 + 精修版)+ 章节级 diff 高亮 + 同步滚动 +采纳/重新生成/放弃。批 3(问题11):行级三态染色(removed删除线红/added 绿)与 并排/差异 单列视图切换——数据源为整篇有序行级 diff(diff_markdown_ops,见 load 内 Why)。数据源:非只读带 taskResult(采纳前内存结果)→ refine_workbench回传 result(消除未落库右侧恒空);无 taskResult →refine_workbench(后端兜底未采纳任务/已落库笔记,重启可恢复);只读(VersionPanel)→ ruleMd/refinedMd 透传。批 7 T17:三处阅读面加 [[ts:ms]] 芯片的容器侧事件委托(+13 行;onOpenSessionAt? 由 VersionPanel 注入)。(自动摘取,待细化) |
若再增长:按职责拆分 |
| app/src-tauri/src/app_commands.rs | 479 | 宏约束下的唯一注册点:312 条 generate_handler! 条目是数据不是逻辑(批 1 删除批收口实测:334 → 312,−22;批 6 T22 新增 1 条 session_audio_path ⇒ 313;批 7 T4 撤下 3 条 ⇒ 313 → 310;T19 新增 1 条后为 311;批 8 T27 新增 1 条 session_audio_config_set ⇒ 312;此数由本行人工维护,--write 只刷新数字列) —— Invoke 按值语义使分域组合不可行(见文件头),拆成多份只会在域间新增「命令名 → 域」路由漂移面;一致性由 scripts/check-command-registry.mjs 机器门禁守 |
不拆(数据文件);新增命令时同步条目,由门禁强制 |
| app/src-tauri/src/commands_ai_enrich.rs | 479 | v0.8.0 M3(REQ-142)+ F1/F2/F3:知识补充命令域(九子项校验/预估/异步任务/采纳/撤销 + 配额去重门控 + 成本硬拦截 + 任务落库)——与精修共用任务注册表上下文,命令域内聚;2026-09 修复(章节目录注入/逐块审查回执)微增 | 若再增长:门控/拦截拆至 commands_ai_enrich_gate.rs |
| app/src-tauri/src/region_tracker.rs | 478 | v0.4.0 M2(REQ-037)起:ROI 跟踪状态机(播放区域检测/锁定聚簇/重扫/前台切换冻结)+ 纯函数单测内联;与 RoiTracker 状态强耦合 | 若再增长:lock_roi/prior_roi 纯函数拆至 region_lock.rs |
| app/src-tauri/src/layout_analyzer.rs | 475 | v0.5.0 M3(REQ-047):规则版版面分析(行/列投影 + 表格线检测 + 区域分类启发式)内聚于同一分类管线;审查加固(公式启发 + 低信息纯色方差滤除) | 若再增长:区域分类启发式拆至 layout_classify.rs |
| app/src-tauri/src/commands_session_note.rs | 472 | 既有登记 314 为过期快照——2026-09-06 实测纠偏(v0.20 装载合成/web 分支/批量 inner 扩展后 +144) | 若再增长:convert_to_note 拆至 commands_session_note_convert.rs |
| app/src/components/KnowledgeCanvasView.tsx | 467 | v0.13.8 画布主视图(RF 装配/拖拽防抖保存/视口持久化/自动排列);v0.13.9 根卡 + 接线方向动态化;v0.14.1 布局/连线下拉 + 偏好读写(+72 行)+ 审查修复(布局 effect 原子化拆分建边 effect/prefsLoaded 控件门控/hasCore 统一 +31 行)——RF 状态与持久化编排内聚(元素构建已拆至 canvasElements/layout* 纯函数) | 若再增长:偏好读写与下拉拆至 useCanvasPrefs.ts;位置持久化拆至 useCanvasPositions.ts |
| app/src-tauri/src/streaming_asr.rs | 466 | sherpa-onnx OnlineRecognizer(Zipformer transducer 中英双语流式),流程移植自原项目 streamingAsr.ts(生产调参验证):partial 节流(≥150ms + 文本变化才推)→ 端点断句 → final →重建流;静音块隔块喂入(静音期低 CPU);停止时尾句 flush 去重。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/streaming_asr_tests.rs | 462 | 流式 ASR 测试域(端点处理/静音判定/段切分回归)单模块 #[path] 挂载 | 若再增长:端点处理组拆至 streaming_endpoint_tests.rs |
| app/src-tauri/src/structure_note_tests.rs | 458 | v0.7.6(REQ-177~181):结构渲染层单测域(章节插入位置/命名窗口/词汇表排序上限锚点/零回归护栏/JSON 往返)单模块 #[path] 挂载 | 若再增长:词汇表组拆至 structure_note_glossary_tests.rs |
| app/src-tauri/src/db_note_group_clean_tests.rs | 447 | REQ-316(批 7)测试域:判定表(自动/系列/手动/改判/五类残留/影响面外/级联卫生)+ 写路径集成 16 例,单模块 #[path] 挂载 | 若再增长:写路径集成组拆至 db_note_group_clean_flow_tests.rs |
| app/src/pages/KnowledgePage.tsx | 444 | v0.13.8 画布接线越线(原 296):中栏「画布」标签 + 树/画布双入口 + v0.15 左列/详情列状态迁移(useColumnLayout + 折叠窄条 + 宽度 prop)——页面编排层内聚(数据获取/选中态/标签态为页面本地状态),子组件已全部下沉(Tree/Canvas/DetailPanel/Wizard/ConceptCardRow/Sample) | 若再增长:中栏视图块(树/画布/概念/模型 + 标签栏)拆至 KnowledgeMiddlePane.tsx,SystemCard 拆至 SystemSidebarCard.tsx |
| app/src-tauri/src/commands_session.rs | 471 | v0.6.0 M6 + v0.7.6 审查硬拆后回归:会话命令域(CRUD/质量报告/课程分组/段搜索)内聚;笔记转换管线已拆至 commands_session_note.rs;M2 修复(search_ocr_blocks 传 data_dir 参数);批 8 T28 加「删会话的音频级联清理」接线与 #[path] 子模块声明(+24) |
若再增长:course/search 拆至 commands_session_extra.rs |
| app/src-tauri/src/symbol_normalize.rs | 443 | v0.6.0 M1(REQ-060):口语符号映射域(映射表/上下文守卫/中文数字解析)内聚;数字解析与守卫共享字符判定 | 若再增长:parse_chinese_number/replace_number_runs 拆至 symbol_numbers.rs |
| app/src-tauri/src/commands_goals_plan.rs | 442 | 规划=单次同步调用 + spawn_blocking(10-30s 交互等待可接受,对话框 loading 态);审计完整(ai_tasks op_type='goal_plan',trajectory/成本落库——轨迹可见性达成,任务化轮询留观察项)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/screens.rs | 437 | v0.7.3(REQ-155/156/160):画面要点屏构建编排(分组/聚类/图匹配 IO)+ 可消费块过滤扩展——编排与纯函数分层(纯函数在 screen_merge.rs) | 若再增长:filter_usable_blocks 拆至 screen_filter.rs |
| app/src-tauri/src/commands_knowledge_tests.rs | 435 | v0.13.1(REQ-202~205):知识体系命令层单测域(校验纯函数 + inner 编排 + 四类 target/审计信号聚合)单模块 #[path] 挂载 | 若再增长:引用与审计组拆至 commands_knowledge_links_tests.rs |
| app/src-tauri/src/screens_tests.rs | 433 | 画面要点屏构建测试域(分组/聚类/图匹配/可消费块过滤回归)单模块 #[path] 挂载 | 若再增长:可消费块过滤组拆至 screens_filter_tests.rs |
| app/src-tauri/src/note_filter_golden_tests.rs | 431 | v0.7.5(REQ-172):黄金语料回归域(会话31/29 实证 + 结构渲染 2 例 + 审查补测)单模块 #[path] 挂载 | 若再增长:结构渲染组拆至 note_filter_golden_structure_tests.rs |
| app/src/components/GoalDetail.tsx | 427 | 一致性契约——进度信号每次现算(get_goal_progress),动作后局部刷新;毕业仪式/回顾流属 M2(按钮留壳禁用不误导)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/db_note_groups_tests.rs | 426 | v0.11.0 组数据层测试域 + v0.14.1 删除/影响面用例(级联归零/悬空清理/迁移回归)——单模块 #[path] 挂载(video_profile_tests.rs 同款先例),组删除语义变更集中验证 | 若再增长:删除/影响面组拆至 db_note_groups_delete_tests.rs |
| app/src-tauri/src/analysis.rs | 423 | v0.5.0 M2 起结构化分析编排域(章节/重点/术语/讲者 + 事件消费 + step_boundaries/practice_segments/player_actions 三字段 + 审查修复按类型判定);各机制输出聚合内聚于单一分析函数 | 若再增长:build_chapter_signals 事件版拆至 analysis_signals.rs |
| app/src-tauri/src/app_setup.rs | 419 | 本模块承载 setup 的 AppState 初始化(数据目录/DB/引擎池/可校准配置/内存态存储)与装配期辅助函数(模型路径构造/捆绑同步/ORT运行时目录注入)——lib.rs 只保留声明与 command 注册,职责单一。(自动摘取,待细化)2026-09-13 批 8 T25:移除遗留凭据槽 "default" 的启动迁移读路径(−1 行) | 若再增长:按职责拆分 |
| app/src-tauri/src/bin/asr_eval.rs | 418 | 目的——"无人工语料也能测 ASR"(2026-09-03 用户裁决①):批量样本(wav + 同名 .srt 外挂字幕 = 参考信道 L1 ~100% 无损)→ SenseVoice 离线转写(预处理开/关两路,A/B)→ CER + 混淆画像→ 汇总/A/B 对比/画像 top-N → 相对基线回归门(退出码契约)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/vocab.rs | 416 | 词表域(存储/纠错/候选提取/n-gram 分词)内聚;分词纯逻辑与存储同域便于单测 | 若再增长:collect_tokens/split_runs 拆至 vocab_tokens.rs |
| app/src-tauri/src/ui_junk.rs | 415 | UI 噪声过滤域(水印/字幕条/角标检测规则 + 窗口过滤启发式)内聚于同一判定管线,规则共享窗口几何上下文 | 若再增长:窗口过滤拆至 ui_junk_window.rs |
| app/src/components/NoteEditView.tsx | 412 | v0.13.6(审查 H1 修复):forwardRef 命令式 flushSave 出口(ESC 先保存后刷新)+ flushLatest 最终保存;v0.15 剪贴板图片 paste(useClipboardImagePaste+插入)+ 外链图下载导入——编辑视图保存/快捷键/工具栏/图片入口内聚(textarea 降级路径与 CM 版同步) | 若再增长:工具栏与 MarkdownEdit 快捷键拆至 NoteToolbar.tsx |
| app/src-tauri/src/live_session_loop.rs | 412 | v0.7.0 M0 拆分产物(音频编排循环):主循环 + 长静音/音量骤变/VAD 段事件写入 + drain/停止 flush;LiveSessionCtx 聚合上下文;A1 暂停边沿 + P1 停止 drain 重构;H1 修复(drain_deadline 改 Option,draining 置位时才计算) | 若再增长:事件写入块拆至 live_session_events.rs |
| app/src/components/RichEditorView.tsx | 409 | v0.20.13 批 8(REQ-317)编辑态选区右键菜单接线(CM contextmenu extension + 动作分发,323→399;前置 323 超 300 为 v0.20.8 偏差登记未登记债务,本次实测纠偏并登记)——选区纯逻辑已拆 utils/noteSelectionMenu.ts 与 note-selection/SelectionActionMenu.tsx,本文件仅留宿主接线 | 若再增长:工具栏 action 分派拆至 commands/ 域(既有 toolbarCommands/headingCommand 范式) |
| app/src-tauri/src/commands_live.rs | 487 | 实时采集命令域(启动/停止/档案热切换/剪辑监听);v0.13.6(REQ-220)update_live_profile 细目参数与校验 + 审查轮(clear sentinel 空串语义/fine 计入至少一项)再增 | 若再增长:档案覆写命令拆至 commands_live_profile.rs |
| app/src/components/ProfileDetector.tsx | 448 | 档案检测组件:投票/确认流/记忆偏好 UI + v0.11.5 Task 5 冲突提示内聚 + v0.13.6(REQ-219~222)形态 10 下拉/领域 20 下拉/细目多选 chips/分区映射形态优先 + 审查轮(onProfileChange ref/独立 try/fine_ids 同步,实测 2026-08-24) | 若再增长:确认流与细目 chips 拆至 ProfileConfirmFlow.tsx |
| app/src-tauri/src/live_session_pause_tests.rs | 395 | plan_edge_observation 为纯函数(无 epoch/DB/emit 依赖——会话时刻由调用方以参数传入),可完整离线测真值表;事件对时刻单调性在此验证(DB 插入顺序 = events 顺序,单调即时间轴有序)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/live_session.rs | 394 | 会话装配/状态(LiveSessionParams 聚合 + run_session_after_engine 骨架 + ProfileOverride 细目字段);v0.13.6 +2 | 若再增长:ProfileOverride 与参数分拆至 live_session_params.rs |
| app/src-tauri/src/fusion_tests.rs | 392 | 融合测试域(ADR-005 四规则 + REQ-062 概率加权 + REQ-103 音量透传 + REQ-111 切分对齐)单模块 #[path] 挂载 | 若再增长:REQ-111 切分对齐组拆至 fusion_split_tests.rs |
| app/src-tauri/src/db_fragments.rs | 391 | REQ-316(批 7):delete_fragment/update_fragment_group/promote 同事务空组自动清理接线(登记值 309 过期快照,实测纠偏) | 若再增长:promote_fragment_to_note 事务拆至 db_fragments_promote.rs(既有登记计划兑现) |
| app/src/components/AiProviderSettings.tsx | 391 | v0.11.6 M1 code-review 修复(2026-08-22):删除/清钥加 window.confirm、window.prompt 改卡片内联 password 输入(+2 state + 内联表单)、模型列表 input 改 textarea、fallbackOrder 透传 initial、run 置"处理中"反馈、预设双源 presetOptions 后端拉取——修复净增约 13 行越线(实测 329,含 4 行豁免头注释) | 若再增长:内联密钥表单拆至 AiProviderKeyInput.tsx |
| app/src-tauri/src/import.rs | 385 | 导入域编排(音视频/图片导入流程 + 帧提取调度)内聚;与 import_frame/import_transcribe 分层 | 若再增长:导入参数校验拆至 import_validate.rs |
| app/src-tauri/src/commands_proofread.rs | 383 | v0.20.2(REQ-270)LLM 校对命令域(预估/门控/分块请求/裁决源列表/失败记账)内聚;2026-09-06 实测登记(TD-2026-09-06-G) | 若再增长:record_proofread_failure 与载荷回写拆至 proofread_apply.rs |
| app/src-tauri/src/capture/resample.rs | 381 | 音频重采样域(采样率转换/缓冲对齐/帧切分)内聚于捕获子模块,纯函数与捕获缓冲格式共享上下文 | 若再增长:帧切分拆至 resample_frames.rs |
| app/src-tauri/src/live_session_lifecycle.rs | 376 | 会话启动/预热生命周期 + v0.19.2/3(REQ-273 + 审查即修:锁外等待+枚举化+辅助函数抽取,+78)——start/prepare/release 与等待/回退策略强耦合于 impl 生命周期域 | 若再增长:wait_prepared_ready 与回退策略拆至 live_session_start.rs |
| app/src/components/RouteInfoPopover.tsx | 376 | v0.20.12 批 7(REQ-316)移入/移出选中笔记清理留痕透传(360→375) | 若再增长:简报拉取与渲染拆至 SystemBriefSection.tsx |
| app/src-tauri/src/analysis_tests.rs | 371 | 分析编排测试域(档案门控矩阵 + REQ-108 事件消费 + M2 三字段)单模块 #[path] 挂载 | 若再增长:事件消费组拆至 analysis_events_tests.rs |
| app/src-tauri/src/commands_web_inbox.rs | 371 | v0.20.4(REQ-304)扩展收件命令域(起停/状态/HTTP 小循环/投递收口/图落盘)内聚;2026-09-06 实测登记(TD-2026-09-06-G) | 若再增长:HTTP 连接处理拆至 web_inbox_http.rs |
| app/src-tauri/src/live_keyframes.rs | 370 | ① handle_full_frame:全帧画面要点落库 + 关键帧样本收集与归档存图(三层图结构参考图集数据源);② 停止时关键帧投票(session:keyframes 事件);③ rewrite_with_fusion:融合重写(原属 live_session_frame,REQ-031 无字幕短路)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/windows.rs | 370 | 窗口枚举/评分域 + v0.19.2(REQ-271/272):CaptureWindow.zOrder/systemWindow 字段 + 抖音/快手/B站客户端评分表(+28)——枚举系统副作用与评分纯函数同域便于单测(既有模式) | 若再增长:z 序/系统标记纯函数拆至 windows_meta.rs |
| app/src/components/KnowledgeCanvasView.test.tsx | 368 | @xyflow/react 全 mock(ReactFlow 记录 props 供交互断言;节点组件渲染不测——规格 §六「React Flow 渲染用 e2e 或跳过」)。覆盖:① 首次打开全量未布局 → batch_initialize 全量初始化(辐射位置);② 已存位置 → 跳过初始化且位置来自存储;③ 拖拽防抖保存;④ 节点点击选中联动;⑤ 视口恢复/首次 fitView;⑥ 自动排列覆盖;⑦ 核心问题虚拟节点;⑧ 返回按钮。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src/types/session.ts | 367 | 覆盖会话本体/转写段/OCR 块/画面要点屏、结构图与图内检索、过滤统计与笔记过滤结果(NoteFilterResult)、段搜索命中与 AI 复核。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/commands_fragments.rs | 366 | 碎片命令域 + REQ-316(批 7)结果契约与组域条件广播(登记值缺失为漏登——HEAD 基线已 347,本次补) | 若再增长:碎片组操作命令族拆至 commands_fragments_group.rs |
| app/src-tauri/src/db_notes.rs | 366 | REQ-316(批 7):delete_note/update_note_group 改显式事务 + 同事务空组自动清理接线(结果契约扩展 + 旧组读出,净增 ~60 行;此前 305 未登记属漏登,本次补) | 若再增长:移组/删除事务族拆至 db_notes_group_ops.rs |
| app/src-tauri/src/ocr_cache.rs | 358 | OCR 结果缓存域(内容指纹键/容量淘汰/命中率统计)内聚;缓存策略与指纹算法共享上下文 | 若再增长:指纹算法拆至 ocr_fingerprint.rs |
| app/src-tauri/src/commands_window.rs | 357 | 浮窗窗口命令域(v0.12.3 架构升级计划:全部窗口操作集中单文件)+ v0.12.6(ADR-025)显隐链路与全局快捷键三态切换核心(open/close/locked/topmost/toggle 核心 fn + 命令薄包装 + 状态机/序列化单测内联);拆分需跨 fn 传递 AppHandle/State,内聚性优先 | 若再增长:浮窗核心逻辑拆至 float_core.rs(命令薄包装保留本文件) |
| app/src-tauri/src/db_sessions_tests.rs | 354 | 由 db_sessions.rs 以 #[cfg(test)] #[path] 引入,保持实现文件 ≤300 行(AGENTS.md §3 模块化)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/live_session_pause.rs | 353 | 批 2 暂停边沿收敛域 + 审查修复轮 1(own_pending 吸收/丢采样恢复沿补发)净增——2026-09-09 纠偏实测 353(交付口径 258 失真),300-600 档登记 | 若再增长:合成事件对构造拆至 live_session_pause_synth.rs |
| app/src-tauri/src/ai_client_tests.rs | 352 | ai_client.rs 单测域(22 例:payload 构造族 build_chat_payload/build_plain_payload、JSON 前置条件提示、chat_completions_url 拼接、响应提取与弱化解析、fallback_provider_ids;env 变量以静态 Mutex 串行化,不触网)——测试模块由 #[cfg(test)] #[path] 单点挂载(ai_client.rs:504),纯函数用例与实现同域便于契约对齐。本条目由生成器补登(该文件无 @ai-context 头注释),理由为 2026-09-11 重建时人工补写 |
若再增长:payload 构造组拆至 ai_client_payload_tests.rs |
| app/src/components/NoteLinkToSystem.tsx | 352 | v0.19.7(REQ-286)重构:挂体系选择器(体系下拉 + 三 tab + LinkEntityPicker 搜索树列表 + 三类内联轻建编排 + 既有反查/撤链/钳制语义保持)——实体选择/创建交互已下沉 LinkEntityPicker.tsx(134 行),本文件保留编排与数据装载内聚 | 若再增长:树行构建(flattenNodeRows)与实体装载拆至 useSystemEntities.ts hook |
| app/src/components/NotePreviewView.tsx | 364 | 原料/产物/笔记预览三视图之一:过滤后笔记正文(标题+讲述内容+画面要点)+ 过滤统计卡(UI 垃圾 x/重复 y/碎片 z/低置信 w)+被过滤内容折叠对照(可复查误杀,点击定位原料)+ 一键落库(复用 session_to_note 单一管线)+「✨ AI 复核」按需触发(REQ-085:授权默认关——上传前确认;判定结果就地更新预览;merge 段以拼接形态展示,落库仍按原始段——原料不动原则)。批 7 T17:行级渲染迁入 utils/markdownLine.ts(PREVIEW 模式,352→349;图片行分支按 §C37.3 留在容器侧)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/structure_models.rs | 343 | v0.5.0 模型版:模型清单/独立状态机下载器(进度事件/.part 原子写/按需启用三分类)+ 磁盘就绪判定(disk_done)内聚 | 若再增长:download_one 拆至 structure_download.rs |
| app/src/components/NoteReadingView.tsx | 343 | v0.20.13 批 8(REQ-317)正文选区右键菜单接线(正文容器 ref 化 + 选区判定/全选 + 共享菜单渲染,259→316)——选区纯逻辑已拆 utils/noteSelectionMenu.ts 与 note-selection/SelectionActionMenu.tsx,本文件仅留宿主接线 | 若再增长:搜索态/选区态/大纲态拆至 useNoteReadingViewState.ts |
| app/src-tauri/src/db_ai_tasks.rs | 340 | 任务注册表在 AppState 内存(HashMap)——重启即失、未采纳结果无法恢复。本模块把任务记录落 SQLite(ai_tasks 表):状态/结果 JSON/成本/耗时/模型/错误全量可查;应用启动时恢复未采纳的成功结果到注册表(重启不丢,任务面板可见历史);采纳落库时标记 adopted(防重启后重复采纳产生重复笔记)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/screen_merge_tests.rs | 339 | 屏级聚合/净化纯函数测试域(聚类/行合并/零跨度/图去重回归)单模块 #[path] 挂载 | 若再增长:净化组拆至 screen_merge_purify_tests.rs |
| app/src-tauri/src/db_notes_tests.rs | 337 | db_notes.rs 单测域(15 例:笔记 CRUD/updated 倒序/搜索通配符转义/会话关联与旧库 ensure_column 迁移;全部走内存库,环境隔离铁律)——测试模块由 #[cfg(test)] #[path] 单点挂载(db_notes.rs:365),H3 硬拆时由原 db.rs 的 tests 模块整体迁入(语义不变)。本条目由生成器补登(该文件无 @ai-context 头注释),理由为 2026-09-11 重建时人工补写 |
若再增长:会话关联与迁移用例拆至 db_notes_link_tests.rs |
| app/src-tauri/src/pause_state.rs | 336 | 批 2(REQ-308)暂停来源状态机域(PauseSource/PauseShared/request 单写点)——2026-09-09 审查纠偏实测 336(交付口径 250 失真),300-600 档登记 | 若再增长:条件真值表与 request API 拆至 pause_machine.rs |
| app/src-tauri/src/commands_asr_pass2.rs | 333 | 实时链路只有端点句 SenseVoice 重打分;本命令把"导入同级的全窗离线质量"带给已结束会话:读取 S4 落盘音频(data_dir/session-audio/{id}.wav,16k PCM16)后台分窗重跑SenseVoice → 逐窗与现网轴比对 → 产 session_refine_drafts(pending),用户经 second_pass_list/decide 预览采纳/回退。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/commands_after.rs | 332 | v0.20.3(REQ-294/295/299/300)收尾命令域(批决议/导出/练习/问题)内聚;2026-09-06 实测登记(TD-2026-09-06-G) | 若再增长:批决议核心拆至 weekly_resolve.rs |
| app/src-tauri/src/fusion.rs | 332 | 纯规则融合(无 LLM,本地优先降级路径)。规则按优先级:1) 字幕权威——字幕段覆盖时间窗内以字幕为准(准确率近 100%)2) ASR 补缝——字幕段之间 gap > gap_ms 的空隙用 ASR 填补3) 重叠校对——REQ-062 升级为概率加权:编辑距离高相似(sim ≥阈值,≈旧 ≤2 规则)一律字幕胜;相似度不足时比较P(字幕胜出)=conf_sub×(0.6+0.4×sim) 与 P(ASR 保留)=conf_asr×(0.4+0.6×sim);双源低置信 → 输出低置信核对段(B3 落库标记);置信度缺失(None=旧数据)→ 回退旧硬规则(距离>2 保留核对段)4) 时间轴对齐——重叠部分归属字幕,ASR 段被裁剪到空隙5) 空窗丢弃——两端无内容的静默窗不产出段@ai-context: 输入字幕段需已含 end_ms(编排按下一字幕出现时刻补齐)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src/pages/SessionsPage.tsx | 355 | 本层为状态宿主与数据编排:会话列表/详情状态、事件驱动刷新(live:status/session:fused/切页 active)、转化与删除操作;左栏列表 UI 拆至 SessionListPanel、右栏详情拆至 SessionDetailPanel(豁免清单拆分计划落地,本文件 ≤300 行)。批 7 T17:[[ts:ms]] 深链的 ms 与目标会话配对后转交面板(339→355)。(自动摘取,待细化) |
若再增长:按职责拆分 |
| app/src-tauri/src/capture/dxgi_capture.rs | 331 | 主路径用 DXGI 桌面复制(GPU 直取,性能最优);new 或运行时捕获失败(远程桌面/锁屏/设备丢失)自动降级 GDI BitBlt(gdi_capture.rs),调用方无感知。帧输出 BGRA8,支持按窗口矩形裁剪与底部字幕区裁剪。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/commands_knowledge_decisions.rs | 331 | 本层只做参数校验、调用数据层、错误映射(AGENTS.md §6);编排 fn xxx_inner(db, …)为纯函数(:memory: 可测),薄 #[tauri::command] 壳只取 state.db 调 inner。一表两面:kind 区分 decision(思辨面)/application(学习面·记一次使用),不双表双记、只记"我的决策"。(自动摘取,待细化) |
若再增长:按职责拆分 |
| app/src-tauri/src/structure_capture_tests.rs | 331 | 纯函数(网格换算/裁剪钳制/过滤上下文组装)+ 端到端集成(合成表格帧+字幕帧参考图集 → 直扫分析 → 只收表格拒字幕 + 幂等重跑+ 降级跳过);tempfile + 内存库隔离(不触碰真实数据)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/db_graph_tests.rs | 330 | 覆盖三类边聚合正确性——link(体系实体→内容,node_id 引用跳过)、trace(同源会话互连,2~6 张边界)、belong(笔记→组);节点四表全量 + 笔记显式色解析。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/image_store.rs | 330 | 会话目录本地存图(关键图/参考图集/缩略图走廊三级):原图 + 缩略图两级(WebP 压缩),去重(aHash)+每会话预算上限(默认 50 张);图文对齐靠时间戳(产物块引用 frame_id)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/subtitle.rs | 328 | L1 外挂字幕(.srt/.ass/.vtt)纯文本解析,零第三方依赖——命中则免 ASR 零成本 100% 准确(本地优先降级路径的最上游)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src/components/EnrichPanel.tsx | 327 | 与精修语义分开:精修=处理已有内容,补充=生成新内容(模型外部知识)。九子项勾选(深度 d1 |
若再增长:按职责拆分 |
| app/src-tauri/src/commands_ai_chat.rs | 324 | v0.16 对话命令域 + v0.19.1(REQ-260)检索分支薄壳(纯聊链路零改动;kb 编排已拆至 commands_ai_chat_kb.rs 267 行)——检索分流点与 run_stream 共用会话编排上下文 | 若再增长:run_stream 与纯聊发送拆至 commands_ai_chat_plain.rs |
| app/src-tauri/src/ai_note_refine.rs | 321 | v0.8.0 M2 + REQ-290①:精修适配器域(提示词装配/请求响应类型/非流式 refine/流式 NDJSON 逐节/预算接线)+ 2026-09-11 provider 策略落体(流式拍不走 post_completions);协议与适配器同域便于 schema v2 一致性 | 若再增长:流式 NDJSON 路径拆至 ai_note_refine_stream.rs |
| app/src-tauri/src/bin/asr_forensic.rs | 321 | 定位"结尾识别不全/短句不清晰/断句不准"根因的三连验证:① 会话原始音频(session-audio/{id}.wav,16k 单声道 PCM16)离线SenseVoice 整段转写 → 与 DB 流式链路段对比(句尾是否更完整);② 对疑似截断段截取音频窗口(start-200ms..end+1200ms)单独离线转写 → 证明"音频里有没有这个尾字"(二分:链路丢 vs 源缺失);③ 200ms 块 RMS 统计 → 验证"句尾弱音块被判静音"假设的量化依据。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/db_ai_chat.rs | 321 | AI 对话双表仓储 + v0.19.1(REQ-260)retrieval/meta_json 补列与行映射(+42)——SQL/行映射内聚(db_* 文件先例) | 若再增长:消息侧读写拆至 db_ai_chat_messages.rs |
| app/src-tauri/src/engine_worker.rs | 321 | 拆分动机(三维复审 #9 + 豁免登记计划):engine.rs 在接入超时排空机制(三维复审 #5)后逼近 600 行硬拆线,按 line-limit-exemptions登记的拆分计划把 worker 循环与请求处理拆至本文件——engine.rs 保留 EnginePool 句柄与同步 API。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/commands_ai_settings.rs | 318 | AI 设置命令域(视图/密钥/授权/目标 AI) + v0.19.1 ai_set_kb_qa 最小面命令(+28)——read-modify-write 同域先例(ai_set_goal_plan)内聚 | 若再增长:kb/goal 最小面命令拆至 commands_ai_settings_extra.rs |
| app/src/components/AiConversationDock.tsx | 318 | 全局 AI 对话面板(REQ-274)+ 批 1 终态事件刷新接线——2026-09-09 审查纠偏实测登记(此前漏登),300-600 档 | 若再增长:会话列表段拆至 DockSessionList.tsx |
| app/src-tauri/src/commands_ai_providers.rs | 343 | v0.11.6 M1:Provider 管理命令域(8 命令 + 视图映射 + 密钥解析口 resolve_default_provider_key/default_provider_ready)内聚于命令层;2026-09-11 探活改 chat_plain。resolve_input/to_view 与命令同域便于契约一致。2026-09-13 批 8 T25:移除遗留凭据槽 "default" 回落读路径 + 解析内核 resolve_default_key 抽出以便单测(+26 行) |
若再增长:默认 Provider 解析与就绪门禁拆至 ai_provider_resolve.rs |
| app/src/components/LiveProfileStrip.tsx | 316 | 采集时右栏由 LiveActivityPanel 独占、档案卡(ProfileDetector)被隐藏——但 M2(REQ-189)引入"会话中画面档每 2-3 分钟自动重评"后档位成为采集中动态信息,且降档需用户裁决。本组件在采集态常显档案摘要(形态×画面档×领域),并接线 live:tier-changed /live:tier-downgrade-request → confirm_tier_downgrade,补齐 M2 前端断链(此前降档请求无人应答,降档永不生效)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src/components/SessionListPanel.test.tsx | 316 | 覆盖批 4 选择/批量交互矩阵——选择模式进出(按钮+Esc)、单击勾选、Ctrl 加/减、Shift 区间、折叠组全选不含隐藏行(P3-1 修复:全选口径=可见行序 visibleOrder 而非 filtered)、列表变化自动裁剪选集、批量删除 pending 防连点与成功清选集(P3-2)、批量转eligible 过滤。invoke 全 mock;数据为本地 props 零后端往返(面板数据驱动经 props——父层 invoke 不在本组件)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/ffmpeg.rs | 313 | ffmpeg 是文件导入(音轨/关键帧)与内嵌字幕(L2)的唯一外部依赖。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/note_filter_ocr.rs | 313 | BodySource::OcrDirect 分支的精简净化链——排序 → 净化链(① 行合并评分器 → ② 行级重识别判定 → ③ 跨帧增量合并,spec §3.1)→ 符号归一(跳过口语净化/口头禅/碎片规则——OCR文本是视觉识别产物,无 ASR 的结巴/填充词/重复)→ 相邻去重→ markdown 组装("图文提取"标注段)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/ai_provider.rs | 312 | v0.11.6 M1 + v0.12.0 M4:Provider 配置域(类型/校验/存储 IO/预设模板/legacy 迁移/默认链升级)+ 2026-09-11 DeepSeek V4.1 模型名归一(current_deepseek_model / normalize_retired_deepseek_models)——预设与迁移共处一文件保证"预设即迁移模板"的单一真源 |
若再增长:预设模板与迁移链拆至 ai_provider_migrate.rs |
| app/src-tauri/src/commands_refine_inner.rs | 312 | v0.5.0 模型版:课后精修编排(清单构建/降级决策/引擎懒加载/逐候选识别/产物回填/HTML→MD 转换)内聚于精修执行域 | 若再增长:html_to_markdown 拆至 html_table_md.rs |
| app/src-tauri/src/commands_video.rs | 356 | v0.5.0 M1(REQ-043)起:视频档案命令域(检测装配/领域检测/预热/记忆);v0.13.6(REQ-219~222)形态/领域/细目/记忆命令 + 分区映射形态接线再增;审查轮(H1 领域记忆兜底顺序修复/L2 独立 try)微增 | 若再增长:领域命令组拆至 commands_video_domain.rs |
| app/src-tauri/src/commands_ai_chat_kb.rs | 310 | 读路径 A 发送流——本地 kb_search 命中 → 命中片段列表恒返回(本地零成本零上传,不受 AI 闸门约束)→ 生成仅当 content_gate+ kb_qa_enabled 双闸门开(默认关)→ 片段打包(budget_allocatorpack_fragments 转正:预算硬顶 + 诚实截断标记)→ 流式生成 →回答 + meta_json 引用落库(命中清单/引用溯源)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/kb_fts.rs | 309 | 中文 BM25 切词口径校准(M0 spike 定案,2026-09-03):索引表用 FTS5 trigram tokenizer(SQLite ≥3.34,bundled已使能)——unicode61 把连续中文句整段当一个 token(无分词),整句/子串查询全部落空(LIKE 都不如);trigram 以 3-gram 窗口索引并支持子串匹配,免分词器与 FFI 自定义 tokenizer。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/kb_search.rs | 309 | kb_search = FTS5 BM25 主链(中文经 kb_fts.rs 规划转 trigram短语/2 字 LIKE 补充);RRF 融合函数已就绪但 embedding 未接入(v0.19.3)——当前单列直通;LIKE 旧链(search_notes 等)保留不动零破坏。命中携带源引用(note_id/fragment_id + 标题 + 组名+ 节标题)→ 引用溯源/跳转高亮天然成立。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/subtitle_ocr.rs | 308 | 本模块只做字幕文本流的多帧投票纠错与滚动字幕检测(纯函数/有状态轻组件);区域裁剪复用 frame_diff::bottom_quarter_rect,OCR 识别复用 v0.1.0 引擎(oar-ocr)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src/components/NoteLinkToSystem.test.tsx | 308 | 覆盖——选体系→点行选中→link 零 id 契约;未选禁用/切体系重置;三实体挂接 conceptId/modelId;已挂态切换先撤旧链、取消挂接;旧数据兼容显示;REQ-286 行内轻建(问题挂根/挂选中节点下、概念、模型)即建即选→确认挂接。invoke 全 mock(AAA)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src/types/goals.ts | 308 | 目标是学习循环的意图层对象(规格 §一)——可追踪/可毕业/可复盘的「学会 Python」;三表:goals/goal_milestones/goal_groups。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/commands_knowledge_systems.rs | 306 | 本层只做参数校验、调用数据层、错误映射(AGENTS.md §6);编排逻辑fn xxx_inner(db, ...) 为纯函数(:memory: 可测),薄 #[tauri::command]壳只取 state.db 调 inner。体系是问题的容器——global 全库唯一、core_question 必填;问题树节点挂体系、parent 自引用成同级树。(自动摘取,待细化) |
若再增长:按职责拆分 |
| app/src-tauri/src/db_session_refine.rs | 306 | 原料 session_segments 不可变(ADR-030 决策 5 可逆契约延续)——离线第二遍(origin=second_pass,source=asr_pass2)与可选 LLM校对(origin=proofread,source=llm_proofread)的替换文本全部落本表:段级(窗口/句级时间窗)diff 快照 base/refined + 来源与置信标记,pending → adopted/rejected 由用户裁决,全文可回退(回退=置 rejected 即恢复原料展示,不删历史裁决)。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src/components/KnowledgeTreeView.tsx | 305 | 树+列表,不做图可视化(§五 UI 原则)——节点以递归列表呈现,每节点一个身份标签(问题/场景/领域入口)+ 挂载引用数(link 按nodeId 计数,整树批量拉取后计数)。节点操作 inline(加子节点/编辑文本/删除),避免弹窗割裂,符合"决策仪表盘"而非 Notion 树。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/note_diff.rs | 304 | 纯函数:按行(块)比较 before/after,三态标记 unchanged/added/removed——前端高亮 AI 变化点(本地规则版为基线);M4 版本管理(任意两版段级 diff)复用本函数,接口不变。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/region_ocr.rs | 302 | 原始帧 → LayoutAnalyzer → 区域列表 → 逐区域裁剪(内存 crop + 边距)→ 区域级预处理 → 现有 OcrEngine::recognize_image(复用零改动)→ 坐标还原(原帧坐标 = 区域坐标 + 裁剪偏移 × 缩放系数)→ 合并回时间轴。(自动摘取,待细化) | 若再增长:按职责拆分 |
| app/src-tauri/src/series_detect.rs | 301 | 从窗口标题/文件名剥离"系列名 + 集号"(B站分P P3/第3集/EP03/(2)/数字后缀 03 等),供档案检测系列名投票、记忆偏好系列键、课程分组使用——同一系列的 P1/P5 标题不同导致的投票漂移与记忆失配,是检测准确度的真实短板(Foresight 头脑风暴brainstorming-video-profile-detection.md,根因 6)。(自动摘取,待细化) |
若再增长:按职责拆分 |
| app/src/utils/canvasElements.ts | 301 | v0.13.8 实体 → RF 元素纯转换域;v0.13.9 根卡/接线方向;v0.14.1 连线样式/箭头入参(+20 行)——单测共用纯函数域(零 React 依赖),拆分破坏转换一致性 | 若再增长:节点构建与边构建拆至 canvasNodes.ts / canvasEdges.ts |
已拆分:app/src/components/LiveActivityPanel.tsx(2026-09-13 批 7 T6,单提交,登记值 513;批 6
rulings.md:138登记转批 7、C9.16 裁决「7a 拆件 / 7b 挂载动效」;主件回归 242 行 ⇒ 本表条目整条移除):按本行原「拆分计划」列早已写明的拆法把转录流与 OCR 预览整段搬出 ——components/LiveTranscriptStream.tsx(297 行:定稿行 + 未沉淀行〔partial 按句读拆行 / 定稿待沉淀〕+live:status/asr-partial/asr-final/subtitle四订阅 + 转录渲染块)·components/LiveOcrPreview.tsx(94 行:屏摘要同屏合并/截断 +live:ocr订阅 + OCR 渲染块);两件均 ≤300 行,无需登记。纯搬迁(§C9.19 第 1 条):两件常驻挂载、按active自隐(列表状态与事件订阅随件走 ⇒ 切 Tab 不丢行),零行为变化、零动效(逐段显影属 7b/T20)。机械等价证据:44 段行区间按countLines()同源切片搬运,落盘后与拆前副本逐字节对拍 44/44 命中(唯一差异 = 两个渲染块的统一去缩进 6 格 + 8 处已声明替换:MAX_KEPT→maxKept注入 /countsRef+setCounts→onBump/setPhase→onPhase/startedAtRef→onStarted);渲染结构探针 19 张快照(空态 → 字幕 → partial/final → 切 Tab → 跨 Tab 累积 → 截断提示 →live:status三态 → 融合三事件 →live:session-info→ 未沉淀行溢出)拆前拆后Buffer.equals= true(201,786 B 逐字节相同)。棘轮表逐张扫过(凡带LiveActivityPanel.tsx键者):FROZEN_FONT_OOB_BY_FILE的 8 → 1(主件)+ 新键LiveOcrPreview.tsx3 +LiveTranscriptStream.tsx4(1+3+4 = 8,Σ 551 不变);FROZEN_MUTED_GRAY_BY_FILE的 2 随代码迁至LiveTranscriptStream.tsx(Σ 63 / 条目 43 均不变,RESIDUAL同批换键);FROZEN_FONT_OOB_FILES120 → 122(键数普查值:一处文件拆成三处且三处仍有命中 ⇒ 条目数 +2;Σ 与逐文件上限均未抬高);FROZEN_NATIVE_BUTTON_BY_FILE(1,唯一原生<button>是留在主件的 Tab 栏)·surfaceBaseline.ts三族(边框 2 / 圆角 1 / 阴影无键)·FROZEN_RED_BY_FILE(2)·emptyStateRatchet的FROZEN_REST([1,1])四处零改动(新件在这些族里命中均为 0)。未做:useRevealChoreography与逐行ref的挂载(7b/T20);真机/观感未测(C6.4)。 已拆分:app/src-tauri/src/video_profile.rs(2026-09-11 批 0-C3 Task 10,2 步 2 个提交c39a3152「步 1 — 检测投票域」/ 步 2「记忆偏好域」,提交态声明 637 / 实测 628(Task 10 评审 M-2 实测:拆分前表体该行实为| app/src-tauri/src/video_profile.rs | 637 | 超硬限(>600 行),不允许豁免…—— 见git show c1a6ca53^:docs/standards/line-limit-exemptions.md;637 本身是过期快照,即基线态--full本应报 (e)「声明 637 / 实测 628」,原文写「登记值 628」「627→496」两处都不是提交态的值;该声明行由本任务步 1 的--write一并刷新为 496,刷新结果被并行提交c1a6ca53连带落库,见下);⚠️ FROZEN_OVER_LIMIT行的删除落在本任务第 1 步提交c39a3152内(该提交 3 个路径 = 主文件 + 新文件 +scripts/line-limits.mjs),但登记表表体的数值刷新(637→496 那一行;原文写的 627 已更正)是被并行提交c1a6ca53(「docs(standards): 记录 types.rs 拆分结果与棘轮时机」,其显式路径含本表)在工作树里连带落库的——与 0-C2 Task 1/2 同款跨任务连带;本任务第 1 步--write同时改写了那一行的人工两列(把「超硬限不允许豁免」的过期理由换成实测拆分进展),该文字亦由c1a6ca53带上;复现:git log -p -- scripts/line-limits.mjs、git log -p -- docs/standards/line-limit-exemptions.md):按职责横切(不是按档——12 档参数表早在 v0.5.0 已外置video_profile_data.rs,本文件内一个档位专属行都没有)拆出 2 个平铺子模块,#[path]由父模块自己声明 ⇒lib.rs零改动(lib.rs:475的mod video_profile;未动,未按分析报告 §2.2/§2.5 方案 A 加 2 行mod)——app/src-tauri/src/video_profile_detect.rs(157 行,检测投票域:ObservedSignals/ProfileCandidate/DetectResult+ 私有阈值CONFIDENCE_THRESHOLD=2.5/CONFLICT_GAP=1.0+vote_detect49 行 +score_profile34 行;原 229–402 行)·app/src-tauri/src/video_profile_memory.rs(236 行,记忆偏好域:MemoryEntry/DomainMemoryEntry/ProfileMemory+impl ProfileMemory13 方法 179 行整块搬入;原 404–622 行)。主文件回归 285 行(契约三枚举ProfileKind/ArtifactTemplate/StoreTier92+32 行 + 4 个参数类型 55 行 +VideoProfile/builtin_profiles再导出/profile_by_kind32 行 + 协调器apply_profile_memory33 行 + 两域#[path] mod声明与pub use22 行 + 测试挂载 5 行)。★ 与计划书/分析报告的两处偏差(读码后以代码为准):①pub use路径不能写成crate::video_profile_detect::{…}(计划书 §2.2 与登记计划原文如此)——本模块由#[path]在父模块内声明,不是 crate 根子模块,crate::video_profile_detect不存在(实测 E0432);正确写法是pub use detect::*;/pub use memory::*;(仓内先例watermark_filter.rs:23的pub use watermark_cluster::…、types.rs:22–27的pub use types_*::*)。② 必须用 glob 而非逐个列名:显式写pub use memory::{DomainMemoryEntry, MemoryEntry, ProfileMemory};会因两者在 crate 内无按名引用(只经ProfileMemory.entries字段类型间接使用)触发unused_imports,使cargo clippy -- -D warnings错误数 15 → 16(实测);改 glob 后回到 15。ProfileKind三表同源核对(本任务第一优先):#[serde(rename_all = "kebab-case")]3 处未改;parse12 条显式臂且无"lecture"臂(靠_ => Lecture兜底、非法值静默回退)、as_str13 条臂(含"lecture")——逐臂与前端独立真值表app/src/types/live.ts:110–124的 13 个字面量逐值同序相同(lecture/hands-on/talking-head/interview/meeting/podcast/live/whiteboard/game-tutorial/exercise/follow-along/coding/unknown);as_str是live_session_lifecycle.rs:68/ai_refine_task.rs:318/artifact_templates.rs:624的落库值 ⇒ 这是全任务唯一「搬错也不报错」的面,已逐臂对拍。投票顺序未动:剥系列名(仅换投票标题)→max ≤ 0早返回Unknown(score 1.0)→ 稳定降序 → 2.5/1.0 双阈值;四段行索引递增实测 87 < 97 < 110 < 115。机械等价证据(第一证据):手术脚本task10-step1.mjs/task10-step2.mjs从原文件按行切片生成新文件(不重打、不转录),收尾探针task10-verify-equiv.mjs把 7 个搬迁块 + 6 个保留块与拆分前副本(git show 211a1cad:版 = 628 行)逐行===对拍 = 15 块 / 631 行正文全部 byte-exact、顺序保持(⚠️ Task 10 评审独立 LCS 复核:「15 块 / 631 行」是实施者自述口径、评审未复现该数字(其 LCS 结果是「拆分前 628 行除 1 个空行〔orig 623〕外每行都 byte-exact 落在三新文件」,而非 631);等价性结论成立,此处只更正数字口径)(含每一条#[serde(default)]/#[allow(dead_code)]、中文注释与超长单行DetectResult { … });全文件 CRLF 保持(裸 LF = 0,未跑任何 formatter)。行为等价:cargo buildexit 0 ·cargo test --test app_lib_tests2359 passed / 0 failed / 6 ignored(与拆前一致)·video_profilefilter 74 例不减(33+14+15+5+7)·commands_video(apply_profile_memory四象限消费方)8 例绿 ·artifact_templates17 例绿 ·cargo clippy -- -D warnings15 个 error 不增(预存缺陷,与本任务无关)。★ 分析报告 §3③ 的实测纠偏:报告称 33 个用例「引用的全部符号都是 pub ⇒ 无私有项依赖」——video_profile_tests.rs:6的use super::*确实要用DetectResult/ObservedSignals/ProfileCandidate/vote_detect,但四者原本就是pub项,搬走不带出任何pub(crate)项;score_profile/两个阈值/5 个私有 lookup 实测在*_tests.rs与全仓src/*.rs中零引用(grep 校验,含CONFIDENCE_THRESHOLD/CONFLICT_GAP全仓唯一命中在本文件内),故私有性原样保持、无提权。既有缺陷原样保留(未顺手修):parse非法值静默回退 Lecture ·profile_by_kind每次克隆 12 档 Vec 再remove(0)且unwrap_or(0)依赖数据表第 0 位是 Lecture · 系列剥离只覆盖title不动url· Unknown 单候选score: 1.0·save()用with_extension("json.tmp")·memory_key空键由两个调用点各自判空 · 文档注释仍写「五档案」·apply_profile_memory象限③「needs_confirmation为真时记忆反而生效」——已裁决行为,逐字未改。测试文件未拆(裁决 D4):video_profile_tests.rs518 行仍以#[path]挂主文件,登记值不变。 已拆分:lib.rs(1025 → 577 行,批 0-C3 Task 1,2026-09-11)——tauri::generate_handler![…]注册清单 450 行(334 条目 + 106 注释 + 10 条#[cfg(target_os="windows")])整体搬至 app_commands.rs(503 行),条目只加crate::前缀(IPC 名 = 路径末段 ident,零改名);.plugin/.setup/.on_window_event/.run与punctuation_model一律留在run()/lib.rs。为什么不是 ≤300:322mod+ 15#[cfg]= 337 行地板(Task 1 评审实测更正:原写「321mod+ 16#[cfg]」—— 322 含本任务新增的mod app_commands;;15 是挂在mod上的#[cfg(target_os="windows")],另有 2 行在run()内、1 行#[cfg_attr(mobile…)]不计入 ⇒ 总数 337 不变),mod声明必须在 crate 根(挪进子模块会把全仓crate::x::y路径整体重写 = 违反行为等价);include!外移方案经评估否决(只是把 337 行挪个地方,且 crate 根的模块树不再可见)。⇒ lib.rs 停在 300–600 豁免带并如实登记本表;app_commands.rs 是数据文件(注册条目,非逻辑),同带登记。机械等价证据:probe-registry-parity.mjs verify= 334 条逐条相同(含 10 条 cfg 门控、顺序不变);行为等价:cargo test --test app_lib_tests= 2357 passed / 0 failed / 6 ignored(与拆前一致)。签名偏差(实测):app_commands::handle()必须是具体tauri::Wry,不能写成计划书的handle<R: Runtime>()—— 334 条里有 13 条按值收AppHandle(commands_knowledge_core2 /commands_window6 /commands_overlay3 /commands_asr_pass22),泛型R下AppHandle<R>: CommandArg<'_, R>会被 rustc 退到Deserialize兜底 impl(13 × E0277),计划书给的Box<dyn Fn>退路同样是泛型、同样失败;Builder::default()本就是Builder<Wry>,故行为等价。新增门禁:scripts/check-command-registry.mjs(定义 ↔ 注册三向检查:漏 / 多 / 重名,含--self-test)。⚠️ 提交树红灯(Task 1 评审 I-1,已用git archive c409a956复现):c409a956的提交树跑node scripts/line-limits.mjs --full= exit 1 —— 该提交一次删了 两行FROZEN_OVER_LIMIT:本任务的'app/src-tauri/src/lib.rs'(正确)与并行的 0-C2 Task 1 的'app/src/pages/NotesPage.tsx'(并把该行声明值 602→588 一起写进表里),却没有提交NotesPage.tsx(该提交只含 4 个路径)⇒ 树内 NotesPage 仍 602 行 > 600 且不在棘轮名单内,同时命中 (a)(新增 >600 硬限违规)与 (e)(声明 588 / 实测 602)。本任务报告里那句「line-limits.mjs --fullexit 0(提交 c409a956 时)」只在工作树口径成立、在提交对象口径不成立(HEAD 自洽,本条记录即更正)。纪律(本批共性教训,已同步.superpowers/sdd/DISPATCH-TEMPLATE.md§三):共享工作区别用工作树状态代替提交树状态;--write之后只提交自己那几行。 已拆分:engine.rs(三维复审 #5 超时排空机制接入后逼近 600 行硬拆线)按登记计划将 worker 主循环与请求协议(AsrRequest/OcrRequest/双 worker 循环/词表纠错纯函数)拆至 engine_worker.rs(253 行)——engine.rs 回归 440 行(仍登记,300-600 区间),engine_worker.rs ≤300 行无需登记。⚠️ 2026-09-11 复核更正:engine.rs实测 526 行(>300,仍在上表登记);engine_worker.rs实测 321 行(>300)—— 原「≤300 无需登记」不再成立,该文件已由生成器补登于上表 301–600 档;上述 440/253 只是当时时点值。 已拆分:db.rs(2026-08-21 H3 硬拆,原 678 行超 600 硬限违规):schema 建表 + ensure_column 列迁移拆至 db_migrations.rs(204 行),notes CRUD 拆至 db_notes.rs(216 行,测试迁至 db_notes_tests.rs 265 行)——db.rs 回归 72 行(Db 结构体/连接锁/with_conn/通用工具),三新文件均 ≤300 行,登记移除。M3 锁中毒恢复(with_conn + into_inner)随拆分一并落地。⚠️ 2026-09-11 复核更正:db.rs实测 91 行(>72,仍 ≤300);但db_migrations.rs实测 573 ·db_notes.rs366 ·db_notes_tests.rs337 均已 >300 ⇒ 原「三新文件均 ≤300,登记移除」不再成立,三者已由生成器补登于上表 301–600 档。 已拆分:live_session.rs(2026-08-21 Task #14 硬拆,实测 727 行超 600 硬限违规):状态查询/控制方法簇(快照/暂停/停止/会话 id 查询)拆至 live_session_manager.rs(150 行),启动与预热生命周期(start/prepare/run_session/wait_prepared_ready)拆至 live_session_lifecycle.rs(288 行)——live_session.rs 回归 284 行(参数/结构体定义 + 构造 + run_session_after_engine 装配骨架),impl LiveSessionManager 跨文件分布,公共 API 签名零变化;三文件均 ≤300 行,登记移除。⚠️ 2026-09-11 复核更正:live_session_manager.rs实测 209 行(仍 ≤300);live_session.rs实测 394 ·live_session_lifecycle.rs376 均已 >300 ⇒ 原「三文件均 ≤300,登记移除」对后两者不再成立,已重新登记于上表(上述 284/288 为当时时点值)。 已拆分/删除:NoteGroupPanel.tsx(v0.12.2 笔记页三栏重构,原 545 行登记)——三合一职责拆分:GroupSidebar.tsx(267 行组筛选侧栏)+ RouteInfoPopover.tsx(278 行 ⓘ 弹层四区);FeedFragmentList.tsx 改为收件箱碎片卡(263 行);noteTree.ts/v0.11.5 树形合并下线;四文件均 ≤300 行,登记移除。⚠️ 2026-09-11 复核更正:GroupSidebar.tsx实测 519 ·RouteInfoPopover.tsx375 均已 >300 ⇒ 原「四文件均 ≤300,登记移除」对这两者不再成立,已重新登记于上表 301–600 档;FeedFragmentList.tsx277 仍 ≤300;NoteGroupPanel.tsx与noteTree.ts确认已下线/更名(原文件不存在)。 登记移除:NoteEditView.tsx(登记值 315 过期——实测 299;v0.12.2 新增 autoFocus 一行后仍 ≤300,无需登记)。v0.13.6 审查修复(forwardRef flushSave)后实测 306 行,重新登记于上表。 2026-09-11 再次复核更正:实测 411 行(>300,上表已按 411 登记)——「306 行」是 v0.13.6 时点值,此后本文件继续增长(v0.15 剪贴板图片 paste + 外链图导入等)。 已删除:live_pipeline_diag.rs(2026-08-21 L5 清理)——"诊断后删除"的临时诊断模块,确认 lib.rs 注册仅 test cfg 且无其他引用后整体移除。 已拆分:dxgi_capture.rs(原 ~333 行)于 v0.4.0 M0(TD-033,提交 2a88b25)将 DxgiState 拆至 dxgi_state.rs——现均 ≤300 行,无需登记。⚠️ 2026-09-11 复核更正:dxgi_capture.rs实测 331 行(>300)⇒ 原「无需登记」不再成立,已登记于上表 301–600 档;dxgi_state.rs实测 242 行仍 ≤300。 已拆分:live_session_frame.rs(原 ~500 行登记)于 v0.6.0 ADR-011(REQ-086/087)按拆分计划将 process_frame 帧处理拆至 live_frame_process.rs。 (2026-09-11 复核:本次拆出的live_frame_process.rs实测 529 行 >300,已登记于上表;live_session_frame.rs其后由批 0-C3 Task 3 续拆至 174 行,见下文记录。) 已拆分:live_session.rs(原 ~798 行,v0.7.0 M0 X-O5 强制落地)按登记计划拆至 live_session_fusion.rs/live_session_loop.rs,并补充 live_session_persist.rs。 已拆分:streaming_asr.rs(原 ~378 行,v0.7.0 M0 X-O5 强制落地)按登记计划将端点处理块拆至 streaming_endpoint.rs。 已拆分:lib.rs(v0.7.5 超 600 行强制落地)按登记计划将 setup 初始化块拆至 app_setup.rs;后因命令注册与模块声明增长重新越线(实测 486),重新登记于上表。 已拆分:note_filter.rs(v0.7.5 净化接线后超 600 行风险)按登记计划将 boundary_candidates/apply_ai_decisions 拆至 note_filter_ai.rs(≤300)。 重新登记:live_session_frame.rs 于 2026-08 暂停/画面档多轮增长后重新越线(见上表);live_session.rs 同轮越线并于 Task #14 完成硬拆(见上条已拆分记录),登记移除。 (2026-09-11 复核:live_session.rs实测 394 行 ·live_session_frame.rs174 行 —— 前者已按 394 重新登记于上表,后者见批 0-C3 Task 3 记录;本条「登记移除」只对当时时点成立。) 登记移除:ai_refine_protocol.rs(2026-09-05 审查 M3)——实测 295 ≤300 无需登记(流式渲染/解析新增后仍合规),原登记 340 不实已撤 登记移除→重新登记:EnrichPanel.tsx(v0.20.x 复核登记值 ~330 过期,实测 299 ≤300 移除)。2026-09-11 重建复核实测 324 行(>300),原移除结论不再成立,已恢复登记于上表 301–600 档。 复核解除:app/src/types.ts(前端类型域拆分期间「暂不登记行数」注记)。2026-09-11 重建复核实测 20 行——2026-08 审查 H4 已按领域硬拆至types/子目录,本文件仅作 re-export barrel(既有 import 路径不变),无需登记。 已拆分:app/src/components/SessionDetailPanel.tsx(2026-09-11 批 0-C2 Task 3,分 4 个原子提交 0db7d972 / 26abdc90 / e2db3a39 / fd1b6f55,登记值 656 超 600 硬限):按实测结构分析拆出 4 个单元——components/session-detail/SessionScreenCards.tsx(192 行,画面要点屏卡流;单屏 toast 与框选态不在此文件,见下条等价性修正)·hooks/useSessionDetailData.ts(237 行,质量报告/术语表/baseUrl + 4 条精修 listen + 懒触发 auto_refine_session + 深链快照 + startRefine + 屏卡瞬时态(框选/单屏 toast))·components/session-detail/SessionDetailHeader.tsx(160 行,降级横幅 + 改名/状态行/融合中徽标/操作)·components/session-detail/SessionRefineSection.tsx(66 行,精修工具条三按钮——原登记名 SessionPass2Section.tsx 名不副实(内容还含 ProofreadPanel 入口),按裁决 D2 更名)。主文件回归 296 行(纯编排层),四新文件均 ≤300 行无需登记;公共 props 契约(9 个)零变化,唯一消费者 pages/SessionsPage.tsx 未改。分步净减实测:656 →(屏卡流)522 →(数据 hook)410 →(头部)305 →(精修区)288 →(等价性回归修正)296。M7 的屏→OCR 分组 memo 仍留在 hook 层并以 prop 传 Map。拆分计划:web 早返回(SessionWebView)/ 质量卡(SessionQualityCard)/ 转写时间轴(SessionTranscriptPane)/ 术语表(SessionGlossarySection)为可选的 5–8 步精化,本轮按「最小可行 + 合规即停」未做(本文件无专属测试,人工核对成本优先)。 等价性回归修正:SessionDetailPanel 拆分后复核发现,单屏 toast 与框选态随SessionScreenCards下沉会随原料视图卸载而丢失——「保存 toast 的 4s 内」或「框选进行中」切到笔记预览再切回时状态提前消失,属用户可见行为差异(本批红线是纯重构、行为等价)。已按fix(ui): 屏卡 toast/框选态上提至数据 hook(等价性回归)把两者上提至hooks/useSessionDetailData.ts(该 hook 由面板在早返回之前调用、面板跨视图切换不卸载 ⇒ 状态寿命与拆分前一致;toast 定时器卸载清理随之上移,注册/清理时机同为面板挂载/卸载),屏卡组件改为接收值 + setter 共 5 个 prop:selectingScreen/onSelectScreen/panelToast/onShowToast/onClearToast。行数影响:面板 288 → 296(≤300)、hook 191 → 237、屏卡 198 → 192;DOM 结构、文案、seg-/ocr-锚点、invoke参数与时机均未变。 已拆分:app/src/pages/NotesPage.tsx(2026-09-11 批 0-C2 Task 1,分 9 个原子提交 88b45e8c / c1840067 / 6ef2060a / b3adbe66 / 2f11a140 / 9c3cabef / 8ff7d73f / 114e4d41 / 61a4022b,登记值 602 超 600 硬限;⚠️ FROZEN_OVER_LIMIT行的删除不在本任务任何提交里 —— 它由并行提交c409a956(lib.rs 拆注册清单,其显式路径清单含scripts/line-limits.mjs)连带落库,因为本任务第 1 步已在工作树里把该行删掉;代价是c409a956那棵树的NotesPage.tsx仍是 602 行 ⇒ 该提交点 (a) 不自洽(HEAD 自洽、本任务 10 个提交逐个自洽)。复现:git log -p -- scripts/line-limits.mjs):按实测结构分析拆出 9 个单元——hooks/useNotesSealedFilter.ts(50 行,SE 封存 #树洞 显隐开关 + 精确匹配过滤纯函数,refreshToken 由页面注入)·hooks/useNotesPageEditing.ts(81 行,编辑态 + Ctrl+E/ESC 单一 window 监听 + 编辑器命令式出口,selectedRef 由页面持有并注入)·hooks/useNotesBatchActions.ts(94 行,单删/批量删 + 空组清理留痕 toast 独占实例)·hooks/useNotesListData.ts(144 行,列表/过滤态/组与标签色/refreshToken/seqRef/handleNoteChanged 单一真源 + useDbRefresh 常驻订阅)·hooks/useNotesDeepLink.ts(106 行,focusNoteId ∪ focusNoteSearch 合并单 effect + focusGroupId 仅过滤不展开)·components/notes/NotesOverlays.tsx(69 行,AI 对话框/模型卡槽/图片预览/清理 toast 的条件门控与 key 语义)·components/notes/NotesReadingColumn.tsx(150 行,右栏 flex:1 宿主 + editor/auxPanels/headerExtra 三插槽)·components/notes/NotesListColumn.tsx(130 行,中栏三形态原位切换 + 折叠态也渲染的 ColumnResizer,顶层 fragment)·components/notes/NotesGroupsColumn.tsx(81 行,左栏组侧栏 + 手柄;第 9 步 = S8 后实测 305 > 300 的兜底,取自结构分析 §3.2 的 S9 备选,非计划书首列的 8 文件)。主文件回归 295 行(纯编排层:页面态 + 三栏/覆盖层装配 + 页面级动作),9 个新文件均 ≤300 行无需登记,本表条目整条移除。NotesPage的 7 个 props 契约零变化,唯一生产消费者App.tsx未改,NotesPage.test.tsx(2 例:编辑完成刷新 / ESC flush 顺序)零修改通过。分步实测:602 →(封存)588 →(编辑态)556 →(删除)506 →(列表数据)416 →(深链)371 →(覆盖层)367 →(右栏)318 →(中栏)305 →(左栏)295。等价证据:全量npx vitest run104 文件 / 811 用例全绿(拆前基线 103/809;文件数增量来自并行批次的他人新增,本任务未改任何测试);npx tsc --noEmitexit 0;机械不变式探针probe-verbatim-strings.mjs(13 段用户可见文案 + 10 个 IPC 命令名,全树计数)在每步与收尾均一致。明确保留的既有缺陷(本批只搬不改):J1-3 大纲折叠死局 / J1-6 大纲宽度假可调 / J1-8 三处硬编码 56px。未做:docs/tech-debt/review-2026-09-11.md的 TD-2026-09-09-D 状态回写(该目录未入库,留待 0-C2 收口统一处理)。🔻 2026-09-13 加注(T26 归档后补记):该目录已归档到docs/archive/2026-09-13/,上句描述的路径与「未入库」在当时成立,原文保留;该未做项现由 2026-09-13 权威清单 收口(TD-2026-09-09-D 已判closed)。 已拆分:app/src/components/SessionListPanel.tsx(2026-09-11 批 0-C2 Task 5,6 个代码提交 2d0cddad / f012968f / 8773a665 / 96dc41cf / 2e339a0c / dd4dabf6,登记值 604 超 600 硬限;⚠️ 溯源更正(评审 I1/M1):本表该行的删除实际由并行提交b8ff1efa(Task 4 步 1,其显式路径含scripts/line-limits.mjs)落库,而本条记录的落库提交是129b4229—— 报告里"第 7 步167eef89"与 git 不符,dd4dabf6不含登记表;另SessionListPanel.test.tsx实测 10 例(4 describe / 10 it),计划与分析写的"9 例"是错的):按实测结构分析拆出 8 个单元——utils/sessionEligibility.ts(17 行,isSessionConvertible纯函数:行内 canConvert / 批量 eligible 过滤 / 右键菜单 canConvert 三处同口径)·hooks/useSessionSelection.ts(102 行,多选态机:selected/anchor/selectionMode +visibleOrderRef同 tick 镜像 + 裁剪 effect 的changed ? next : cur同引用 + clearSelection/exitBatch/enterSelectionMode/rowOpen/rowModifier/toggleAllVisible;visibleOrder 由面板注入而不在本 hook 推导)·hooks/useSessionListView.ts(105 行,matchFilters/sorted/filtered/groupedView/visibleOrder 纯派生链 + StatusFilter/ConvertedFilter/SortBy 三类型)·hooks/useSessionSearch.ts(76 行,三模式搜索态 + 本文件唯一两个 invoke 落点 search_session_segments / search_ocr_blocks)·components/SessionSearchBar.tsx(84 行,三模式单输入框)·components/SessionSearchHits.tsx(80 行,段命中/画面命中两视图)·components/SessionListBody.tsx(117 行,列表容器 + 全部分支 + renderRow 行工厂)·components/SessionSelectionToolbar.tsx(122 行,一个文件两个导出:具名SessionSelectionControls=头部 chip + 「选择」按钮、默认导出=底部批量栏)。主文件回归 298 行(纯编排层),8 个新文件均 ≤300 行无需登记,本表条目整条移除。18 个 props 契约零变化,唯一生产消费者pages/SessionsPage.tsx未改,SessionListPanel.test.tsx(316 行 / 10 例,invoke 全 mock)零修改通过。分步实测:604 →(可转化纯函数)598 →(选择态机)547 →(视图模型)491 →(搜索三件套)371 →(列表区)342 →(选择与批量栏)299 →(JSDoc/注释再平衡)298。★ 与计划书/分析报告的两处系统性偏差(读码后以代码为准):① 分析报告 §3.1/§4.1 把batchBusy+batchBusyRef+runBatchConvert划给 Toolbar —— 实测批量转会先 clearSelection 使批量栏立即卸载,状态随组件走会让「pending 期间重新勾选」的连点拦截失效(行为不等价)⇒ 三者与新增runBatchDelete一律留在面板,Toolbar 做成纯展示;R5「state 与 ref 必须同属一处」仍满足。② 分析报告把「chip + 「选择」按钮」(列表头部,L346–362)与「底部批量栏」(L527–586)同列进一个组件,但两者 DOM 位置不相邻 ⇒ 同一文件导出两个组件分别就位,DOM 层级与拆前逐字一致(Fragment 不入 DOM)。Esc 三级退出链(R1,最高危):监听留在面板(deps[contextMenu, selectionMode, selected.size, exitBatch]逐字不变),未新建第二个 window keydown,菜单优先return⇒ 菜单开启时按 Esc 只关菜单、选集保留。同时保留 R2(visibleOrderRef 镜像)/R3(裁剪返回同引用)/R4(全选三态口径=visibleOrder 而非 filtered)/R6(批量转「转前清选集」与批量删「成功后清选集」不对称,未统一)。机械等价证据:probe-verbatim-strings.mjs(35 段用户可见文案 + 2 个 IPC 命令名,按 app/src 全树计数)在拆前快照与每一步 + 收尾均 100% 一致;npx vitest run104 文件 / 811 用例全绿(与拆前基线逐数相同,用例数不减);npx tsc --noEmitexit 0;node scripts/line-limits.mjs --fullexit 0,>600 硬限 9 → 7。登记表人工列:第 1 步曾把本行「拆分计划」列改写为八文件边界(该文本随第 6 步--write整行移除而不再出现在本表,逐字存档于提交2d0cddad的 docs/standards/line-limit-exemptions.md)——「8 文件边界」的权威记录即本条目。未验证(诚实单列):SessionRowContextMenu全仓无测试文件 ⇒ 右键菜单坐标钳制(232×300 硬编码)、危险项红字、canConvert显隐、透明背板收起只能人工验证;本任务未跑 WebView2 手工核对(详见.superpowers/sdd/2026-09-11-frontend-redesign-batch0c2-frontend-splits/task-5-report.md)。 已拆分:app/src/components/NoteListView.tsx(2026-09-11 批 0-C2 Task 2,登记值 654 超 600 硬限;FROZEN_OVER_LIMIT行由本任务在第 1 步删除,但该行删除被并行提交14b8aaa6(拆 types.rs 第 2 步,其显式路径含scripts/line-limits.mjs)在工作树里连带落库 —— 与 Task 1 同款跨任务连带;⚠️ 该提交点(14b8aaa6)的NoteListView.tsx实测仍是 642 行 > 600 ⇒ 那一棵树触发规则 (a)(>600 却不在棘轮内)与--full的 (e),门禁红(HEAD 自洽、本任务各步自洽)。复现:git log -p -- scripts/line-limits.mjs):按实测结构分析拆出 9 个单元——utils/noteSectionModel.ts(117 行,展示节/全局可见序/scope 键/裸折叠键/手动底序纯函数,含grouped死载荷去重后的单次分桶)·hooks/useNoteSections.ts(91 行,裸键折叠记忆 localStorage 读写 + treeMode/sections/visibleOrder 接线)·hooks/useNoteOrders.ts(57 行,序行 store:note_order_list/note_group_order_list 拉取 + note_order_save/note_order_clear 整表覆写 + refreshToken 重拉;兑现本表原「拖拽/移动接线拆至 useNoteOrders.ts」计划)·hooks/useNoteMoves.ts(173 行,拖拽/移动三入口 moveToGroup/moveWithinScope/handleDropOnRow + 共用同一dropBusyRef实例——硬性同文件约束)·hooks/useNoteListSelection.ts(133 行,多选三通道 + 菜单三态 + 唯一 Esc handler 优先级链 + visibleIdsRef 镜像 + 选集裁剪 + 批量删除)·hooks/useNoteMarquee.ts(76 行,划选整块:window 四路监听 + rAF 节流 +elementFromPoint→closest('[id^="note-row-"]')判定逐字不动)·components/NoteListBody.tsx(110 行,滚动容器 + 节/行装配 + 行色条)·components/NoteListToolbar.tsx(95 行,标题栏 + 搜索/排序/标签;导出ghostBtn供批量菜单复用)·components/NoteListBatchMenu.tsx(100 行,一个文件两个导出:NoteListBatchBar批量栏 +NoteListBatchContextMenu选集菜单(受控,菜单态与 Esc 链留在 selection hook,防双 window keydown))。另有 1 个独立小提交删除grouped死载荷(−14 行,输出不变)。主文件回归 241 行(纯编排层:props + 5 个 hook 组合 + orderActions + JSX 装配),9 个新文件均 ≤300 行无需登记,本表条目整条移除。公共 API 冻结零变化:default export ·export type SortMode· 再导出{ parseTags, fmtDate }(NoteReadingView / parseTags.test 依赖)· 27 个 props 契约不变,唯一生产消费者pages/NotesPage.tsx未改。分步实测:654 →(去重)642 →(节模型)582 →(序行 store)556 →(移动接线)442 →(多选与菜单)365 →(划选)328 →(折叠与节派生)290 →(列表体)267 →(顶栏)235 →(批量栏与选集菜单)230 →(头注释收敛)241。等价证据:全量npx vitest run104 文件 / 811 用例全绿(拆前基线 103/809;本任务新增components/NoteListView.fold.test.tsx(78 行 / 2 例)=唯一增量,既有 3 个 NoteListView 测试文件零修改通过);npx tsc --noEmitexit 0;机械不变式探针probe-verbatim-strings.mjs(27 段用户可见文案 + 5 个 IPC 命令名,全树计数)在每一步与收尾均完全一致。R3 键派生守卫:新增测试对折叠记忆的写(notes:group-fold:1、断言不写notes:group-fold:g:1)与读(预置裸键 ⇒ 组 body 不渲染)两侧断言裸键,防 scopeKey 误用导致用户折叠记忆静默失效(既有 tree.test.tsx 每测localStorage.clear()恰好掩盖该错)。未验证(诚实单列):WebView2 真实 HTML5 DnD 全矩阵(组头/行间/跨组/置顶行/折叠目标/平铺禁用/并发二次 drop)· 划选真实指针命中与拖出窗口松手 · 折叠记忆跨重启保持 · 空组清理留痕 toast —— 本任务未跑 Tauri 真机手工核对(详见.superpowers/sdd/2026-09-11-frontend-redesign-batch0c2-frontend-splits/task-2-report.md)。 已拆分:app/src/pages/ClassroomPage.tsx(2026-09-11 批 0-C2 Task 4,登记值 724 超 600 硬限;FROZEN_OVER_LIMIT行按计划在第 1 步的提交b8ff1efa内删除,⚠️ 但该提交树在"本文件之外"不自洽(评审 I1):它同时连带提交了并行 Task 3 已在工作树删掉的live_session_frame.rs棘轮行,而那棵树里live_session_frame.rs实测仍 607 > 600 ⇒ 该提交点触发规则 (a)+(e)(HEAD 自洽、本任务各步自洽)):按实测结构分析拆出 7 个新文件(全部平铺components/与hooks/,命名按裁决 D4 用ClassroomCapturePanel而非登记表旧名LiveCaptureCard)——components/ClassroomCapturePanel.tsx(297 行,实时捕获卡整体:模型四态(未就绪缺件/下载中带 MB 进度/失败/⟳ 重试)、采集状态行、VU 表、四按钮组、启动过渡与预热三态、会话行;卡内不再调useCaptureControl()(D2,唯一消费点留页面),paused/autoPaused/autoPauseHint与pausedCardText/AUTO_RESUME_HINTS随卡下沉)·hooks/useClassroomHints.ts(221 行,12 条 listen + 融合三事件 + 模型四态 + 预热状态 + 会话结束复位/starting 收口/看门狗镜像;warmUp由页面注入入参、自持并导出prepareState/setPrepareState——D1:少了任一条都不是编译错误,而是「下载完成即预热」或「点击时 prepare 重同步」静默消失)·components/ClassroomSourceColumn.tsx(157 行,左栏壳 + 滚动容器 + 六块面板装配 + 状态行;顶层恰好返回一个元素(折叠态ColumnBar,否则原 5 键样式 div),横幅/捕获卡经 ReactNode 插槽注入;ColumnResizer仍是其兄弟、留在页面无条件渲染——R2/R3)·hooks/useClassroomFloat.ts(78 行,floatSnap + toggleFloat + float_state/float:state 同步 + Ctrl+Shift+F 监听〔deps[active, floatSnap.open, toggleFloat]+active && !floatSnap.open让位守卫〕)·components/ClassroomBanners.tsx(65 行,三条页面级横幅 + 原「为什么没有第四条」注释;顶层 fragment,仍是左栏 div 的直接子元素——D3)·hooks/useClassroomWindows.ts(42 行,list_windows枚举/选中/loading + 首挂载 effect,失败文案经onStatus回写)·hooks/useClassroomShortcuts.ts(41 行,Ctrl+Shift+S 截图监听,deps[]——R4:与浮窗键仍是两个独立 window keydown,未合并)。主文件回归 278 行(纯装配层:warmUp 一次性预热〔D1〕、四个采集动作、status/lastNote 单一状态源、列状态、两个 keydown 的注入点),7 个新文件均 ≤300 行无需登记,本表条目整条移除。ClassroomPage({ onOpenSessions })的 props 契约不变,唯一消费者App.tsx未改;useColumnLayout("classroom-left", { default: 320, min: 240, max: 420, autoFoldBelow: 860 })逐字保留(R7)。分步实测:724 →(捕获卡)534 →(提示/模型 hook)421 →(横幅)402 →(左栏列)350 →(窗口 hook)325 →(浮窗 + 快捷键)278。⚠️ 提交粒度偏差(如实记录):步 1b8ff1efa/ 步 2e4923341/ 步 30d20ad71各自独立提交,步 4–6 因三步共用同一文件ClassroomPage.tsx(git commit <路径>只能整文件落库)而合并为本条提交;三步的行数已在上表逐步实测,棘轮删除与--write的正确时机仍由第 1 步提交承载。等价证据(本页零自动化覆盖):全量npx vitest run104 文件 / 811 用例全绿(与开工基线同为 104/811;开工时并行的 SessionListPanel 10 例失败已由其作者修复,收尾复跑 811 全绿);npx tsc --noEmitexit 0;node scripts/line-limits.mjs --fullexit 0;机械不变式探针probe-verbatim-strings.mjs(53 段用户可见文案 + 22 个 IPC 命令/事件名,全树计数)在每一步与收尾均完全一致(零差异)。保留的既有缺陷(只搬不改):B1(Ctrl+Shift+S 与 NoteEditView 拆段同键双义)· G6(ReadyCheckCard 与页内模型卡可能矛盾)· G7(采集中仍可改选窗口)。文档同提交:docs/Foresight/ux-market-convention-audit.md的 6 处行号引用(B1/B2/G3/G6/G7/J2-8)已改指新落点(文件名 + 该处控件/文案)并保留「拆分前 = ClassroomPage.tsx:NNN」。 已拆分:app/src-tauri/src/artifact_templates.rs(2026-09-11 批 0-C3 Task 9,单提交,登记值 632 超 600 硬限;FROZEN_OVER_LIMIT行由本任务在同一个提交内删除;⚠️ 但本表该文件行/数值的刷新与下方「已拆分」记录的落库并非本任务提交所带 —— 实由并行提交211a1cad(拆 ClassroomPage 第 4-6 步,其显式路径含本表)连带完成(git show --name-only 6d1b7a10= 只有 4 个路径、不含docs/standards/line-limit-exemptions.md);代价是211a1cad那棵树里本文件仍 632 行、棘轮行/登记行却已删且 doc 已宣布「已拆分 222 行」⇒ 该提交点文档与代码不自洽、--fullexit 1(Task 9 评审 I1 用git archive 211a1cad复现:(c) artifact_templates.rs 632),6d1b7a10落地后闭合,HEAD 自洽):按档案族拆出 2 个平铺子模块(#[path]由父模块自己声明 ⇒lib.rs零改动、lib.rs:103的mod artifact_templates;未动)——app/src-tauri/src/artifact_templates_visual.rs(210 行,图像优先族:lecture_blocks95 行 +hands_on_blocks59 行 +step_cards_blocks37 行;私有回退 569step_cards → hands_on随族闭合)·app/src-tauri/src/artifact_templates_voice.rs(239 行,语音优先族:talking_head_blocks63 +storytelling_blocks53 +interview_blocks38 +meeting_blocks66;私有回退 196talking_head → storytelling随族闭合)。主文件回归 222 行(模块头 8 +use7 +#[path] mod声明 8 + 代码帧子域(原 398–534)137 行 + 分发器build_artifact54 + 测试挂载 4)——代码帧子域留主文件的理由:已登记的artifact_templates_tests.rs(423 行 / 17 用例)直接调用code_blocks并直接构造CodeFrame,移出会强制改测试文件。口径纠偏(以代码为准):本文件不是模板正文字面量文件(多行字面量 / raw string /{{}}/{0}/%s/ emoji 全 0 命中;产物可见文本仅 8 行 / 约 69 字符 / 占 1.3%,纯逻辑 485 行),故按「档案族」拆而不是按字面量拆。可见性:既有 3 个pub项(CodeFrame/code_blocks/build_artifact)逐字不变(main 的pub行多重集与拆前完全一致),6 个被分发器调用的族函数取最小提权pub(super)(子模块可用super::访问父模块私有项,父模块调子模块项需pub(super)),storytelling_blocks保持私有(仅同族内被调用)。机械等价证据(17 个用例对输出文本零断言 ⇒ 只能靠逐字对拍):① 搬迁正文实为 416 行(原文写 415,少记 1)按行切片 byte-exact 搬运(Task 9 评审用重建等式独立证明:visual尾 193〔210 − 17 行表头/use〕+voice尾 223〔239 − 16〕= 416 = 411 行声明单元 + 5 个族内空行;实施者自己的切片区间长度和也是 416〔156 + 223 + 37〕;对账式 632 − 416 − 2 + 8 = 222 只有 416 成立)(手术脚本直接从原文件切行、不重打;落盘后回读与拆前副本按行===对拍 0 处不一致);主文件全部改动 = 416 行删除 + 2 个接缝空行(原 397/573,被mod声明块的分隔空行取代) + 8 行#[path] mod声明 + 11 处调用点加visual::/voice::前缀(6 个函数:lecture×4〔585/587/595/603〕· hands_on×2〔588/597〕· talking_head×2〔589/593〕· interview×1〔590〕· meeting×1〔591〕· step_cards×1〔599〕)+ 6 处pub(super)前缀,除此之外无一行被改写;② 8 行产物可见文本字面量(原 26 / 34 / 104 / 143 / 388 / 132 / 549 / 556)逐字命中且归属唯一,"full/{}.webp"3 份副本 0 失 1(visual 2 / voice 1),代码行含全角括号者恰 1 行(原 556"{}({})",全角()未变半角);③ 会议触发词 9 个(原 348/350/351,含"TODO"与"截止")与detect_language的 18 个语言签名 + 5 个语言名(原 511–530)逐字在位;④ 全文件 CRLF 保持(裸 LF = 0,未跑任何 formatter、未去尾空格)。门禁:cargo buildexit 0 ·cargo test --test app_lib_tests= 2359 passed / 0 failed / 6 ignored(开工基线 2358/0/6;+1 来自并行types.rs任务的新用例),17 个artifact_templates::tests全绿(含 13 kind 矩阵empty_session_produces_minimal_artifact)·cargo clippy -- -D warnings错误数不增 ·node scripts/line-limits.mjs --fullexit 0,>600硬限由 7 → 6,本文件不再出现在任何档位。既有缺陷只搬不改(登记):"full/{}.webp"3 份副本拆分后跨 2 个文件(原同文件 3 处)· 步骤卡缺省文案两套(format!("步骤 {}", i+1)带序号 vs"步骤"不带)· 模块头自称「一种原料,五种模板」而实际已有 8 个生产者(既有文档漂移)。未验证(诚实单列):未跑 Tauri 真机(本文件无 IPC 边界,产物生成唯一生产消费者commands_artifacts.rs:13/45的use与调用路径逐字未变);模板输出文本仍无整串金值断言(本批只写不改,补金值用例另立条目)。 已拆分:app/src-tauri/src/types.rs(2026-09-11 批 0-C3 Task 2,分 6 个原子提交 c7ec6181 / 14b8aaa6 / d7921d84 / 5357b304 / e473c629 / 01ed59c7,登记值 1017 超 600 硬限;FROZEN_OVER_LIMIT行按计划在第 2 步(主文件降到 594 ≤600)的提交14b8aaa6内删除、--write同批刷新;第 4 步主文件 234 ≤300 ⇒ 登记条目由生成器自动整条移除):按域拆出 6 个平铺子模块(#[path]由父模块自己声明 ⇒lib.rs:469的mod types;零改动、lib.rs一行未动)——types_session.rs(171 行,会话核心 + 详情/列表/批量结果;use super::types_ocr::{SessionOcrBlock, SessionScreen})·types_knowledge.rs(273 行,体系/问题树节点/概念/模型/引用/图谱/审计)·types_note.rs(278 行,笔记 + 笔记组 + 批 7 命令结果 + 碎片/闪卡/周契约 +NoteSortMode;default_tags()与Note同模块以保证default = "default_tags"按名解析)·types_ocr.rs(99 行,落库 OCR 块 + 屏卡;use super::types_extract::TextBox)·types_extract.rs(87 行,ADR-004 引擎层内存态)·types_decision.rs(134 行,决策/应用 +UsedRefs+ v0.13.8/v0.14.1 画布契约)。门面回归 32 行(27 行纯门面 = 6 个#[path]声明 + 6 个pub use,另 5 行是契约测试挂载),6 个子模块全 ≤300,本表条目整条移除。引用面零改动:全仓 157 文件 / 236 处crate::types::…(92 非测试 + 65 测试文件)逐字未改 —— 门面再导出与「私有模块 + 公开项」的可见性完全等价,禁用「顺手把引用改成types_note::X」(那会把一次搬运变成 236 处机械编辑 + 双份漏改回归面)。 ★ 口径纠偏(分析报告 §2 的域行数估算系统性偏小,以代码为准):analysis-types-rs.md§1/§2 的域行数只累计「#[derive]→ 右花括号」区间(如域 9 记 208 行),漏掉每项上方的///文档行与项间空行;按真实行区间,域 9 = 267 行、域 11 画布 = 44 行,合计 311 > 300(连文件头都放不下)⇒ 计划书「types_knowledge= 域 9 + 域 11」在 ≤300 硬红线下不可行(估 245 行与实测差 66 行)。裁决:画布契约(CanvasNodePosition/CanvasViewport/CanvasPrefs)并入types_decision.rs(两者同属 v0.13 知识子系统:决策是记录面、画布是视图面),维持「6 个子模块」口径不变。另:§1「default共 89 处」两种数法都不复现(#[serde(default…)]属性行 = 76、全文default词频 = 80),以代码为准。 ★ 棘轮时机实测(与计划书估算的步位不同,以实测为准):1017 →(S1 门面 + session)860 行仍 >600 ⇒ 棘轮行保留 →(S2 +knowledge)594 ≤600 ⇒ 本步提交内删FROZEN_OVER_LIMIT行 +--write,转入 301–600 档 →(S3 +note)324 →(S4 +ocr)234 ≤300 ⇒ 登记条目由--write自动整条移除(计划书写「S5 后 ≤300」,实测早一步)→(S5 +extract)155 →(S6 +decision)27 行纯门面。每步提交前实测行数、每步都跑cargo build+cargo test --test app_lib_tests。 机械等价证据(本任务第一证据):手术脚本gen-types-split.mjs从原始副本按行切片生成新文件(不重打、不转录),收尾探针verify把 6 个模块按原文件行号顺序逐块回读对拍 = 12 个块 / 998 行正文逐字节相同、顺序保持(含每一条#[serde]属性行、每一行中文注释、3 处#[allow(dead_code)])。serde 契约分布对拍(原 vs 拆后,逐项相等):struct 52 / enum 1 /rename_all="camelCase"36 /"kebab-case"1 / 无rename_all16(名单逐字一致:TranscriptSegment · WordTimestamp · TextBox · OcrBlock · NoteDraft · Note · NewNote · Session · NewSession · SessionSegment · NewSessionSegment · SessionOcrBlock · NewSessionOcrBlock · ScreenStructure · SessionScreen · SessionDetail ——SessionScreen与其邻居SessionListItem的 camelCase 不对称是历史有意,「顺手统一」会一次改坏 16 个类型的线格式)/rename="type"3 /skip_serializing_if1(GraphNode.system_id)/serde(default…)属性行 76 /default = "default_tags"1。 契约快照测试单独一个提交(14790912):types_contract_tests.rs(129 行 / 2 用例)对全部 53 个类型断言serde_json::to_string的键名 + 键序(键序 = 字段声明序;serde_json::Value走 BTreeMap 会丢序,故用序列化字符串逐字比对),外加 default / rename / skip_serializing_if / kebab-case 的反序列化断言。已做故障注入自证:临时去掉NoteGroup的rename_all = "camelCase"⇒ 测试报「NoteGroup 线格式漂移」变红;还原后复绿,且git status证明被改文件字节干净、verify探针仍绿。 门禁:cargo buildexit 0 ·cargo build --bin cer_bench --bin asr_evalexit 0 ·cargo test --test app_lib_tests2359 passed / 0 failed / 6 ignored(拆前 2357;+2 = 新增契约快照用例,用例数不减)·cargo clippy -- -D warnings15 error,与基线为同一集合(Compare-Object逐条相同,无一条落在types*.rs)·node scripts/line-limits.mjs --fullexit 0。未验证(诚实单列):真机 IPC 冒烟未做(本任务不改命令名/事件名/invoke面,但未在npm run dev下实操);.qoder/repowiki/**里types.rs#L…行锚点随拆分全部失效(生成物,非门禁)。 已拆分:app/src-tauri/src/live_session_frame.rs(2026-09-11 批 0-C3 Task 3,分 6 个原子提交40ef9593/c10c8e8c/c8e01d9d/129b4229/25cd23d5/05ac9f00,登记值 974 超 600 硬限;FROZEN_OVER_LIMIT行在第 4 步(主文件 476 ≤ 600)删除):按实测结构分析(analysis-live-session-frame.md)把 1s 主循环的 6 个子系统连同其状态与节拍搬出(全部平铺src/,#[path]由父模块自己声明 ⇒lib.rs零改动)——live_session_liveness.rs(128 行:REQ-281 停更判定 + 心跳/停更载荷 +watchdog_paused_probeWGC 自愈;§10 敏感面留在live_session_*命名内)·live_session_worker_state.rs(268 行:FrameWorkerState聚合 22 装配参数 + 46 主循环状态量 +compensated_epoch(),即 TD-24-A 既定 Ctx 方案 / D2)·live_session_pause_poll.rs(201 行:前台门控 250ms 拍 + 暂停期轻量轮询 +light_poll_enabled/media_sound_recent两纯函数;配套live_session_pause_poll_tests.rs29 行)·live_player_probe.rs(165 行:5s 播放器图标检测 + 10s 播放器区域 OCR 信息探测,含recognize_image_timeout(…, OCR_REQUEST_TIMEOUT)有界等待变体)·live_profile_runtime.rs(213 行:tier 观测/升降档 +profile_override三维热切换消费 + 领域 150s 重评)·live_session_consume.rs(183 行:媒体 1s 拍 / 负载 2s 拍 / 采样 1s 拍 / 15s 诊断打印)。主文件回归 174 行(模块文档 +LatestCapturedFrame(D4 不迁)+ 3 常量 + 公共签名 + 循环骨架 + 收尾 + 6 条#[path]声明 + 测试声明),6 个新文件均 ≤300 行无需登记,本表条目整条移除。run_screen_worker公共签名与调用点(live_session.rs:305)零变化(唯一非语义改动:mut image_store/mut foreground_monitor两个按值绑定的mut去掉——聚合后不再在本函数内变异,留着会触发unused_mut警告并使 clippy-D warnings计数上升;mut不是函数类型的一部分,调用点零改动)。分步实测:974 →(停更监测)866 →(状态聚合)761 →(暂停轮询)607 →(播放器探测)476 →(档案运行期)295 →(采样消费)174。★ 与分析报告/计划书的两处命名偏差(D1 裁决优先于 Files 清单):分析 §2 与计划 Files 列的live_frame_worker_state.rs/live_frame_consume.rs改名为live_session_worker_state.rs/live_session_consume.rs—— 两者都碰屏幕捕获/暂停/隐私共享槽,D1 明文「不得为规避 §10 额外审查而取名live_frame_*」;live_session_liveness.rs/live_session_pause_poll.rs/live_player_probe.rs/live_profile_runtime.rs与清单一致。机械等价证据(顺序/锁/时序第一优先):① 搬迁全部由脚本按行切片完成(不手抄),落盘后与拆前副本逐行对拍:初始化块 111 行 · 主循环+收尾 574 行 · 前台门控块 37 行 · 暂停轮询体 105 行 · 播放器拍 80 行 ·probe_player_info56 行 · 档案决策块 186 行 · 四个 tick 块 32/13/76/11 行 —— 全部 0 处差异(唯一变换 =w.→self.前缀 + 必要 dedent +probe_player_info改super::路径);② 1s 节拍顺序逐字不变(前台门控 250ms → 暂停检查 → 恢复沿sleep(100ms)→ 补偿纪元 → 媒体 1s → 负载 2s → 采样 1s(含档案拍/播放器拍)→ 15s 诊断 →sleep(50ms)),块间隐式数据流(stats.diff_pass/ocr_ok先在process_frame内更新、其后被 tier 观测读差量;accumulated_ocr_text更新后被领域重评读;got_frame内部清零后被读)读点位置不变;③if let Some(f) = latest_frame.lock().ok().and_then(|g| g.clone())的语句级短锁逐字保留(live_player_probe.rs内,D3:不把 clone 提到if之前)——⚠️ 2026-09-11 Task 3 评审实证纠偏:该写法把MutexGuardmove 进and_then闭包,闭包返回时守卫即释放 ⇒if let块体(人脸 CV / 落库 /emit/ 有界 OCR)全程无锁;原文的「长锁窗口」模型不成立(探针tmp/t3rev/guard_probe.rs+rustc --edition 2021实测:body: 锁在块内已释放=true;对照组.map(|g| …)闭包内仍持锁);④ 嵌套锁顺序profile_override → applied_tier/applied_profile未倒置(live_profile_runtime.rs);⑤db 写 → pause.request_* → app.emit三元组顺序与 16 处 emit(⚠️ 计划书plans/2026-09-11-frontend-redesign-batch0c3-rust-splits.md:203/228写的「15 处」是错的 —— Task 3 评审逐名复算基线 = 16,与本条一致)事件名逐字不变(probe-emit-parity.mjs:全树 52 事件名 / 73 处 emit 计数与基线逐条相同;9 个 live 事件名逐名计数不变,拆后 7 文件合计仍 16);⑥ 同步原语归属不变(speech_active仍Relaxed;media_sound锁中毒仍按无声;total_paused_ms仍只读、唯一维护者是捕获线程;ScreenCaptureSampler仍在本线程创建/screen.take()释放);⑦recognize_image_timeout(…, OCR_REQUEST_TIMEOUT)未被"统一"成无界变体。门禁:cargo buildexit 0(零新增警告)·cargo test --test app_lib_tests2359 passed / 0 failed / 6 ignored(用例数不减;light_poll_*2 例按 D5 随函数迁至live_session_pause_poll_tests.rs并在新路径复跑通过,bgra_*2 例按 D5 留原处)·cargo clippy -- -D warnings= 15 error(与开工基线逐条相同)·cargo build --bin cer_bench --bin asr_evalexit 0 ·node scripts/line-limits.mjs --fullexit 0。⚠️ 棘轮行删除的跨任务连带(与 Task 1/Task 2 同款,如实记录):本任务第 4 步前把FROZEN_OVER_LIMIT里自己那一行删到了工作树(等待钩子期间),随后并行提交b8ff1efa(拆 ClassroomPage 第 1 步,显式路径含scripts/line-limits.mjs)把它一并落库——该提交点live_session_frame.rs仍是 607 行 > 600 ⇒ 那一棵树触发规则 (a)(>600 却不在棘轮名单内)与 (e)(该树登记表里本文件声明 476 / 实测 607,line-limits.mjs的 (e) 数值一致守卫;Task 3 评审 §5② 逐条读源码确认)——--full红;HEAD 自洽,本任务 6 个提交各自自洽(c8e01d9d:行在 / 607;129b4229起:行删 / ≤600)。复现:git log -p -- scripts/line-limits.mjs。未修(出界登记)→ 伪遗留项(2026-09-11 Task 3 评审实证撤销):原文写「451–476 / 816–875 两处latest_frame长锁窗口(持锁做 CV + 落库 + IPC)按 D3 原样保留,需独立立项与真机验证」——该模型不成立:两处(原 451 / 原 816,拆后分别在live_session_pause_poll.rs:160与live_player_probe.rs:38)都是latest_frame.lock().ok().and_then(|g| g.clone()),守卫 move 进闭包、闭包返回即释放,块体无锁(探针tmp/t3rev/guard_probe.rs用rustc --edition 2021实证;全仓latest_frame.lock()共 5 处,另 2 处在live_frame_process.rs:138/298是if let Ok(mut guard)真持锁形态、与本条无关);搬迁时两侧同形 ⇒ 等价性不受影响,「长锁窗口需独立立项」是伪遗留项(撤销,不再计入出界登记)(相关真机项仍列在本节末「本批未执行的真机验证」清单);LatestCapturedFrame按 D4 不迁(6 处跨 5 文件引用)。只能真机验证(本任务无法覆盖):WGC 停更判定与revive_wgc自愈 · 暂停冻结与comp_epoch时间戳补偿 · 空闲降频与 5s 探针唤醒 · 负载降级 0.1fps 封顶 · 前台切换 ROI 重扫 · 播放器图标检测 ·live:tier-downgrade-request→ 前端确认往返 · 截图命令读latest_frame。 已拆分:app/src-tauri/src/ai_refine_task.rs(2026-09-11 批 0-C3 Task 7,4 个原子提交19dd641c「步 1 — 并发 worker 池」/12eadb4f「步 2 — 终态骨架」/ 步 3「屏卡图装载」(本记录同提交)/ 步 4「流式帧推送」,登记值 670 超 600 硬限;⚠️ FROZEN_OVER_LIMIT行的删除不在本任务任何提交里 —— 本任务第 1 步在工作树里删掉该行后,它被并行提交b3aa4a9a(拆 commands_goals 读侧视图,其显式路径含scripts/line-limits.mjs)连带落库(同一提交还连带带走了 db_goals.rs 与 note_filter.rs 两行);代价是b3aa4a9a那棵树里 ai_refine_task.rs 实测仍 670 行 ⇒ 该提交点触发规则 (a)(>600 却不在棘轮内),HEAD 与本任务各步提交自洽。复现:git log -p -- scripts/line-limits.mjs):按并发域边界拆出 4 个子目录模块(app/src-tauri/src/ai_refine_task/,#[path]由父模块自己声明 ⇒lib.rs:41的mod ai_refine_task;零改动、父文件路径不变、无 rename 噪声;父文件不改成mod.rs)——ai_refine_task/workers.rs(277 行:RefineCtx12 字段并发参数聚合 +slice_summary纯函数 +turn_user_text+refine_slices_concurrent编排(原 467–657,180 行)+SLICE_RETRY;原 69–70 / 362–380 / 382–400 / 467–657 / 659–670)·ai_refine_task/skeleton.rs(117 行:push_refine_audit+run_refine_task_skeleton(catch_unwind 归一 + 成功/失败两路 轨迹落库/结果写注册表/set_task/终态帧/审计/finish_ai_task+trim_ai_tasks);原 72–83 / 85–168)·ai_refine_task/vision.rs(77 行:load_session_vision_images(数值时间戳倒序取最近 3 张 → 长边 ≤1280px 缩放 → PNG base64 data URI);原 402–465)·ai_refine_task/stream.rs(26 行:RefineStreamPayload+ 唯一 emit 点emit_refine_stream;RefineStreamFrame按 D5 留在父文件(外部唯一引用点ai_note_refine_task_tests.rs:27),子模块use super::RefineStreamFrame;)。父文件回归 260 行(契约与装配:CONCURRENCY+RefineStreamFrame5 帧 + 会话级入口run_refine_task+ 主体run_refine_task_inner129 行 +build_refine_adapter+ 4 条#[path] mod声明与 re-export);5 个文件全部 ≤300 行,本表条目整条移除。★ 并发语义第一优先(逐条等价核对;本文件 0 专属测试、全仓#[tokio::test]= 0 ⇒ 只能逐行搬运 + 人工核对):①turns轨迹槽的方法链临时守卫(原 596–607)整段逐字搬运,锁窗口仍覆盖build_system+turn_user_text+serde_json::to_string(&r)(未改成「先建AiTurn再 push」=未缩短锁窗口);②drop(tx)与rx.iter()仍在同一函数同一顺序(collect 在std::thread::scopejoin 全部 worker 之后,未搬进 scope 内);③ 线程创建链不变(命令层spawn_blocking(原commands_ai_refine.rs:247,Task 4 已把该文件拆成目录模块 ⇒ 现锚点为commands_ai_refine/session.rs:176::176spawn_blocking(move || {/:177crate::ai_refine_task::run_refine_task(…),JoinHandle 未 await;Task 7 评审 M-3 逐字比对) →thread::scope→scope.spawn1..=3 线程),本文件 0 处 tokio/abort/cancel/timeout(超时仍在下游ai_client.rs:238的 300s);④ 12 条共享状态的「谁写/谁读/持锁范围」逐条未变(stdmpsc::channel、Arc<Mutex<VecDeque<usize>>>、Arc<Mutex<Vec<AiTurn>>>、Arc<Vec<AiRefineRequest>>原样);⑤ 事件名逐字不变:"ai:refine-stream"(唯一 emit 点、5 种帧 Done/Delta/Progress/BlockDone/SliceFailed)与经set_task的"ai:task-update"(本文件 4 处触发点 = skeleton 2〔Succeeded/Failed〕+ 父 1〔Running 起始〕+ workers 1〔每片推进〕,与拆前一致);⑥ 三种进度口径未统一(Progress用pos+1、BlockDone/SliceFailed用slice_idx+1、Delta用idx+1);⑦RefineCtx字段序(= 构造序/可读性契约)与SLICE_RETRY=1/CONCURRENCY=3/MAX_EDGE=1280/MAX_IMAGES=3数值逐字未变。可见性:RefineCtx/refine_slices_concurrent/slice_summary/turn_user_text/run_refine_task_skeleton/CONCURRENCY/RefineStreamFrame的可见性逐字不变(前 5 者由父文件pub(crate) use再导出 ⇒ai_note_refine_task.rs:13,88与commands_ai_refine.rs:247四处外部引用一行未改);新增放宽只有 2 处最小必要:load_session_vision_images私有 →pub(super)、emit_refine_stream私有 →pub(super)(父模块调子模块项必须提权;两者不改变任何外部可见面)。机械等价证据:手术脚本按「行号区间 + 锚点断言」逐行切片搬运(不手抄、不重打;脚本对每段断言首行锚点与末行列 0 的}),收尾探针把(父 ∪ 4 子)的非空行多重集与原文件(670 行 / 653 非空行,取自git show 19dd641c^:)对拍 = 0 行丢失,唯一差异是 2 行(均为最小必要提权;原文写「1 行」,漏记emit_refine_stream—— Task 7 评审 I-1 实测):fn load_session_vision_images(…)→pub(super) fn …(vision.rs,74e9a5c6引入时确实只有这 1 行)与fn emit_refine_stream(…)→pub(super) fn …(stream.rs,直到步 4ee020120才出现 ⇒ 该数字未随步 4 同步),其余字符逐字相同;新增行全部属于 模块头/#[path] mod声明/pub(crate) use再导出/use随搬 四类。门禁:cargo test --test app_lib_tests2359 passed / 0 failed / 6 ignored(与拆前基线逐字相同,步 1/步 2 各测一次)·cargo check/cargo buildexit 0(步 1 实测;步 3 起工作树被并行 Task 4 的commands_ai_refine/mod.rs中间态阻塞,见报告)·node scripts/line-limits.mjs --fullexit 0(>600计数 3 → 0)。既有缺陷只搬不改(分析报告 R7 的 7 条一条未动):catch_unwind 只包work、中毒锁语义不一致(122into_innervsset_task的if let Ok静默跳过)、emit_refine_stream用let _ =吞错、403–413 文档与 306 任务级覆写口径不一致、workers双重钳制冗余、drop(tx)注释与事实不符、三种进度口径不同。 已拆分:app/src-tauri/src/commands_goals.rs(2026-09-11 批 0-C3 Task 6,3 步 3 个提交b3aa4a9a「步 1 — 读侧视图」/67427ee1「步 2 — 里程碑写入域」/ 本提交「步 3 — 访谈输入契约」,登记值 673 超 600 硬限;FROZEN_OVER_LIMIT行按计划在第 1 步(主文件 501 ≤600)删除,实测确实落在b3aa4a9a内(git log --oneline -S" 'app/src-tauri/src/commands_goals.rs'," -- scripts/line-limits.mjs= 只有b3aa4a9a与本工具引入提交8ba2cf84);⚠️ 同一提交连带落库了另外三位实施者已在工作树删掉的三行(db_goals.rs/ai_refine_task.rs/note_filter.rs,git show b3aa4a9a -- scripts/line-limits.mjs显示 4 行删除),代价是b3aa4a9a那棵树里这三个文件实测仍 707 / 670 / 642 > 600 却不在棘轮名单内 ⇒ 该提交点触发规则 (a);同理67427ee1那棵树里commands_ai_refine.rs仍 751 > 600 而名单已空(该行由并行 Task 4 在工作树删掉、被本提交连带)——HEAD 自洽、本任务各步源码自洽。复现:git log -p -- scripts/line-limits.mjs):拆出 3 个平铺子模块(#[path]由父模块自己声明 ⇒lib.rs:150的mod commands_goals;零改动、lib.rs一行未动)——app/src-tauri/src/commands_goals_views.rs(197 行:5 个视图 DTOGoalCardView/GoalDetailView/GoalGroupView/ReadinessView/GoalProgressView+list_goals/get_goal_detail/get_goal_progress3 条读命令 + 3 个读 inner +goal_card_metrics/client_check;0 emit)·app/src-tauri/src/commands_goals_milestones.rs(181 行:suggest_goal_milestones/add_goal_milestone/update_goal_milestone/delete_goal_milestone/set_goal_milestone_status/bind_goal_group/unbind_goal_group7 条命令 + 4 个 inner +MILESTONE_STATUSES/CRITERIA_TYPES2 个白名单常量;6 emit)·app/src-tauri/src/commands_goals_intent.rs(97 行:GoalCreateInput/GoalMilestoneInput2 个 IPC 输入 DTO +parse_domain/trimmed/bounded/build_intent4 个纯助手;无命令、无 DB、无 IO)。主文件回归 272 行(5 条核心命令 create/update/update_interview/delete/update_status + 5 个核心 inner + 跨模块 seamrequire_goal/collect_signals/parse_criteria——故commands_goals_lifecycle.rs/commands_goals_plan.rs零改动——+goal_created埋点 + 3 条#[path] mod声明 + 测试挂载 3 行),四文件全 ≤300 ⇒ 本表条目整条移除。分步实测:673 →(views)501 →(milestones)344 →(intent)272。★ 与计划书/分析报告的三处偏差(读码后以代码为准):① 子模块必须写成pub(crate) mod,不能照抄计划书的裸mod views;/ 分析 §2.0.1 的同款片段 —— 注册清单在app_commands.rs(crate 根的兄弟模块)按crate::commands_goals::views::x解析,且commands_goals_lifecycle_tests.rs/_plan_tests.rs是commands_goals_lifecycle/_plan的子模块、按crate::commands_goals::intent::GoalCreateInput导入;裸mod下两处分别是 E0433 与 E0603(后者在并行 Task 4 的commands_ai_refine::workbench上当场复现过同款错误)。② 11 处 emit 的条件分布是「2 处无条件 + 9 处if ok」,不是分析 §1.3 写的「5 处无条件 + 6 处 if ok」(逐行实测:138create_goal、236add_goal_milestone无条件;172/187/198/209/254/267/277/288/298 在if ok {内)——add_goal_milestone不是唯一无条件的一位,create_goal同样无条件(Task 6 评审 §三 逐行复核:实施者的纠正正确,计划/分析的说法都不符代码;⚠️ 源码注释commands_goals_milestones.rs:5仍写「add_goal_milestone是唯一无条件发的一位」—— 该句仅在「本文件内」成立〔域内另一位无条件者在父commands_goals.rs〕,评审建议加「本文件内」限定语,属只改注释的待办)。③ 实测行数与估算相差:三个新文件 197/181/97(估 194/180/102),父文件 272(估 ≈253,差额=3 条#[path]声明的两行 doc 注释与 import 分组)。★ 注册路径(本任务唯一静默风险面):15 条 IPC 名逐字不变,其中 10 条路径由两段改三段(3 条commands_goals::views::+ 7 条commands_goals::milestones::),全部在app_commands.rs同批改写;intent无命令 ⇒ 零改动,5 条核心命令路径保持两段。机械证据:node scripts/check-command-registry.mjs= ✅ 定义 334 / 注册 334 / 重复 0;node …/probe-registry-parity.mjs verify …/snap-registry-baseline.json app/src-tauri/src/app_commands.rs= ✅ 按末段名 334 条逐条相同(含 10 条 cfg 门控)+ 打印 11 条「路径前缀变化」(10 条属本任务,第 11 条commands_ai_refine::refine_workbench → ::workbench::属并行 Task 4)。★ 行为等价证据:emit_changed(&state.app, crate::notify::DataDomain::Goals)三文件合计 11(父 5 / milestones 6 / views 0;if ok分属 4 / 5,add_goal_milestone的无条件形态逐字保留);cargo buildexit 0;cargo test --test app_lib_tests2359 passed / 0 failed / 6 ignored(与拆前基线逐字相同;goals 相关 23 例不减:commands_goals::tests13 /commands_goals_lifecycle::tests6 /commands_goals_plan::tests4 —— 父文件末尾#[cfg(test)] #[path = "commands_goals_tests.rs"] mod tests;三行原样保留);cargo clippy -- -D warnings15 error(= 基线 15,未增)且无一条落在commands_goals*.rs;node scripts/line-limits.mjs --fullexit 0 且>600计数 0。既有缺陷只搬不改:update_goal_milestone/delete_goal_milestone无 inner 且零单测覆盖、两处let _ = db.add_metric_event(...)吞错、get_goal_detail_inner(checks 上提为顶层criteria、progress.checks置空)与get_goal_progress_inner(checks 留在progress.checks)的刻意不同口径未统一。未验证(诚实单列):15 条命令的真机 IPC 可达性未做(本任务未起 dev server;注册边界只由check-command-registry.mjs+ 编译期路径解析 + 探针兜底);update_goal_milestone/delete_goal_milestone与 15 条命令壳、11 处 emit 仍零测试覆盖(补测属出界,另立条目)。 已拆分:app/src-tauri/src/db_goals.rs(2026-09-11 批 0-C3 Task 5,6 步 6 个提交df2b1a50「步 1 — 里程碑域」/368b2d84「步 2 — AI 规划域」/b974a193「步 3 — 目标域」/077b9acb「步 4 — 回顾取数域」/5b9a4b58「步 5 — 绑定域」/ 本提交「步 6 — 毕业报告域」,登记值 707 超 600 硬限;FROZEN_OVER_LIMIT行按计划在第 1 步(主文件 591 ≤600)删除,⚠️ 实测该删除不在本任务任何提交里 —— 本任务第 1 步在工作树删掉该行后,它被并行提交b3aa4a9a(拆 commands_goals 读侧视图,其显式路径含scripts/line-limits.mjs)连带落库(git log -S"'app/src-tauri/src/db_goals.rs'," --oneline -- scripts/line-limits.mjs只命中b3aa4a9a与工具引入提交8ba2cf84);代价是b3aa4a9a那棵树里 db_goals.rs 实测仍 707 行 > 600 却不在棘轮内 ⇒ 该提交点触发规则 (a),而 HEAD 与本任务各步提交自洽。复现:git log -p -- scripts/line-limits.mjs)——按域硬拆为 6 个平铺兄弟文件(#[path]由父模块自己声明 ⇒lib.rs的mod db_goals;与db_migrations.rs的crate::db_goals::init(conn)一行未改):db_goals_milestone.rs(141 行:6 个里程碑 CRUD +add_milestone_row(三写路径共用;私有 →pub(super)最小放宽)+row_to_milestone行映射)·db_goals_plan.rs(233 行:apply_plan_core事务 +link_goal_to_system+goal_systems+goal_concept_activities+goal_plan_context)·db_goals_goal.rs(144 行:6 个 goals 实体 CRUD +create_goal事务 +row_to_goal)·db_goals_retro.rs(101 行:结算快照 / 复习统计 / 成果物清单只读聚合)·db_goals_binding.rs(67 行:绑定 3 方法 +mark_group_settled_milestones结算钩子)·db_goals_graduation.rs(54 行:毕业报告快照表读写)。主文件回归 88 行(= 分析报告的地板估算 88:模块文档 9 +use3 + 6 条#[path] mod声明与节注 19 +init50 + 空行 4 + 测试接线 3),7 个文件全 ≤300 ⇒ 本表条目整条移除。分步实测:707 →(milestone)591 →(plan)384 →(goal)260 →(retro)177 →(binding)128 →(graduation)88。 ★ schema 零改动(本任务红线,逐条声明):init与 9 条CREATE整段原地未动 —— 原 20–69 行的pub(crate) fn init逐字节留在主文件(现 35–84 行);9 条 DDL 的原始行号 23(CREATE TABLE IF NOT EXISTS goals)/35(idx_goals_status)/36(goal_milestones)/48(idx_milestones_goal)/49(goal_groups)/56(idx_goal_groups_group)/59(goal_graduation_reports)/66(idx_graduation_goal)全部原样,含 57–58 两行 SQL 行注释与 66 行尾",;本文件PRAGMA/ALTER TABLE/DROP各 0 条(拆后复核仍 0)。跨文件 schema 假设(contracts唯一索引db_migrations.rs:171之于ON CONFLICT(group_id, week_start);knowledge_links无 UNIQUE 之于link_goal_to_system先查后插)均未触碰。机械证据:SQL 关键字行多重集 = 原 77 行 vs 拆后 7 文件并集 77 行,逐字相等(0 处差异)。 ★ 行为等价证据(机械 + 人工):① SQL 行多重集 77/77 逐字相等;② 原文件 703/707 行能在 7 文件并集里逐字找到(Task 5 评审实测更正:原写「707 行每一行」;差的 4 行 = 原use crate::goal_schema::{…}块被重排成 4 条文件内use,其 8 个符号经复核 8/8 仍有归属;未覆盖的非白名单行 0;函数体与pub fn名 27/27 逐字节相等);③pub fn名字多重集 27/27 逐一相等(无增/无减/无改名 ⇒Db公开方法面零变化);④ 结构锚点计数全等:unchecked_transaction()2/2(create_goal/apply_plan_core——两个显式事务的起止与「恢复路径带 ROLLBACK」性质未变)、tx.commit()2/2、#[allow(dead_code)]1/1(goal_systems,漏带会新增 warning)、self.with_conn(27/27(一方法一锁粒度未变)、params一类 IDE 生成深链虽已陈旧(init现居 35–84),不作为本批门禁对象(Task 5 评审 Minor-4 补理由:.qoder/被忽略、非跟踪物、非门禁输入)。评审复核:已跟踪文档 0 处db_goals.rs:<行号>锚点 —— 上述命中全部落在未跟踪的审查快照 / 只读归档 / gitignore 缓存内。判定:本批无需同步任何 docs 文件。🔻 2026-09-13 加注(T26 归档后补记):docs/tech-debt/已归档到docs/archive/2026-09-13/(快照 review-2026-09-11.md,内容零改动、行锚点逐字有效)⇒ 上句的路径与「未被 git 跟踪」在当时成立,原文保留;后续引用该快照请用新路径。 门禁:cargo buildexit 0(步 1–6 各测一次)·cargo test --test app_lib_tests2359 passed / 0 failed / 6 ignored(与拆前基线逐字相同;goals 相关 80 例不减;全内存库Db::open(":memory:"),不连真实数据)·cargo clippy --all-targets -- -D warnings拆后 21 error ——⚠️ 判据按 Task 5 评审 Minor-2 改写为:cargo clippy -- -D warnings的 lib 15 error(= 计划书记载基线 15,未增)、无一条落在db_goals*;原写「同树〔含并行任务改动、不含本任务改动〕基线 23 ⇒ 本任务新增 0」中的「基线 23」依赖当时并行工作树、评审无法复现**,故不以它为判据(「新增 0」结论仍成立,且证据更直接:db_goals*.rs相关诊断 0 条)(-D warnings下unused_imports会变 error,故见偏差 ②)·node scripts/line-limits.mjs --fullexit 0 且>600计数 0(707 时代起算 −1)。未验证(诚实单列):① 未做真机(目标创建 / 里程碑 / 计划应用 / 复盘 / 绑定 / 毕业六条动线的读写往返)——只跑内存库单测,未起 dev server;②goal_plan_context零测试覆盖(恰是原文件最大函数 69 行):仅逐行搬运 + 上述多重集核对,其 4 个 SQL 执行点与 15 行 SQL 文本的运行期行为无回归网;③ 旧库升级面未实测(init幂等依赖CREATE TABLE IF NOT EXISTS;SQL 文本未变 ⇒ 语义面零变化,但无真实旧库样本);④ 6 个新文件的中间态只在各自提交点跑过 build + test,未做并发/乱序调用的额外压测。 已拆分:app/src-tauri/src/note_filter.rs(2026-09-11 批 0-C3 Task 8,3 步 3 个提交a0c5e62f「第 1 步 — 渲染层」/38557f8b「第 2 步 — 净化纯函数族」/ 本提交「第 3 步 — 转写段过滤链」,登记值 642 超 600 硬限;⚠️ 棘轮行的删除不在本任务任何提交里 —— 本任务第 1 步已在工作树删掉'app/src-tauri/src/note_filter.rs',,它被并行提交b3aa4a9a(拆 commands_goals 读侧视图,其显式路径含scripts/line-limits.mjs,同批连带删掉 db_goals / commands_goals / ai_refine_task 三行)连带落库;复现git log -p -- scripts/line-limits.mjs。反向连带:本任务a0c5e62f也带走了并行 Task 4 在工作树删掉的'app/src-tauri/src/commands_ai_refine.rs',行(git show a0c5e62f -- scripts/line-limits.mjs)——该提交点 (a) 仍自洽(当时该文件实测已 ≤600)。登记表落库归属:S1 的「拆分进行中(S1/3)」文本落在233528a5、S2 的 426 行刷新落在本任务38557f8b(该提交只含 3 个文件:note_filter.rs / note_filter_purify.rs / 本表)、S3 的 262 行整行移除落在并行提交fcea5ccd):拆出 3 个平铺子模块(#[path]由父模块自己声明 ⇒lib.rs:399的mod note_filter;零改动、lib.rs一行未动;与既有note_filter_ai.rs/_discourse.rs/_ocr.rs三兄弟同形)——note_filter_render.rs(154 行:render_screen_points+apply_session_warning+refresh_screen_points+rebuild_markdown+ 私有assemble_purified_markdown;原 493–620)·note_filter_purify.rs(134 行:FILLER_WORDS+purify_segment+is_purified_empty+is_filler_only+concat_transcript+is_fragment+ 私有is_cjk;原 55–65 / 401–446 / 448–452 / 454–470 / 472–480 / 482–491 / 622–626)·note_filter_chain.rs(199 行:filter_note_transcript整函数 167 行逐字搬运;原 212–378)。主文件回归 262 行(模块文档 29 + 4 条use+ 3 条#[path] mod声明 + 3 条再导出 + 1 条链入口use+PurifyEnv/RULE_VERSION+ 5 个公共类型 +filter_note/filter_note_empty+ AI 再导出 + 2 个测试挂载),四文件全 ≤300 ⇒ 本表条目整条移除。分步实测:642 →(渲染层)528 →(净化族)426 →(过滤链)262。 ★ 口径纠偏(以代码为准):本文件不是查询构造层 ——SELECT|INSERT|UPDATE|sql|regex|Regex|LIKE|ESCAPE|r#"|\.execute|query|prepare|OnceLock|lazy_static|target_os|feature全文件 0 命中,是纯内存文本过滤管线(0 IO / 0 DB / 0 网络 / 0 正则 / 0 全局缓存 / 0impl块)。分析的 §1 行号表与实测逐条吻合(25 个顶层命名项、filter_note_transcript167 行、purify_segment46 行、FilterStats40 行),无偏差。 ★ 等价证据(机械优先):搬迁由脚本按行区间切片完成(不重打、不转录),落盘后tmp/.task8-verify-move.mjs把三段从拆前 642 行副本按原行号回读对拍 ⇒ 128(render)+ 109(purify)+ 167(chain)= 404 行逐字一致,0 处内容差异(唯一差异是 6 处pub(crate)可见性前缀,探针显式剥离)。判定顺序 = 语义(第一优先,逐条核对):① 单遍 6 规则顺序 ①ui_junk→②低置信→③过渡→④口头禅→⑤碎片→⑥净化残留未动,③(过渡)仍在 ⑤(碎片)之前(否则 reason 从Transition变Fragment、stats.transition少计);② ⑥ 净化仍在 ⑧ 相邻去重之前(否则「嗯…嗯」与「嗯」判不出重复);③ ⑦ 修辞问句仍是跨段后置 pass(在单遍循环之后、kept全集就绪),未挪进循环;④purify_segment内部折叠仍先于书面化(否则 3 连先压成 2 连、折叠规则不再命中);⑤stats.filler += 1两处(④口癖命中 / ⑥净化残留)仍分列不同分支;⑥ ⑧ 合并仍写last.end_ms = last.end_ms.max(seg.end_ms)。公共 API / 契约面零改动:PurifyEnv+RULE_VERSION+FilterReason/FilteredItem/FilterStats/MergedItem/NoteFilterResult原地不动(#[serde(rename_all="kebab-case")]、10 个#[serde(default)]、4 个#[serde(skip)]、字段声明序 = JSON 键序全部逐字未变);filter_note的两个filter_note_transcript(...)调用点字面量逐字未改(新增use self::chain::filter_note_transcript;保持名字可达,未改调用文本);外部 17 文件 / 37 处crate::note_filter::…(commands_ai.rs:229-230、commands_session_note.rs:162-163/448-449、note_filter_ai.rs:11/242)零改动。可见性(D4,只放宽必要的):5 个净化纯函数 +filter_note_transcript放宽为pub(crate);is_cjk与assemble_purified_markdown保持私有;再导出可见性 1:1(pub use self::render::{refresh_screen_points, render_screen_points};pub(crate) use self::render::{apply_session_warning, rebuild_markdown};pub(crate) use self::purify::FILLER_WORDS)——未触发 E0365(分析 U1 由本次编译实测排除:pub use包pub项、pub(crate) use包pub(crate)项即可)。测试盲区(无拦网,靠逐字 diff):25 例中无一例带image_ref⇒render_screen_points的配图行格式串(- ,含两空格缩进)与 EN DASH"[{}–{}]"/" · "/"画面 {}"全部分隔符由上述逐字对拍证明未改;OCR 文本直拼 markdown 的既有注入面 只记录不改。既有缺陷(D6 只搬不改,逐条登记):filter_note_empty不接收env、写死purify: PurifyConfig::default()(留在主文件,零改动)·refresh_screen_points的BodySource::Web落_分支 ⇒ 空kept重建退化为标题仅(说明随迁入note_filter_render.rs模块头@ai-context)·is_purified_empty/is_fragment的is_cjk语义冗余 ·is_filler_only手写全角标点集 ·concat_transcript末段尾随半角空格 —— 全部逐字保留。 ★ 与分析的实现偏差(实测修正,2 处):① 分析 §2/§8-S1..S3 提议「lib.rs:399后插 3 行mod」,计划书 Global Constraints 优先:3 个模块全部由父模块自己用#[path]声明(mod render;/mod purify;/mod chain;),lib.rs一行未动(同时避开分析 U6 指出的并行lib.rs冲突面)。②render_screen_points在拆后全仓无任何消费者(唯一调用点在过滤链内)⇒ 若 chain 直接写super::render::render_screen_points,父模块的pub use绑定就成了unused_imports警告(-D warnings下 = clippy error +1);故 chain 改为经父模块再导出消费use super::render_screen_points;,既消除警告又保住crate::note_filter::render_screen_points这个拆前就存在的入口名。③ S2 中间步主文件仍需use self::purify::{concat_transcript, is_filler_only, is_fragment, is_purified_empty, purify_segment};(filter_note_transcript当时尚未迁出),S3 随函数迁出同步下线该行(否则unused_imports)——这是分 3 步走带来的、每步都自洽的必要动作。 ★ 门禁与未验证(诚实单列):cargo buildexit 0(三步各一次,S3 后无新增警告)·cargo test --test app_lib_tests2359 passed / 0 failed / 6 ignored(三步各一次,与开工基线逐项相同;开工时任务书写 2357,实测 2359 = 并行 Task 2 新增 2 个types_contract_tests快照用例,用例数不减)· 域内 62 例逐文件计数不变(note_filter25 = tests 11 + golden 14 /note_filter_ai13 /note_filter_discourse8 /note_filter_ocr16)·node scripts/line-limits.mjs --fullexit 0(>600硬限 0、棘轮名单空)·cargo clippy -- -D warnings:未采到干净基线 —— 开工时那次采集被本任务自身的中间编辑态污染(报 8 个 E0255/E0425,均属"再导出已加、定义未删"的瞬时态),随后共享工作树持续被 4 位并行实施者的中间态打断(ai_refine_task/vision.rs未闭合定界符等),故本任务只给出收工侧实测:S3 后cargo build0 warning,新增 3 个文件无unused_imports/dead_code类告警(期间唯一一次自引入的unused_imports已在38557f8b→S3 之间修正)。未验证:真机 IPC 冒烟未做(本任务不改命令名/事件名/invoke面);.qoder/repowiki/**里note_filter.rs#L…行锚点随拆分失效(生成物,非门禁)。 ★ 2026-09-11 逐条复核(批 0-C2 Task 6「登记表收敛」):本节当时共 31 条记录(计划书写 16 条、派发词写 22 条 —— 差额是 0-C2/0-C3 各任务陆续回写所致),逐条按当前实测核对「≤300 无需登记 / 登记移除」结论(口径 =scripts/line-limits.mjs的countLines,即全部行数含空行)。6 条被否证、已就地标注更正(记⚠️ 2026-09-11 复核更正,写明复核值,不删除):engine_worker.rs321 ·db_migrations.rs573 /db_notes.rs366 /db_notes_tests.rs337 ·live_session.rs394 /live_session_lifecycle.rs376 ·GroupSidebar.tsx519 /RouteInfoPopover.tsx375 ·dxgi_capture.rs331 ·NoteEditView.tsx411(原更正只写到 306,续增后补记)—— 这些文件均已在上表 301–600 档登记(生成器补登)。2 条为信息性补充(记(2026-09-11 复核:…)):live_frame_process.rs529 ·live_session.rs394 /live_session_frame.rs174。其余记录逐条复核实测值与记录一致(video_profile285 + 2 文件 157/236 ·lib.rs577 /app_commands.rs503 ·live_pipeline_diag.rs已删除 ·streaming_asr466 /streaming_endpoint.rs114 ·lib.rsv0.7.5 一条与「重新越线并登记」自洽 ·note_filter.rsv0.7.5 →note_filter_ai.rs255 ·ai_refine_protocol.rs295 ·EnrichPanel.tsx324(既有更正成立)·app/src/types.ts20 ·SessionDetailPanel296 + 4 文件 ·NotesPage295 + 9 文件 ·SessionListPanel298 + 8 文件 ·NoteListView241 + 9 文件 ·ClassroomPage278 + 7 文件 ·artifact_templates222 + 2 文件 ·types.rs32 + 6 文件 + 契约测试 129 ·live_session_frameTask 3 → 174 + 6 文件 ·ai_refine_task260 + 4 文件 277/117/77/26 ·commands_goals272 + 3 文件 197/181/97)。未纳入本次结论:db_goals.rs与note_filter.rs两条记录属进行中任务(其实施者仍在续拆 ⇒ 数字仍在变),故只读不改、留待其自身收尾回写。复核一律不做删除 —— 本节是历史证据链,被否证条目只就地标注复核值与日期。 已拆分:app/src-tauri/src/commands_ai_refine.rs(2026-09-11 批 0-C3 Task 4,分 4 个原子提交d2443ce9「步 1 — 目录模块 + dto/registry/gate」/e41023a6「步 2 — 工作台域」/d012c219「步 3 — 会话生命周期域」/e962b22a「步 4 — 采纳落库/历史域」,登记值 751 超 600 硬限;⚠️ FROZEN_OVER_LIMIT行的删除不在本任务任何提交里 —— 本任务第 1 步在工作树里删掉该行后,它被并行提交a0c5e62f(「拆 note_filter 第 1 步 — 渲染层」,其显式路径含scripts/line-limits.mjs;同一提交还连带带走了db_goals.rs那行,见git log -S" 'app/src-tauri/src/commands_ai_refine.rs'," -- scripts/line-limits.mjs= 只有a0c5e62f与本工具引入提交8ba2cf84)。代价:a0c5e62f那棵树里commands_ai_refine.rs实测仍 751 > 600 而棘轮名单已空 ⇒ 该提交点触发规则 (a);HEAD 与本任务 4 个提交各自自洽。同样地,本任务第 2/3 步的--write结果被并行提交74e9a5c6/ab515560连带落库(--write幂等 ⇒ 内容相同,非丢失)):改成目录模块(app/src-tauri/src/commands_ai_refine/,不再有commands_ai_refine.rs⇒ 二者不可并存 E0761)——mod.rs(37 行:原 12 行文件头逐字 + 子模块职责注释 + 6 条mod声明 + 4 条门面重导出)·dto.rs(66 行:4 个 IPC 契约类型AiRefineResult/RefineStrategyInfo/AiTaskHandle/RefineEstimateView,原 51–101)·registry.rs(110 行:TASKS_CAP+AiTaskEntry+set_task/trim_tasks/task_seq/task_seq_lower_bound/claim_task_id/task_registry,原 35–49 + 573–642)·gate.rs(60 行:BALANCE_SAFETY_FACTOR+ensure_balance_for,原 644–688,兑现本表原「拆分计划」列写的门控拆分)·workbench.rs(212 行:WorkbenchData+refine_workbench+stats_from+ 整个内联#[cfg(test)] mod tests(2 用例),原 447–571 + 690–751)·session.rs(260 行:MOCK_ENV+ 6 条会话生命周期命令,原 33–34 + 103–330)·apply.rs(132 行:ai_task_history+ai_refine_apply,原 332–445)。7 文件全部 ≤300 ⇒ 本表条目整条移除(本文写作时表中已无该行)。★ 外部引用面零改动:lib.rs:48的mod commands_ai_refine;一行未动(mod.rs正是它的解析目标),10 文件 20 处crate::commands_ai_refine::X引用逐字未改(pub use4 项 /pub(crate) use3 项按原声明可见性分开写,避免 E0365;dto/gate/registry保持私有mod,只有承载命令的 3 个子模块写pub(crate) mod)。★ D2 注册路径(本任务唯一静默风险面):9 条命令定义随域下沉,app/src-tauri/src/app_commands.rs的注册条目同批改成三段路径(步 1 0 条 / 步 2 1 条refine_workbench/ 步 3 6 条 session / 步 4 2 条 apply),IPC 名 = 路径末段(tauri-macros-2.6.3/src/command/handler.rs:46-58)⇒ 9 个 IPC 名逐字不变,前端invoke与 capabilities ACL 零影响。机械证据:node scripts/check-command-registry.mjs= ✅ 定义 334 / 注册 334 / 重复 0;probe-registry-parity.mjs verify …snap-registry-baseline.json app/src-tauri/src/app_commands.rs= ✅ 按末段名 334 条逐条相同 + 打印 9 条本任务的「路径前缀变化」(refine_workbench属步 2,其余 8 条属步 3/4)。★ 与计划书/分析报告的四处偏差(读码 + 编译器实测后以代码为准):①mod workbench;必须写成pub(crate) mod workbench;(session/apply 同) —— 注册清单在app_commands.rs(crate 根下的兄弟模块)按crate::commands_ai_refine::workbench::refine_workbench解析,裸mod下当场报 E0603「moduleworkbenchis private」×2(实测,见cargo build首轮)。②pub use workbench::WorkbenchData;未写进门面 ——WorkbenchData在原文件的模块外零 Rust 引用(前端有自己的 TS 接口),私有模块里的pub use会触发unused_imports(实测 warning);删掉它不改变任何外部可见面(前端经invoke拿 JSON,不依赖 Rust 侧路径)。③gate.rs与dto/registry同落步 1(不是计划书的步 2):实测若只拆dto(51 行)+registry(86 行),主文件 ≈630 仍 >600,棘轮行删不掉 ⇒ 把 45 行的gate一起放进步 1,实测 582 ≤600,同提交删棘轮行(但该删除被a0c5e62f连带,见上)。④stats_from保持私有,零可见性放宽:分析 D4 的pub(super)是为「refine_workbench留在主文件」的中间态准备的;终态把refine_workbench与stats_from放进同一文件(workbench.rs)⇒ 两处调用(524/540 原行号)与测试同文件,D4 的放宽不再必要,本任务实际未改任何既有项的可见性。★ 行为等价证据(superpowers/sdd/…/tmp/task4-verify.mjs,可复跑):① 每个新文件的正文块 = 拆前 751 行快照对应行区间的逐字拼接(逐字节比较,含 CRLF),段落边界全部落在条目边界上(每段首行是////pub/const/#[,末行是该项的收尾)——没有任何函数被跨文件切开 ⇒ 语句顺序、await位置、if let/早退、表达式求值顺序机械保持;② 覆盖:快照非空行(除use块 14–31)700 条 ↔ 正文块非空行 700 条(零丢行、零多行);③ 不可测维度计数对拍(两侧都排除文件头与use块):#[tauri::command]9/9 ·pub struct6/6 ·#[serde(rename_all="camelCase")]5/5 ·.lock()锁点 12/12 ·drop(guards)1/1 ·spawn_blocking2/2 ·fetch_add5/5 ·Ordering::Relaxed1/1 ·emit(1/1 ·"ai:task-update"2/2 ·#[cfg(test)]1/1 ·#[test]2/2 ·eprintln!2/2 ·let _ =3/3。★ 计划「等价核对」四条逐条结论:①ai_refine_start(原 137–250)作为一整段 114 行逐字搬运到session.rs,段落顺序(授权闸门 → mock → 密钥 → 去重 → 余额硬拦截 → 配额 try_consume + 显式drop(guards)→claim_task_id→ 注册表 insert+trim_tasks→insert_ai_task落库(失败仅eprintln!)→resolve→spawn_blocking)不可重排、不可能提前/延后 await(同一函数体内逐字未动,机械可证);② 9 条注册路径与check-command-registry全绿 + 探针按末段名逐条相同(见上);③ 本文件覆盖极低(9 个 command 与ensure_balance_for/set_task/trim_tasks全仓 0 测试)⇒ 已额外做逐字 + 计数对拍兜底,真机 IPC 冒烟未做(诚实单列:本任务未起 dev server,9 个入口的可达性只由编译期路径解析 + 注册门禁 + 探针兜底);④ 既有缺陷一处未修(BALANCE_SAFETY_FACTOR与文案 "×1.2" 重复、let _ =吞采纳标记/成本回填、set_task锁中毒静默、去重 TOCTOU、async 内同步余额 HTTP、MOCK_ENV直读全局 env、unwrap_or(50).min(200)魔法上界、session_id<=0四处重复)。门禁:cargo buildexit 0(4 步各一次,零新增警告)·cargo test --test app_lib_tests2359 passed / 0 failed / 6 ignored(与基线逐字相同;步 4 首轮ffmpeg::tests::run_captured_handles_large_output因 5 个并行 cargo 抢占导致 cmd 10s 超时失败一次,重跑即绿,与本改动无关)·cargo clippy -- -D warnings15 error = 基线 15(逐条同名,未增) ·node scripts/line-limits.mjs --fullexit 0,>6000(棘轮名单已空),本文件条目整条移除 · 7 文件实测 37/66/110/60/212/260/132(合计 877 = 751 + 126 行新写的文件头/use/mod/门面)。(2026-09-11 文档更正交叉引用):Task 7 条目里命令层锚点「commands_ai_refine.rs:247」已更正为commands_ai_refine/session.rs:176(本任务把该文件拆成目录模块后旧锚点失效);本条 ③ 的「gate并入步 1」与 ④ 的「零可见性放宽(原计划stats_from → pub(super)已不需要)」经复核与代码一致、未改。
▲ 批次级共同说明(2026-09-11 文档更正,Task 1/2/3/4/5/6/7/8/9/10 逐个复核):本批多次出现同一种跨任务现象 —— 某个文件的棘轮行删除 / 登记行数值刷新 / 「已拆分」记录文本由并行提交连带落库(
git commit <显式路径>提交的是共享工作树里该路径的当前内容),而那个提交树对那个文件往往不自洽(登记行已删或数值已刷新、代码却还没拆到位)⇒ 该提交点触发line-limits.mjs的 (a)/(c)/(e) 之一、--full红。已确认实例:Task 1 →c409a956(连带NotesPage.tsx棘轮行,树内仍 602)· Task 2 →14b8aaa6(连带NoteListView.tsx棘轮行,树内仍 642)· Task 3 →b8ff1efa(连带本文件棘轮行,树内仍 607 ⇒ (a)+(e))· Task 4 →a0c5e62f(连带commands_ai_refine.rs棘轮行,树内仍 751)· Task 5/6/7/8 →b3aa4a9a(一次连带db_goals.rs707 /ai_refine_task.rs670 /note_filter.rs642 /commands_goals.rs673 四行中被并行任务在工作树删掉的三行 ⇒ (a)),Task 8 的 S3 整行移除另落fcea5ccd· Task 7 的--write结果又被74e9a5c6/ab515560连带 · Task 9 →211a1cad(连带本表行/数值与「已拆分」记录,树内仍 632 ⇒--fullexit 1)· Task 10 →c1a6ca53(连带 637→496 表体行)。HEAD 自洽,且各任务自己的每一步提交各自自洽;上述红灯全部是「共享文件被显式路径提交带走」的副作用,按纪律不重写历史(不 rebase / 不 amend / 不 force push),只在此如实登记,复现命令:git log -p -- scripts/line-limits.mjs、git log -p -- docs/standards/line-limit-exemptions.md。纪律(本批共性教训,已写入.superpowers/sdd/DISPATCH-TEMPLATE.md§三末条):共享工作区别用工作树状态代替提交树状态;--write之后只提交自己那几行。
本批未执行的真机验证(已知缺口,非未完成项)(2026-09-11 批次收口前登记;最小清单来自 Task 1/6 评审,判据 = 应用控制台无
command … not found,即 334 条注册在真机全可达):
- 按值收
AppHandle的 4 个面各 1 条(拆lib.rs注册清单暴露的 13 条泛型风险面的代表):link_knowledge_target·show_main_window·overlay_cancel·second_pass_start——app_commands::handle()必须具体tauri::Wry(泛型R下AppHandle<R>: CommandArg<'_, R>退到Deserialize兜底 ⇒ 13 × E0277),编译期已排雷,真机可达性未实测;- 各域入口各 1 条:
create_note(笔记域)·ai_refine_estimate(AI 精修域)·list_sessions(会话域)·live_session_status(live 域,Windows 门控);- 前端交互 2 项:Ctrl+Shift+F 浮窗键(
float_state/float:state往返)· 关窗拦截(on_window_event留在run())。- live 侧 8 项(捕获/时序只能真机观察,Task 3 评审同列):WGC 停更自愈(
revive_wgc)· 暂停冻结与comp_epoch时间戳补偿 · 空闲 5s 探针唤醒 · 负载降级 0.1fps 封顶 · 前台切换 ROI 重扫 · 播放器图标检测 ·live:tier-downgrade-request→ 前端确认往返 · 截图命令读latest_frame。- 说明:本批各任务均未起 dev server、未跑 WebView2 手工核对(
cargo build/ 2359 用例绿 / clippy 不增 / 注册三向门禁 334=334 / 机械对拍探针已覆盖编译期与文本等价面);以上项不是「未完成」,而是本批范围外的真机验收项,收口前需单独派发一次。- ★ 2026-09-11 用户裁决:本批真机冒烟「跳过验证」。⇒ 上述清单为经裁决主动跳过,不是遗漏;本批的等价性依据是静态证据链:
check-command-registry三向门禁(334 定义 / 334 注册 / 0 重复,含 5 夹具--self-test)· 编译期路径解析(注册路径写错即 E0603/编译失败)· 注册清单探针 334 条按末段名逐条相同 · 各任务的逐行/逐字节机械对拍(前端另有文案+IPC 名全树计数探针)。若后续批次(批 3 起会动壳层与视图)需要真机结论,应在新批次里重新派发一次真机验收,不要沿用本批的"已跳过"。
批 0-D(L1 原语层 + 批 1 删除批)新增文件记录 —— 全部 ≤300 行,无需登记(2026-09-11,Task 14 收尾)。本节只追加人工记录行:收尾时
node scripts/line-limits.mjs --full本就绿(>600硬限 0 · 301–600 档 125 · 登记条目 125),故未跑--write(避免把并行任务的在飞行连带提交);本节数字与棘轮名单、301–600 档表均无改动。
⚠️ 来源标记:本节是人工维护的记录块,非机器生成 —— 数值写成 Markdown 引用行(> -起首,形如> - 文件:**N**),而parseTable()只认 4 列| path | N | … |表行(引用行一律忽略);且本块位于## 已拆分标题之后,parseHistory()对该节逐字保留 ⇒--write永远既不重算也不删除它,数值过期后没有任何门禁会报警(2026-09-11 已发现 Loading / StatusLine 共 6 个值过期,实测更正)。 刷新规则:本节与docs/adr/ADR-033-l1-primitives-and-view-layer-contract.md、docs/superpowers/specs/2026-09-11-frontend-redesign-design.md三处副本不一致时,一律在 HEAD 按countLines()口径(含空行)重新实测,并以实测值同步全部副本。机器锚点:三处副本的每处数值行后紧跟一行 HTML 注释<!-- line-count-src: files=… caliber=… authority=… -->,供门禁按files=逐个在 HEAD 重测、与相邻数值行对拍 —— 锚点内刻意不写数值**,否则等于又造一份手抄副本。**🔴 批 6 收口就地加注 · 刷新规则的两条补强(R42.3 / R63.2 / R33.3;2026-09-13,上面原文一字未改):① 登记口径 = 提交树
countLines()实测 —— 本节数值只许取自「该值落库的那个提交树」上的实测(不是工作树口径、不是旁边某次跑工具的读数)。批 6 已发生 3 次口径混用(工具把import type与注释字面量算成命中 · T16 在依赖文件仍在飞时按工作树口径登记 ⇒ R33.2 已登记为控制方的派发错误)。② 🔴 机器锚点<!-- line-count-src … -->全仓 0 个读者:规格:835与本节所称「门禁按files=重测」今日无实现 ⇒ 三副本同步只能靠人工(批 6 的二次刷新即一次人工同步;锚点保留待将来实现 —— 它刻意不写数值,故自身不会腐化)。③ 二次刷新的范围(R63.2):批 6 收口只余两条漂移 ⇒motion.css271 → 335(Δ64)与Text.css58 → 66(Δ8,T23/T28 的低置信墨度落点);其余 40 值逐条 ✅(T16 已刷的 19 条 + 23 条不变)。新建目录
app/src/ui/primitives/下 42 个文件(实测行数口径 =scripts/line-limits.mjs的countLines(),即含空行的全部行数;最大 335(=motion.css,CSS 不在行数门禁的SOURCE_EXT视野内;源文件最大 299)):
Text:Text.tsx119 ·Text.css66 ·Text.test.tsx171Surface:Surface.tsx98 ·Surface.css85 ·Surface.test.tsx175Button:Button.tsx132 ·Button.css100 ·Button.test.tsx286Modal:Modal.tsx260 ·Modal.css81 ·Modal.test.tsx296 ·Modal.exit.test.tsx91 ·useFocusTrap.ts122 ·useFocusTrap.test.tsx236 ·ime.ts18 ·ime.test.ts32ConfirmDialog:ConfirmDialog.tsx202 ·ConfirmDialog.css58 ·ConfirmDialog.test.tsx297Toast:Toast.tsx257 ·Toast.css76 ·Toast.test.tsx249 ·Toast.interrupt.test.tsx167 ·Toast.style.test.ts134(⚠️ 这 4 个Toast.*在本次收尾期间由 T9 补正实施者并行修改,已落入6cb44424;上面数值已按批 6 T16 实测刷新,该次提交时的登记值为 210 / 65 / 249 / 167 / 132)EmptyState:EmptyState.tsx170 ·EmptyState.css103 ·EmptyState.test.tsx276Loading/Skeleton/Probe:Loading.tsx105 ·Loading.css79 ·Loading.test.tsx238StatusLine:StatusLine.tsx94 ·StatusLine.css42 ·StatusLine.test.tsx267usePresence:usePresence.ts200 ·usePresence.test.tsx282 ·usePresence.node.test.ts71- 接缝 / 导出面 / 守卫:
motion.css335 ·index.ts48 ·style-seams.test.ts299 ·style-contract.test.ts296 ·motion-coverage.test.ts186(🔻 批 6 收口二次刷新(R63.2 / R33.2;2026-09-13,本行原文的旧值保留于本节历史):motion.css271 → 335(Δ64;T5/T6/T12/T13/T19/T29 六次追加)·Text.css58 → 66(Δ8;T23/T28 的低置信墨度落点)= 本批仅此两条漂移;其余 40 值逐条 ✅。出处 =.superpowers/sdd/2026-09-12-frontend-redesign-batch6-motion/task-34-report.md§11/§13-②,口径 = 提交树countLines()实测。)★ 一次真实的口径事件(记在此以免被当成"新文件登记豁免"的先例):收尾实施者最初把 Task 14 的全部守卫追加进
style-seams.test.ts⇒ 该文件涨到 340 行 > 300,--fullexit 1((c) 超过 300 行但未登记),会拦下全仓所有人的提交。处置照批 0-D 裁决:不用--write登记豁免(登记表/棘轮是给存量文件的历史债机制),而是按语义拆 —— 「原语 CSS 文本反例」(零颜色字面量 ·--ed-stamp不作底色)留在style-seams.test.ts;「跨文件契约」(CSS 接线 · 联合契约锚 · 退场时长三方对拍)落style-contract.test.ts;「reduced-motion 覆盖」(基类名单 · 动画落点含伪元素)另立motion-coverage.test.ts(T11 评审 Critical 修好后追加的那条守卫再次逼近 300 行红线,遂二次按语义拆)。三个文件 299 / 296 / 186 行、职责写进各自@ai-context文件头,T3/T4/T12 已追加的 describe 逐条保留(追加式演进)。本批配套改动(不涉行数登记,仅为溯源):①
--ed-shadow-1/2定值(亮档投影 / 暗档反相描边0 0 0 1px rgba(255,255,255,.06))落在生成器真源app/scripts/gen-tokens.mjs与产物app/src/ui/tokens.css(--ed-shadow-card被取代,实测 0 处代码引用 ⇒ 不留兼容别名);②ui/tokens.css入口接线 =app/src/main.tsx:5的import "./ui/tokens.css";(此前该文件从未被 import ⇒ 原语的var(--ed-*)运行时无值;该文件只有:root/[data-theme]自定义属性、无选择器 ⇒ 零视觉变化;防回归断言在tokens.drift.test.ts);③--ed-due亮档第二次修正#A05F10 → #9F5E10(剪报底 4.4950 → 4.5571,纸 4.9309 / 面 5.1436);④ 守卫(零颜色字面量 ·--ed-stamp不作底色 · reduced-motion 基类名单 · CSS 接线)+ 三条补充判据(联合契约锚 · 退场时长三方对拍 ·animation落点含伪元素必须逐字进 reduced-motion 名单)落在上述三个.test.ts;⑤app/src/App.css(123 行、非 UTF-8、从未被 import 的死样式)由 Task 13 删除 —— 它本就不在 301–600 档表内(.css不在SOURCE_EXT管辖内),故删除对计数的贡献为 0。未做(如实登记):全部调用点迁移(20 弹层 / 44 空态 / 85 加载 / 196 错误行 / 4 toast / 2 confirm / 上千处内联 style)属批 4;动效 token(
--ed-dur-*/--ed-ease)真源属批 6(本批只在primitives/motion.css落同名临时块,届时整块删除)。
🔴 批 7 收口就地加注 · 豁免表历史上又一次「连带落库」+ 一处门禁盲区 + 探针登记(§C16.2 / §C51.7① / §C11.8 ③;2026-09-13,上面全部原文一字未改):
- 这一次的形态与批 5 同源,机理已定位:批 7 首波的提交 A
fa45caf1(refactor(app): 抽出 PageSlot 与 AiToast 两个装配件)带走了 T4 的两行表格改动 ——git show fa45caf1 -- docs/standards/line-limit-exemptions.md= 3 个 hunk:@@ -20是 T1 自己的(app/src/App.tsx | 599 → 537),而@@ -42(app/src-tauri/src/app_commands.rs | 479 → 476+ 散文**313 条**→**310 条**)与@@ -53(app/src-tauri/src/commands_session.rs | 443 → 447)都是 T4 的。⇒ T4 自己的提交39f74e4f因此只含 2 个.rs文件(表格改动不在它里面)。- 🔴 机理(关键,必须记住):
git commit --only -- <paths>对点名路径取的是「工作树内容」,不是暂存区内容 —— T4 的表格改动是在 T1 同步表格之后、T1 提交之前落进同一棵工作树的,于是被一并带走。后果(实测):fa45caf1与f7ac5d0f两棵树的 (e) 判据(声明值 == 实测值)exit 1(表声明 476/447、代码仍 479/443);自 T4 的39f74e4f落库起恢复自洽,最终树自洽。🔴 不得声称「7a 段每个中间提交都过 (e) 判据」(§C16.2 的强制登记;另见v0.22批 7 节的「诚实代价」)。- 裁定:接受「内容正确、提交边界错位」+ 强制登记,不重写历史(§C16.2;批 5 已有同款先例被接受并逐字登记)。amend / force-push 被批纪律禁止,且其后已有 4 个提交依赖此历史 ⇒ 重写是净损失。
- 🔴 顺带的机制结论(本批在提交机制上的两次实质改进,写进本节以备后来者):① 共享文件改用 blob 构造 +
update-index --cacheinfo(git show HEAD:<path>取 LF 规范版本 → 只改自己那几行 →hash-object -w→ 挂索引 → 提交,不用--only);② 真实索引里已有别人暂存内容时改用私有索引(GIT_INDEX_FILE+read-tree <HEAD>+add -- 只自己的路径+write-tree+commit-tree -p $(git rev-parse HEAD)+update-ref带旧值守卫)—— 比--only安全(不碰真实索引、不碰工作树)。自证要看git diff HEAD -- <shared path>(git diff --cached防不住--only);提交前先看git status --porcelain的「首列」(出现M/A且不是你的路径 ⇒ 索引里有别人的东西 ⇒ 必须改用私有索引,否则git commit一定连带落库);私有索引提交后必须git add -- <你的路径>重新对齐真实索引,否则下一个人一裸提交就回退你的提交(§C41.2 连带回退 / §C54.2)。- 🔴 门禁盲区一例(§C51.7①):
app/src-tauri/src/commands_video.rs的末尾换行被吞(T21 实测s.endsWith("\n") === false,countLines()= 356)而countLines()不变 ⇒ 本表与line-limits --full都看不见。机理 =countLines()的定义(s.split("\n").length - (s.endsWith("\n") ? 1 : 0))对「有无末尾换行」不敏感 —— 这是口径的性质,不是缺陷;但 🔴 任何「逐字节一致」的纯搬迁 / 拆件声明都不许只靠行数(批 7 的判据已升级为Buffer.equals逐字节对拍 +digest/sha256,§C26.4 / §C29)。登记为技术债(批 8 可考虑加一条「末尾换行 / EOF 形态」的机器判据)。- 🔴 散文对拍探针 = 批 8 的候选闸(§C11.8 ③):
scripts/check-exemption-prose.mjs(批 7 T11 新建,112 行;口径 =countLines()同源实现)把本表的散文数字与check-command-registry.mjs的门禁读数对拍(如「散文『311 条』== 门禁『定义 311』」;两态都成立、中途未同步期为真阳性EXIT=1)。🔴 批 8 T17 已挂进 CI:.github/workflows/pr-check.yml的line-limitsjob 内单列 step「Exemption table prose check」(:211,run: node scripts/check-exemption-prose.mjs)⇒ 它已经是 CI 门禁。🔴 仍不进八闸集合(理由未变:八闸的集合是批次间治理收口的逐字对账基线,扩闸会让对账漂移)、🔴 仍不进 husky;⚠️ **若它在 CI 上频繁假红 ⇒ 回退裁决、改回手工跑,并写明回退理由。**并进入pr-check.yml的 paths-filter 缺口名单(§C41.4 U2;缺口形态未变、逃逸文件集合 +1 —— 同源事实见performance.md的懒侧门禁节)。⚠️ 探针按路径定位、不按死锚行号(本表的:45因 T6 删行已下移为:44,即app_commands.rs那行,其散文现为 「311 条」、行数值 478,T21 实测两者与门禁读数一致)。- 🔻 2026-09-13 加注(原句留档):本条在批 7 收口时逐字写「🔴 已入库,但不入八闸 / CI / husky(理由:八闸的集合是批 8 治理收口的对账基线,本批扩闸会让逐字对账漂移;散文数字天然易漂 ⇒ 硬门禁会频繁假红)⇒ 手工跑(
--help与头注都自述「非门禁」)。」;🔴 该句在本条被就地更正时被替换掉了(批 8 T29,提交9b1e8aa8,git diff --numstat为3/3)⇒ 按documentation.md的「原文 + 就地加注」形态补回留档。🔴 该句描述的是当时(批 7 收口)的登记,现状见本条上一段的加注。- 🔴 本批的贴边件清单(余量 ≤5,共 10 条)落在
v0.22批 7 节的「诚实代价」(母本体例同批 4 的「9 个贴边文件」):任何后续编辑必须先拆件。其中app/src/components/notes/NotesReadingColumn.tsx的路径在批 7 台账(rulings.md§C49.5①)与派发语里被写成app/src/views/note/NotesReadingColumn.tsx—— 🔴 该路径不存在(实测该文件在components/notes/)⇒ 以components/notes/为准。
🔴🔴 批 7 收口就地加注 · 「贴边件清单」的口径更正:手列清单一律作废,以全树脚本扫描为唯一来源(§C55.3 / §C57.4③;2026-09-13 · T21 追加轮,上面全部原文一字未改):
- 被更正的对象:本表上面那条与
v0.22批 7 节「诚实代价」 里的**「本批 10 个贴边件」是手列清单(取值范围 = 本批实际触碰过、且改动当时余量 ≤5 的件 ∪ 两个判据件)⇒ 🔴 它一律不得作为判据输入。上游已判其两次失真(前几轮转述成「10 条」,而全树真值远大于此)。- 🔴 全树机器扫描(唯一来源;口径
countLines(),域app/src/**/*.{ts,tsx}): · 上游(§C55.3 时点) = 578 文件 · ≥300 = 35 条 · 295–299 = 20 条 · 合计 55。 · 🔴 T21 于追加轮重跑(T23 的三条提交已改动行数 ⇒ 不抄上游读数)= 579 文件 · ≥300 = 35 条 · 295–299 = 21 条 · 合计 56。 · 差额逐条归因:① 新件app/src/components/FragmentGroupAction.tsx(155 行,T23 的125eec85)⇒ 文件数 578 → 579;②app/src/components/FeedFragmentList.test.tsx297 → 299(T23 的125eec85+ 返工5d59e332)⇒ 295–299 档 20 → 21。🔴 ≥300 档不变(35)。- 域内恰 300(余 0)者 = 6 条(T21 追加轮实测):
app/src/components/KnowledgeDetailPanel.tsx·app/src/components/notes/NotesReadingColumn.tsx·app/src/components/notes/NotesReadingColumn.views.test.tsx·app/src/hooks/useLiveCaptureControl.tsx·app/src/ui/primitives/dialogMigration.e.test.ts·app/src/views/session/SessionTriTrackView.tsx。⚠️ 口径更正(按实测):其中 5 条在上游那份 10 条手列清单里;🔴 手列清单真正漏掉的域内 300/300 是 1 条 =NotesReadingColumn.views.test.tsx(§C55.3 同时点名了KnowledgeDetailPanel.tsx,而它本就在清单内——转述已两次失真,故以本表的实测名单为准)。另:scripts/check-bundle-budget.mjs= 300 但不在本域(.mjs不在SOURCE_EXT),它只出现在手列清单里。- 本域两张完整表(T21 追加轮实测,供 T22 直接对拍): · ≥300(35 条):
pages/ChatPage.tsx579 ·types/knowledge.ts559 ·App.tsx549 ·components/action-center/ActionCenterPanel.tsx538 ·components/GroupSidebar.tsx518 ·components/GroupSidebar.test.tsx497 ·components/RefineWorkbench.tsx497 ·components/KnowledgeCanvasView.tsx467 ·components/ProfileDetector.tsx448 ·pages/KnowledgePage.tsx444 ·components/GoalDetail.tsx427 ·components/NoteEditView.tsx412 ·components/RichEditorView.tsx409 ·components/AiProviderSettings.tsx391 ·components/RouteInfoPopover.tsx376 ·components/KnowledgeCanvasView.test.tsx368 ·types/session.ts367 ·components/NotePreviewView.tsx364 ·pages/SessionsPage.tsx355 ·components/NoteLinkToSystem.tsx352 ·components/NoteReadingView.tsx343 ·components/EnrichPanel.tsx327 ·components/AiConversationDock.tsx318 ·components/LiveProfileStrip.tsx316 ·components/SessionListPanel.test.tsx316 ·components/NoteLinkToSystem.test.tsx308 ·types/goals.ts308 ·components/KnowledgeTreeView.tsx305 ·utils/canvasElements.ts301 · 恰 300 的 6 条见上。 · 295–299(21 条):components/ClassroomCapturePanel.tsx299 ·components/FeedFragmentList.test.tsx299 ·components/FeedFragmentList.tsx299 ·components/RefineLaunchDialog.tsx299 ·shell/TopBar.test.tsx299 ·ui/primitives/style-seams.test.ts299 ·ui/primitives/textBaseline.ts299 ·views/session/useTriTrackAlign.test.tsx299 ·components/session-detail/useRevealChoreography.test.tsx298 ·components/SessionListPanel.tsx298 ·ui/primitives/style-contract.test.ts298 ·views/note/noteViews.test.tsx298 ·components/review/useRevealMemory.test.tsx297 ·types/ai.ts297 ·ui/primitives/ConfirmDialog.test.tsx297 ·components/confirmMigration.test.tsx296 ·components/RefineWorkbench.test.tsx296 ·ui/primitives/emptyStateRatchet.test.ts296 ·ui/primitives/Modal.test.tsx296 ·components/session-detail/SessionViewHost.test.tsx295 ·pages/NotesPage.tsx295。- 🔴 纪律(§C55.3 逐字):「手列清单一律不得作为判据输入;以全树脚本扫描为唯一来源」。⇒ 🔴 T22 必须在报告里给完整两张表(≥300 / 295–299,逐条
路径 + 实测行数 + 是否本批新增或被改过),并逐字写「任何后续编辑必须先拆件」。🔴FeedFragmentList.tsx是本轮新增的「恰 299」(T23 的返工把它从 300 降到 299 ⇒ 余 1),它仍在 ≥295 面内。- 🔴 同口径已同步进
v0.22批 7 节(其「诚实代价」段的贴边件表后已加范围声明与全树读数)⇒ 本条与那张表必须并读。