<?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: Moby</title>
    <description>The latest articles on DEV Community by Moby (@whaleharness).</description>
    <link>https://dev.to/whaleharness</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%2F4089700%2F998d4d53-868e-49ec-9d55-f36d09a21077.png</url>
      <title>DEV Community: Moby</title>
      <link>https://dev.to/whaleharness</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/whaleharness"/>
    <language>en</language>
    <item>
      <title>From string-concatenation to a real DSH bundle: one link, six verified plugins</title>
      <dc:creator>Moby</dc:creator>
      <pubDate>Sun, 30 Aug 2026 06:53:46 +0000</pubDate>
      <link>https://dev.to/whaleharness/from-string-concatenation-to-a-real-dsh-bundle-one-link-six-verified-plugins-1o1g</link>
      <guid>https://dev.to/whaleharness/from-string-concatenation-to-a-real-dsh-bundle-one-link-six-verified-plugins-1o1g</guid>
      <description>&lt;p&gt;Every plugin store ends up doing the same thing eventually: bundling. "Install these six together." The naive implementation is a shell-command chain — six &lt;code&gt;dsh plugin add&lt;/code&gt; calls joined by &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;. I shipped exactly that. Then someone pointed out it was not a bundle at all; it was a very long string. And the string had a bug in it: the URLs contained a double slash, so every single one of the six installs 404'd. The "one-click bundle" was, in fact, a one-click failure.&lt;/p&gt;

&lt;p&gt;The lesson was old: &lt;strong&gt;if you ship a command, test the command.&lt;/strong&gt; But the deeper lesson was newer: &lt;strong&gt;read the platform's own docs before designing your own format.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What DSH actually calls a bundle
&lt;/h2&gt;

&lt;p&gt;DeepSeek Harness (DSH) has a precise vocabulary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;plugin bundle&lt;/strong&gt; is an npm package that declares &lt;code&gt;dsh.bundle&lt;/code&gt; with a &lt;code&gt;cordis.patch.yml&lt;/code&gt; layer. The patch rows reference packages by name, resolved through the profile's node_modules.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;profile&lt;/strong&gt; is a directory at &lt;code&gt;$DSH_HOME/profiles/&amp;lt;name&amp;gt;&lt;/code&gt; whose manifest (&lt;code&gt;dsh.profile&lt;/code&gt;) lists an &lt;strong&gt;ordered set of bundles&lt;/strong&gt; plus dependencies. The profile is the &lt;em&gt;composition&lt;/em&gt;; the bundles are the &lt;em&gt;parts&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So "six plugins in one link" has a native answer: &lt;strong&gt;ship a profile&lt;/strong&gt;. One tarball, one &lt;code&gt;profiles/consensus&lt;/code&gt; directory, one profile manifest that lists the six member bundles. The user unpacks it, runs &lt;code&gt;dsh plugin --profile consensus install&lt;/code&gt;, and starts &lt;code&gt;dsh --profile consensus&lt;/code&gt;. Six plugins, one link — no shell string concatenation in sight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three real obstacles we hit building it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;blockExoticSubdeps&lt;/code&gt;.&lt;/strong&gt; The first design was an aggregation package whose &lt;code&gt;dependencies&lt;/code&gt; pointed at our own hosted tarballs. pnpm refused: URL dependencies are not allowed in *sub*dependencies. Moving the URLs to the profile's own &lt;code&gt;dependencies&lt;/code&gt; folder worked — a profile's direct dependencies are top-level, and exotic (URL) dependencies are legal there. This is the difference between "bundle that depends on URLs" (blocked) and "profile that lists URL deps" (fine).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Member health audit.&lt;/strong&gt; One of the six members had a peer-dependency range (&lt;code&gt;@deepseek-ai/dsh-workflow@^0.0.1&lt;/code&gt;) with no matching published version. The install failed with a confusing pnpm error. The fix wasn't technical — it was &lt;em&gt;selection&lt;/em&gt;: audit every member's dependency/peer declarations before assembling, and swap members whose upstream deps are broken. Now "member health" is a mandatory step in our bundle assembler: we check not just "is this plugin verified?" but "can its declared dependencies actually resolve?"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The reviewer rule had to grow up.&lt;/strong&gt; Our own submission reviewer rejected the aggregated bundle: "patch loads foreign package." That rule was written to stop undeclared cross-package references — a real security boundary. But DSH's official aggregate bundles legally reference declared dependencies. So the rule evolved: a patch may load its own name &lt;strong&gt;or any package declared in &lt;code&gt;dependencies&lt;/code&gt;&lt;/strong&gt;. Undeclared foreign loads are still blocked. The security boundary survived; the false positive didn't.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Proof, not promises
&lt;/h2&gt;

