The module identity failure
The scheduler key is a module-scoped plain Symbol. Node caches one identity per resolved module file, not per package name. When the agent loop imports one dsh-tools copy and the live ToolRuntime installs the scheduler under another copy’s Symbol, both symbols have the same description but are never equal.
| Layer | Module copy A | Module copy B |
|---|---|---|
| Agent loop | Looks up TOOL_RUNTIME_SCHEDULER from its resolved dsh-tools | Does not know B’s Symbol identity |
| Tool runtime | Does not own A’s key | Registers the scheduler under B’s key |
| Result | Lookup returns undefined | prepare is never reached |
Why tools may still look registered
Registration and execution use different boundaries. A profile can list tools and a text-only turn can work even though the scheduler identity needed at execution time is split. That is why the most useful control forces exactly one built-in tool call.
Find the extra physical copy
Inspect the launcher tree and the failing profile tree separately. Mixing package managers, running npm or pnpm manually inside a profile, or linking a local checkout can all create an extra copy; the discussion does not confirm which operation created the reported duplicate.
npm ls @deepseek-ai/dsh-tools --all
node -p "require.resolve('@deepseek-ai/dsh-tools/package.json')"Recover with a reversible change
Back up the failing profile and its lockfile. Move only the confirmed profile-local duplicate outside the active module graph, then run the exact tool-call control again. If the crash remains, restore it and investigate the full stack; do not recursively remove the profile or DSH home.
What an upstream fix would need to address
A durable fix could prevent the duplicate graph, make the runtime identity global or structurally injected, or fail with a typed diagnostic that names both resolved module paths. No such fix is claimed in the current official release.
DeepSeek Harness is in developer preview. Recheck official documentation and plugin evidence when the host version changes.
Sources and evidence
Official documentation and community evidence are labeled separately in the source pages and in this article.