Agent Timeline v0.7.5
修一个把同一场对话摊成好几个「项目」的分组缺陷。用户报的现象是「消息不及时、时间有问题」——
实际时间戳分秒无误,是命令被挂到了别的项目组里、在原来那组找不到,于是把一条措辞相近的旧命令
当成了自己刚发的那条。Windows 先落地,macOS 复现确认后同轮跟进对齐。
修复(Windows)
- claude 会话的项目名钉在「会话启动目录」,不再跟着
cwd漂。原规则取每条记录cwd的
末段目录名,而一场会话里的cwd会被 subagent、工具调用里的cd改写:实机会话从仓库根
启动后cwd依次漂到tools/harness-governance→uikit_uiautomation_midscene→
hawk_agent-rs→meeting-hawk→hawk_server,一场对话被摊成 7 个「项目」,同一个
仓库在全库里裂成 8 组。改后只认本文件第一条cwd,之后的漂移只用于「是不是摘要器自己的
会话」判定。语义是按会话在哪儿起的分组——直接在子目录里起的会话仍然自成一组; - 断点续读回头补读文件头(
ClaudeParser.FirstCwd+PinProjectFromHead,与
CodexParser.EnsureMeta同构)。否则项目名会钉在「重启恢复那一刻恰好在哪个子目录」,
比漂移更难查。头扫描封顶 256 KB,不为一个显示名整读 20 MB 的会话文件; - 一次性回填存量节点(
TimelineCoordinator.BackfillProjectPins,marker
AppSettings.ProjectPinBackfillVersion)。解析器改规则只对新节点生效,历史仍是裂的。
回填与实时解析共用FirstCwd同一口径,否则回填完再跑一轮又会改回去;只UPDATE project
一列、不碰唯一键,重跑幂等;源文件已删除或读不出cwd的保持原样,不猜。在建窗之前
同步跑完,否则本次启动看到的还是旧分组; - 其余通道不受影响:codex 的
cwd取第一条session_meta(本就只应用一次),
grok / kimi / zcode 取目录名,都不存在会话中途漂移。
验证(Windows)
- Core 冒烟 442 → 451:漂移不改组、续读补读文件头、
FirstCwd在缺文件时返回 null,
以及回填的三条(改对、源文件没了不动、重跑幂等); - 真实库实机(改动前整份备份 db/-wal/-shm/settings):
项目归属回填完成:129 个节点改挂到 会话启动目录,8 个碎组并回一组,条数 1428+67+32+15+7+5+2+1 = 1557 与实测逐个相等;
35 个 claude 源文件回填耗时 0.84 s,本次启动零 WARN / 零 ERROR。
修复(macOS)
- 同一缺陷,独立复现确认后对齐:本会话自身的真实语料里
cwd就漂过——
agent-timeline→agent-timeline/macos→.../Sources/AgentTimeline→
agent-timeline/windows,回填前真实库对应节点分落agent-timeline\|85、macos\|2、
AgentTimeline\|1三组。规则与验证同 Windows(项目名钉在会话启动目录、断点续读补读
文件头封顶 256 KB、存量回填 version-gated 一次性迁移),实现路径不同:
ClaudeParser.firstCwd头部扫描 +ParsedFileContext.projectPinned兜底、
AppDelegate.backfillProjectPinsIfNeeded。顺手把项目名派生换成早已存在但从未被这条
路径调用过的ParserSupport.projectName(fromCwd:fallback:)(统一走反斜杠归一化+空白
兜底,与 winParserUtil.ProjectNameFromCwd同口径)。只改 claude:复核确认 codex/
grok/kimi/zcode 都不存在中途漂移。
验证(macOS)
swift test95 → 98(漂移不改已钉住的项目名、firstCwd忽略漂移只认文件头、
makeContext靠头部扫描钉住——覆盖断点续读场景);- 真实库实机(改动前整份备份 db/-wal/-shm/defaults):回填日志
项目归属回填完成:9 个节点改挂到会话启动目录,9 =macos(2)+AgentTimeline(1)+ harnessloop(5)+android(1)逐项对上;claude 节点总数回填前后不变(226 → 226,只是
重新分组);项目筛选下拉里四个幽灵组消失;手工清零 marker 强制重跑确认幂等
(结果逐字段相同、无新变更)。