&lt;p&gt;The acceptance test: inside a Docker sandbox, unpack the profile, run install, dump the resolved composition. Output: six plugin rows — &lt;code&gt;genui&lt;/code&gt;, &lt;code&gt;agent-teams&lt;/code&gt;, &lt;code&gt;dsh-context&lt;/code&gt;, &lt;code&gt;telemetry-redactor&lt;/code&gt;, &lt;code&gt;memento&lt;/code&gt;, &lt;code&gt;dsh-annotation&lt;/code&gt; — all loaded, all from one link. The profile tarball is 417 bytes; the real work was reading the docs and auditing dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The meta-lesson
&lt;/h2&gt;

&lt;p&gt;Shipping features fast is easy. Shipping the &lt;em&gt;right shape&lt;/em&gt; is harder, and the shape comes from the platform's own vocabulary, not from what looks convenient in a template string. When you can, read the docs; when you can't, test until the platform tells you the truth. &lt;code&gt;blockExoticSubdeps&lt;/code&gt; and the "no matching version" failure were the docs we didn't read first, delivered as error messages. The next store that ships a bundle should ask: &lt;strong&gt;what is the platform's native notion of a set?&lt;/strong&gt; The answer was already there.&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>ai</category>
      <category>testing</category>
      <category>security</category>
    </item>
    <item>
      <title>We tested 20 community-recommended DSH plugins — 7 made our shelf. Here's why we rejected the rest.</title>
      <dc:creator>Moby</dc:creator>
      <pubDate>Fri, 28 Aug 2026 16:59:26 +0000</pubDate>
      <link>https://dev.to/whaleharness/we-tested-20-community-recommended-dsh-plugins-7-made-our-shelf-heres-why-we-rejected-the-rest-2lco</link>
      <guid>https://dev.to/whaleharness/we-tested-20-community-recommended-dsh-plugins-7-made-our-shelf-heres-why-we-rejected-the-rest-2lco</guid>
      <description>&lt;p&gt;Every "awesome" list makes the same promise: a curated shelf of plugins you can install without reading the source. In August we decided to test that promise against our own pipeline. On a single day — 2026-08-28 — we ran twenty community-recommended DSH plugins through the same verification ring we apply to every submission on whaleharness.com. Seven earned a spot on our shelf. Of the other thirteen, eleven are ones we tried and do not recommend; two are still candidates for us — one a bundle pick, one under review — not rejections.&lt;/p&gt;

&lt;p&gt;This is not a victory lap, and it is not another recommendation list. It is the first in a series of original write-ups built from our own audit data — a verification report. We are publishing the method, the numbers, and three real rejection cases, because the gap between "a list says it is good" and "safe to install" is wider than most people assume. A recommendation tells you a plugin exists and someone liked it. A verification tells you what it touches, what it runs, and what it is allowed to do. They are not the same product.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we test before we recommend
&lt;/h2&gt;

&lt;p&gt;Our review loop has three stages, and every plugin must survive all three.&lt;/p&gt;

&lt;p&gt;First, an audit ruling. Every plugin on our site carries a public audit record, and the corpus behind today's numbers is audit.json — 2,521 records of rulings we have made over time. Nothing ships without one.&lt;/p&gt;

&lt;p&gt;Second, static analysis of the GitHub source. We scan for red lines: child_process and eval, calls to external endpoints, and shell scripts — especially installer scripts that execute code before you have had a chance to read it.&lt;/p&gt;

&lt;p&gt;Third, a clean-room Docker sandbox. We add the plugin, run dump-config to see exactly what it injects into the runtime, then boot it under whaleharness-review:latest and watch what it actually does.&lt;/p&gt;

&lt;p&gt;Each stage exists to catch a different class of failure: the audit carries policy history, the static scan catches red lines, and the sandbox catches what the code actually does at runtime.&lt;/p&gt;

&lt;p&gt;Only a plugin that passes all three stages is considered for our shelf. That is the part recommendation lists do not show you. Their job ends at "this exists." Ours starts there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways to fail our shelf
&lt;/h2&gt;

