【BUG】DSH底层问题详细Bug报告 #4672
Replies: 1 comment
|
问题 A 我在另一份 0.1.1-rc.2 线的源码副本上独立核过一遍,函数体与你贴的一字不差,两个调用点也确实是裸传( 三点补充,第一点是对你报告的更正。 1. 把三个判断照原样跑一遍真值表:
第二条判断在第三条之前就命中了,所以 这对你的定位有影响:你现场看到的是 2. 测试盲区比你写的还大,而且是"行覆盖率骗人"的标准形态。
同一天 #4676 报的 3. 一条硬边界,给任何想"先用插件绕过去"的人(也说明 A 只能上游修)。 外部插件改不了 DSH 原生工具已经发出的 arguments。我们自己的兼容层里这条是写死并显式拒绝的:Pi 侧的 反方向倒是成立: 问题 B 我给不了实证,只能指个方向:mtime/ctime 类 freshness token 撞上会改元数据的同步守护进程(Synology Drive、OneDrive、以及 利益相关:我维护一个第三方 DSH 插件(Pi 生态兼容层)。上面第 3 点是我们自己代码里的实测结论,其余是对官方源码的核证——这两个 bug 都在 DSH 自家组件里,我们修不了,也不该修。 |
Uh oh!
There was an error while loading. Please reload this page.
DeepSeek Harness / DSH Desktop Bug Report
1. 报告摘要
本报告记录在 DSH Desktop 中观察到的两个相关但相互独立的问题,供 DeepSeek Harness 官方维护者定位和修复:
justification被错误拒绝。write/edit可能错误抛出FS_STALE_VERSION。其中,第一个问题已经通过当前官方源码确认仍然存在,且能够从源码直接推导出稳定复现路径;第二个问题的源码机制也仍然存在,但“本机实际触发是否由 Synology Drive 元数据变化导致”需要在运行中的 Desktop 重启后通过集成测试最终确认。
本报告不要求官方接受现有用户级 workaround 作为长期方案,重点请求官方确认参数归一化、版本 token 语义及对应回归测试策略。
2. 报告环境与源码基线
2.1 用户环境
D:\SynologyDrive\ObsidianD:\SynologyDrive带 WindowsReparsePoint属性。cloud-drive-connect、cloud-drive-daemon、cloud-drive-ui。2.2 官方源码仓库
deepseek-ai/deepseek-harnessE:\CodeFile\DSHsourcemastermaster与本地副本一致。b150a551b8d465e31e418e1b2eaf5e79bbb7d28e2026-08-21T20:03:37+08:000.1.1-rc.22.3 运行实例与源码的关系
运行实例位于:
D:\Program Files\DSH\DSH Desktop\resources\app.asar.unpacked\其中可以看到打包后的
@deepseek-ai\dsh-sandbox\lib\index.js。该目录仅用于对照确认 Desktop 当前运行代码的行为,不应作为正式源码修复位置,因为安装更新可能覆盖其中的修改。3. 问题 A:空
justification导致普通工具调用失败3.1 用户可见症状
新建 DSH 对话后,普通工具调用失败,返回:
该调用没有请求权限升级,也没有意图访问工作区外资源。现场推断工具适配层在序列化可选字符串字段时,将未填写的
justification传成了空字符串""。3.2 预期行为
普通工具调用不携带权限升级参数时,应当正常执行。例如:
如果适配层因为 schema 或序列化原因传入:
在没有
sandbox_permissions的情况下,空字符串应当被视为“未提供”,而不是被当作一次真实的权限升级理由校验。3.3 实际行为
官方当前源码中的共享校验函数位于:
E:\CodeFile\DSHsource\packages\sandbox\sandbox\src\escalation.ts当前实现:
当输入为:
执行结果为:
原因是
justification !== undefined对空字符串成立,随后''.trim().length === 0也成立。也就是说,当前实现区分了undefined与"",但工具参数适配层可能无法稳定保持这种区分。3.4 影响范围
该共享函数被以下工具链调用:
因此问题潜在影响:
pwsh普通调用;bash普通调用;write/edit等调用在其 sandbox 参数处理路径上的普通调用。这是一个跨工具共享的参数处理问题,不应只在某一个工具包中添加临时特判。
3.5 当前测试覆盖情况
测试文件:
E:\CodeFile\DSHsource\packages\sandbox\sandbox\tests\escalation.spec.ts当前已经覆盖:
但没有覆盖关键输入:
因此当前测试不会捕获普通调用因空字符串字段失败的问题。
3.6 建议修复方向
优先建议在工具参数归一化层统一处理:
同时,
dsh-sandbox的共享校验入口建议保留防御式兼容,至少使以下输入满足预期:如果选择只在校验函数中兼容,也应明确其行为等价于:
但不建议仅修改某个 Desktop 打包后的
lib/index.js,因为这无法修复源码构建产物以外的部署方式,也无法提供正式回归保护。3.7 必须保持的安全语义
修复不能把空字符串兼容扩大成无条件允许权限升级。以下规则应保持:
5.2 NAS stale-version 验证
C:\Users\lucif\.dsh\profiles\desktop\cordis.patch.yml内容仍正确;read一个 Synology Drive 工作区中的已有文本文件;edit;FS_STALE_VERSION;read与edit前后各 stat token 分量,尤其是ctimeNs。6. 建议官方关注的最小修复范围
对问题 A
最小正确修复应包括:
对问题 B
建议先区分两个层次:
dsh-fs-local/dsh-fs-observation-policy上游重新定义跨平台 freshness token,配套并发写入和同步文件系统测试。7. 相关文件索引
本地运行实例
官方源码
用户 profile
8. 给官方维护者的简短结论
在提交
b150a551b8d465e31e418e1b2eaf5e79bbb7d28e的官方master源码中,validateEscalationArgs(undefined, '')仍然会抛出invalid justification: expected a non-empty sentence。这确认了普通工具调用的空字符串兼容 Bug 尚未修复。同一提交中,Windows 本地文件系统版本 token 仍包含
ctimeNs,并且write/edit仍对完整 token 做严格相等比较。因此 Synology Drive 工作区的 stale-version 误报机制仍然存在,建议官方进一步确认同步目录的实际 stat 变化,并重新评估版本 token 设计。建议官方首先修复问题 A 并添加回归测试,再单独处理问题 B;两个问题共享文件工具使用场景,但不应通过关闭整个 sandbox 或 approval 栈来解决。
All reactions