Standards

DSHIO/T 10—2026 Plugin Standard

Standard No.DSHIO/T 10—2026
CodeDSHIO-PLUGIN
TitlePlugin Standard
Versionv1.0 (Trial)
Published2026-11-07
Effective2026-11-07
StatusTrial (2026-11-07 → 2027-02-07; becomes current automatically)
OriginalSimplified Chinese
LayerProduct standard
SupersedesDSHIO-DEV (retired)

📋 Current scope

This standard defines six test stages (T0–T5). Current implementation status:

StageNameStatus
T0Static check✅ Available
T1Install✅ Available
T2List✅ Available
T3Mount✅ Available
T4Boot✅ Available
T5Tool invocation🕐 Planned

Why T5 is only planned: it involves model cost and nondeterminism (see DSHIO/T 32 clause 4.3). It is written into the standard but not yet scheduled. Until it is formally included, any report claiming a T5 run is void.

Manual-judgement clauses (5.5.1, 5.5.2) are the author's own responsibility. DSHIO does not issue verdicts on them. Producing an opinion on them is a paid service, and the opinion is advisory only — it does not change the conformance verdict.

This notice prevails over any T5-related provision elsewhere in this standard.


1 Scope

This standard specifies the classification, technical requirements, test methods, inspection rules and marking of DSH plugins.

It applies to every plugin distributed as an npm package that can be installed into a DSH profile with dsh plugin.

It does not apply to:

1.1 Statement of implementation independence

This standard does not require any particular development tool, programming language, build process or helper library.

Anything that satisfies every technical requirement is conforming, however it is implemented. Conformance is judged by observable runtime behaviour, not by source structure.

Concretely:

  1. @deepseek-ai/dsh-tools is not mandatory. defineTool() is merely a

convenient way to author a tool; a hand-written object that satisfies the entry contract is equally valid.

  1. TypeScript is not mandatory. Official plugins are written in TS because the

official project uses TS, not because the standard requires it.

  1. The official build pipeline is not mandatory. The standard constrains the

structure of the artefact, not how it is produced.

  1. pnpm is not mandatory. dsh plugin currently delegates to pnpm, but the

standard only requires that dependencies resolve correctly.

  1. A specific Cordis version is not mandatory. The plugin only has to mount

and run on the target DSH version.

Judgement is black-box: install, list, mount, boot, tool invocation. The author's source code is not read.


2 Normative references

The clauses of the following documents become clauses of this standard by virtue of the reference. For dated references, only the dated edition applies.

StandardTitleClauses referenced
DSHIO/T 00—2026Terms and Definitions3.1.3, 3.2.1, 3.2.5, 3.3.3, 3.5.1, 3.5.3, 3.6.1, 3.7.1, 3.7.2
DSHIO/T 21—2026Test ConditionsAll (chapter 6 of this standard references it directly)
DSHIO/T 20—2026General Rules for TestingChapter 3 (T0–T5 definitions)

Non-normative references (informative only):


3 Terms and definitions

The terms defined in DSHIO/T 00—2026 apply. Additional definitions:

3.1 baseline version

The DSH version currently used by DSHIO for conformance decisions. The current baseline is 0.2.2-rc.1.

The baseline version is updated as DSH releases. The update procedure is in DSHIO/T 35.

3.2 static layer

Checks that can be decided without installing. Corresponds to stage T0 of DSHIO/T 20.

The static layer examines three kinds of object: package.json, the patch file, and the entry structure.

3.3 dynamic layer

Checks that require an actual install and run. Corresponds to stages T1–T5.

3.4 red-line combination

A permission combination that is high risk by its mere presence.

One is currently defined: network declared together with (shell or fs-write).

Rationale: these two capability classes together form a complete path for "read local data and send it out", and the user cannot see the actual direction of flow from the declaration.


4 Classification

4.1 By capability provided

TypeCriterionTypical
ToolRegisters at least one tooldsh-tool-*
ServiceProvides capability to other plugins via injectdsh-fs, dsh-llm
UIProvides Web client componentsdsh-client-ui-*
AdapterBrings an external system into DSHdsh-llm-<provider>
ConfigurationProvides only a patch, no runtime logicmarket bundles

A plugin may belong to several classes at once.

4.2 By model dependence

TypeMeaningEffect on judgement
Model-independentFunctionality does not depend on a specific modelT0–T4 suffice
Model-dependentBehaviour depends on model capabilityAlso requires T5, and the verdict shall name the model