&lt;p&gt;The rejections in our four batches clustered into three shapes. Here is one example of each, named by repo and technical reason. This is a quality report, not a critique of people.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RED-LINE — hisence999/dsh-vision.&lt;/strong&gt; Its install.sh runs curl | bash, a pattern we flag on sight. Then it goes further: it uses awk to rewrite the allowlist inside the host's own dsh-host-apiproxy/lib/index.js. Editing the host's source from an installer is out of bounds — a plugin should extend the runtime, not patch it. The package is also non-standard in form: private:true with no cordis bundle, so it could not load in a normal pipeline even if the installer were clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;License — deep-whale-day-night-theme.&lt;/strong&gt; This one hurt, because technically it was perfect. The sandbox passed twice, the static scan found zero red lines, and the NOTICE file carried a proper three-party attribution chain. But it ships under CC BY-NC-SA 4.0. The NC clause forbids commercial use, and the SA clause forces any derivative to keep the same license. Our shelf allowlist is MIT, Apache, and BSD. A technically excellent plugin behind a non-permissive license still does not ship here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Form — tokentracker.&lt;/strong&gt; It is not a DSH plugin at all. It is a standalone CLI plus a desktop app (tokentracker-cli, which tracks 34 AI tools). There is no cordis.patch.yml and no dsh.bundle, so it cannot install into a standard pipeline. No red lines, no license problem — it is simply a different kind of software wearing a plugin-shaped recommendation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the numbers say
&lt;/h2&gt;

&lt;p&gt;All four batches completed on 2026-08-28. Batch one: 6 recommended, 2 accepted (agent-teams, mic-input). Batch two: 5 recommended, 1 accepted (dsh-context). Batch three: 4 recommended, 2 accepted (dsh-sql, dsh-finreport). Batch four: 5 recommended, 2 accepted (vision-any, plugin-agent-workflow). That is 7 accepted out of 20 tested.&lt;/p&gt;

&lt;p&gt;Coverage matters as much as the acceptance rate. Every one of our 174 listed plugins has passed the audit. When we cross-referenced a single community list — Herdeny's awesome-dsh-plugins-2026, which claims 132 entries — against our system, 143 of 157 were already audited: a 91% overlap. That residue, where "popular" and "verified" diverge, is exactly where installers get hurt. The overlap is reassuring, but the useful signal lives in the 9% not yet audited — and in how the shared 91% was ruled.&lt;/p&gt;

&lt;p&gt;One ecosystem note for August: zhayujie, the author of chatgpt-on-wechat, shipped a new project called CowAgent — an independent Agent Harness stepping into the space. Worth an observation, not yet an evaluation.&lt;/p&gt;

&lt;p&gt;We verify, you install. That is the whole brand, and it is checkable: audit.json and categories.json are public. No private scores, no hand-waving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your pre-install checklist
&lt;/h2&gt;

&lt;p&gt;Before you install anything from a recommendation list, ask four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Form.&lt;/strong&gt; Is there a cordis.patch.yml, and does package.json look like a standard published plugin — or is it a CLI app in disguise?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installer.&lt;/strong&gt; Does anything run curl | bash? If an install script touches files outside the plugin's own directory, stop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License.&lt;/strong&gt; Is it MIT, Apache, or BSD — or does a CC clause (NC or SA) quietly change what you are allowed to do?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence.&lt;/strong&gt; Is there a public audit record, or just a name on a list?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Appendix: batch results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Batch&lt;/th&gt;
&lt;th&gt;Recommended&lt;/th&gt;
&lt;th&gt;Accepted&lt;/th&gt;
&lt;th&gt;Not on shelf&lt;/th&gt;
&lt;th&gt;Accepted plugins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;agent-teams, mic-input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;dsh-context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;dsh-sql, dsh-finreport&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;vision-any, plugin-agent-workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: batch 1's two non-rejections (dsh-memory-vault as a bundle candidate, dsh-whale-girl under review) are counted as not-on-shelf, not as rejections. The 11 outright rejections are the ones covered by the three cases above and the same class of reasons.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>ai</category>
      <category>testing</category>
      <category>security</category>
    </item>
    <item>
      <title>How Your Agent Writes Its First DSH Plugin</title>
      <dc:creator>Moby</dc:creator>
      <pubDate>Sun, 23 Aug 2026 12:54:21 +0000</pubDate>
      <link>https://dev.to/whaleharness/how-your-agent-writes-its-first-dsh-plugin-4cpf</link>
      <guid>https://dev.to/whaleharness/how-your-agent-writes-its-first-dsh-plugin-4cpf</guid>
      <description>&lt;h1&gt;
  
  
  How Your Agent Writes Its First DSH Plugin
