<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Charles950311</title>
    <description>The latest articles on DEV Community by Charles950311 (@charles950311).</description>
    <link>https://dev.to/charles950311</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4204614%2F002bbf5b-489b-45da-968e-dcff3bcc132c.png</url>
      <title>DEV Community: Charles950311</title>
      <link>https://dev.to/charles950311</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/charles950311"/>
    <language>en</language>
    <item>
      <title>Agent skills are a supply chain risk. Scan them like it matters.</title>
      <dc:creator>Charles950311</dc:creator>
      <pubDate>Sat, 24 Oct 2026 12:40:58 +0000</pubDate>
      <link>https://dev.to/charles950311/agent-skills-are-a-supply-chain-risk-scan-them-like-it-matters-4lbe</link>
      <guid>https://dev.to/charles950311/agent-skills-are-a-supply-chain-risk-scan-them-like-it-matters-4lbe</guid>
      <description>&lt;p&gt;Agent skills are the new npm packages — except a package's install script is code you can statically analyze, and a &lt;code&gt;SKILL.md&lt;/code&gt; is a &lt;strong&gt;natural-language program&lt;/strong&gt; your agent reads and obeys. That difference changes everything about how you should treat them.&lt;/p&gt;

&lt;p&gt;The Agent Skills standard went open in December and 70+ platforms now load the same folder format. Marketplaces popped up within weeks. Meanwhile a security-audit skill from a major CDN vendor sat at the top of GitHub trending — the ecosystem is clearly hungry for "skills". What almost nobody is talking about: &lt;strong&gt;installing a third-party skill is a supply-chain decision.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What a skill can actually ask for
&lt;/h2&gt;

&lt;p&gt;Strip away the branding and a skill grants its author three channels into your session:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Instructions the model treats as authoritative.&lt;/strong&gt; The description alone steers when the skill activates. Prompt-injection isn't a hypothetical here — it's the native instruction format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool permissions.&lt;/strong&gt; &lt;code&gt;allowed-tools&lt;/code&gt; lines decide whether the skill may read files, run shell commands, or hit the network during its "workflow steps".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundled scripts.&lt;/strong&gt; Many skills ship helper scripts the agent is told to execute at step N. That's arbitrary code execution with your working directory as the blast radius.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this is a flaw in the standard — it's the feature. But it means "try this cool skill I found" is closer to &lt;code&gt;curl | bash&lt;/code&gt; than to installing a browser extension.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pre-install checklist I run now
&lt;/h2&gt;

&lt;p&gt;I run real security-audit pipelines with agent skills daily, and this is the discipline that survived contact with reality:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Scan before install.&lt;/strong&gt; Cisco's open-source &lt;code&gt;skill-scanner&lt;/code&gt; catches the low-effort malicious stuff — credential reads, destructive deletes, known injection patterns. No findings ≠ safe, but it clears the floor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Read the SKILL.md like an attacker.&lt;/strong&gt; Where does it ask the agent to send data? Which URLs? What "verification steps" involve executing bundled binaries? A five-minute read beats a post-incident forensics month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Check &lt;code&gt;allowed-tools&lt;/code&gt; against the actual need.&lt;/strong&gt; A transcription skill does not need shell access. A report formatter does not need network. Scope mismatch is the loudest signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Keep a provenance manifest.&lt;/strong&gt; Every install recorded: version, source repo, license, how you verified it. When the next supply-chain incident drops, "was I exposed?" becomes a one-line lookup instead of archaeology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Refuse with reasons, in writing.&lt;/strong&gt; My manifest records plugins I refused — safety-policy bypasses, third-party account pools. The refusal reasons are knowledge too; they stop you re-litigating the same decision in three months.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same lens, pointed at your own code
&lt;/h2&gt;

&lt;p&gt;That discipline scales up. Once you treat "what can this input reach?" as the core question, code review becomes a taint walk: entry points → sources → sinks, with an explicit verdict on every sanitizer in between. I packed that method into a skill as well — a taint-analysis code-audit skill with a 0–10 severity rubric and a hard output contract: every finding ships with &lt;code&gt;file:line&lt;/code&gt;, the taint path, and the minimal request that proves it. No walkable path means it goes in the hardening appendix, never inflated to a "vulnerability".&lt;/p&gt;

&lt;p&gt;It's live as a free tool edition on &lt;a href="https://swarms.world/tool/049e83ff-76c9-4af2-96f1-ab47518c127e" rel="noopener noreferrer"&gt;Swarms Marketplace&lt;/a&gt;, and the governance tooling I use to keep my own installs honest is open source: &lt;a href="https://github.com/Charles950311/dsh-plugin-hub" rel="noopener noreferrer"&gt;dsh-plugin-hub&lt;/a&gt; (routing table, health checks, the provenance manifest itself).&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable summary
&lt;/h2&gt;

&lt;p&gt;We spent a decade teaching developers not to &lt;code&gt;curl | bash&lt;/code&gt;. Then we built a format whose entire value proposition is "the model will follow these instructions" — and started collecting them from strangers. Skills are worth it. Install them like it matters.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's your pre-install routine for third-party skills — or are we all still at &lt;code&gt;curl | bash&lt;/code&gt; stage? Comments very welcome.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>agents</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>I installed 7 plugins in DeepSeek Harness. Then I built a control hub for them.</title>
      <dc:creator>Charles950311</dc:creator>
      <pubDate>Sat, 24 Oct 2026 12:11:16 +0000</pubDate>
      <link>https://dev.to/charles950311/i-installed-7-plugins-in-deepseek-harness-then-i-built-a-control-hub-for-them-1bf4</link>
      <guid>https://dev.to/charles950311/i-installed-7-plugins-in-deepseek-harness-then-i-built-a-control-hub-for-them-1bf4</guid>
      <description>&lt;p&gt;DeepSeek Harness (dsh) went open source in August and blew past 130K stars in&lt;br&gt;
