DSH plugin: profile reload requires the root Include entry
dsh: profile reload requires the root Include entry means a DeepSeek Harness profile reload could not find the root Include entry: a reload must begin from the root Include — the profile's cordis.yml — to recompose the plugin tree, and without it the whole tree fails to build and the operation returns failed. Error X → do W: restore the root Include entry, then start a fresh instance, rather than repeatedly firing the plugin start/stop toggle on the instance that is already throwing that error (source).
The message reads like a broken config, but it is really "a reload precondition was not met". A user hit this in the wild: inside a CLI web instance they called the official pluginManager.setBundleEnabled to hot-toggle a bundle, the call returned application:"failed", and it came with this exact sentence; by then the on-disk config had already changed while the process was still alive (source). The three things below — what it is, how to fix it, and why it fires — answer that scene in order, and two official mechanics follow.
What the profile reload requires the root Include entry error means
The root Include entry is the DeepSeek Harness loader entry that loads a profile's root config, and it points at the profile's cordis.yml; a profile reload has to start from that root Include to layer user patches and bundles one on top of another (source). Line up the three actors first:
| Term | What it is | Its relation to this error |
|---|---|---|
| profile | the startup config stack a plugin set is layered onto | the reload targets the current profile |
| root Include entry | the loader's cordis:include entry, pointing at cordis.yml | "requires the root Include entry" asks for exactly this |
cordis.yml | the profile root config, top level is an array of loader entries | the file the root Include actually loads; missing or broken triggers this |
Read it in this order:
- It is a reload precondition, not data corruption — the message (
dsh: profile reload requires the root include entry, commonly typed lowercase when searching) says "a reload needs the root Include entry", a failed precondition check, not that your session or model config was written badly. Expected: the file is most likely still on disk; this one reload just did not get it. - It shows up more on the "live instance reload" path — a process starting from zero (a cold boot) also reads the root Include, but it goes through the boot path; a hot reload goes through "recompose the plugin tree", which is stricter about the root Include being ready. Expected: the same config comes up fine after a process restart, which is the signature of this error.
- It is not the same as "a plugin is not enabled" — a disabled plugin is one entry switched off with
disabled: truewhile the tree still composes; this error is the footing not being found, so the whole tree cannot compose. Expected: when it fires, usually nothing takes effect, rather than only one plugin being off.
Keep one sentence: this is a footing error that says "the reload cannot proceed", not a fault in any single plugin.
Two neighbouring errors are easy to confuse with this one. A "plugin tree failed to load" message points at an entry inside the tree — a bundle or plugin failed to apply — and it can appear even when the root Include is healthy; this error is the footing itself, so it fires before any individual entry is judged. And "overlay must be a top-level YAML array of loader patch entries" is about the patch file cordis.patch.yml, not the root file — the same YAML family, a different file — so read the path in the message before assuming it is the root config. Reading the path and the phrase together is what tells the three apart in seconds.
How to fix profile reload requires the root Include entry: restore the root and restart
The main line of the fix is "put the root Include entry back, then restart the instance" — because a live instance composes its plugin list at boot, a runtime hot reload is stricter about the root Include, and one restart is the least trouble. Run the steps in order:
- First confirm the root Include entry is there. Open the profile directory and find the root config
cordis.yml(a path shaped like$DSH_HOME/profiles/<name>/cordis.yml). Expected: the file exists and its content is a top-level array ([...]); if it is empty or not an array, this is where the problem is. - Restore the root config content to its default. If
cordis.ymlwas emptied or written as a non-array, restore it to a top-level array of entries per the official config catalog — the root config is fixed content and plugins should not be written into it (source). Expected: after saving, the file is a valid YAML top-level array. - Check whether a plugin wrote config into the root file. Some plugins write the composed rows back into
cordis.yml; the correct behaviour is to write into the patch layer (cordis.patch.yml), not the root file. Expected: the root file keeps its fixed content and the plugin entries all land in the patch layer. - Restart the instance instead of hot-reloading. Stop
dsh webwithCtrl+C, then runnpx @deepseek-ai/dsh webagain. Expected: the terminal prints the listening address again, the plugin tree recomposes from the root Include, and this error no longer appears (source). - Confirm the compose result with dump. Run
dsh --profile web --dump-configand check whether the plugin entry you care about shows up in the composed result (source). Expected: the entry is present and its content is right, meaning the root Include and the patch layer line up.
A useful confirmation detail: --dump-config prints the composed result, so if your entry is missing there but present in the patch file, the problem is a layering or ordering mistake rather than a missing root Include; --dump-config-schema instead prints which keys are valid, which is the one to reach for when you are rewriting the root config and want to avoid writing another illegal shape. Running the two together separates "the footing is missing" from "the footing is fine but a layer wrote the wrong thing".
One reminder: do not keep firing the plugin start/stop toggle on the instance that is throwing — that is precisely the action that triggers this sentence, and the more you toggle the messier it gets; edit the file and restart is the right road.
Why profile reload requires the root Include entry happens: hand-edited YAML and bundle toggles
The two high-frequency scenes are "hand-editing cordis.yml" and "toggling bundles on a live instance" — the first turns the content the root Include points at into an illegal shape, and the second triggers a reload with no ready root Include. Compare them:
| Trigger | Why it hits | Direction |
|---|---|---|
Manually edited cordis.yml | the root config was emptied, made a non-array, or given a wrong path | restore the root config, move plugin entries back to the patch layer |
| A plugin wrote composed rows into the root file | the root file was stuffed with rows that belong in the patch layer | make the plugin use cordis.patch.yml |
| Toggling bundles on a live instance | the bundle list was composed at boot, and the reload has no ready root Include | restart the instance instead of hot-toggling |
| A third-party plugin manager switch | the switch calls the underlying start/stop interface, hitting the same reload path | edit config and restart, or disable that plugin in the market first |
Row by row:
- Editing the root file is the easiest trap:
cordis.ymlis the root config with a fixed shape; pushing plugin entries into it can be judged illegal on the next reload. Expected: the error disappears once the plugin entries are moved tocordis.patch.yml. - When a plugin overwrites config, look at which layer it writes to: if a plugin rewrites config on your behalf and lands on the root file, disable or uninstall it first from the DSH Plugin Hub installed list, then restore the root config by hand. Expected: after disabling it in the market and restarting, the root file is no longer rewritten.
- The bundle start/stop path is itself a hot reload: the official
setBundleEnabledtriggers one reload when called on a live instance, and that instance's bundle list was fixed at boot, so it is more likely to hit the root Include precondition check (source). Expected: switching to "edit config + restart" stops this sentence from appearing. - Config layering and overwrite order are a different thing: which layer overrides which, and why
--patchhas the highest priority, is config-layering knowledge, not this reload error; it is written up in DeepSeek Harness plugin config: config blocks and patch overrides. Expected: you can tell "the footing is missing" apart from "the layers were written wrong".
Boundary: if what you hit is "a validation failure that happens intermittently during concurrent launches, with the file intact afterwards", that is a cordis.yml overwrite race, not this error — the race is covered in DSH plugin concurrent launches corrupt the profile.
The misjudgment to avoid is blaming a plugin for a config-shape problem. If you enabled a bundle from the market switch and then saw this error, it is tempting to uninstall that plugin, but the plugin is usually fine — the switch called the runtime start/stop path that needs a ready root Include. Check the root file's shape and restart before you remove anything, because uninstalling a healthy plugin only removes the evidence that pointed you at the reload path.
Troubleshooting notes for a DSH plugin profile reload
- First tell "cold boot works, hot reload errors" apart — that is the signature of this error, so do not suspect data corruption first.
- Do not use the root file as scratch paper — plugin entries belong in the patch layer; root
cordis.ymlholds only fixed content. - Restart once you have edited — the bundle list is composed at boot, and a runtime hot reload is pickier about preconditions than a cold boot.
- Verify with dump —
--dump-configshows the composed result,--dump-config-schemashows what can be configured. - Trace a plugin that rewrites config — if you suspect a plugin touched the root file, disable it in the market first, then restore the root config.
The official DSH plugin mechanism behind a profile reload
Understand two official statements and troubleshooting gains direction: a profile's root config is loaded by the loader's include entry, so a plugin-tree reload has to get that root Include back; and a bundle list is composed at boot. Two points:
- The root Include is the load entry point — the official docs take "every
config:block can be set by acordis.ymlentry" as the general principle, and this root config is loaded through the loader's include entry (source). Expected: once you grasp "include is the entry point", you see why the whole tree cannot compose when it is missing. - Hot reload and cold boot are split — a patch change goes through a profile reload, while the bundle list is composed at boot, so relying on runtime start/stop is often less reliable than a restart (source). Expected: treating "edit file + restart" as the default move avoids most errors in this family.
Rather than editing cordis.yml by hand and worrying you will wipe the root Include entry, drive plugin start/stop and uninstall from the DSH Plugin Hub GUI — it hands the syntax to standard commands and leaves you with just the confirm click. Get it at https://dsh-plugin.org/.