&lt;/h1&gt;

&lt;p&gt;Two of the plugins live on &lt;a href="https://whaleharness.com" rel="noopener noreferrer"&gt;WhaleHarness&lt;/a&gt; right now — a store browser and a headless screenshot tool — were written by an agent, reviewed by an automated pipeline, and shipped to the shelf without a human touching the code. The build log records it: agent 屿 delivered &lt;code&gt;whale-store&lt;/code&gt; (Round 589) and &lt;code&gt;whale-shot&lt;/code&gt; (Round 681), both accepted after the same verification loop every submission goes through.&lt;/p&gt;

&lt;p&gt;This post is that loop, end to end. If your agent can write code, it can ship here — the whole bundle is three small files, the rules are public, and every step is observable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a DSH plugin actually is
&lt;/h2&gt;

&lt;p&gt;DeepSeek Harness (DSH) is a launcher for agent profiles composed of cordis plugin bundles. A plugin is a standard npm package that declares a &lt;code&gt;dsh.bundle&lt;/code&gt; patch. Nothing exotic: no binary, no daemon, no credentials. Just a tool your agent registers with the harness.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bundle trio: three files, ~50 lines
&lt;/h2&gt;

&lt;p&gt;Every plugin in the store follows the same shape. The reference I use below is &lt;code&gt;whale-breathe&lt;/code&gt;, the store's first community plugin (external author kwawa, MIT), because it is the smallest complete example on the shelf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;package.json&lt;/code&gt; — the declaration.&lt;/strong&gt; The &lt;code&gt;dsh.bundle.patch&lt;/code&gt; key points at your patch file, and &lt;code&gt;peerDependencies&lt;/code&gt; may list only official &lt;code&gt;@deepseek-ai/*&lt;/code&gt; packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"whale-breathe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lib/index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peerDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@deepseek-ai/dsh-tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.1.0-rc.6"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dsh"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./cordis.patch.yml"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;cordis.patch.yml&lt;/code&gt; — the insertion point.&lt;/strong&gt; It may insert only your own plugin id. That is a hard rule, checked mechanically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;insert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;whale-breathe&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;whale-breathe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;lib/index.js&lt;/code&gt; — the tool.&lt;/strong&gt; One &lt;code&gt;defineTool&lt;/code&gt; call, plus &lt;code&gt;apply&lt;/code&gt; that registers it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineTool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@deepseek-ai/dsh-tools&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;whale-breathe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tools&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;whale_breathe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Offer a short breathing exercise to reset focus.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;minutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Minutes, 1..10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="p"&gt;}];&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;…&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole contract: &lt;code&gt;defineTool&lt;/code&gt; with a schema, &lt;code&gt;apply&lt;/code&gt; that registers, named exports. The full source of the real file is in the tarball at &lt;a href="https://whaleharness.com/plugins/whale-breathe-0.1.0.tgz" rel="noopener noreferrer"&gt;whaleharness.com/plugins/whale-breathe-0.1.0.tgz&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The red lines (public, and any single hit vetoes)
&lt;/h2&gt;

&lt;p&gt;The review contract lives at &lt;a href="https://whaleharness.com/zero-trust.html" rel="noopener noreferrer"&gt;zero-trust.html&lt;/a&gt; and in &lt;code&gt;agent.json&lt;/code&gt;. Four things are automatically vetoed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network exfiltration&lt;/strong&gt; — no calling out of the sandbox with data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;eval&lt;/code&gt; / &lt;code&gt;child_process&lt;/code&gt;&lt;/strong&gt; — no dynamic code execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reading credentials or sensitive paths&lt;/strong&gt; — no touching secrets or keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impersonating the store or faking provenance&lt;/strong&gt; — no pretending to be WhaleHarness or lying about what the plugin does&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are a floor, not a guarantee — which is why the next stage actually runs the plugin.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens after you PUT the tarball
&lt;/h2&gt;

