现象
在 DSH 0.1.5-rc.1(profile web)上选择「学习模式」(dsh-learning-mode@0.1.1),preset 挂载失败、
模式不可用:
failed to apply loader entry persona(@deepseek-ai/dsh-persona):
invalid config:
- prefix missing required value (at prefix)
(/home/ankali/.dsh/.agent-presets/learning-mode/agent.cordis.yml)
环境
- dsh
0.1.5-rc.1,profile web,Node v22.23.2,Linux
dsh-learning-mode@0.1.1
@deepseek-ai/dsh-persona@0.1.5-rc.2(dsh 的依赖声明是 ^0.1.5-rc.1)
根因
@deepseek-ai/dsh-persona 的配置字段已由 text 改名为 prefix(并新增 suffix):
| dsh-persona 版本 |
Config schema |
0.1.2-rc.1(及更早) |
text(required)、complete、includeRuntimeContext |
0.1.5-rc.1 起(含 0.1.5-rc.2 / rc.3) |
prefix(required)、suffix(default '')、complete、includeRuntimeContext |
本包捆绑的 preset/learning-mode/agent.cordis.yml 第 18 行仍是旧字段:
- id: persona
name: '@deepseek-ai/dsh-persona'
config:
text: |- # ← 当前 persona 只认 prefix
同文件第 6 行的说明注释也还写着 persona.text。harness 在 apply loader entry 时做 schema 校验
(cordis resolveConfig() → Config['~standard'].validate()),prefix 缺失即抛 ValidationError,
整个 preset 挂载失败。对照:dsh 自带的 standard / minimal / cordis / ptc 用的都是 prefix。
复现
dsh plugin --profile web add dsh-learning-mode,重启 host
- 选择「学习模式」(或新建一个使用该 preset 的会话)
- 挂载失败 → 上面那段报错
建议修复
preset/learning-mode/agent.cordis.yml 第 18 行:text: |- → prefix: |-(正文一字不用动);
- 同文件第 6 行注释里的
persona.text 一并更正为 persona.prefix。
⚠️ 升级路径需要注意
lib/index.js 的 installer 是「目标目录已存在就跳过」(idempotent,注释明确写了 an existing target
directory is left untouched)。这意味着即使发布了修复版,已经装过的用户也不会拿到修复 ——
$DSH_HOME/.agent-presets/learning-mode/ 会一直保留旧的 text:,故障持续。
建议二选一并写进 README:
- 检测已存在目录的内容/版本戳并在旧版本时覆盖(可参考
@ziduup/dsh-programming-mode 的版本戳策略),或
- 明确提示用户手动处理:删除
~/.dsh/.agent-presets/learning-mode/ 后重启 host,让它重新植入。
在修复发布前,现有用户可以自己改一行:
sed -i '0,/^ text: |-/s// prefix: |-/' ~/.dsh/.agent-presets/learning-mode/agent.cordis.yml
(text: 在本文件里只出现一次,改完重启 host 即可;本次即用此法修复并验证。)
验证方式(离线,不需要起 host)
按 harness 的真实路径离线校验组合文件:
- 用 loader 自己的 YAML 方言(
entryListSchema,即带 !!js 的那个)解析 .cordis.yml;
- 按 loader 的
interpolate() 递归求值 !!js 节点(with (scope) { return eval(expr) },scope 提供 baseUrl);
- 对每个会启动的 row(
Boolean(disabled) === false,组递归)解析模块并调用 Config['~standard'].validate(config)。
结果:修复前该文件报 row "persona" (@deepseek-ai/dsh-persona): $.prefix missing required value (at prefix)
(且仅此一条 apply 级错误,与线上报错一致);修复后与内置 standard、cordis(对照组)一样 OK。
人格正文 SHA-256 比对:改键前后一致(3474 字符,同一 hash),确认只换了键名。
🤖 本 issue 由 DeepSeek Harness 的 coding agent(模型 deepseek-flash) 定位根因、复现并起草,
经用户授权以其 GitHub 账号提交。上文的 schema 对照、installer 幂等性分析、离线校验脚本与
SHA-256 正文比对均由该 agent 实际执行。
现象
在 DSH 0.1.5-rc.1(profile
web)上选择「学习模式」(dsh-learning-mode@0.1.1),preset 挂载失败、模式不可用:
环境
0.1.5-rc.1,profileweb,Node v22.23.2,Linuxdsh-learning-mode@0.1.1@deepseek-ai/dsh-persona@0.1.5-rc.2(dsh 的依赖声明是^0.1.5-rc.1)根因
@deepseek-ai/dsh-persona的配置字段已由text改名为prefix(并新增suffix):0.1.2-rc.1(及更早)text(required)、complete、includeRuntimeContext0.1.5-rc.1起(含0.1.5-rc.2/rc.3)prefix(required)、suffix(default'')、complete、includeRuntimeContext本包捆绑的
preset/learning-mode/agent.cordis.yml第 18 行仍是旧字段:同文件第 6 行的说明注释也还写着
persona.text。harness 在 apply loader entry 时做 schema 校验(cordis
resolveConfig()→Config['~standard'].validate()),prefix缺失即抛ValidationError,整个 preset 挂载失败。对照:dsh 自带的
standard/minimal/cordis/ptc用的都是prefix。复现
dsh plugin --profile web add dsh-learning-mode,重启 host建议修复
preset/learning-mode/agent.cordis.yml第 18 行:text: |-→prefix: |-(正文一字不用动);persona.text一并更正为persona.prefix。lib/index.js的 installer 是「目标目录已存在就跳过」(idempotent,注释明确写了 an existing targetdirectory is left untouched)。这意味着即使发布了修复版,已经装过的用户也不会拿到修复 ——
$DSH_HOME/.agent-presets/learning-mode/会一直保留旧的text:,故障持续。建议二选一并写进 README:
@ziduup/dsh-programming-mode的版本戳策略),或~/.dsh/.agent-presets/learning-mode/后重启 host,让它重新植入。在修复发布前,现有用户可以自己改一行:
(
text:在本文件里只出现一次,改完重启 host 即可;本次即用此法修复并验证。)验证方式(离线,不需要起 host)
按 harness 的真实路径离线校验组合文件:
entryListSchema,即带!!js的那个)解析.cordis.yml;interpolate()递归求值!!js节点(with (scope) { return eval(expr) },scope 提供baseUrl);Boolean(disabled) === false,组递归)解析模块并调用Config['~standard'].validate(config)。结果:修复前该文件报
row "persona" (@deepseek-ai/dsh-persona): $.prefix missing required value (at prefix)(且仅此一条 apply 级错误,与线上报错一致);修复后与内置
standard、cordis(对照组)一样OK。人格正文 SHA-256 比对:改键前后一致(3474 字符,同一 hash),确认只换了键名。