🧩 Skill Trail

August 23, 2026 Β· View on GitHub

ζ―ζ’ε›žθ¦†ε¦‚ε―¦ζ¨™ε‡Ίγ€Œθ§Έη™ΌδΊ†δ»€ιΊΌγ€ζˆεŠŸη”¨δΊ†δ»€ιΊΌγ€γ€‚ εŸΊζ–ΌεΌ•ζ“Žζ—₯θͺŒηš„ι€ε›žθ¦†ζŠ€θƒ½/ε·₯ε…·εΎ½η« ,ι›Άζ¨‘εž‹θ‡ͺ報。

⚠️ ** superseded by @bryan-cmf/dsh-skill-ledger ** β€” this plugin's per-reply badges live on there (dual-seat, deliverables-safe), with the alternative-skill hint and the Skills tab. This repo is archived as the design-history record.

English Β· 繁體中文 npm License: MIT DSH Topics

A DeepSeek Harness (DSH) plugin that renders a compact trail under every assistant reply: which skills were triggered (🧠) and which tools were actually used (βœ“) or failed (βœ—).

$ 🧩 ζŠ€θƒ½θ»Œθ·‘ [🧠 \text{ak}-\text{hk}-\text{stock}-\text{dd} βœ“] [\text{read} \times 3 βœ“] [\text{bash} \times 2 βœ“] [\text{web\_search} βœ—] $

Why it is truthful

The badges are not produced by the model. A skillTrail session-projection unit (Host) folds each session's committed log β€” every tool/call event becomes a triggered entry; the paired tool/result (matched by callId) settles it as ok / err. The Client reads the finished value through useProjection('skillTrail') and renders it in the zero-risk conversation.chat.turnTail slot.

  • βœ… Structural β€” the platform records, nobody self-reports
  • βœ… Replayable β€” projection folds are pure; persisted cache + cold-start backfill come from the DSH projection subsystem for free
  • βœ… Per-turn β€” each reply shows exactly its own turn's trail
  • βœ… Skill-aware β€” skill tool calls render as 🧠 with the resolved skill name

Install

The package ships a Host half (lib/index.js) and a browser Client half (lib/client.js, window.__ModuleLoader__ closure-factory format).

Path A β€” Host composition (always-on, every session & preset)

Add to the profile's package.json:

"dsh": { "profile": { "bundles": ["@bryan-cmf/dsh-skill-trail"] } }

then install and restart DSH. The projection unit is registered process-wide; the client half renders in every conversation.

Path B β€” Agent preset

Add one row to your preset's agent.cordis.yml (a consumer-only row β€” it publishes no service, so it sits loose; no isolate realm needed):

- id: skill-trail
  name: '@bryan-cmf/dsh-skill-trail'

Path C β€” Dynamic experiment

Inside a session, @bryan-cmf/dsh-skill-trail can also be run through the dynamic Cordis flow; prefer A or B for anything standing.

Requirements

  • DSH >= 0.1.0-rc.6 (@deepseek-ai/dsh-session-projection mounted in the host composition β€” it is part of the shipped dsh-base bundle)
  • Browser UI needs the conversation.chat.turnTail slot (shipped chat view)

Configuration

KeyDefaultMeaning
maxTurns500Turns retained per session; oldest pruned first
maxCallsPerTurn50Triggered-entry cap per turn (wire-payload guard)

Projection value

useProjection('skillTrail') β†’ Record<turn, { triggered, used, failed }>

{
  "12": {
    "triggered": [{ "name": "skill", "skill": "ak-hk-stock-dd", "status": "ok", "callId": "call_1" }],
    "used": { "skill": 1, "read": 3, "bash": 2 },
    "failed": ["web_search"]
  }
}

Development

pnpm install
pnpm build        # tsc declarations β†’ lib/types + tsdown β†’ lib/{index,client}.js

License

MIT