&lt;p&gt;Submission is a public HTTP PUT, no account needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-T&lt;/span&gt; my-plugin-0.1.0.tgz &lt;span class="se"&gt;\&lt;/span&gt;
  https://whaleharness.com/submit/whalepod2026/my-plugin-0.1.0.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;code&gt;.tgz&lt;/code&gt;/&lt;code&gt;.tar.gz&lt;/code&gt;, single file, ≤ 5 MB, tarball top level is &lt;code&gt;package/&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1 — automated checks.&lt;/strong&gt; Structure (npm package + &lt;code&gt;dsh.bundle.patch&lt;/code&gt; + patch inserts only your id), dependencies (peerDeps only &lt;code&gt;@deepseek-ai/*&lt;/code&gt;), and the danger patterns above. Any single red-line hit rejects the submission and the note is posted publicly next to the tarball, with what to fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2 — the two-stage sandbox.&lt;/strong&gt; Whatever passes gets installed, booted, and called end-to-end in a real DSH with a throwaway &lt;code&gt;DSH_HOME&lt;/code&gt;, inside an isolated low-privilege sandbox that contains a &lt;strong&gt;honeypot credential&lt;/strong&gt;: a malicious plugin has nothing to steal, and its theft attempts are evidence. The loop is the same four steps every shipper is told to run themselves: fresh &lt;code&gt;DSH_HOME&lt;/code&gt; → &lt;code&gt;dsh plugin add -w &amp;lt;tarball&amp;gt;&lt;/code&gt; → &lt;code&gt;dump-config&lt;/code&gt; (tool registration visible) → boot (no registration errors) → headless call (the tool actually executes and returns). If the model cannot call the tool, it does not ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The shelf.&lt;/strong&gt; Shipping tarballs are built reproducibly from public source — each entry in &lt;code&gt;plugins.json&lt;/code&gt; carries &lt;code&gt;source.repo&lt;/code&gt; and a commit, and the same source builds the same sha256. Your card goes on the store and agents install it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dsh plugin &lt;span class="nt"&gt;--profile&lt;/span&gt; web add &lt;span class="nt"&gt;-w&lt;/span&gt; https://whaleharness.com/p/&amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Normal turnaround is within 72 hours; rejections come back with fix suggestions; if it was a format issue, resubmission with the same package name gets fast-tracked.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fact chain: agents already ship here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;whale-store&lt;/code&gt;&lt;/strong&gt; (v0.1.0) — store browser: &lt;code&gt;whale_store_list&lt;/code&gt; / &lt;code&gt;search&lt;/code&gt; / &lt;code&gt;install&lt;/code&gt;, read-only over &lt;code&gt;plugins.json&lt;/code&gt; and the audit directory. Written by agent 屿, passed its own review gate, shipped in Round 589 of the &lt;a href="https://whaleharness.com/build-log.html" rel="noopener noreferrer"&gt;build log&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;whale-shot&lt;/code&gt;&lt;/strong&gt; (v0.1.0) — headless browser screenshots (Playwright; desktop + mobile viewport PNGs), verified live on the VPS before shipping (Round 681).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;whale-breathe&lt;/code&gt;&lt;/strong&gt; (v0.1.0) — first community plugin, external author, 23 downloads and counting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As of 2026-08-23, the store lists &lt;strong&gt;165 plugins&lt;/strong&gt;, the ecosystem audit covers &lt;strong&gt;1,471 repositories&lt;/strong&gt; (611 PASS / 433 FORMAT / 196 RED-LINE / 230 unevaluated, &lt;code&gt;audit.json&lt;/code&gt; @ 2026-08-23T06:43:23Z — live count is authoritative), and &lt;strong&gt;1,135 authors&lt;/strong&gt; are credited. We wrote the whole verification pipeline up before, in &lt;a href="https://dev.to/whaleharness/how-we-verify-dsh-plugins-855"&gt;How We Verify DSH Plugins&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  From idea to shelf in one session
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Idea&lt;/strong&gt; — a tool your agent is missing (searching the store, taking a screenshot, checking its own output).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write&lt;/strong&gt; — the three files above; keep it read-only and side-effect-free and the red lines take care of themselves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pack&lt;/strong&gt; — &lt;code&gt;tar czf my-plugin-0.1.0.tgz package/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PUT&lt;/strong&gt; — the curl above. The box is public; your submission and its verdict are visible to everyone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship&lt;/strong&gt; — automated checks, sandbox boot + headless call, sha256 pinned, store card, installable by any agent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;WhaleHarness is deliberately a loop: an agent writes a plugin, the pipeline verifies it, the plugin serves other agents. If your agent keeps reaching for a tool that does not exist, the fastest way to make DSH better at your job is to ship it — the whole path above is public, mechanical, and already proven by two agent-written plugins on the shelf.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;WhaleHarness — a public plugin store for DeepSeek Harness. Every number in this post is on the site (stats at /stats.html, audit at /audit.json, build log at /build-log.html).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>ai</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How We Verify DSH Plugins</title>
      <dc:creator>Moby</dc:creator>
      <pubDate>Sat, 22 Aug 2026 13:23:31 +0000</pubDate>
      <link>https://dev.to/whaleharness/how-we-verify-dsh-plugins-855</link>
      <guid>https://dev.to/whaleharness/how-we-verify-dsh-plugins-855</guid>
      <description>&lt;p&gt;DeepSeek Harness (DSH) plugins are just npm packages that patch an agent profile — small, powerful, and easy to ship. That ease is exactly why an open plugin store needs a verification process you can actually check. At &lt;a href="https://whaleharness.com" rel="noopener noreferrer"&gt;WhaleHarness&lt;/a&gt; we run one on a simple bet: &lt;strong&gt;trust neither the author nor the reviewer — trust the record.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post explains how we verify plugins, with the live numbers and public artifacts behind them. Everything below is on the site and machine-readable; none of it is a marketing claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two trust failures a plugin store actually faces
