「edit requires reading ... first」在进程重启 / 会话 resume 后系统性误报:观察态生命周期与持久 transcript 不匹配(附机理与插件侧验证) #3853
aka-danielZhang
started this conversation in
Ideas
Replies: 0 comments
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.
现象
edit工具在进程重启 / 会话 resume 之后系统性误报:桌面形态(每次启动 spawn 新 harness 进程)下尤其高频:会话恢复后模型做的第一个
edit,即使它在同一会话历史里刚刚读过、甚至刚刚改过这个文件,也会被拒。#275 / #450 已覆盖 fork 维度;这里补充 restart/resume 维度——机理同源,但触发面更广(每次进程重启必现,不限于 fork)。机理(源码级)
dsh-fs-observation-policy把观察态存WeakMap<session 对象, Map<targetKey, FsObservation>>(packages/fs/fs-observation-policy/src/index.ts,owner 取自actor.agent.session)——纯内存、进程级,README 也已将其列为 deferred limitation("Observed state does not survive a session resume")。edit,然后撞FS_NOT_OBSERVED。tool:edit的系统提示写 "Read the file first … unless you just created or edited it in this session",resume 之后"you just edited it in this session"确实成立。prompt 层面无法修复。我们验证过的两个关键事实
FsVersion跨进程稳定:dev:ino:size:mtimeNs:ctimeNs(packages/fs/fs-local/src/fsio.ts)。文件未变 ⇒ token 不变。这使得「持久化观察 evidence + 恢复前重验版本 token」成为一个可靠且不削弱 guard 的判定基础。fs-local+ stockfs-observation-policy+dsh-tool-fs+ToolRuntime组合,两个独立 Cordis context 模拟重启):设计建议(供讨论)
fs/observed的 present 观察 mirror 到按会话分的持久 sidecar;在tools/pre-execute(edit/write)时若本进程未观察过该 target,查会话及 fork 血缘的 evidence,ctx.fs.stat重验——版本 token 逐字节相等才补发fs/observed,让 stock policy 正常记录并走原有 CAS。文件变了 / 没了 / 从没观察过 ⇒ 什么都不做,照旧要求 read。fs/observed重放),policy 无需自带持久化——与 "Model-visible ⟺ logged" 的心智模型一致:transcript 记得的,guard 不应忘记。FS_NOT_OBSERVED时edit在工具内部自动 read 一次再重试(把浪费的往返收进 tool 内部),保持对外语义不变。方案 A 的不变量可以一句话表述:guard 忘记的永不多于 transcript 记得的;文件真变过,照样强制 read。
相关讨论:#275、#450(fork 维度)、#2148(结构化 remediation)、#3153(bash 读不计观察)。
All reactions