Replies: 2 comments
|
报告非常扎实——我把整个链路对照 rc.2(HEAD 1. 源码锚点(全部确认)
2. 日志证据自洽 → 双实例是铁的 你的证据里两条 406068 时间戳相隔 6.4 分钟(end-seed 在前、inbox-spliced 在后)。若两个写者持有同一实例,end-seed 追加后 3. 家族定位:机制 #12 = 同进程双实例游标分叉 这是会话损坏家族的新机制,与此前最接近的两个区分开:
4. 修复分层(含读侧自愈的精确规则)
验收条件里"修复后恢复 + inbox-splice 不再产生 seq 冲突"对应写侧;"加载端自动修复已有损坏"对应读侧规则——两层都做才闭环。需要我贴出扫描器遮蔽规则的改动形态可以随时说。 |
0 replies
|
跟着 argszero 的源码锚点补一个使用侧的观察(利益相关:dsh-backup 插件作者):你们定位的家族共性是「恢复路径上出现了第二个写者,seq 从过期游标重新分配」——这意味着损坏往往在用户无感知时已经发生,等打开历史才爆炸。 两个建议给同样场景的人:
写入侧的修复还是得等官方,这帖的分析质量值得被排进修复队列。 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
会话恢复的 end-seed 与 inbox-splice 序列号冲突,历史损坏无法加载。
复现、预期与验收
复现步骤:
turn/end(seq 406067)。Session以存储日志为 seed 构造,因日志末尾不是session/end-seed,构造函数自动在seq = 406068追加合成标记session/end-seed(dsh-session构造函数:if (seed !== void 0 && this.log.at(-1)?.type !== "session/end-seed") this.append("session/end-seed", {}))。Inbox.mutate→this.session.append("agent/inbox/spliced", …)(dsh-agent/lib/types/inbox.js)写入。该写入路径持有的Session实例log.length仍为 406068(未包含 end-seed 标记),于是再次分配seq = 406068。turn/start406069、agent/inbox/spliced406070…)均基于该过期游标继续写入,整条尾流相对正确序列偏移 1。dsh-session-persistence-jsonl扫描器在物理行 31191 检测到 seq gap,直接抛错,整个会话历史不可用。实际结果:
history unavailable for session "session-78f369a2-…": Error: corrupt session log: seq gap in committed region at line 31191 (expected 406069, got 406068)预期结果:
seq = log.length契约成立),不同写入路径对同一会话的 seq 分配一致;commitRepair路径),而不是让整个历史不可读。环境:
@deepseek-ai/dsh、dsh-agent、dsh-session、dsh-session-persistence-jsonl均为0.1.0-rc.8session.jsonl.zstd)证据(日志实测,事件已脱敏):
session/end-seed(含此冲突处),说明会话被多次恢复;最后一次恢复的标记与 inbox-splice 冲突。session/end-seed行后,全部 1,830,282 个事件恢复连续(seq 0…1830281),Session.fromRestore校验通过。根因分析:
Session.append的 seq 恒为this.log.length(dsh-session的get seq与append),是"按 Session 实例"的本地游标,而非持久化层的权威游标。session/end-seed由构造函数在"以存储日志为 seed 恢复"时追加;agent/inbox/spliced由 Inbox 经另一个 Session 引用追加。两个写入者若持有不同的 Session 实例(或同一实例的过期快照),就会分配出相同 seq。dsh-session-persistence-jsonl的consumeEventLine)对 seq gap 直接抛错,没有像 torn-tail 那样的自修复路径。建议修复(供维护者参考):
commitRepair)。Session实例;或在 append 时以持久化端最后 seq+1 为准,游标过期则拒绝/重试。验收条件:
All reactions