2026-09-27 审查、归档与界面改进
状态:本轮修复和本机验证完成。范围包含 4ef354d42dac2ca9f86ae101f70908ff4cb2f7eb 至 ff1e458,即 4ef354d^..ff1e458 的九个提交、444 个变更文件。初始工作区干净。 核对设计与版本依据、全部改动清单、采集至 UI 的数据流、测试、构建和文档; 历史验证结果不计作本轮通过。未提交、推送、安装或部署。
修复要求与结果
归档与活动会话属于同一来源实例。只读有格式依据的本地记录,以原生身份去重, 不以相近时间或相同 token 猜测关联。未知字段保留未知;消息、请求、累计值和额度分别处理。 模型和 Agent 分组、筛选忽略大小写;事件身份不变,不因显示名称变化重复入库。
| 审查发现 | 修复及回归依据 |
|---|---|
| Codex 仅发现 sessions,归档后首次采集遗漏 | 同时发现 archived_sessions;只有归档、活动与归档副本并存、再次扫描均只计一次 |
| ZCode 时间/token 近似匹配会误合并;迟到 JSONL 会重复 | 本地 model_usage 原生 ID 为主;按来源/日原子替换,禁止跨格式猜测匹配 |
| 历史周期写每个维度前删除整个周期,最后仅余一个维度 | 每周期只删除一次;多来源、多模型均保留;重复清理结果不变 |
| 部分日层覆盖完整周期,汇总与分组取数规则不同 | 共用层级覆盖选择器;仅使用完全落入查询范围的周期;保留日层截止线 |
| 名称大小写在汇总、小时、明细与图表间处理不一致 | SQLite 注册与 Rust 一致的小写函数;各路径统一;不同供应商保留独立模型行 |
| 小时会话取整日再逐维度相加;跨日会话重复 | 按筛选范围及来源/会话去重;缺少会话 ID 或只有历史汇总时显示未知 |
| 耗时平均值以全部调用作分母 | 按有耗时的样本加权;新增耗时样本量;未知样本不补零 |
| 小时汇总压平字段质量、冲突数;缓存占比混用样本 | 保留质量与冲突计数;留存明细恢复配对样本规则;旧封存数据不能恢复的字段显示未知 |
| 无来源用户的空筛选被当成所有来源 | 区分未限定与明确空集合,阻止跨用户统计泄漏 |
| 导出漏近期未封存日层和历史周期,导入漏字段 | 直接导出聚合快照,包含日/小时/周期与覆盖计数;保留原始主机;错误导入整体回滚 |
| 导入可能覆盖仍有明细的本地分区 | 相同包重复导入不改变数据;不同内容与活跃明细冲突时明确拒绝,避免封存或覆盖实时来源 |
| 原生汇总失败前已提交游标,重试可能漏读 | 原生汇总、事件、游标共用事务;Hermes 故障注入验证回滚、失败状态与完整重试 |
| 间隔 0 仍扫描;并发触发判断存在竞态 | 0 停止间隔提取;更改间隔及手动完成重置期限;同一刷新原子合并 |
| 第二进程打开库可能恢复仍运行的任务 | 每库 OS 文件锁;headless 请求合并到持锁进程;崩溃自动释放锁 |
| headless 版本不匹配进入删库对话框 | 无窗口启动直接返回错误并保留库;交互恢复仍由 GUI 明确处理 |
| 切回曾使用的时区不含后来采集数据 | 从留存明细重建目标时区日/小时分区;已清理的历史不猜测换算 |
| 页面重复查询、旧响应覆盖新筛选、来源分配后不刷新 | 查询去重与序号保护;筛选目录独立加载;归属变化强制重查;空闲轮询不重查图表 |
| 明细刷新回第一页;清理后停在无效页 | 同范围刷新保留页码;范围变化重置;数据缩减时回到最后有效页 |
| 面板重启丢失顺序,缩放点击行为反直觉 | 按保存顺序恢复;拖放按插入排序;键盘调整宽高;取消拖动不保存 |
| 中文用户名称生成同一个 ID | ID 与显示名称分离;采用随机唯一 ID;验证中文名称及重复名称 |
| GNU tar 专用参数使 Windows 脚本测试失败 | 使用相对工作目录归档,兼容 BSDtar;重复报告不重复打包 |
归档来源核验
Codex、Claude、OpenCode 与 Kilo
- Codex 官方 App Server 文档 的 thread/archive 描述会话移至归档目录。实现以同一来源内的原生事件身份去重,文件移动不改变身份。 本机只读盘点有 306 个活动文件、没有归档文件;归档路径以合成文件验证, 不宣称本机真实归档样本验收。
- Claude 已有 orphaned/superseded、subagents 路径发现与原生消息身份测试,本轮全套复验。 本机没有可供真实归档核对的 Claude 数据。
- OpenCode/Kilo 的数据库查询保留已归档会话;新增归档标记前后合计不变的测试。 OpenCode 字段依据见官方 session 源码。 同一代码家族不作为其他产品归档格式的依据。
- 其他来源按 接入矩阵 记录能力; 未取得格式依据的归档不作推测性解析,OpenClaw 等受限状态不因此转为已验收。
ZCode:数据库采集与 JSONL 回退
只读核验本机安装产物 resources/glm/zcode.cjs 的 model_usage 写入及清理逻辑, SHA-256 为 B1DF2EF3E5BD76C4AF3ECB296BC003A10D3F13191A26610BD0BA940FEADAD529。 原生行身份包含 assistantMessage/span/start/attempt 等来源信息;JSONL 网络 requestId 与它不是同一身份,traceId 也会被多个请求共享。相同时间、token 不足以证明同一调用。
数据库按 started_at 清理约 30 天前记录,因此是有限保留的本地历史,不能称为永久归档。 实现行为:
- 正常采集即发现 db/db.sqlite,不需要手动补历史按钮。
- 只读一致快照,验证字段和完成状态,以 model_usage.id 作为来源内调用键。
- 验证成功后按来源/日同时替换事件、日层、小时层,一次事务提交指纹。 不把 turn_usage 与逐次调用相加。
- 应用已经保存的较老历史继续保留。数据库 30 天边界日可能不完整, 已有日层不被残缺快照覆盖,并产生诊断。已超出应用日层保留范围的数据不重新拆日。
- 来源曾使用数据库后,数据库缺失或损坏则保留统计并报错,不能悄悄改用 JSONL 双计。 只有从未使用过数据库的来源才走 JSONL 回退。
- DB 缺少逐条产品版本核验依据,记录 latest_fallback;有效数值可统计,版本覆盖仍待验证。
只读真实核对命令:cargo run –manifest-path desktop/src-tauri/Cargo.toml -p llm-usage-core –example real_verify_zcode – <本机-ZCode-CLI-根> build/review-2026-09-27/real-zcode-final。输入为本机来源,输出为任务独立库。
该次快照退出码 0,允许保存的数值如下。来源仍在运行,后续快照变化不代表历史重算错误。
| 指标 | 核对结果 |
|---|---|
| 完成调用 | 8,225 |
| 输入 token(含缓存) | 2,394,416,074 |
| 缓存读取 token | 2,360,503,168 |
| 缓存写入 token | 0 |
| 输出 token | 4,533,937 |
| 总 token(输入 + 输出) | 2,398,950,011 |
| 主调用 / 子 Agent / 辅助 / 分类未知 | 5,949 / 2,257 / 18 / 1 |
| 重扫新增 / 修订变化 | 0 / 0 |
逐次 model_usage 合计与应用统计完全一致。turn_usage 506 行中 482 组相符、24 组不同, 其累计总量为 2,389,951,339;这份活库快照不能把 turn_usage 当作全部完成调用的替代值。 两种记录分别核对并保留差异,不强行抹平。核对程序不输出原始提示词、正文、session ID 或项目路径。
界面与性能
- 五页统一侧栏、层级、间距、卡片、表格和表单,主题覆盖图表文字、坐标轴与浮层; 窄窗口保持可用,保留键盘焦点与减少动画偏好。
- 看板新增活动天数、用量字段已知比例、耗时样本量、待核查记录和历史覆盖提示。 缓存文案改为“缓存读取占比”,避免把 token 占比误称为请求命中率。
- 来源页支持搜索、归属用户和启用切换,显示兼容、缺失文件及失败状态; 删除已经由自动采集替代的 ZCode 手动补录入口。
- 图表相同结构增量更新;未知用量留空;自定义浮层转义来源标签。 今日与明细使用统计时区,日期偏移不依赖 OS 本地时区或固定 24 小时。
- 汇总复用一次覆盖选择与明细扫描,消除按周期/维度反复扫描; 历史周期替换使用集合处理,避免逐归档行反复过滤全部日行。 聚合导出不先装载原始明细;无变化采集、重复导入及重复保留清理不推进修订。
- 性能结论限于实现与回归结果;未测百万行 P95、空闲内存或全部来源统一时间限制, 不把减少重复请求等同于已经达到 M7 全部资源目标。
本轮验证
环境:Windows x64,Node.js 24.21.0、Rust 1.98.1,依赖按锁文件;cwd 为仓库根。 OS 文件锁使用 Rust 1.89 起的 File.try_lock, 桌面 Cargo rust-version 改为 1.89;CI 既定 1.98.0 满足该要求。
| 命令/检查 | 退出码 | 结果与日志 |
|---|---|---|
| npm run verify | 0 | 476 项 Rust、6 项前端纯逻辑、3 项脚本测试通过;资源、Markdown、Svelte、全工作区 fmt/clippy 和前端构建通过;verify-complete.log |
| npm run test:browser | 0 | Edge headless,10 类检查、运行时异常 0、7 张截图;browser-final.log |
| npm run build:desktop | 0 | Windows release + NSIS;release-complete.log |
| real_verify_zcode | 0 | 上表逐次值相等、重扫不新增用量;real-zcode-final.log |
| headless-schema-check.py | 0 | 子进程按预期退出 1;无对话框,数据库 SHA-256 不变;headless-schema.log |
| git diff –check | 0 | 收尾检查无空白错误 |
最终 NSIS 候选包为 desktop/src-tauri/target/release/bundle/nsis/LLMUsage_0.1.0-dev_x64-setup.exe, 2,564,223 字节,约 2.45 MiB;未运行安装程序。 后台失败路径以本次 release 程序和独立 APPDATA 验证,不接触正式用户库。 日志与一次性探测均位于 build/review-2026-09-27/。
浏览器测试已保存为 desktop/tests/browser-smoke.mjs,由 npm run test:browser 运行。 使用固定时间、OS 洛杉矶时区与统计上海时区、合成 IPC 数据;验证五页、深浅主题、 760px 布局无页面横向溢出、初次仅两次汇总查询、空闲 31 秒无额外汇总查询、 快速筛选时旧响应不能覆盖新值、空用户不继承旧数据、相同修订下来源重新分配生效、 刷新保留页码以及数据清理后页码收缩。结果和截图保存在 build/browser-smoke/。
前端六项纯逻辑测试覆盖时区/DST、面板顺序和损坏布局、耗时加权、未知图表值、 名称大小写合并、浮层 HTML 转义。Rust 回归覆盖归档去重、同值不同原生请求、实例隔离、 数据库缺失保护、NULL 字段、裁剪边界、周期保留、用户筛选、交换事务、时区重建及进程锁。
首次全量检查揭示两项旧断言仍采用已纠正的规则:无会话 ID 记零、ZCode 仅有 JSONL 身份。 已同步为未知值及 DB/JSONL 各自原生身份;保留业务断言后重跑全套通过。 终端沙箱曾出现启动访问拒绝和子进程 EPERM;通过受支持的提升执行完成验证, 不把启动失败算作业务失败,也未删除测试来规避检查。
AI 维护入口与按需维护规则已同步真实命令和采集回归要求;未建立重复 Skill 或空规则。 CI 已加入前端回归和全工作区 fmt/clippy,本轮未推送触发 CI。
剩余验收与数据限制
- 尚未执行原生 GUI 全流程、安装/卸载、Windows 系统任务注册、macOS/Linux/WSL 本轮验收。 Playwright 模拟 IPC 不证明 Tauri 原生对话框、IPC 或系统集成通过。
- 来源已删除且应用从未保存的数据无法恢复;边界不完整或版本尚未核验均保留可见限制。 封存后的会话数、耗时样本及跨时区小时无法从总量反推。
- 历史只有周/月/年层时,截断周期不按比例摊入任意日期范围; 星期/小时热力图仅展示仍有明细的范围。
- 当前交换仍为聚合快照导入;明细级合并、删除传播和完整 Merge 按原计划后续实施。 不允许用聚合快照覆盖仍持续采集的同源明细分区。
- 逐源定时、监听、系统任务 desired/applied 状态和统一时间限制仍按 M6/M7 待办推进; 这些计划不被本轮静态或单元测试通过自动标作完成。
归档与界面补充核验
用户反馈暗色热力图有黑色色块。浏览器截图复现:先前坐标轴交替底色使无调用位置 呈灰黑棋盘,低值端深蓝也接近面板背景。现在绘制固定 7×24 个中性底格, 仅在有调用时覆盖蓝青金色强度格;深浅主题分别设定底格和间距颜色。 浏览器暗色趋势截图可在本轮 build/browser-smoke/trend-dark.png 核对; 新的截图显示无调用位置颜色一致,不再有交替黑格。总览历史和趋势默认顺序 均为 token 用量、调用与会话;已保存布局保留用户自定义顺序。
Qwen Code 官方归档行为说明 说明 JSONL 从 chats 移入 chats/archive,恢复时移回。上游另有 活动与归档副本并存的问题, 因此不能按文件数相加。当前配置文档 确认 QWEN_RUNTIME_DIR、QWEN_HOME 的路径含义;新 projects 与旧 tmp 布局 见上游会话格式讨论 及官方 daemon 文档。 适配器只枚举两种布局的 chats 及其 archive,同一根保留一个来源实例, 活动文件先读,原生 uuid 去重,新的活动尾记录照常计入。 两个自动环境根按运行时覆盖优先级选择;手工根可补旧位置。环境变量中的 绝对路径及以波浪号开头的用户目录路径可解析;相对于 Agent 工作目录的路径 无法由桌面进程可靠还原,需在设置中添加绝对手工根。 本机只读检查未发现 Qwen 根,所以归档数字以合成样本验证,尚无真实 Qwen 归档验收。
Gemini CLI 会话管理 确认自动保存会话默认定期清理;手动 checkpoint 是另存的会话状态,未取得可与自动会话精确去重的逐次用量身份与格式依据。 因此不把它当成独立调用来源相加。pi 删除会话可进系统回收站,但这是删除操作, 不是内置独立用量记录;Claude、Codex、Kilo、OpenCode、ZCode 的已知归档行为 沿用上文规则,不因相似目录名扩展到其他 Agent。
新增三项 Qwen 回归:仅归档可计入;活动副本加尾且归档仍在时共三个调用,
重扫修订不变;旧 tmp 与新 projects 同来源只计两条原生调用,排除旁路 JSONL;
运行时覆盖路径只选目标根。Qwen 回归检查及八项原有增量测试均通过。
浏览器检查补两页默认顺序和暗色趋势截图,11 类检查、8 张截图、
运行时错误 0。完整 npm run verify 退出码 0:479 项 Rust、6 项前端纯逻辑、
3 项脚本测试通过,Markdown、资源、Svelte(0 错误、0 警告)、fmt、clippy
和前端构建通过;日志 build/review-2026-09-27/verify-archive-layout.log。
npm run test:browser 退出码 0,日志 browser-heatmap-final.log;
npm run check 在添加图例后再次退出码 0,日志 check-heatmap-legend.log。
npm run build:desktop 退出码 0,生成 Windows release 与 NSIS 安装包,
日志 release-archive-layout.log。候选包为
desktop/src-tauri/target/release/bundle/nsis/LLMUsage_0.1.0-dev_x64-setup.exe,
2,567,112 字节;未运行安装程序。浏览器仍使用合成 IPC,
未代替原生 GUI 或真实 Qwen 归档验收。
数据源健康与未知版本
用户反馈 Codex、ZCode 均显示“需要检查”。本机应用库只读查询显示:Codex
272 个活动文件、38 个降级文件;ZCode 2 个活动文件、10 个旧“new”文件及
1 个旧“不支持”文件。两源最近 7 次任务均成功。当前程序在仓库 build/
中的隔离应用库重新读取同一本机来源后,Codex 仍有 38 个降级文件,ZCode
为正常。Codex 的差异不是未知版本:38 个降级文件均属已登记版本;新库诊断有
37 项逐次用量与最终快照不一致、4 项累计回退,以及 1 项用量结构异常,
无法证明所有调用完整,因此保留“部分数据需核对”。隔离库与真实应用库
分别存储,未写入真实应用库或 Agent 日志。
ZCode 的旧“不支持”文件缺 sessionId,但有 requestId 和用量;主数据库
已被设为主要统计来源,现有采集不再读取 JSONL,以免跨格式双计。只读对照发现
该 JSONL 的请求 ID 与 DB 原生/逻辑请求 ID 均无匹配,且同日时间附近的
token 数也不同;trace_id 并非逐调用唯一,因此不能证明数据库已覆盖该调用。
文件名虽像测试样本,但不能据此判定为无效或安全忽略。本轮保留该告警和
原有统计,不把 JSONL 直接相加;来源卡片新增“未识别 1 个文件”,使原因可见。
隔离新库初次扫描 ZCode 为正常,因为 DB 主要记录跳过了旁路 JSONL;
此结果只验证 DB 路径可用,不能证明旁路文件的用量已被纳入。
未知版本本来就按 Agent 专属最新内置解析器尝试,结构通过的数据会计入统计,
版本依据仍保留 latest_fallback。本轮修复两处跨 Agent 判定:增量扫描继续
使用已保存的版本依据;兼容解析若出现坏记录,即使有有效调用也显示部分数据
需核对,而不是让 active_compat 掩盖异常。初次完全不兼容仍拒绝,不能用
“成功 0 条”代替错误。数据源卡片区分兼容读取与降级文件,前者用普通信息色。
补充回归覆盖:未登记版本的有效调用正常入账并保持正常来源状态;同一文件
后续出现无效用量时保留已计入的两个调用、文件及来源标为降级;ZCode 成功
读取主数据库后,旧 unsupported/degraded JSONL 告警仍保留,不能用
“DB 扫描成功”抹掉未验证的旁路用量。浏览器检查新增来源健康、未识别文件
和兼容提示断言。
环境仍为 Windows x64、Node.js 24.21.0、Rust 1.98.1;命令均从仓库根执行,
Rust 聚焦测试在 desktop/src-tauri 执行。日志均在
build/source-health-2026-09-27/:
| 命令/检查 | 退出码 | 结果 |
|---|---|---|
| cargo test -p llm-usage-core –test zcode_gaps_synthetic –test zcode_db_backfill –test codex_gaps_synthetic –test codex_versions_v17 | 0 | 最终 38 项通过;首次新增回归揭示增量坏记录被误判为全文件不兼容,已修正 |
| npm run verify | 0 | 481 项 Rust、6 项前端纯逻辑、3 项脚本测试;Markdown、Svelte(0 错误/警告)、fmt、clippy 与前端构建通过 |
| npm run test:browser | 0 | 12 类检查、8 张截图、运行时错误 0;合成 IPC |
| npm run build:desktop | 0 | Windows release 与 NSIS 安装包生成,2,568,281 字节;未运行安装程序 |
| git diff –check | 0 | 无空白错误 |
用户真实应用库未被修改。自动批准审查拒绝将整库复制进仓库 build/:
该库可能包含敏感用量与元数据,用户的许可限于只读验证。本轮改用真实来源的
隔离新库重扫、真实库定向只读 SQL 与合成旧状态回归;因此真实用户库升级后
首次刷新是否清掉历史告警,仍需运行新版本后观察。
逐日热力图与多语言扩展
用户要求热力图每格为一天,并补主要语言。原实现将所选日期范围压成 星期几 × 小时,相隔一周的同一小时被合并;直接读留存事件,在事件清理后 漏掉仍有每日汇总的用量。现按所选 IANA 时区输出连续本地日期,从 daily_usage 汇总每日期的调用和已知 token,并与总览日层使用同一筛选规则。 每日层保留截止线之前、且该日已无匹配日层数据时返回不可用状态; 周期归档本身也单独检查,覆盖没有本机每日截止线的导入库。同日若还有 部分日数据,则保留已知数值并标记部分覆盖。周/月/年物化总量不能按日拆分, 因此不会填零、分摊或重算。周分布直接合并这些日期格,并在覆盖不全时提示边界。 合成测试包含跨周同星期、 上海时区跨 UTC 日期、事件删除后保留日层、大小写筛选、空用户集合、 日层清理后仅有周期归档、无截止线的周期导入、同日部分保留等情形。
界面改用日历格,暗色底格和颜色分级均由主题变量控制,清理后的日期用 斜纹区别于零调用,部分覆盖用虚线框;短范围旁显示已知活跃天数、 已知最长连续活跃与已知最高调用日期,避免覆盖缺口被误读为完整结果。 浏览器深浅主题截图确认没有旧黑块;日期格数量与筛选范围一致。
新增繁体中文、日语、韩语、西班牙语、法语、德语、巴西葡萄牙语和俄语, 与原有简体中文、英语合计 10 种语言。292 个界面键逐语言齐全, 测试核对键集合、非空文案和插值参数;语言选择可持久化且即时生效。 日期、数字、相对时间走当前 locale 的 Intl 格式化,统计时区和查询结果不由 翻译决定。诊断原文和来源原始名称不属于界面翻译。各语言文字仍需母语审校, 尤其是有操作后果的清理、导入和导出说明。
本节验证环境为 Windows x64、Node.js 24.21.0、Rust 1.98.1; 浏览器使用合成 IPC,不能代替原生 GUI 或真实日层清理后的安装验收。
| 检查 | 退出码 | 结果 |
|---|---|---|
| npm run verify | 0 | 483 项 Rust、8 项前端纯逻辑、3 项脚本测试;Markdown、资源、Svelte 0 错误/警告、Rust 格式与 Clippy、前端构建均通过 |
| npm run test:browser | 0 | 13 类检查、9 张截图、运行时错误 0;逐日格子、深浅主题、10 种语言保存切换、德/俄窄屏均覆盖 |
| npm run build:desktop | 0 | Windows x64 release 与 NSIS 生成;安装包 2,585,083 字节,未执行安装 |
| git diff –check | 0 | 已跟踪改动无空白错误;新文件另由格式、类型和测试检查 |
前端产物的 JS gzip 为 287.14 KB、CSS gzip 为 7.27 KB, 仍低于设计中的前端 gzip 1 MiB 上限。未在本轮实测首屏 P95; 原生桌面逐语言验收及翻译文字母语审校仍待后续人工检查。