DeepSeek Harness Profession Skill Trees
A persistent profession and capability-budget plugin for DeepSeek Harness:
Shared catalog → Public tree definitions
Profession → One wallet + Private public build + Private core-tree build“Public” means every profession may allocate nodes from the same definition. It does not mean allocations are global. Each profession independently funds its public and core nodes from one wallet, and switching profession switches both builds together.
- Public definitions are shared across professions.
- Public allocations, core allocations, and point wallets are profession-private.
- One profession may have multiple core trees with cross-tree prerequisites.
- Only the active profession contributes its public-plus-core live effects.
- Runtime changes, profession switches, and persistence roll back on failure.
Points come from human-approved external evidence. Allocation, respec, grants, and profession switching require approval and revision compare-and-set. State uses a file lock, atomic writes, a hash-linked audit ledger, and runtime rollback.
The current release targets @deepseek-ai/dsh@0.1.0-rc.6.
Install
dsh plugin --profile <profile> add ./dsh-plugin-skill-tree-0.7.2.tgz
dsh --profile <profile> --dump-config
dsh --profile <profile>The default bundle includes a General Work public tree and 14 preset professions, each with two core trees (software-engineer and ai-video-artist have three): general base (software-engineer, researcher), creative (artist, lyricist, composer, screenwriter, novelist), AI creation (ai-video-artist, ai-image-artist), visual media (photographer, film-director), and everyday crafts (chef, teacher, translator). Every profession starts with its tier-1 build fully allocated: the public layer (3 points) plus every tier-1 core node at max level. Advanced nodes declare requiresCareerLevel: 2 and start locked — each wallet keeps 3–4 unspent points reserved for them — until a human-approved skill_tree_advance_career raises the profession's tier. Default nodes add runtime Skills only; they do not gate existing tools.
Control tools
| Tool | Purpose | Mutation |
|---|---|---|
skill_tree_status | Read one profession and its public or core layer | No |
skill_tree_skills | Browse and search every skill across all professions by category | No |
skill_tree_ledger | Read the hash-linked mutation ledger incrementally (since/limit) | No |
skill_tree_plan | Simulate one layer against the combined profession budget | No |
skill_tree_allocate | Raise one public or core node for one profession | Approval required |
skill_tree_respec | Replace one profession layer | Approval required |
skill_tree_grant_points | Grant evidence-backed points to one profession wallet | Approval required |
skill_tree_advance_career | Raise one profession career level, unlocking higher-tier nodes | Approval required |
skill_tree_switch_profession | Activate the target public-plus-core build | Approval required |
skill_tree_save_build | Save one profession build into a named slot (max 8) | Approval required |
skill_tree_load_build | Restore a saved slot as one transactional two-layer respec | Approval required |
skill_tree_delete_build | Remove one saved slot; live build untouched | Approval required |
layer accepts public or core and defaults to core. Every mutation must use the latest global expected_revision.
skill_tree_skills is a read-only catalog-wide index. Omit every filter to list each category with its skill count; pass category to list one group (or "(uncategorized)"), query for a case-insensitive search over skill names and descriptions, and active_only to see just the skills live under the active profession build. A skill may carry an optional category (a lowercase identifier such as prompt-engineering); skills without one are grouped as uncategorized.
The plugin accepts a Chinese display alias through the alias config option (default 技能树). It surfaces as plugin.alias in the skill_tree_status and skill_tree_skills outputs and in the human-facing title of every tool call card.
Web panels
Under the web profile the plugin also registers two conversation views plus their HTTP endpoints through the optional webServer service:
- Profession panel: every profession's wallet, build summary, and active marker; switching is one click on a non-active card and goes through the same transaction, revision check, and ledger as the model tools. Browsers get an interactive HTML page.
- Skill tree panel: the complete build of any profession and layer, with node levels, next-level costs, and blockers. Browsers get an interactive HTML page.
- Skill catalog panel: every skill across all professions grouped by
category, with free-text search and an active-only filter. Browsers (Accept: text/html) get an interactive HTML page; API clients get JSON.
| Endpoint | Purpose |
|---|---|
GET /skill-tree/status?layer=&profession=&tree= | Read the status view, same shape as the skill_tree_status tool |
GET /skill-tree/skills?category=&query=&active_only= | Read the skill catalog index, same shape as the skill_tree_skills tool |
GET /skill-tree/ledger?since=&limit= | Incremental hash-linked ledger feed for external aggregators, same shape as the skill_tree_ledger tool |
POST /skill-tree/switch-profession | Switch the active profession; requires the x-skill-tree-client custom header, which cross-origin pages cannot forge, so only the same-origin panel can call it |
Profiles without a webServer service (CLI/TUI) mount neither the endpoints nor the panels.
Catalog shape
config:
catalogId: my-agent-professions
catalogVersion: 1
initialProfession: software-engineer
public:
trees:
- id: general
nodes:
- id: foundation
costs: [0]
- id: planning
costs: [1]
requires:
- node: foundation
professions:
- id: software-engineer
initialPoints: 4
initialPublicAllocations:
general:
foundation: 1
planning: 1
initialCoreAllocations:
delivery:
foundation: 1
coreTrees:
- id: delivery
nodes:
- id: foundation
costs: [0]
- id: implementation
costs: [1, 2]
requires:
- scope: public
tree: general
node: planning
- id: reliability
nodes:
- id: recovery
costs: [2]
requires:
- tree: delivery
node: implementationIncremental costs from both layers count toward the profession's single wallet. Public nodes cannot depend on core nodes. Core nodes may depend on public nodes or other core trees owned by the same profession.
See README.zh.md for the complete guide and safety boundaries. The package includes a [crawler engineer example](examples/crawler-engineer.patch.yml), a [profession-aware tool-gating example](examples/coding-tree.patch.yml), and the formal model in [DESIGN.zh.md](DESIGN.zh.md).
The catalog now supports career levels. Each profession has an initialCareerLevel (default 1) and maxCareerLevel (default 5); skill_tree_advance_career raises one profession's level through approval. A node may declare requiresCareerLevel — allocating it is blocked until the profession reaches that tier, producing an insufficient-career-level blocker. Points and the live build are unchanged by advancing; it only unlocks allocation permission.
Version 0.7 uses state schema v5 and does not silently consume schema v4 state: it adds per-profession careerLevel (plus the buildSlots from v4). Use a new state file or an explicit migration. skill_tree_grant_points also accepts an optional verification object (kind, reference, optional 64-hex digest) that binds a grant to an immutable evaluation and is recorded in the hash-linked ledger.
Development
npm install
npm test
npm run pack:checkMIT License.