|
1 | | -# 技术债清单(权威:2026-08-21 归档滚动——v0.8.0 M1~M4 代码建设 + 新增代码审查批次后) |
| 1 | +# 技术债清单(权威:2026-08-21 二轮归档滚动——AI 精修全链路建设 F0~F3 + 新增代码审查批次后) |
2 | 2 |
|
3 | 3 | > 本清单为当前唯一权威债务清单,归档日滚动更新;旧归档清单仅历史追溯。 |
4 | | -> 来源:2026-08-20 清单滚动 + 本次会话 v0.8.0 M1~M4 代码建设 |
5 | | -> (提交 7818e90/12c5a13/fcd09c4/b4e7e79/4c44297,1264 单测全绿) |
6 | | -> + 新增代码七维审查即修批次(提交 354dd3d,1265 单测全绿)。 |
| 4 | +> 来源:2026-08-21 首轮清单滚动 + 本次会话 AI 精修全链路代码建设 |
| 5 | +> (F0 契约修复 `1845462` · F1-A2 丢图 `897ee96` · F1-A3 成本 `ba9e618` · F1-A4/A5 审计配额 `b6ad051` |
| 6 | +> · F2-B1/B2 任务中心 `f06fd7f` · F2-B3 面板 `6e72c5d` · F2-B4 并发 `afca35f` |
| 7 | +> · F3-C 协议 v2 `7f575cd` · F3-D 硬拦截 `790f964` · F3-E golden `b75db82`,1294 单测全绿) |
| 8 | +> + 新增代码七维审查即修批次(提交 `564dfc5`,1294 单测全绿 + 前端 tsc/build 通过)。 |
7 | 9 |
|
8 | 10 | ## 未偿债务(逐笔核验;carried 仅留 ID + 一行摘要) |
9 | 11 |
|
|
13 | 15 | | TD-2026-08-19-D | image_stream_store 已交付未接线(REQ-110/123/088);本次未涉及,保持 | |
14 | 16 | | TD-2026-08-19-F | detect_pause_icon 暗底+中央亮内容可能误报暂停;本次未涉及,保持 | |
15 | 17 | | TD-2026-08-19-G | db_ocr_search 500 会话静默截断 + 图路径不校验存在性;本次未涉及,保持 | |
| 18 | +| TD-2026-08-21-A | 存量 clippy 告警 9 个(live_session_persist ×8 + series_detect ×1)——本次未改动文件,环境版本漂移所致;本次新增代码 clippy 已清零(审查确认),保持 | |
16 | 19 |
|
17 | | -## 今日已偿(v0.8.0 M1~M4 新增代码审查即修,可经代码/提交验证) |
| 20 | +## 今日已偿(本次新增代码七维审查即修,可经代码/提交验证;提交 `564dfc5`) |
18 | 21 |
|
19 | 22 | | ID | 摘要 | 偿还方式 | |
20 | 23 | |----|------|----------| |
21 | | -| (审查 C1) | ai_client/ai_balance URL 拼接 `trim_end_matches("/v1")` 把默认端点 `https://api.siliconflow.cn/v1` 的 /v1 一并删掉 → 请求打到缺 /v1 的路径 404——测试连接/余额/复核/精修/补充全部网络调用失败,且波及既有 REQ-085 复核(重构后走共享 client) | 只修剪尾斜杠(与 ai_text_filter 原实现一致)+ 提取 chat_completions_url 纯函数 + 防回归单测(chat_url_preserves_v1_segment);提交 354dd3d | |
22 | | -| (审查 C2) | AiRefineCard/EnrichPanel 任务轮询 setInterval 无组件卸载 cleanup——切会话/关面板后 interval 持续 invoke 并对已卸载组件 setState(泄漏) | 两组件加卸载 cleanup(clearInterval + 置空);提交 354dd3d | |
23 | | -| (审查 C3) | run_refine_task 双跑全量 analyze_session_opt(build_rule_draft 结构渲染一次 + 任务取章节/术语又一次)——千段长会话重复 CPU | build_rule_draft_with_analysis 提取(装载+分析一次完成并返回 analysis),apply_note_structure_with_analysis 复用外部分析;提交 354dd3d | |
24 | | -| (审查 C4) | 过期 `#[allow(dead_code)]` 标注:chat_json/parse_json_object(已被 M2/M3 适配器使用)、content_gate(已被命令使用)——豁免过期误导审查 | 移除过期豁免 + 注释更新;enabled_gate 真预留保留;提交 354dd3d | |
25 | | -| (审查 C5) | trim_tasks 容量守卫:终态任务数 < excess 时删不完(并行 Running 占满时 len 持续 > CAP) | 改 while 循环逐删最旧终态,无终态可删即停;提交 354dd3d | |
26 | | -| (审查 C6) | EnrichPanel 动态 import @tauri-apps/api/event(与 AiRefineCard 静态 import 不一致 + 异步竞态窗口) | 改顶部静态 import(与 AiRefineCard 一致);提交 354dd3d | |
| 24 | +| (审查 P0-1) | 任务去重粒度过粗:`tasks.values().any(进行中)` 全表检查——会话 A 精修中时会话 B 精修/任意笔记补充被误拒 | `AiTaskEntry` 增 `target_id`,去重按目标粒度(精修=session、补充=note);refine/enrich 同步 + 恢复路径补字段 | |
| 25 | +| (审查 P0-2) | 成本拦截与配额消耗顺序错误:先扣配额后拦余额——余额不足被拒时配额已扣(浪费每日额度) | 顺序调整:先 `ensure_balance_for`(失败不扣配额),后消耗配额;enrich 同步 | |
| 26 | +| (审查 P1-1) | 采纳无幂等:adopted 标记只在落库后写,异常/重复调用可绕过前端反复建笔记 | 服务端 `is_ai_task_adopted` 前置校验(refine/enrich apply)+ 前端 adopted 任务禁用查看/采纳 + DB 单测 | |
| 27 | +| (审查 P1-2) | 落库成本失真残留:`usage_cost` 用旧默认单价(¥0),付费模型预估 ¥X 但落库记 ¥0 | 新增 `usage_cost_for_model`(模型感知单价与预估同口径),refine/enrich apply 改用 + 单测 | |
| 28 | +| (审查 P1-3) | 补充任务无单片重试(精修有 SLICE_RETRY)——网络瞬态失败整任务失败浪费已成功片 | run_enrich_task 单片重试 1 次(与精修对齐) | |
| 29 | +| (审查 P1-4) | 任务表运行期不裁剪:`trim_ai_tasks` 仅启动时跑,终态任务运行期无限累积 | 精修/补充任务终态落库后调用 `trim_ai_tasks`(保留策略生效) | |
| 30 | +| (审查 P1-5) | AiTaskPanel 用 `any` 类型(违反强类型契约);AiRefineResult 前端类型缺 `failedSlices` | 改类型收窄(AiRefineResult/AiEnrichResult 分支);types.ts 补 failedSlices | |
| 31 | +| (审查 P2-1) | App.tsx toast 计时器未清理(每事件新起 timer,卸载后残留空转) | toastTimer ref 持有 + 卸载/新事件清理 | |
| 32 | +| (审查 P2-2) | 前端未展示部分成功(failedSlices > 0 无提示) | AiRefineCard done 状态显示「部分成功 x/y 片」 | |
27 | 33 |
|
28 | 34 | ## 今日新登记 open |
29 | 35 |
|
30 | 36 | | ID | 摘要 | 类型 | |
31 | 37 | |----|------|------| |
32 | | -| TD-2026-08-21-A | 存量 clippy 告警 9 个(live_session_persist ×8 needless_borrow `&ctx.last_speech_rate` + series_detect ×1 nonminimal_bool)——本次未改动的历史文件,clippy 版本漂移所致;新代码已清零 | 环境变化 | |
| 38 | +| (无) | 本次新增代码七维审查:接入性/逻辑性/牵连性/性能/冗余/规范/安全全部通过或即修;无遗留 open | — | |
33 | 39 |
|
34 | 40 | ## 观察项(登记不立债,保持跟踪) |
35 | 41 |
|
36 | 42 | | ID | 摘要 | 处置 | |
37 | 43 | |----|------|------| |
38 | | -| (观察 A1) | ai_enrich_protocol B6 无链接校验用宽松 contains_url(http(s):// 或 www. 前缀)——含 "www" 的普通文本(如"www 是万维网缩写")会被误拒 | B6 语义=仅标题不输出链接,宽松匹配已够;误伤概率极低,保持跟踪 | |
39 | | -| (观察 A2) | AiRefineCard/EnrichPanel 事件监听 useEffect 依赖数组未含 handleState(eslint exhaustive-deps 会提示)——运行时无碍(taskId 变化时监听与回调同步重建) | 保持跟踪;如需零告警可将 handleState 依赖补全 | |
40 | | -| (观察 A3) | ai_refine_apply 落库采用"建规则基线笔记 + versioned_save 精修版"两步——若中途失败(如 usage 落库失败)会留下只有基线快照的笔记 | 单机应用可接受(用户可重跑精修);M5 端到端验收时实测 | |
41 | | -| (观察 1~8 继承) | 2026-08-20 清单观察 8 条(clone 拷贝/结构渲染白算/前端统计卡/AGENTS.md Silero 表述/说话人卡片入口/首启下载/双版面/词级时间戳) | 保持跟踪(观察 1 处置:拷贝已在 spawn_blocking 线程内,消除收益微小) | |
| 44 | +| (观察 A1) | ai_enrich_protocol B6 无链接校验用宽松 contains_url——含 "www" 的普通文本会被误拒 | B6 语义=仅标题不输出链接,宽松匹配已够;保持跟踪 | |
| 45 | +| (观察 A2) | AiRefineCard/EnrichPanel 事件监听 useEffect 依赖数组未含 handleState(eslint exhaustive-deps 会提示) | 运行时无碍(taskId 变化时监听与回调同步重建);保持跟踪 | |
| 46 | +| (观察 A3) | ai_refine_apply 两步落库(建基线笔记 + versioned_save 精修版)——中途失败留下只有基线快照的笔记 | 单机应用可接受;M5 端到端验收时实测 | |
| 47 | +| (观察 1~8 继承) | 2026-08-20 清单观察 8 条(clone 拷贝/结构渲染白算/前端统计卡/AGENTS.md Silero 表述/说话人卡片入口/首启下载/双版面/词级时间戳) | 保持跟踪 | |
42 | 48 |
|
43 | 49 | ## 关联 |
44 | 50 |
|
45 | | -- 版本与需求:[v0.8.0 版本文档](../../versions/v0.8.0.md)(M1~M4 已交付,M0/M5 待推进)· [需求池 REQ-138~147](../../product/requirements-pool.md) |
| 51 | +- 版本与需求:[v0.8.0 版本文档](../../versions/v0.8.0.md)(M1~M4 已交付 + AI 精修非功能扩展 F0~F3 已交付,M0/M5 待推进)· [需求池 REQ-138~147](../../product/requirements-pool.md) |
| 52 | +- 设计文档:[AI 精修非功能扩展设计([ ] 已归档,本日归档)](brainstorming-ai-refine-nonfunctional-rebuild.md) |
46 | 53 | - 决策:[ADR-016(AI 密钥 DPAPI 存储)](../../adr/ADR-016-ai-credentials-dpapi.md)(当前生效) |
47 | | -- 提交链:M1 `7818e90`/`12c5a13` · M2 `fcd09c4` · M3 `b4e7e79` · M4 `4c44297` · 审查修复 `354dd3d` |
| 54 | +- 提交链:F0 `1845462` · F1 `897ee96`/`ba9e618`/`b6ad051` · F2 `f06fd7f`/`6e72c5d`/`afca35f` · F3 `7f575cd`/`790f964`/`b75db82` · 审查修复 `564dfc5` |
0 commit comments