DeepSeek Harness 报错 deployment:persona already registered 排查实录:从重装到定位 .dsh 配置冲突

装 DeepSeek Harness 的时候,很多人遇到的报错集中在模型配置、Provider 认证或者 MCP 连接上。这次碰到的问题更靠近框架内部。

报错看起来像配置文件写错了:

internal: resume failed for session "session-3836a0e6-9fe9-40d7-884e-876b3ebba209"

Error: agent-presets: preset "standard" failed to mount

failed to apply loader entry persona (@deepseek-ai/dsh-persona):

prompt section "deployment:persona" is already registered

第一眼很容易怀疑是 agent.cordis.yml 里重复配置了 persona,或者插件版本不一致。

结果一路排查下来,问题并不在安装包本身,而是在旧 Session、旧 Profile 和 .dsh 用户目录的状态。

本文记录整个排查过程。


问题出现时的环境

先确认当前安装状态。

查看 DSH 版本:

dsh --version

输出:

0.1.0-rc.8

查看全局安装:

npm list -g --depth=2 @deepseek-ai/dsh @deepseek-ai/dsh-persona

输出:

C:\nvm4w\nodejs
`-- @deepseek-ai/dsh@0.1.0-rc.8
  `-- @deepseek-ai/dsh-persona@0.1.0-rc.8

查看实际执行路径:

where.exe dsh

结果:

C:\nvm4w\nodejs\dsh
C:\nvm4w\nodejs\dsh.cmd

查看 PowerShell 当前调用的命令:

Get-Command dsh

输出:

ExternalScript  dsh.ps1
C:\nvm4w\nodejs\dsh.ps1

从这里可以确认:

  • DSH 和 Persona 版本一致
  • 没有多版本混装
  • 当前调用的是 NVM 管理下的 Node 环境

报错发生在 Resume Session 阶段

异常不是启动时报的。

而是在恢复旧 Session 时出现:

resume failed for session

关键报错:

prompt section "deployment:persona" is already registered

这里有两个值得关注的信息:

信息 含义
deployment:persona Prompt Section 名称
already registered 已存在同名注册项

从字面上看:

Persona 被重复注册

但问题是:

当前配置文件里并没有两份 Persona。


查看 standard 预设配置

打开:

@deepseek-ai/dsh/config/agent-presets/standard/agent.cordis.yml

其中有一段:

- id: persona
  name: '@deepseek-ai/dsh-persona'
  config:
    text: >-
      You are a coding agent powered by the {{model}} model.

文件注释写得很明确:

The preset's own persona,
shadowing the deployment default for this agent.

也就是说:

deployment persona
      ↓
standard preset persona
      ↓
agent persona

这是标准设计。

因此简单删除:

- id: persona

并不是正确方案。


排查是否存在多个 DSH 实例

接下来检查系统里的 Node 进程。

执行:

Get-CimInstance Win32_Process -Filter "Name='node.exe'" |
Select-Object ProcessId,ExecutablePath,CommandLine

发现:

5536  npm start
13676 node index.js
12104 @deepseek-ai/dsh

说明系统里确实有 DSH 相关进程存在。

为了排除旧进程影响,决定彻底重装。


卸载 DeepSeek Harness

停止所有 DSH 实例后执行:

npm uninstall -g @deepseek-ai/dsh

输出:

removed 452 packages in 11s

再次检查:

where.exe dsh

结果:

信息: 用提供的模式无法找到文件。

说明启动器已经被移除。

继续确认:

npm list -g --depth=2 @deepseek-ai/dsh

已经为空。


清理 npm 缓存

执行:

npm cache verify

然后:

npm cache clean --force

清理完成。

Node 环境如下:

node -v
npm -v

输出:

v25.0.0
11.6.2

是否需要降级到 Node 24

很多人第一反应会切换 Node LTS。

实际情况并不一定需要。

当前环境:

Node 25.0.0

同时还在使用:

Codex CLI
Claude Code CLI

切换到 Node 24 后:

Codex CLI
Claude Code CLI

都出现异常。

因此这里没有继续切换版本。

原因很简单:

当前报错发生在:

Persona 注册
Preset Mount
Session Resume

阶段。

并不是典型的 Node Runtime 报错。

贸然更换 Node 版本会引入新的变量。