Sources: dsh CLI README, plugin config catalog (official docs), community plugin dsh-backroom field report.
FAQ
In DeepSeek Harness that message means a profile reload could not find the root Include entry, so it could not recompose the plugin tree. The reload has to begin at the root Include (the profile's cordis.yml), and when that entry is missing or unresolvable the whole tree fails to build and the operation returns failed. It usually appears when you toggle a bundle through the plugin manager on a running instance instead of restarting the process.
In DeepSeek Harness a bundle list is composed at boot, so calling setBundleEnabled at runtime triggers a profile reload that this instance cannot satisfy. The on-disk config has already changed while the process is still alive, and the reload cannot obtain the root Include entry, so it returns failed. The steadiest fix is to restart the instance after editing, rather than relying on hot start/stop.
In DeepSeek Harness the root Include entry must exist and be resolvable, so this error does not necessarily mean cordis.yml was deleted. A profile's root config is cordis.yml, loaded through the loader's cordis:include entry; check that it is a top-level array, that the path resolves, and that no plugin has overwritten it, then decide whether to restore the entry or rebuild the profile. Only a file that is empty or not an array is genuinely broken.
In DeepSeek Harness, put the root Include entry back first: restore the root config's default content, or rewrite the plugin entries per the official config catalog. If a plugin wrote its rows into the root file, move them to cordis.patch.yml instead. For enabling plugins, prefer the start/stop switch in DSH Plugin Hub or the standard add/remove command, so no plugin edits the root config directly.
This is not the same as a cordis.yml overwrite race or config layering: profile reload requires the root Include entry is about a DeepSeek Harness reload missing the root Include entry, an overwrite race is concurrent boots hitting a zero-length window, and config layering is about which patch layer wins. Three different conditions, three different repairs.
Related Terms
- root Include entry
- The root Include entry is the DeepSeek Harness loader entry that loads a profile's root config, pointing at the profile's cordis.yml; a profile reload must start from it, and without it the plugin tree cannot be recomposed.— DeepSeek Harness official docs - plugin config catalog
- profile reload
- profile reload is the process by which DeepSeek Harness re-reads a profile's configuration and recomposes the plugin tree without restarting the process, triggered by a patch change or a plugin start/stop.— dsh CLI README
- cordis.yml
- cordis.yml is the root configuration file of each DeepSeek Harness profile, holding a top-level array of loader entries that the loader's cordis:include entry loads as the root Include.— DeepSeek Harness official docs - plugin config catalog
- setBundleEnabled
- setBundleEnabled is the DeepSeek Harness interface for starting and stopping a bundle; calling it on a live instance triggers a profile reload, which returns application:failed when the root Include entry is missing.— Community plugin dsh-backroom field report