DeepSeek Harness market says compatible, install rejects
A plugin declares its supported range only in peerDependencies, yet the market marks it compatible from old releases through any future major version. The market-side data source is missing a piece; the range itself is not wrong. According to Discussion #9907, compatibilityOf() builds a manifest only from the index entry's engines.dsh, while index validation makes engines optional and fills {} when it is absent, so "no requirement" is evaluated as "compatible with any version". The preflight before installation rejects the install, producing a contradiction between the list and the installer; when you see this badge in the DSH plugin market, check the following in order.
Contradiction in the DeepSeek Harness market: compatible, install rejects
When the same plugin gets opposite verdicts in the market and the installer, the two sides are not reading the same declaration. Lay out both inputs first:
- The market list reads the index entry. Expected: its fields are only version, publish time, source, and
engines. - The installer reads the package manifest. Expected: it looks at both
engines.dshandpeerDependencies. - The entry lacks
engines.dsh. Expected: the market receives a manifest with no requirements and returnscompatible: true. - The installer computes the real range from
peerDependencies. Expected: it rejects the batch when the runtime is outside that range.
DeepSeek Harness break: compatibilityOf only receives engines.dsh
According to the community's source review in the thread, the break is not in the evaluator but in the manifest passed to it. For the version rules, see DSH plugin version compatibility; four steps cover the failure:
compatibilityOf()builds{ name, version }from the index entry. Expected: it addsenginesonly whenengines.dshexists.- The index validator treats
enginesas optional and fills{}when missing. Expected: its type comment says absence means any version. - The compatibility evaluator sees no requirement and returns
undefined. Expected: the outer layer translates that tocompatible: true. - A package with only
peerDependenciesis always green in the market. Expected: that includes runtimes below its lower bound and any future major version.
Who sees the false DeepSeek Harness green badge
The false green badge affects the selection stage, not the install result. Three cases are most visible:
- A plugin declares a multi-segment range only in peers. Expected: the market shows it as compatible with every runtime.
- The user's current version is below the declared lower bound. Expected: it still appears green and is rejected only after clicking install.
- A future major version ships. Expected: the same plugin still appears compatible even though the author never adapted it.
- A third-party index omits
engines. Expected: the market cannot distinguish "no requirement" from "not written". - Users treat the green badge as a promise. Expected: they discover after install that the runtime is unsupported, pushing the problem into runtime.
DSH plugin fixes: require engines, fall back, or preflight
All three paths align the badge with the real range; they differ in whether you fix the format, the read path, or only surface the verdict earlier. Judge by four points before choosing a layer:
- The required-field fix changes only validation and generation conventions. Expected: read-side code stays untouched and the review surface is smaller.
- The fallback fix changes the index type, generator, and market together. Expected: missing any one side leaves the false report in place.
- The required-field fix makes old indexes fail validation after the upgrade. Expected: publishers must backfill data.
- The fallback fix stays compatible with existing indexes. Expected: it adds a second parser, and folded results may disagree.
- Whichever path you choose, the index entry and the manifest must end up using the same range. Expected: the badge and the installer cannot disagree.
Path 1: make engines required in the index format
This has the smallest surface and the most consistent semantics: require every index entry to carry a resolved engines.dsh, and fail validation when it is missing. The generator already folds a range from peers, so validation only needs to align with it.
- Change
enginesfrom optional to required in the index schema, and makeengines.dshrequired and non-empty. Expected: validation rejects an entry without the field. - Keep the generator's logic for parsing
peerDependencies, intersecting multi-segment ranges and removing duplicates. Expected: output stays a resolved range. - Update the format documentation and delete statements that contradict the implementation, such as "engines is optional". Expected: the docs match the validator.
- Add a validation step to the publishing flow for hand-written or third-party indexes. Expected: incomplete entries cannot enter the index.
- Expected result: an entry can no longer implicitly mean "any version", and
compatible: trueappears only when the range is satisfied.
Path 2: let the market fall back to peerDependencies
If the index format cannot change in the short term, the market can evaluate peers when engines.dsh is missing, at the cost of a second parser. According to the reply in the thread, the generator and the read side would each parse ranges, which is prone to drift.
- Add an optional
peerDependenciesfield to the index version type and have the generator pass it through unchanged. Expected: the generator can emit peer ranges. - In
compatibilityOf(), readengines.dshfirst and build the manifest from peers when it is absent. Expected: both sources can produce a manifest. - Extract range parsing into a shared implementation called by both sides. Expected: one parser serves the generator and the market.
- Add a source marker to
MarketCompatibility.requirementsstating whether the range came from engines or peers. Expected: diagnostics name the range source. - Expected result: plugins that declare a range only in peers get the correct verdict, and diagnostics no longer point at a field that does not exist.
Path 3: backstop with the installer's preflight
The first two paths fix the display; this one ensures that even when the display is wrong, users see the real reason before clicking install. The installer already rejects, but the verdict is not shown at the selection stage.
- When loading the market detail page, call the same evaluation function the installer uses, with the full manifest. Expected: the page has a full-manifest verdict.
- When incompatible, disable the install button and show the required range and the current runtime version. Expected: the install button is disabled.
- If the user still tries to install, display the preflight rejection reason verbatim. Expected: the user sees the real reason instead of a generic failure.
- Record whether the evaluation used
engines.dshorpeerDependencies, and cache it on the detail page. Expected: repeated clicks do not recompute the verdict. - Expected result: no more "looks installable, then fails as a batch" gap.
Verifying the DeepSeek Harness badge against three runtimes
Test at least a runtime below the lower bound, one inside the range, and one future major version to confirm the badge is no longer unconditionally true. Verification order:
- Pick a plugin that declares its range only in peers and check whether its index entry has
engines.dsh. Expected: you know which source the entry carries. - Open the detail page on a runtime below the declared lower bound. Expected: incompatible, not green.
- Open it on a runtime inside the declared range. Expected: compatible.
- Test a version above every declared segment. Expected: incompatible.
- Click install once. Expected: the preflight verdict matches the page badge.
What DeepSeek Harness authors and users should each do
Authors should not treat the market badge as a promise, and users should not treat a green badge as a guarantee. Each side has one executable check:
- Authors write both
engines.dshandpeerDependenciesin the manifest. Expected: different readers can obtain the range. - Authors open the index entry after publishing and confirm
enginesexists with the resolved range. Expected: the entry is no longer missing the field. - Authors state the runtime interval they actually support in release notes. Expected: readers do not rely only on the market's green badge.
- Users run a
dsh plugin adddry-run or read the installer prompt before installing. Expected: the real range is visible. - When the list and the installer disagree, users trust the installer and report the missing
enginesfield to the market. Expected: the conflict is traced to an index that was not updated.
Source: Discussion #9907.
FAQ
The DeepSeek Harness installer is right and the market display is wrong. According to Discussion #9907, the market evaluates compatibility only from the index entry's engines.dsh; when the entry lacks that field it treats the plugin as accepting any version. The preflight before installation evaluates name, version, engines, and peerDependencies together and rejects the batch when they are not satisfied.
In the DeepSeek Harness market, it depends on who generated the index. The reference generator parses peerDependencies and folds them into engines.dsh, so entries it produces carry the range. A hand-written or third-party index may omit engines, and the validator fills {}, so omission is interpreted as any version.
The DeepSeek Harness index version type does not contain peerDependencies at all, and adding it introduces a second range parser. According to the reply in the thread, the generator already performs one fold, and doing it again on the read side is prone to drift. A safer approach is to require a resolved engines.dsh.
The DeepSeek Harness problem is a selector and trust problem, not an install vulnerability. Users decide to install because they see a compatible badge, then get rejected as a batch. A preflight backstop prevents wrong installs but cannot replace a correct compatibility badge.
Related Terms
- compatibilityOf()
- compatibilityOf is the function the plugin market uses to decide whether a published version can run on the current DSH runtime. It builds a manifest from the index entry, filling in only `name`, `version`, and the optional `engines.dsh`, then hands it to the compatibility evaluator.— https://github.com/deepseek-ai/deepseek-harness/discussions/9907
- engines.dsh
- `engines.dsh` is the manifest field that declares the required DSH version range for a plugin. Market index entries use it as the sole compatibility source, and a missing value is treated as having no version requirement.— https://github.com/deepseek-ai/deepseek-harness/discussions/9907
- peerDependencies
- `peerDependencies` is the npm manifest field that declares host dependency ranges, and it is the documented fallback for DSH when `engines.dsh` is absent. It can express multi-segment ranges with upper and lower bounds.— https://github.com/deepseek-ai/deepseek-harness/discussions/9907
- preflight
- Preflight is the compatibility and dependency check DSH runs before invoking the package manager. It reads the full manifest and rejects the whole install when requirements are not met, rather than installing and then rolling back.— https://github.com/deepseek-ai/deepseek-harness/discussions/9907