改用 npx 启动 rc.8

既然已经卸载全局安装。

接下来直接运行:

npx --yes @deepseek-ai/dsh@0.1.0-rc.8 web

结果:

没有报错
没有输出
一直卡住

这一步最容易误判。

很多人会以为:

npm 下载失败
网络问题
rc.8 本身损坏

实际并不是。


真正的线索来自 .dsh

尝试删除:

C:\Users\用户名\.dsh

Windows 弹出提示:

文件夹正在使用

操作无法完成,因为其中的文件或文件夹在另一程序中打开

说明:

.dsh 被占用

这时候问题终于开始收敛。


查找占用 .dsh 的进程

执行:

Get-CimInstance Win32_Process |
Where-Object {
    $_.Name -match 'node|npm|npx' -or
    $_.CommandLine -match 'deepseek|dsh'
} |
Select-Object ProcessId,Name,ExecutablePath,CommandLine

结果发现:

6544 notepad.exe

C:\Users\reanod\.dsh\profiles\web\package.json

以及:

6188 notepad.exe

agent.cordis.yml

这里出现了关键线索。

真正锁住 .dsh 的并不是 DSH。

而是记事本。


.dsh 目录里到底有什么

从进程信息可以看到:

C:\Users\reanod\.dsh\profiles\web\package.json

这说明:

.dsh
 └─ profiles
     └─ web
         └─ package.json

已经存在历史 Profile。

同时此前还存在:

session-3836a0e6...

对应的旧 Session 数据。

这意味着:

当前环境并不是一个全新安装。

而是:

旧 Session
旧 Profile
旧 Persona 注册状态

一起参与了启动过程。


删除 .dsh 前先关闭占用程序

关闭对应记事本。

或者直接:

Stop-Process -Id 6544 -Force
Stop-Process -Id 6188 -Force

然后检查:

Get-CimInstance Win32_Process |
Where-Object {
    $_.CommandLine -match '\.dsh|deepseek'
}

确认没有占用。

接着删除:

Remove-Item "$HOME\.dsh" -Recurse -Force

验证:

Test-Path "$HOME\.dsh"

返回:

False

说明用户配置已经清空。


下一步验证方式

此时不要直接恢复旧 Session。

先验证 DSH 是否正常启动:

npx --yes @deepseek-ai/dsh@0.1.0-rc.8 --version

如果返回:

0.1.0-rc.8

再执行:

npx --yes @deepseek-ai/dsh@0.1.0-rc.8 web

启动后:

New Session
      ↓
standard
      ↓
Hello

不要恢复:

session-3836a0e6-9fe9-40d7-884e-876b3ebba209

这样才能判断问题来自:

旧 Session

还是:

rc.8 本身

操作清单

  • 查看 DSH 版本
dsh --version
  • 查看安装情况
npm list -g --depth=2 @deepseek-ai/dsh
  • 卸载 DSH
npm uninstall -g @deepseek-ai/dsh
  • 清理 npm 缓存
npm cache clean --force
  • 查看 Node 版本
node -v
npm -v
  • 查找占用进程
Get-CimInstance Win32_Process
  • 删除用户配置
Remove-Item "$HOME\.dsh" -Recurse -Force
  • 使用 npx 启动
npx --yes @deepseek-ai/dsh@0.1.0-rc.8 web

FAQ

deployment:persona already registered 一定是配置写错了吗?

不一定。本次排查中,agent.cordis.yml 本身没有发现重复 Persona 配置。

直接删除 standard 里的 persona 配置可以吗?

不建议。该配置属于标准预设的一部分。

Node 25 会导致这个报错吗?

当前排查过程中没有证据表明 Node 25 与该错误直接相关。

为什么不切换到 Node 24?

当前机器同时运行 Codex CLI 和 Claude Code CLI,切换后会影响现有环境。

.dsh 可以直接删除吗?

可以,但先确认没有程序占用该目录。

.dsh 里面保存什么?

从排查结果看,包含 Web Profile、Session 等用户数据。

为什么 npx 启动后没有任何输出?

如果 .dsh 被占用,或者旧配置存在异常状态,可能表现为启动卡住。

排查时应该优先恢复旧 Session 吗?

不建议。应先创建全新 Session 验证框架是否正常工作。