Basis: model access is provided by separate plugins (dsh-llm-*), not by the harness core, so install, mount and boot are inherently model-independent.

4.3 By permission requirement

ClassPermissionsRisk
No permissionComputation, UI onlylow
Read-onlyfs-read, llmlow
Networknetworkdepends on combination
Writefs-writedepends on combination
Shellshelldepends on combination
Red linenetwork + (shell/fs-write)high

5 Technical requirements

Every clause in this chapter is mandatory, except those marked "(recommended)", which are advisory.

5.1 Structural requirements

5.1.1 Plugin declaration

package.json shall contain a dsh.bundle.patch field whose value is the path of the patch file relative to the package root.

{
  "dsh": {
    "bundle": {
      "patch": "./cordis.patch.yml"
    }
  }
}

Criterion: the field exists and its value is a non-empty string.

5.1.2 Patch file exists

The file referenced by dsh.bundle.patch shall exist inside the published package.

Criterion: the file can be fetched from a public CDN (unpkg / jsdelivr / npmmirror).

Common failure: the path differs from the declaration; the files array omits the patch file.

5.1.3 Patch file is valid YAML

The patch file shall be parseable by a YAML 1.2 parser.

Criterion: yaml.safe_load() does not raise.

Most common mistake: a value starting with @ is not quoted.

# wrong
name: @scope/pkg
# right
name: "@scope/pkg"

In YAML, @ is a reserved indicator; unquoted it fails to parse.

5.1.4 Patch structure

The top level of the patch file shall be an array containing at least one item with an insert field.

- insert:
    - id: my-plugin
      name: "my-package"

Criterion: the top level is a list; at least one item is a dict containing insert.

5.1.5 Entry completeness

Every entry in the insert list shall contain a non-empty string id and a non-empty string name.

FieldRequirement
idNon-empty string, unique within that patch layer
nameNon-empty string, a module specifier

Criterion: iterate every dict in every insert array and check both fields.

5.1.6 Optional entry fields

The following fields are optional; when present they shall conform to the official schema:

FieldTypePurpose
configanyPlugin configuration
groupboolean/nullAllow patch indexing
disablingboolean/null/!!jsDisable the entry
injectarray/object/nullDependency injection
interceptobject/nullInterception
isolateobject/nullIsolation

Basis: the entry definition emitted by dsh --dump-config-schema.

5.2 Version and entry-point requirements

package.json should contain an engines.dsh field declaring the compatible DSH version range.

When absent: judge by the version ranges of @deepseek-ai/* packages in peerDependencies. If neither is present, treat as unconstrained (any DSH version accepted) and record it as a suggested improvement only.

{
  "engines": { "dsh": ">=0.2.0-rc.2" }
}

5.2.2 Version range includes the baseline version

The range declared in engines.dsh shall include the current baseline version.

Criterion: use semver rules to decide whether 0.2.2-rc.1 falls inside the range.

Common mistake: hard-coding an upper bound.

// wrong: excludes 0.2.2-rc.1
"engines": { "dsh": ">=0.2.0-rc.2 <0.2.2-0" }

// right: lower bound only
"engines": { "dsh": ">=0.2.0-rc.2" }

Basis: the official README states that both installation and profile startup validate engines.dsh against the runtime version; an incompatible plugin needs an explicit exact-version exemption.

5.2.3 Code entry point

package.json shall declare a code entry point: main or exports, at least one.

Pure configuration plugins (the "configuration" class in 4.1) may have an empty apply(), but a usable entry is still mandatory — otherwise the install check fails.

{
  "type": "module",
  "main": "lib/index.js"
}

ESM packages should declare "type": "module" rather than rely on .mjs extensions.

5.3 Packaging requirements

5.3.1 files array completeness

If a files array is declared, it shall include:

Criterion: check whether files has an item starting with lib, and whether it covers the value of dsh.bundle.patch (compare after stripping a leading ./).

When files is not declared: all files are included and this clause passes.

5.3.2 No local-path dependencies

The values of the following fields shall not start with file: or /:

dependencies, optionalDependencies, peerDependencies, dsh

devDependencies is excluded — development dependencies are not published with the package and are not installed by consumers.

Common mistake: writing an internal tool as "my-kernel": "file:./kernel" inside dependencies, which makes installation fail for consumers.

Installed node_modules size should be below 50 MB.

Note: no hard limit is imposed, but excessive size slows installation markedly. For reference, official plugins are typically 1–20 MB.

5.4 Behavioural requirements (require sandbox testing)

5.4.1 Installable

The plugin shall be resolvable and installable into a DSH profile from the public npm registry or a specified Git repository.

Criterion: stage T1. See DSHIO/T 20 and DSHIO/T 21.

5.4.2 Listable

After installation the plugin shall appear in the profile's dependency list.

Criterion: stage T2.

Note: this stage runs with networking disabled.

5.4.3 Mountable

The plugin's entry shall appear in the output of dsh --dump-config.

Criterion: stage T3. Runs with networking disabled.

Failure verdict: when install_ok=true but registered=false, the verdict is installs_but_not_registered.

5.4.4 Bootable

After loading the plugin the profile shall start and stay alive for at least 12 consecutive seconds.

Criterion: stage T4. Runs with networking disabled.

5.4.5 Tool contract (tool plugins)

Every registered tool shall satisfy:

FieldRequirement
nameNon-empty, globally unique, lowercase with underscores or hyphens
descriptionNon-empty, see 5.5.1
parametersConforms to the JSON Schema object convention
executeA function

Criterion: read the tool registration code statically, or observe the tool list during stage T5.

5.5 Quality requirements

5.5.1 Tool description states when to use it

Every tool's description shall let someone unfamiliar with the plugin decide under what circumstances the tool should be called.

Non-conforming examples:

Conforming example:

quotes from third-party providers, sorted cheapest first, with quantisation notes. Use when asked how much DeepSeek costs or which provider is cheapest."

How it is judged: human judgement required. Guiding questions: could someone who does not know this plugin decide from the description whether to use it? Can they tell when to use this rather than something else?

5.5.2 Declared permissions match behaviour

The permission set a plugin declares shall:

How it is judged: human judgement required. Guiding questions: declared network but never makes a request? Declared fs-write but only reads? Over-reporting erodes trust; under-reporting causes runtime failure.

5.5.3 No red-line combination

Declaring network together with (shell or fs-write) is a red line.

Criterion: read the permission declaration statically.

Exception: where genuinely necessary, the README shall state:

  1. why network is needed
  2. why write or shell is needed
  3. the direction of data flow

A registered exception is still high risk, but is not non-conforming.


6 Test methods

6.1 Static layer (T0)

No container required. Run deepseekbase_check or an equivalent implementation.

ClauseMethod
5.1.1Read registry metadata, inspect $.dsh.bundle.patch
5.1.2Fetch {pkg}@{ver}/{patch} from a CDN
5.1.3pyyaml safe_load
5.1.4Parsed result is a list with an item containing insert
5.1.5Iterate insert, check id/name are non-empty
5.1.6Compare against the official schema
5.2.1Read $.engines.dsh; if absent read $.peerDependencies
5.2.2semver range check against baseline 0.2.2-rc.1
5.2.3Check main or exports
5.3.1Check files covers lib and the patch
5.3.2Check the value prefixes of the four dependency fields
5.5.3Read the permission declaration, check the red-line combination

A static-layer result has three possible states: conforming / non-conforming / human judgement required.

6.2 Dynamic layer (T1–T4)

Shall run in a sandbox conforming to DSHIO/T 21.

ClauseStageCommand
5.4.1T1 (network on)dsh plugin --profile web add <pkg>
5.4.2T2 (network off)dsh plugin --profile web list
5.4.3T3 (network off)dsh --profile web --dump-config
5.4.4T4 (network off)dsh --profile web, observe for 12 s

Judgement follows the stage definitions in DSHIO/T 20.

6.3 Model-dependent layer (T5, model-dependent plugins only)

A model-related environment fingerprint shall be recorded (see DSHIO/T 21 chapter 6).

Method: under a named model, use a fixed prompt to request a call to a tool the plugin registers, repeated 3 times.

Pass criteria (the report shall state which one was used):

6.4 Human-judgement layer

5.5.1 and 5.5.2 can only be judged by a human.

The output shall be "human judgement required + guiding questions"; it shall not produce a pass or fail conclusion.


7 Inspection rules

7.1 Inspection types

TypePurposeScope
Static inspectionStructural validityAll clauses of chapter 6.1
Type inspectionFull conformanceStatic + dynamic + human
Certification inspectionIssue a certificateFull type inspection + repeatability requirements

7.2 Sampling

This standard does not involve batch sampling. Each plugin version is an independent inspection object.

Different versions of the same plugin (including patch versions) are different objects and shall be judged separately.

7.3 Verdict rules

7.3.1 Per-clause verdict

StatusMeaning
ConformingThe clause is satisfied
Non-conformingThe clause is not satisfied
Not applicableThe clause does not apply to this plugin (reason required)
Human judgementAutomation cannot decide

7.3.2 Overall verdict

Overall conclusionCondition
ConformingNo critical or major non-conformance, and no pending human items
Conditionally conformingNo critical non-conformance, but major non-conformance or a few pending human items
Non-conformingAny critical clause non-conforming

7.3.3 Clause severity

SeverityClausesImpact
critical5.1.1–5.1.5, 5.2.2, 5.2.3, 5.3.2, 5.4.1–5.4.4If not satisfied, the plugin cannot be installed at all or does not work
major5.3.1, 5.5.1, 5.5.2, 5.5.3Non-conforming, though it may still run
minor5.2.1, 5.2.4, 5.3.3Suggested improvement

7.4 Repeatability requirements

TypeMinimum runsConsistency
Static inspection1—
Dynamic inspection (public release)2The two verdicts shall be identical
T5 (public release)3Per the criteria in 6.3

When the two dynamic verdicts differ:

  1. Record as "unstable"
  2. Record both full outputs
  3. shall not be used as a basis for certification

7.5 Re-inspection

A non-conforming plugin may be re-inspected after the author fixes it and publishes a new version. The new version is a new object and does not inherit the old verdict.


8 Marking

8.1 Declaration of conformity

A plugin that passed inspection may declare in its README:

Conforms to DSHIO/T 10—2026 (baseline DSH 0.2.2-rc.1, static + dynamic layer)
Tested: YYYY-MM-DD
Environment fingerprint: dsh=0.2.2-rc.1;img=...;node=...;pnpm=...

The following shall also be declared:

this shall be stated)

Prohibited: writing only "conforms to the DSHIO standard" without version, scope and environment.

8.2 Certification mark

Not currently in effect. See DSHIO/T 32 Certification Rules (trial, not yet implemented).

While v1.0 of this standard is in force, the state "DSHIO certified" does not exist. Any statement claiming DSHIO certification is false.

8.3 Citation format

Cite this standard as:

DSHIO/T 10—2026 clause 5.2.2

Do not write:


Annex A (normative) Static inspection checklist

Execute in this order; abort on any critical non-conformance:

#ClauseSeverityCheck
15.1.1criticalpackage.json has dsh.bundle.patch
25.1.2criticalThe patch file is fetchable
35.1.3criticalYAML parses
45.1.4criticalTop level is a list containing insert
55.1.5criticalEvery entry has id and name
65.2.1minorHas engines.dsh or DSH peerDeps
75.2.2criticalRange includes 0.2.2-rc.1
85.2.3criticalHas main or exports
95.3.1majorfiles covers lib and the patch
105.3.2criticalNo file:/absolute paths in dependencies
115.5.3majorNo red-line permission combination
125.5.1majorTool description quality (human)
135.5.2majorPermissions match behaviour (human)

Annex B (informative) Common failure modes

SymptomClauseCauseFix
Won't install, YAML parse error5.1.3@-prefixed value unquotedname: "@scope/pkg"
Won't install, version mismatch5.2.2engines.dsh upper bound hard-codedLower bound only
Won't install, file missing5.1.2 / 5.3.1files omits the patchAdd it to files
Installs but does nothing5.4.3Entry never reaches the config treeCheck whether the patch layer is overridden
Installs but fails to boot5.4.4Initialisation throwsRead the first error's stack
Consumers cannot install5.3.2dependencies contains file:Use the npm package name

Annex C (informative) Relationship to other standards

DSHIO/T 00  Terms and Definitions
      ↓ referenced by
DSHIO/T 10  Plugin Standard (this document)
      ↓ references
DSHIO/T 20  General Rules for Testing ── what each stage does
DSHIO/T 21  Test Conditions           ── under what conditions
      ↓ referenced by
DSHIO/T 32  Certification Rules       ── how conformance is certified (not in effect)

Revision record

VersionDateChangeProposed byParticipantsConflict-of-interest statement
v1.0 (Trial)2026-11-07First release; supersedes DSHIO-DEVDSHIODSHIODSHIO itself develops the plugins @liangjiehappy/dsh-deepseekbase and @liangjiehappy/dsh-deepseekbase-market; this standard applies to both equally. The reference implementation is the former.