Introduction¶
When doing skill management in DeepSeek Harness (DSH), you encounter a recurring problem: every time the skill evolution page accumulates a batch of pending suggestions, clicking through each one is a burden in itself. Moreover, suggestions automatically proposed by the model are often “a stream from a specific task”; if adopted directly, the skill library will quickly balloon into hundreds of unrelated narrow skills.
dsh-skill-autopilot offloads the “review” and “publish” steps to a Large Language Model (LLM) configured by you, but writes deterministic admission rules for “what kind of skills qualify for the library”. The model can only judge within this box, and the code judges again. Finally, passing skills are packed into SKILL.md and written to the disk via the skill data source, with version records and the ability to roll back.
What is it¶
- Plugin Name:
dsh-skill-autopilot - Maintainer: BrainZombie
- Category: Workflow
- Source: SkillHub Directory Page, GitHub
- Version and License:
0.1.0,MIT
It solves a clear problem: transforming the accumulated pending suggestions in the evolution pipeline—after model review and anti-fragmentation gating—into actual skills entering the library, rather than turning every suggestion into a new file.
What it does (One Run)¶
The flow for one run is as follows:
pending suggestions ──► Review Model (your choice) ──► Deterministic Gate ──► Pack SKILL.md ──► Disk Write + Version Record
(mnemon) (semantic judgment) (non-bypassable) (distill/clean) (adopt)
- Read: Retrieve
pendingsuggestions, evidence trails, test cases, and the full skill directory from Mnemon’s Skills Source. - Review: Call the review model in one batch, outputting
create / merge / dismiss / deferfor each suggestion, along with a reason and merge target. - Gate: The model’s output is not final; the code judges again. This layer is the core of the plugin, discussed later.
- Package: Call the model again specifically for passed items to generate the body, while removing time-sensitive content that degrades over time, such as dates, session IDs, UUIDs, absolute machine paths, and “N hours ago”.
- Write:
recordDraft→adoptDraft, using the skill data source’s own write entry. Suggestions are set toadopted, version records are generated, and rollback is possible from “Skill Management → Versions/Recycle Bin” if needed. The plugin does not write toSKILL.mddirectly.
By default autoApply: false. review only outputs decisions and the body to be written, writing not a single byte; apply actually writes to disk only after confirmation.
Anti-Fragmentation Strategy¶
This is the core of the plugin. It breaks down the principle that “the library is class-level knowledge, not a stream” into executable rules.
| Rule | Criteria |
|---|---|
| Library is “class-level knowledge”, not a stream | A skill with N labeled subsections beats N narrow sibling skills |
| Merge prioritizes creation | Same xxx-* prefix cluster and related content, or similar description → merge; sharing only the product name doesn’t count |
| Don’t reinvent capabilities the plugin already has | Match against ctx.skills.list() (actual skills advertised by host, including plugin skills) → hit means dismiss |
| Don’t create for trivial matters | Must simultaneously satisfy strong signal, confidence threshold, and minimum body length |
| Don’t write hub/router skills | If > 60% of body lines are “pointing to other skills”, reject directly |
| Description is one sentence | Long descriptions will be truncated by the system skill index, causing the trigger word to become invalid |
| Archiving doesn’t delete | Skills absorbed during merge go to the recycle bin and can be restored |
Several hard conditions in the gate are worth listing separately:
- Suggestion confidence below
minConfidence→ do not create (this item does not enter model review). - Model’s confidence in “creation” is below
minModelConfidence→ defer to the next round, do not force publish. - No strong signal (
procedure / correction / directive / skill-gap / skill-misleading / approach-change) → do not create. - Plugin already provides this capability → do not create.
- Similarity to existing skills ≥
mergeSimilarity, or samexxx-*prefix cluster and related content → force merge, disallow creating new sibling skills. createexceedsmaxNewPerRunthis round → leave for the next round.- The resulting
SKILL.mdmust pass lint.
consolidate is the accompanying existing-data health check. It clusters existing skills by prefix/domain, allowing the model to judge which should converge into an “umbrella”. When applied, it writes the merged body to the keeper and moves the absorbed ones to the recycle bin.
Packaging Validation¶
Packaging validation is implemented in lib/policy.js: lintSkillDoc. Hard blocks include: name is not kebab-case or is a duplicate; missing or excessively long description; body is empty, too short, or too long; body contains frontmatter; missing “When to use” or “Steps”; is a router skill. Soft prompts include missing acceptance section, body has no executable commands, or description starts with clichés.
Installation and Activation¶
Installation commands come from the repository’s built-in install.ps1. There are two modes. The standard mode edits the profile’s package.json (link: dependencies + dsh.profile.bundles) and executes pnpm install:
# First check the plan
powershell -ExecutionPolicy Bypass -File .\install.ps1 -DryRun
# Execute standard installation
powershell -ExecutionPolicy Bypass -File .\install.ps1
The no-pnpm mode only creates soft links and appends insert entries to the profile’s cordis.patch.yml:
powershell -ExecutionPolicy Bypass -File .\install.ps1 -Link
Rollback is recognized by both modes, restoring the backup of package.json / cordis.patch.yml:
powershell -ExecutionPolicy Bypass -File .\install.ps1 -Rollback
After installation but before starting or restarting, a pre-check can be performed:
dsh --profile web --dump-config | Select-String skill-autopilot
Activation requires restarting DSH, which the user performs themselves.
Typical Usage¶
After installation and restart, slash commands can be used directly in any session:
/skill-autopilot status # View queue, counts, review model, strategy, log directory
/skill-autopilot review # Review only, no writing (default dry-run)
/skill-autopilot apply # Review and write to disk directly
/skill-autopilot consolidate # Existing data consolidation review (proposes only)
/skill-autopilot history # Recent decisions
You can also let the agent call the tool directly:
{"action": "review", "maxItems": 3}
{"action": "apply", "ids": ["<suggestionId>"]}
{"action": "apply", "provider": "deepseek-official", "model": "deepseek-reasoner"}
{"action": "consolidate", "confirm": true}
Decision logs are append-only JSONL, and there is also a recent complete result located at $DSH_HOME/storages/skill-autopilot/: decisions.jsonl is one line per suggestion, containing the final action, reason, whether it was written, and errors; last-run.json is the complete content of the most recent run, including the SKILL.md body that is to be written or has been written. The significance of review being dry-run by default lies here: you can read before writing.
Relevant Configuration¶
The config in the plugin patch can be omitted. Common keys are as follows, default values taken from README:
| Key | Default | Description |
|---|---|---|
enabled |
true |
When disabled, the tool still exists, but any run returns disabled directly |
mnemonDataDir |
~/.mnemon |
Should contain skills/ledger.json, auto-detected |
targetRoot |
user-dsh |
New skills written to ~/.dsh/skills (can also set to user-agents) |
reviewer.provider/model |
Empty = Host default model | Uses the model selected in the settings page when left empty |
reviewer.maxTokens |
4096 |
Single review/pack limit |
policy.minConfidence |
0.8 |
Do not create if suggestion confidence is below this |
policy.minModelConfidence |
0.5 |
Defer to next round if model’s grasp of “creation” is below this |
policy.maxNewPerRun |
2 |
Maximum number of new skills per run |
policy.mergeSimilarity |
0.45 |
Similarity threshold; above this forces merge |
policy.descriptionMaxChars |
240 |
Description limit |
policy.maxBodyChars / maxMergedBodyChars |
16000 / 24000 |
Body character limits |
policy.requireStrongSignal |
true |
Must have a strong signal |
autoApply |
false |
Whether scheduled tasks write to disk directly |
intervalMinutes |
0 |
Run in background periodically when > 0, defaults to just review |
logDir |
Empty = $DSH_HOME/storages/skill-autopilot |
Log directory |
To make judgment stricter, you can point reviewer.model to a stronger model, set mergeSimilarity to 0.55, and maxNewPerRun to 1. Note that deepseek-flash’s self-assessment for “create” is usually between 0.65–0.8. This is a calibration value, not a ruling value, so minModelConfidence is only set to 0.5 by default. The things that truly determine “whether it qualifies for the library” are suggestion confidence, strong signals, deduplication, and document linting.
Verification¶
node test/selftest.mjs # Unit gate/dedup/pack/write (temporary ledger + temporary skill root, doesn't touch real data)
node test/selftest.mjs --live # Additional: read-only real ledger, confirms ability to read pending and directories
node test/host-contract.mjs # Walk through registration and one LLM assembly call using real dsh-tools/dsh-llm
dsh-plugin verify . # Real pack, real install, mount check
selftest never touches ~/.mnemon/skills and ~/.dsh/skills: it copies a ledger under %TEMP%, creates an empty temporary skill root, and deletes it after running. Tests requiring “DSH installed locally” or “mnemon data source installed” will automatically skip rather than fail on machines without them, so CI only runs npm test; host-contract and verify require a real host, please run them on a machine where DSH is installed.
Use Cases and Notes¶
The target audience for this plugin is developers already using Mnemon to manage skills within DSH and who are troubled by manual review of evolution suggestions and skill library fragmentation.
A few points to note:
- The plugin runs with the permissions of the current DSH process; you should check the source code and license (
MIT) before installing. This plugin reads and writes the same ledger viadsh-mnemon-source-skills’smanage(), which is an implementation relying on internal mnemon contracts. applywill truly add or modify skills under~/.dsh/skills, but only via the data source write entry, so there are version records and a recycle bin as two fallback paths. The model’s judgment is not 100% satisfactory, so it is dry-run by default.- Do not enable
autoApplytogether with shortintervalMinutes; that is equivalent to letting the model infinitely self-grow the skill library. It is recommended to triggerapplymanually, or only useautoApplywithmaxNewPerRun: 1. - Project-level skills (
project-dsh/project-agents) are read-only by default and not created;consolidateonly handlesuser-dsh/user-agents. - Runtime requirements: DeepSeek Harness
>= 0.2.0, Node.js>= 20;dsh-mnemon-source-skills >= 0.4.0is an optional peer dependency. The plugin can still load if missing, but it cannot readpendingsuggestions.
Conclusion¶
The value of dsh-skill-autopilot lies not in letting the model decide, but in hardcoding “what kind of skills qualify for the library” into deterministic rules, allowing review and merging to run automatically while preserving version records and rollback capability. If you happen to be on the DSH skill evolution chain, you can start trying from the dry-run review.