weeks. Its architecture pitch is one line: &lt;strong&gt;everything is a plugin&lt;/strong&gt; — a&lt;br&gt;
deliberately thin core, capabilities arriving as &lt;code&gt;.dsh.bundle&lt;/code&gt; plugins and&lt;br&gt;
hot-loaded skills.&lt;/p&gt;

&lt;p&gt;That means the ecosystem explodes fast. It also means that at plugin #7 you hit&lt;br&gt;
every plugin platform's classic problem — except this time nobody solved it for&lt;br&gt;
you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four pains nobody warns you about
&lt;/h2&gt;

&lt;p&gt;Installing is easy: &lt;code&gt;dsh plugin --profile desktop add &amp;lt;pkg&amp;gt;&lt;/code&gt; with HMR mounting&lt;br&gt;
it live. The pain starts &lt;em&gt;after&lt;/em&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Entries are scattered.&lt;/strong&gt; Turn rewind lives in the Web UI, long-term memory
is a &lt;code&gt;hindsight_*&lt;/code&gt; tool plus a Python service on port 8888, the
failure-experience library speaks MCP, skill cards sit under the input box.
Even the agent isn't sure which tool is called what — let alone the user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status is uncertain.&lt;/strong&gt; "Is this plugin usable right now?" A loaded plugin
is not a running service. hindsight can load fine while port 8888 is down —
and the call fake-succeeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust needs managing.&lt;/strong&gt; Dozens of community plugins appeared within weeks.
Installing an unknown SKILL.md means wiring a natural-language program into
your agent. Did you scan what files it wants to read and what it runs?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody keeps the manifest.&lt;/strong&gt; What did you install last week, which version,
why did you remove it? Two weeks later: gone.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The fix: a hub skill + three disciplines
&lt;/h2&gt;

&lt;p&gt;I built the governance layer itself as a skill: &lt;strong&gt;dsh-plugin-hub&lt;/strong&gt; (open source,&lt;br&gt;
MIT).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One routing table.&lt;/strong&gt; The SKILL.md is a table: user intent → which tool →&lt;br&gt;
current state. The agent stops guessing from training data and starts looking&lt;br&gt;
things up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One status command.&lt;/strong&gt; &lt;code&gt;status.ps1&lt;/code&gt; checks everything in one shot: profile&lt;br&gt;
plugins, tool files on disk, services up/down, where the skill junctions point.&lt;br&gt;
The skill has a hard rule baked in: &lt;em&gt;confirm status before dispatching; if it's&lt;br&gt;
down, say so — never pretend a call succeeded.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One junction trick.&lt;/strong&gt; All my skills live in one directory (easy to back up and&lt;br&gt;
sync), junctioned into &lt;code&gt;%USERPROFILE%\.dsh\skills&lt;/code&gt; so DSH hot-loads them. New&lt;br&gt;
skills never touch &lt;code&gt;.dsh&lt;/code&gt;; git manages the unified directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One manifest (PROVENANCE).&lt;/strong&gt; Every install/remove updates a table: version,&lt;br&gt;
source, license, how it was verified. The routing table may only claim what this&lt;br&gt;
file confirms. &lt;strong&gt;The table is not allowed to lie — that's the most important&lt;br&gt;
rule of the whole design.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bugs I hit so you don't have to
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version compatibility:&lt;/strong&gt; after 0.2.0 → 0.2.1-rc.2, turn-rewind 0.3.9 broke;
0.3.10 + one missing dependency fixed it. Check peer deps before upgrading
the harness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup order:&lt;/strong&gt; hindsight calls an external model API on boot — no egress,
instant &lt;code&gt;Application startup failed&lt;/code&gt;. Network first, service second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some plugins you just don't install:&lt;/strong&gt; safety-policy-bypass plugins and
third-party account pools. Compliance and credential risk are both too high.
The manifest records the refusal &lt;em&gt;with the reason&lt;/em&gt; — refusals are knowledge too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scan before install:&lt;/strong&gt; Cisco's skill-scanner runs locally. No findings ≠
safe, but it catches the low-effort malicious stuff — then a human reads the
scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows PowerShell 5.1 parses UTF-8 scripts as ANSI unless they have a
BOM.&lt;/strong&gt; My first "generic" config broke on any non-ASCII path because of this.
One byte at the start of the file; hours of confusion saved.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;"Remember this" routes to hindsight. "Undo that edit" routes to turn-rewind.&lt;br&gt;
"Can I install this skill?" goes through skill-scanner first. One table owns all&lt;br&gt;
entries, one command owns all status, one manifest owns all trust.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Charles950311/dsh-plugin-hub" rel="noopener noreferrer"&gt;Charles950311/dsh-plugin-hub&lt;/a&gt; (MIT), &lt;code&gt;install.ps1&lt;/code&gt; and you're in. Stars/PRs welcome.&lt;br&gt;
I'm building a skills factory and security-audit pipeline on the same pattern —&lt;br&gt;
follow if that's your kind of thing.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