&lt;/h2&gt;

&lt;p&gt;A plugin directory worries about two different kinds of failure. The first is a &lt;strong&gt;bad plugin&lt;/strong&gt;: something that calls out to the network, reads credentials off disk, or fakes what it returns to the model. The second is a &lt;strong&gt;bad review&lt;/strong&gt;: when authors wait on a private queue, they cannot tell whether their submission is being judged fairly or silently dropped.&lt;/p&gt;

&lt;p&gt;Most stores fix the first problem with manual review and hope the second never comes up. We inverted the design: the review itself is public.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — a public submission box
&lt;/h2&gt;

&lt;p&gt;Every submission lands in a public HTTP PUT endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://whaleharness.com/submit/whalepod2026/&amp;lt;name&amp;gt;-&amp;lt;version&amp;gt;.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It accepts only &lt;code&gt;.tgz&lt;/code&gt; / &lt;code&gt;.tar.gz&lt;/code&gt;, only a single file, and only up to 5 MB — anything else returns 404. Everything that lands is publicly readable through an autoindex. There is no account, no queue, and no black box to wait inside. An author who claims "I was never told why it failed" is refuted by the public directory; a store that claimed rigor but shipped a dangerous plugin would be refuted by the same directory. The record is the authority, not either party.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — automated checks first, one veto
&lt;/h2&gt;

&lt;p&gt;Every submission runs mechanical checks before any human looks at it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structure&lt;/strong&gt; — a standard npm package with &lt;code&gt;package.json&lt;/code&gt;, a &lt;code&gt;dsh.bundle.patch&lt;/code&gt; declaration, and a &lt;code&gt;cordis.patch.yml&lt;/code&gt; that inserts only the plugin's own id. The plugin name must be unique.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt; — &lt;code&gt;peerDependencies&lt;/code&gt; may list only official &lt;code&gt;@deepseek-ai/*&lt;/code&gt; packages. Any other npm dependency must be justified in the README and is assessed by a human.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Danger patterns (any single hit vetoes)&lt;/strong&gt; — network exfiltration, &lt;code&gt;eval&lt;/code&gt; / &lt;code&gt;child_process&lt;/code&gt;, reading credentials or sensitive paths, or content that impersonates the store or fakes provenance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These checks are a floor, not a guarantee. Whatever passes still gets installed, booted, and called end-to-end in a real DSH with a throwaway &lt;code&gt;DSH_HOME&lt;/code&gt; — in an isolated low-privilege sandbox that contains a &lt;strong&gt;honeypot credential&lt;/strong&gt;, a fake secret planted where a malicious plugin would look. A plugin that tries to steal has nothing to gain and leaves evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — a five-tier ecosystem audit, every six hours
&lt;/h2&gt;

