Field report: two plugins, one namespace — how dsh-pocket + dsh-web-mobile quietly broke on restart (and the 4 rules that prevent it) #4486
Replies: 2 comments 1 reply
|
I added an English plugin-audit note based on this field report: https://sandbaseai.github.io/deepseek-harness-handbook/community-plugin-audit.html The key boundary is browser-side composition: two packages can install successfully yet collide on a locale namespace during restart. The guide now requires effective-profile inspection, clean-profile coexistence testing, and unique documented namespaces before calling a UI plugin compatible. |
|
Nice field report — the "symptom vs. disease" split is exactly right. One thing worth adding from the composition side, because this is the quiet sibling of your bug: The locale throw is one instance of a broader class: two packages claiming the same key in the composition layer. Cordis rows are keyed by Worth adding to the pre-flight checklist: inspect the effective tree, not the package.json on disk. dsh --profile web --dump-config
Same mechanism, used on purpose: my |
Uh oh!
There was an error while loading. Please reload this page.
A field report, not a plugin release — how two well-meaning plugin installs produced a "Failed to load plugins" banner, why nothing showed in the server logs, and the four rules I now follow before touching a dsh profile. If you install community plugins, this will happen to you eventually.
The symptom
After restarting
dsh web, the browser greeted me with:The page still loaded. The mobile nav just… wasn't there. And in
journalctl --user -u dsh— nothing. Clean logs, healthy service. The failure only exists in the browser banner.What actually happened
I was setting up mobile access and did the obvious thing:
dsh plugin --profile web add dsh-pocket -w— the QR-code LAN access plugin (great plugin, by the way)dsh plugin --profile web add github:mexiaosqwq/dsh-web-mobile— a dedicated mobile UI adaptation pluginWhat I didn't know: dsh-pocket 1.13.4 has already absorbed the mobile-nav functionality upstream. Its client bundle contains
NS = "mobileNav"with its own zh/en dictionaries (the source even creditsclient/mobile/locales.ts).The external plugin registers the same namespace with a zh dictionary that is — word for word — the same. Bundles load in order; dsh-pocket wins, the external plugin's second registration throws
already has locale "zh", and its loader entry fails.So: two packages, one job, and a locale collision as the only visible evidence.
Why it's sneaky (the trap chain)
pnpm installdoesn't reload anything. The running process keeps serving old code with the new profile on disk. The bomb only detonates on the next restart — which might be days later, in the middle of something else.systemctland curl, everything looks fine. "Service healthy" and "plugins loaded" are different claims.The fix
Verification (the part everyone skips):
dsh-pocket's built-in mobile nav carries on fine; I only lost two fullscreen-preview locale keys I wasn't using anyway.
The four rules I've adopted
grep -rn 'NS = "<something>"' node_modules/<big-plugin>/client/— if both sides register it, pick one.locale namespace X already has locale Y= two plugins fighting over X. Not a locale bug. Trace who registers X.~/.dsh/profiles/web/package.json— dependencies ANDdsh.profile.bundlesmust stay in sync; the CLI does it for you on add/remove, manual edits forget.Happy to hear counter-examples or additional failure shapes — especially anything else that hides in the browser banner while the journal stays clean.
All reactions