From a7448552c1df9e7ac3696f5d8252ff87d1b49cc9 Mon Sep 17 00:00:00 2001 From: oratis Date: Sun, 9 Aug 2026 23:13:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(analytics):=20un-binary=20usage-ledger.js?= =?UTF-8?q?=20=E2=80=94=20escape=20the=20NUL=20separator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `summarize()` 用 NUL 作 `month`/`agent_id` 复合键的分隔符,这个选择本身是对的 (NUL 不可能和 `YYYY-MM` 或任何 agent_id 冲突)。问题出在编码:两个 NUL 是以 **裸字节 0x00** 直接写进源文件的,而不是转义序列。 由于 NUL 落在文件前 8000 字节内,git 把整个文件判定为二进制,后果有两层: - `git diff` 只显示 `Bin 9679 -> 10779 bytes`,`git blame` 完全失效, `file` 报 `data` —— 这个 bug 把自己从 review 里藏了起来(它是 #17 带进来的) - 更糟的是**文件无法三方合并**:#23 在 main 上也改了这个文件,于是本分支 第一版直接 CONFLICTING,git 对二进制文件没有合并策略可用 改动: - 两处裸 0x00 换成 `\u0000` 转义 —— 注释里的复合键说明,以及 `cellKey` 模板字符串 - 运行时字符串完全不变:模板字面量里的 `\u0000` 求值仍是 U+0000, `getWorkspaceUsage` / `getPlatformUsage` 的分组逐字节一致 验证: - 文件 NUL 计数 0;`file` 现在报 `Unicode text, UTF-8 text` - 全仓受跟踪文件扫描,没有第二个文件有同样问题 - `npm test` 678/678 通过;`usage-ledger.test.js` 单独跑 29/29 - 对抗性分组检查:agent_id `07-x` 在 `-` 分隔符下会与 `2026-08-07`/`x` 撞键, 用 NUL 分隔后仍正确分桶(同月同 agent 合并、不同 agent 分离、总计正确) 已 rebase 到当前 main(含 #23 对本文件的改动),冲突按「取 main 版本 + 重新施加 同一处转义」解决。 注意:本次 diff 对 HEAD 仍显示 `Bin`,因为 git 只要有一侧是二进制就走二进制路径, 而旧 blob 确实含 NUL。合并后该文件的 `git diff` / `git blame` 恢复正常。 #29 的 `.gitattributes` 会让这类 diff 即使跨 NUL blob 也强制按文本渲染。 Co-Authored-By: Claude Opus 5 --- server/usage-ledger.js | Bin 10779 -> 10789 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/server/usage-ledger.js b/server/usage-ledger.js index abb86002cf96f9b2a86cc701fefcf367325051b3..7d10d4c8e0b0174c55e058220dcd947468fb495b 100644 GIT binary patch delta 31 fcmbOovNU8vnj~9HsR0mdPM36Ngt6C4