Repository navigation
Replies: 4 comments
|
感谢 v5.9.0 的 不过这次补丁带来一个新的升级阻断问题,建议优先处理: 附件根变更未迁移历史对象 ⇒ 升级后旧会话整轮失败
建议(按侵入性从小到大)
附:我们的临时处置(供参考)写了一个三断言门禁:① 解析运行进程实际生效的附件根(不读配置猜)② 全会话引用可达 ③ 对象名 = 内容 sha256。升级前后各跑一次并对比根路径与对象数,漂移即 FAIL。目前 209 对象 / 81 引用全可达。如需要,我可以把脚本整理成 PR 贡献到本仓库 补充一条给后来者的提醒:配置文件里写 |
|
@sanluoluo 感谢这份排查,问题 3 的根治确认让我们松了半口气—— 你补充的升级阻断问题,我们已关注,暂作待定规划处理,先把我们对现状的判断和后续安排讲清楚,避免你按「已修复」理解:
问题 1( 这批反馈目前均为「已关注、待定规划」,不是已排期。我们会在需求与计划文档正式登记后再回来同步;在此之前,若你那边有新的实测数据(尤其是不同挂载点、不同历史附件规模的样本),欢迎继续贴上来。 另感谢你提出把三断言门禁脚本整理成 PR 的意向——我们会在明确附件根的判定口径之后再评估是否合入,避免门禁规则先于实现定型。 |
|
@tnnevol 收到,「待定规划、不是已排期」我记下了,后续按这个前提走——不当成排期,也不据此催进度。你在 10-22 说的三点(新旧根判定、触发条件、失败降级)我按你邀请补两组实测,另外主动收窄一条建议的范围。 一、先在你们这个补丁上做的验证:boundary v2 在我们实例上的效果你们在
两点补充,可能对你们写文档有用:
结论:v5.9.0 那次「附件根漂到卷根、祖先 fsync 必败」的直接原因,在这个补丁下不再出现。我们这边 10-21 到 10-25 连续 4 天没有复发。 二、连续运行数据(附样本局限)同一实例,升级后连续使用:
样本局限我主动说清楚:这是一条纵向单实例、4 天、225 对象的记录,只能说明「这条路径上没再出问题」,够不上「长期有效」。你邀请的不同挂载点样本见上表(btrfs/ext4 各一,都开了 trimacl),不同历史规模我只有这一档,有第二台机器我再补。 复算命令: R=/vol1/@appdata/fn-deepseek-harness/attachments/v1
find "$R/objects" -type f | wc -l # 225
find "$R/file-objects" -type f | wc -l # 3
find sessions -mindepth 3 -maxdepth 3 -name 'session.v4.jsonl.zstd' | wc -l # 301
# 悬空核查:抽全部会话里的 attachmentId,逐个查 $R/objects/<前2位>/<id> 是否存在
zstd -dc <会话文件> | grep -oE '"attachmentId"[[:space:]]*:[[:space:]]*"sha256:[0-9a-f]{64}"'三、收窄建议③,并回答你能用的两点看到 #23 之后我核了一遍自己的三条建议落在哪一层:
关于你提的三点,我们这边实测能给两条(第三条给不出,如实说):
四、PR 意向按你的排序:等附件根判定口径明确后再评估合入,这期间我不提。门禁脚本本身已经在我们仓库里跑着,如果需要现状数据随时说。 |
|
感谢你这一轮把机制层面钉死,尤其两条补充对我们是结论级的:
一、附件存储位置定稿:
|
| 建议 | 状态 | 说明 |
|---|---|---|
| ① 升级回调补缺失对象 | 不排期 | 与你的判断一致:边界完全取决于「如何确定旧根」,该未定点未解决前不算可实施方案 |
| ② 启动自检 | 不排期 | 同属长期项 |
| ③ 读附件多根回退 | 不在本仓库做 | 按 #23 口径,改上游读取逻辑不属于本仓库范围;你已撤回、不附 PR,这条线就此放下 |
「新旧根判定只能看运行进程 environ、写配置文件不生效」这条我们接受,作为将来若重启 ① 的前提输入。
三、新进展:问题 1({{cwd}})已实现,随下一版本发布
你报的第一个问题——0.2.1 移除内置提示词变量后,旧 profile 发消息静默失败——已在主分支实现:
- 做法:升级回调扫描 profile 的
cordis.patch.yml与package.json,移除含该变量的整句(不是只删变量名,否则会留下Your working directory is .这类残句),改写前写带时间戳备份、原子写回。 - 约束:未命中的 profile 零改动(不写文件、不写备份);迁移异常只记日志、不阻塞安装;重复执行幂等(不产生新备份)。
- 验证(已验证):包级 15 条用例——命中改写、多行文本逐字保真、YAML 引号结构不被破坏、
package.json只改目标字段、备份内容等于原文、幂等、损坏文件只告警跳过;实测147条包级用例全绿。真实 fnOS NAS 上装过两版,每次安装的两次回调都执行了迁移步骤并留日志,profile 两个候选文件的内容校验和升级前后一致、无备份文件产生。 - 未验证项(如实说明):真机上没有构造「含该变量的 profile」去复现原症状——构造它需要改写测试设备的用户数据,超出我们允许的验证手段。移除逻辑本身由上面的包级用例覆盖,真机侧验证的是「迁移确实执行且不破坏用户 profile」。
实现细节与验收口径见 docs/requirements/FNOS-031-cwd-prompt-variable-migration.md、docs/plans/PLAN-FNOS-031-cwd-prompt-variable-migration.md、docs/tests/FNOS-031-cwd-prompt-variable-migration.md。
四、问题 2(悬空引用无降级)
仍是上游读侧行为:ATTACHMENT_NOT_FOUND 让整轮失败、客户端只显示 Attachment object is missing.;你补的「纯文本消息同样失败(重放历史时就卡住)」也记下了。按 #23 口径本仓库不改上游读取逻辑,应用层两条缓解(①②)暂不排期——所以问题 2 目前没有本仓库侧的改动计划,不是已修复。
顺带说明:问题 3 的直接原因(附件根漂到卷根、祖先 fsync 必败)在当前发布线上不再出现,这一点与你的复测一致。
Uh oh!
There was an error while loading. Please reload this page.
环境
fnOS 实机,DSH 安装于 /vol1 挂载树。
/vol1为 fnOS 系统挂载点,出厂权限d--------- root:root(btrfs trimacl 挂载)——这是系统管理面的默认状态,应用与用户不应修改其权限位。运行用户为 fnOS 应用标准用户(uid 980,AppUsers 组),对其子目录读写正常。2026-10-20 从 0.2.0-rc.2 升级到 0.2.1-rc.2 后暴露以下问题;经与 npm 上游 0.2.0-rc.2 包比对,问题 2、3 相关代码自 0.2.0 起即存在,非 0.2.1 引入,但升级/重部署使其必然暴露。
问题 1(0.2.1 引入):提示词变量 {{cwd}} 移除,升级无检查
0.2.0 的 agent-loop 注册
ctx.systemPrompt.variable("cwd", …),0.2.1 不再注册。旧 profile(由官方模板派生)的 persona 后缀含Your working directory is {{cwd}}.,升级后提示词组装抛unknown prompt variable "{{cwd}}",请求不发送到模型;用户侧表现为发消息没有反应、未见明确错误提示。dsh-system-prompt 的 README 有迁移指引,但升级过程不扫描用户 profile、无告警。
建议:升级时扫描用户 profile/preset 对已移除变量的引用并告警,或提供自动迁移。
问题 2(0.2.0 起存在,本次暴露):会话历史图片引用悬空时无降级、无自愈
0.2.0 时代会话(2026-10-11)中的图片引用在
attachments/v1/objects/下无对应对象文件(对象在升级前即不存在,与问题 3 的落盘失败相关)。悬空引用使旧会话重放失败:发给视觉模型时抛ATTACHMENT_NOT_FOUND,整轮请求失败;错误信息不指示「对象缺失、可重新上传」。建议:对悬空附件引用降级为占位文本(可复用 offloadedImageText 机制),并使错误可读、可自愈(提示重新上传)。
问题 3(0.2.0 起存在,本次暴露):附件落盘的持久性保证 fsync 到文件系统根,在受限挂载点上必然失败
dsh-attachment-local 的
ensureDurableHome(lib/index.js:402-407)调用ensureDurableDirectory(home, parse(home).root),把目录项持久性保证一路做到文件系统根(逐级 syncDirectory,行 352-360 以 O_RDONLY 打开目录后 fsync)。运行用户对/vol1连只读打开都被拒绝(EACCES),因此每次图片落盘必然失败。实测复现(以 fnOS 应用标准用户执行):
(对照:
/vol1/@apphome及更深目录、/var/lib的 open + fsync 均正常,故障点隔离在 /vol1 一级。)另:该失败被包装为
ATTACHMENT_WRITE_FAILED后上报,message 不含 errno、cause 链被吞;客户端侧只见笼统的prompt rejected文案,排障时无法定位真实原因。建议:
用户侧临时缓解:将 DSH_HOME 指向权限位正常生效的持久路径(如 /var/lib 下;/tmp 不可用,开机清空)。
其他
其余链路(对话、工具、搜索)在规避上述问题后实测正常。相关背景可见此前 Discussion #11(升级链路反馈)。
All reactions