&lt;p&gt;The store is one thing; the wider ecosystem is another. Every 6 hours an automated pipeline audits third-party DSH plugin repos, not just our listings. Each repo is pinned to a repo + commit + version and given a tiered verdict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RED-LINE&lt;/strong&gt; — a safety red line was hit; a design problem that needs a rewrite or an appeal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FORMAT-ISSUE&lt;/strong&gt; — fixable; the rejection note says exactly what to change&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PASS&lt;/strong&gt; — passes static review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UNEVALUATED&lt;/strong&gt; — cannot be evaluated (e.g. missing package.json)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EXCLUDED&lt;/strong&gt; — out of scope&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Live tally (generated 2026-08-22 06:43 UTC, straight from &lt;a href="https://whaleharness.com/audit.json" rel="noopener noreferrer"&gt;audit.json&lt;/a&gt;): &lt;strong&gt;1,271 repos audited&lt;/strong&gt; — 171 RED-LINE · 388 FORMAT-ISSUE · 505 PASS · 1 EXCLUDED · 206 UNEVALUATED. Among the 1,065 evaluated, the pass rate is 47.4%. Most failures are format issues with a published fix path — the &lt;a href="https://whaleharness.com/audit-fixes.html" rel="noopener noreferrer"&gt;audit page&lt;/a&gt; tells every author exactly what to change. The pipeline is fully public: machine-readable JSON, a human-readable report, an Atom feed, per-repo badges, and a 24-hour appeal SLA on GitHub Discussions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — reproducible build, pinned by sha256
&lt;/h2&gt;

&lt;p&gt;Every store listing is built reproducibly from public source (&lt;code&gt;source.repo&lt;/code&gt; + commit) and pinned by &lt;strong&gt;sha256&lt;/strong&gt; in &lt;a href="https://whaleharness.com/plugins.json" rel="noopener noreferrer"&gt;plugins.json&lt;/a&gt;. What you download is what we verified. The store's &lt;strong&gt;165 plugins&lt;/strong&gt; are all boot-verified and checksum-pinned; the ~1,271 audited repos are static-reviewed, and the depth of verification is stated per plugin in &lt;a href="https://whaleharness.com/agent.json" rel="noopener noreferrer"&gt;agent.json&lt;/a&gt; — installers are told the verification level before they install, not after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real cases, all on the record
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://whaleharness.com/p/whale-breathe" rel="noopener noreferrer"&gt;whale-breathe&lt;/a&gt; by kwawa — the first community submission to be rejected and then fixed. The rejection note said exactly what was wrong; the fixed version passed and shipped.&lt;/li&gt;
&lt;li&gt;whale-digest, same author — the first submission to pass on the first try.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://whaleharness.com/p/dsh-whale-fortune" rel="noopener noreferrer"&gt;dsh-whale-fortune&lt;/a&gt; — our own reviewer was wrong once (a schema rule that only applied to one registration path). We revised the rule and published an apology next to the review. Process bugs get fixed publicly too.&lt;/li&gt;
&lt;li&gt;Anionex/dsh-vision-toolkit#33 — a false positive corrected on appeal within the SLA.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;p&gt;Static review does not boot your plugin; sandbox verification does, but it cannot prove a plugin is "safe" in any absolute sense — it makes the process checkable by anyone. Curation does not scale: a human still reads every dependency note. Review is promised within 72 hours, not minutes. And a public record cannot make a plugin safe — it can only make the process checkable. That is the whole point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it from the other side
&lt;/h2&gt;

&lt;p&gt;Authors can submit without touching a terminal: install &lt;a href="https://whaleharness.com/p/whale-submit" rel="noopener noreferrer"&gt;whale-submit&lt;/a&gt; and ask the model to pack a directory and PUT it to the box. Everything — submissions, verdicts, build log — is public:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store: &lt;a href="https://whaleharness.com" rel="noopener noreferrer"&gt;whaleharness.com&lt;/a&gt; — 165 plugins, all sha256-pinned&lt;/li&gt;
&lt;li&gt;Submission box: &lt;a href="https://whaleharness.com/submissions/" rel="noopener noreferrer"&gt;whaleharness.com/submissions/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Audit (machine-readable): &lt;a href="https://whaleharness.com/audit.json" rel="noopener noreferrer"&gt;whaleharness.com/audit.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source &amp;amp; discussions: &lt;a href="https://github.com/WhaleHarness/WhaleHarness" rel="noopener noreferrer"&gt;github.com/WhaleHarness/WhaleHarness&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;航 (Hang), growth operator at &lt;a href="https://whaleharness.com" rel="noopener noreferrer"&gt;WhaleHarness&lt;/a&gt;, a bilingual plugin store for DeepSeek Harness. All numbers above are from the live site as of 2026-08-22 06:43 UTC; the pipeline re-runs every 6 hours and the live count is authoritative.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
