Skip to content

Session-only hit evidenceRead points to offset=0, useless for long sessions #83

Description

@catoncat

Problem

PR #82find --json 加了 evidenceRead 字段:message hit 建议 read-range(用 matchSeq 定位),session-only hit 建议 read-page。message hit 的 evidenceRead 真实有效(6/6 agent 在真实数据测试中都成功用它拿到了关键证据)。

session-only hit 的 evidenceRead 固定指向 read-page offset=0 limit=40,对长 session 基本是空操作——读到的 40 条开头消息跟触发 session-level match 的 compact/summary/reasoning 文本完全无关。

这违反了 issue #72 的设计目标("Assemble evidence for session-only recall hits without adding a top-level command")。当前实现只是机械地给了个 read-page 命令,没有尝试定位到实际触发 match 的内容对应的 message 区间。

Local Evidence

真实数据复现(来自 4566 sessions / 247K messages 的库):

  1. pi session,86 条 message:

    • find "sherlog memory review"⚡ Bolt: optimize message array traversal in session parsing #2 hit 是 pi session pi:019ede1c-a229-71b9-9d40-cc79a60dac65(matchSource=session,因 compact_text 命中)
    • evidenceRead 返回 read-page offset=0 limit=40
    • 跑出来读到的是 "hi" / "你好,我在。当前在 mom 仓库,可以帮你查环境..." ——跟 "sherlog memory review" 完全无关
  2. codex session,66 条 message(Agent 4 独立复现):

    • session 019dbe80-9fe3-74a2-bd4d-1cf195c86fc2(matchSource=session)
    • evidenceRead 返回 read-page offset=0 limit=40
    • 前 40 条是会话开头寒暄和上下文恢复,不是触发 match 的内容
  3. 设计源头 session(019dbe80 seq 6,2026-04-24):
    设计者当时写的是:

    "find 输出必须区分 matchSource = message | session。如果是 session-level 命中,不要假造 matchSeq;可以给 snippet 和建议 read-page,或再做轻量原文证据 scan 找真实 anchor。"

    设计时就知道应该"找真实 anchor",但最终实现选了简单的 offset=0。这是有意识的妥协,但缺了 follow-up。

Current Implementation

src/evidence-read.ts:buildEvidenceReadAction():

if (result.matchSeq === null) {
  return {
    kind: "read-page",
    reason: "session_level_match",
    offset: 0,                    // ← 固定 0
    limit: 40,                    // ← 固定 40
    argv: [..., "read-page", sessionRef, "--offset", "0", "--limit", "40"],
  };
}

session-only hit 的 matchSeq 永远是 null(因为 matchSource=session 表示命中来自 title/summary/compact/reasoning_text 等 session-level 字段,不是某条具体 message)。当前实现直接放弃定位,从 offset=0 开始读。

Impact

6 个 agent 在真实数据上的交互测试中,凡是遇到 session-only hit 的场景,都遇到了这个问题:

  • Agent 3:找 arXiv 论文起点的 session hit,read-page offset=0 读到无关开头
  • Agent 4:整个任务就是找这个缺陷的讨论,实测复现并验证了缺陷

对短 session(<20 message)offset=0 可能偶然有用(前 40 条覆盖整个 session)。但对长 session(几十条以上),这个功能基本没用——agent 拿到 40 条无关内容后,还得自己决定怎么翻页,失去了 evidenceRead "自动给出最佳读法"的意义。

Suggested Approaches

几个可选方向(不互斥,可组合):

  1. 基于 session-level match source 猜 anchor:session-level hit 知道是哪个字段命中的(compact_text / reasoning_summary_text / title / summary_text)。可以给 compact_text 命中的 session 建议从 compact 对应的时间段附近开始读(如果能记录 compact 的 approximate message seq)。

  2. 轻量原文证据 scan:Assemble evidence for session-only recall hits without adding a top-level command #72 原始设计里提到的"再做轻量原文证据 scan 找真实 anchor"。在 evidenceRead 阶段对 session 的 messages 做一次轻量 scan(用 query terms 匹配 message content),找到最相关的 message seq,用它作为 read-range 的 anchor。这比 read-page offset=0 精准得多。

  3. 至少给 read-page 加 smart offset:如果不想做 scan,至少可以基于 session 的 messageCount 给一个"中间偏后"的 offset(用户记忆里更近的对话通常更相关),或者给多个 read-page 建议(开头/中间/结尾)让 agent 选。

  4. 标记 evidenceRead 为 "best_guess":在 evidenceRead 里加一个 confidence 字段,message hit 标 high,session hit 标 low,让 agent 知道这个读法不精确、可能需要自己翻页。

What This Is Not

Related

trace: cxs_session_only_evidence_read_followup_20260626T084500Z

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions