upstream-radar 0.43.3 → 0.43.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README-zh-CN.md CHANGED
@@ -1,44 +1,47 @@
1
1
  <h1 align="center">Upstream Radar</h1>
2
2
 
3
- <p align="center"><strong>每次 DeepSeek Harness 发布后,在用户踩坑前找出哪些插件坏了。</strong></p>
4
-
5
- <p align="center">
6
- <a href="README.md">English</a> · 简体中文
7
- </p>
3
+ <p align="center"><strong>在 DeepSeek Harness 生态变化后,找出哪些插件需要维护者关注。</strong></p>
8
4
 
9
5
  <p align="center">
6
+ <a href="README.md">English</a> ·
10
7
  <a href="https://github.com/MicroMilo/upstream-radar/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/MicroMilo/upstream-radar/actions/workflows/ci.yml/badge.svg"></a>
11
8
  <a href="https://www.npmjs.com/package/upstream-radar"><img alt="npm" src="https://img.shields.io/npm/v/upstream-radar"></a>
12
- <a href="https://github.com/MicroMilo/upstream-radar/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/MicroMilo/upstream-radar"></a>
9
+ <a href="https://github.com/MicroMilo/upstream-radar/stargazers"><img alt="GitHub Stars" src="https://img.shields.io/github/stars/MicroMilo/upstream-radar"></a>
13
10
  <a href="LICENSE"><img alt="Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-blue.svg"></a>
14
11
  </p>
15
12
 
16
- Upstream Radar 持续把一批真实插件发布物放到一次性隔离环境中,与不断变化的
17
- [DeepSeek Harness(DSH)](https://github.com/deepseek-ai/deepseek-harness)
18
- 版本重新配对测试。某个组合坏了,就生成一条可复现的 Issue;作者发布修复后,
19
- Radar 会再次检查并关闭闭环。
13
+ Upstream Radar 持续检查三者之间的真实关系:精确的 DSH 插件发布物、DSH 宿主和依赖图。
14
+ DSH 或插件发布新版本改变这层关系时,Radar 告诉你变了什么、实际观测到了什么,以及维护者
15
+ 可以修什么。
20
16
 
21
- **维护 100 个安装/加载目标 · 已提出 13 条 domain 报告 · 4 条已关闭 · 9 条开放或持续观察**
17
+ 它面向 [DeepSeek Harness(DSH)](https://github.com/deepseek-ai/deepseek-harness) 插件生态。
18
+ 静态检查是关于发布包的证据;隔离运行检查是关于某个精确的
19
+ `插件 × DSH × Node/profile` 组合的证据。两者都不会被包装成永久有效的“兼容”徽章或安全证书。
22
20
 
23
- [最近一次 Agent 驱动的 headless 运行](https://github.com/MicroMilo/upstream-radar/actions/runs/32684879130):
24
- **观测 96 个可执行目录插件 · 74 个兼容 · 22 个需要复核 · 0 个复现不兼容 · 4 个仅源码目标**。
25
- 需要复核的信号不会被宣传成插件故障。
21
+ > 已被 DSH 生态目录
22
+ > [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/blob/main/data/plugins/MicroMilo__upstream-radar.yml)、
23
+ > [awesome-deepseek-harness](https://github.com/0xsline/awesome-deepseek-harness) 和
24
+ > [awesome-deepseek-harness-plugins](https://github.com/imsai-sh/awesome-deepseek-harness-plugins/blob/main/catalog/plugins/micromilo--upstream-radar.json)
25
+ > 收录。
26
26
 
27
- 第一轮真实闭环从 29 个待复核插件开始。Agent 选择了 9 个受限重试,其中 7 个转为
28
- 兼容;另 2 个明确停在 Web 客户端依赖边界,没有被误报成插件坏了。
27
+ ## 为什么需要它
29
28
 
30
- 一句话:`DSH/插件变化 → Agent → 一次性 headless 虚拟机 → 精确证据 → 复测或可修复 Issue`。
29
+ 插件源码仓库看起来正常,但用户真正安装的发布物可能还没有适配当前 DSH 宿主:
31
30
 
32
- ## 为什么需要它
31
+ - README 宣传的版本根本没有发布;
32
+ - 插件实际导入了比 peer range 更新的 DSH 包;
33
+ - `package.json` 和 lockfile 描述的不是同一个版本;
34
+ - 安装阶段需要构建工具或依赖脚本,而用户环境没有;
35
+ - DSH 宿主依赖没有发布,完整依赖图无法建立。
33
36
 
34
- 仓库看起来正常,不代表用户实际安装的插件仍然可用。真实发布物必须同时适配某个
35
- DSH 版本、Node 运行时、profile 和依赖组合;其中任何一项更新,都可能让插件一夜
36
- 之间失效。
37
+ 这些是生态关系问题。分别检查两个仓库,很容易漏掉它们。
37
38
 
38
- Upstream Radar 检查的是这层真实关系,而不只是分别看两个仓库。本地发布前检查
39
- 回答“这个插件今天能不能过”;Radar 回答“生态变化后,维护中的哪些插件不再能过”。
39
+ ## Radar 做什么
40
40
 
41
- ## 完整闭环
41
+ 1. **锁定真实输入。** 读取精确 npm 发布物、DSH 版本、Node 运行时、profile、lockfile 和依赖路径。
42
+ 2. **比较真实关系。** 发现上游变化、发布/源码漂移、依赖图不完整和 DSH 契约不一致。
43
+ 3. **需要执行时再观察。** 在全新的、无密钥的环境中安装、注册并加载精确发布物,记录结果和边界。
44
+ 4. **完成闭环。** 生成有边界的证据,把重要变化交给可选的 DSH Agent,并在干净复测后更新或关闭一条面向维护者的 Issue。
42
45
 
43
46
  ```mermaid
44
47
  flowchart TB
@@ -51,68 +54,59 @@ flowchart TB
51
54
  ```
52
55
 
53
56
  Agent 读取仓库说明和最新运行证据,决定 headless 是否重试、重试时允许哪些安装条件。
54
- 真正的结果由一次性虚拟机执行得出,而不是模型判断。模型不能凭空增加安装包、不能
55
- 进入目标虚拟机执行,也不能把缺失证据说成通过。
57
+ 真正的结果由一次性虚拟机执行得出,而不是模型判断。模型不能凭空增加安装包、不能进入目标
58
+ 虚拟机执行,也不能把缺失证据说成通过。
56
59
 
57
- ## 你会得到什么
60
+ ## 试试一个真实检查
58
61
 
59
- - `插件版本 × DSH 版本 × Node/profile` 的精确结果,而不是永不过期的“兼容”标签。
60
- - 把 Agent 规划的后续动作,与真实发布物的安装、注册、加载结果放在一起判断。
61
- - DSH 或插件变化后自动重新检查,而不是只生成一次报告。
62
- - 同一问题持续更新;回归时重新打开;干净复测通过后自动关闭。
62
+ 第一次检查不需要本地 DSH profile,也不会执行插件代码:
63
63
 
64
- ## 我们闭环中提出的 domain 报告
64
+ ```bash
65
+ npx --yes upstream-radar@0.43.5 inspect \
66
+ @sanqi-normal/dsh-webui-market-plugin@0.5.4 \
67
+ --deep --fail-on never
68
+ ```
65
69
 
66
- 以下是 Upstream Radar 提出的 13 条面向维护者的报告。它们不全都表示
67
- “插件坏了”:第一组是运行时兼容性,第二组是精确发布物/安装边界,第三组是
68
- 持续监控所依赖的依赖图是否可信。
70
+ 这个历史 DSH 插件版本会返回 `review / incomplete`,因为它发布的宿主依赖链指向了一个不可用的包。
71
+ 这是可复现的发布/宿主契约问题,不是恶意行为指控。查看[完整证据报告](examples/dsh/reports/sanqi-market-plugin-dependency-resolution.md)。
69
72
 
70
- ### DSH 宿主/插件契约 · 2 条
73
+ 如果要检查自己的公开仓库,而不安装它:
71
74
 
72
- - **已关闭** · [Sanqi-normal/dsh-webui-market-plugin#5](https://github.com/Sanqi-normal/dsh-webui-market-plugin/issues/5)
73
- - **开放** · [shaoshi20/dshscan#1](https://github.com/shaoshi20/dshscan/issues/1)
75
+ ```bash
76
+ npx --yes upstream-radar@0.43.5 scan \
77
+ https://github.com/owner/dsh-plugin \
78
+ --fail-on never
79
+ ```
74
80
 
75
- ### 发布物与安装契约 · 7
81
+ 仓库扫描会读取源码 manifest、DSH 元数据和 lockfile;不会安装依赖、执行 lifecycle script、加载插件、启动 DSH 或调用 LLM。
76
82
 
77
- - **已关闭** · [1na-ko/dsh-hdc-bridge#3](https://github.com/1na-ko/dsh-hdc-bridge/issues/3)
78
- - **已关闭** · [6Mikao9/dsh-wsl-workspace#6](https://github.com/6Mikao9/dsh-wsl-workspace/issues/6)
79
- - **已关闭** · [3274375092/dsh-voice#2](https://github.com/3274375092/dsh-voice/issues/2)
80
- - **开放** · [AmeKrance/anan-thermal-monitor#1](https://github.com/AmeKrance/anan-thermal-monitor/issues/1)
81
- - **开放** · [AbcdefgXW/dsh-msg-hub#3](https://github.com/AbcdefgXW/dsh-msg-hub/issues/3)
82
- - **开放** · [030611/dsh-verification-receipt#3](https://github.com/030611/dsh-verification-receipt/issues/3)
83
- - **开放** · [0xsline/dsh-spotlight#5](https://github.com/0xsline/dsh-spotlight/issues/5)
83
+ ## 让它持续运行
84
84
 
85
- ### 依赖图与源码/发布版本对齐 · 4 条
85
+ 把下面任意一个维护好的 workflow 复制到你的仓库:
86
86
 
87
- - **开放** · [lninghaha/dsh-coding-subscription-oauth#14](https://github.com/lninghaha/dsh-coding-subscription-oauth/issues/14)
88
- - **开放** · [AbcdefgXW/dsh-msg-hub#1](https://github.com/AbcdefgXW/dsh-msg-hub/issues/1)
89
- - **开放** · [AbcdefgXW/dsh-toolbox-web#1](https://github.com/AbcdefgXW/dsh-toolbox-web/issues/1)
90
- - **开放** · [13071301808/dsh-composer-expand#1](https://github.com/13071301808/dsh-composer-expand/issues/1)
87
+ - [跨多个 DSH 版本检查一个精确插件](examples/github-actions/dsh-plugin-review-minimal.yml):手动触发,得到发布物证据和隔离加载矩阵。
88
+ - [每天观察一个插件仓库](examples/github-actions/upstream-observer-minimal.yml):比较 commit、发布版本、manifest 和依赖图,只有发生重要变化才唤起 Agent。
89
+ - [在 CI 中运行依赖门禁](examples/github-actions/upstream-radar.yml):在合并前检查 lockfile 或审查过的 Radar 配置。
91
90
 
92
- 你记得的 browser/web 案例——[`dsh-web-ui#35`](https://github.com/zhu1090093659/dsh-web-ui/issues/35)
93
- 和 [`dsh-web-ui#71`](https://github.com/zhu1090093659/dsh-web-ui/issues/71)——是有价值的历史兼容性
94
- 对照,且目前已关闭;但它们不是 Upstream Radar 提出的报告,所以不计入上面的 13 条。
95
- 当前维护中的 `dsh-browser` 条目也都观测为兼容,不应被列成问题。
91
+ [隔离观察 workflow](.github/workflows/observe-dsh-plugin-install.yml) 会为需要执行代码的检查使用全新的 GitHub 托管 runner。
92
+ 它不是你的电脑,也不会接收项目密钥。
96
93
 
97
- 查看[完整分类与证据索引](docs/domain-reports.md),其中区分了动态复现、源码/发布物证据,
98
- 以及仍需维护者确认的弱结论。
94
+ ## 来自真实生态的结果
99
95
 
100
- ## 检查一个插件
96
+ 当前的[100 插件兼容性 feed](feeds/dsh-plugin-compatibility.md)记录了 74 个精确 headless
97
+ 通过、22 个仅待复核结果、0 个已复现不兼容和 4 个仅仓库条目。在真正观测所需的
98
+ Web/client 或仓库安装平面之前,待复核项不会被包装成插件故障。
101
99
 
102
- ```bash
103
- npx --yes upstream-radar@0.43.3 review dsh-plugin \
104
- <包名>@<版本> \
105
- --dsh-version <DSH版本>
106
- ```
100
+ 截至 2026-08-25,Radar 共向维护者提交了 13 条报告。比数量更重要的是处理结果:
107
101
 
108
- 需要执行插件代码时,请使用仓库维护的
109
- [隔离观察工作流](.github/workflows/observe-dsh-plugin-install.yml):每个组合都会获得
110
- 一台全新的、无密钥的 GitHub 托管虚拟机和受限容器。
102
+ | 结果 | 报告 |
103
+ | --- | --- |
104
+ | **已发布修复并复核(5)** | [Sanqi #5](https://github.com/Sanqi-normal/dsh-webui-market-plugin/issues/5)(`0.5.5`)、[HDC #3](https://github.com/1na-ko/dsh-hdc-bridge/issues/3)(`0.7.3`)、[Voice #2](https://github.com/3274375092/dsh-voice/issues/2)(`0.2.6`)、[Msg Hub #1](https://github.com/AbcdefgXW/dsh-msg-hub/issues/1)、[Toolbox Web #1](https://github.com/AbcdefgXW/dsh-toolbox-web/issues/1) |
105
+ | **维护者复核或补充契约(3)** | [Msg Hub #3](https://github.com/AbcdefgXW/dsh-msg-hub/issues/3)、[Spotlight #5 / PR #7](https://github.com/0xsline/dsh-spotlight/pull/7)、[WSL Workspace #6](https://github.com/6Mikao9/dsh-wsl-workspace/issues/6)——均已关闭,但不冒充运行时修复 |
106
+ | **仍开放(5)** | [Anan #1](https://github.com/AmeKrance/anan-thermal-monitor/issues/1)、[Verification Receipt #3](https://github.com/030611/dsh-verification-receipt/issues/3)、[dshscan #1](https://github.com/shaoshi20/dshscan/issues/1)、[OAuth #14](https://github.com/lninghaha/dsh-coding-subscription-oauth/issues/14)、[Composer Expand #1](https://github.com/13071301808/dsh-composer-expand/issues/1) |
111
107
 
112
- 你还可以查看[实时兼容性矩阵](examples/dsh/install-observer/README.md)
113
- [可供目录消费的兼容性结果](feeds/dsh-plugin-compatibility.md)、
114
- [第一批 50 个插件](examples/dsh/first-batch/README.md)和
115
- [架构说明](docs/architecture.md)。
108
+ “关闭”不自动等于“修复”。[完整的 domain 报告索引](docs/domain-reports.md)逐条保留了证据、
109
+ 验证等级、PR 覆盖和剩余边界。
116
110
 
117
111
  <p align="center">
118
112
  <strong>如果 Upstream Radar 对 DSH 生态有帮助,欢迎<a href="https://github.com/MicroMilo/upstream-radar">点一个 Star</a> ⭐</strong>
package/README.md CHANGED
@@ -1,47 +1,55 @@
1
1
  <h1 align="center">Upstream Radar</h1>
2
2
 
3
- <p align="center"><strong>Know which DeepSeek Harness plugins break after every release—before users do.</strong></p>
4
-
5
- <p align="center">
6
- English · <a href="README-zh-CN.md">简体中文</a>
7
- </p>
3
+ <p align="center"><strong>Find the DeepSeek Harness plugins that need attention when the ecosystem moves.</strong></p>
8
4
 
9
5
  <p align="center">
6
+ <a href="README-zh-CN.md">简体中文</a> ·
10
7
  <a href="https://github.com/MicroMilo/upstream-radar/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/MicroMilo/upstream-radar/actions/workflows/ci.yml/badge.svg"></a>
11
8
  <a href="https://www.npmjs.com/package/upstream-radar"><img alt="npm" src="https://img.shields.io/npm/v/upstream-radar"></a>
12
9
  <a href="https://github.com/MicroMilo/upstream-radar/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/MicroMilo/upstream-radar"></a>
13
10
  <a href="LICENSE"><img alt="Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-blue.svg"></a>
14
11
  </p>
15
12
 
16
- Upstream Radar continuously retests a maintained fleet of exact published
17
- plugins against changing
18
- [DeepSeek Harness (DSH)](https://github.com/deepseek-ai/deepseek-harness)
19
- releases in disposable runners. When a pair breaks, it produces a reproducible
20
- issue; when the author ships a fix, it retests and closes the loop.
13
+ Upstream Radar continuously checks the relationship between an exact published
14
+ DSH plugin, its DSH host, and its dependency graph. When a DSH or plugin release
15
+ changes that relationship, Radar shows what changed, what was actually observed,
16
+ and what a maintainer can fix.
21
17
 
22
- **100 maintained install/load targets · 13 domain reports filed · 4 closed · 9 open or under watch**
18
+ It is built for the [DeepSeek Harness (DSH)](https://github.com/deepseek-ai/deepseek-harness)
19
+ plugin ecosystem. A static review is evidence about a package; an isolated
20
+ runtime review is evidence about one exact `plugin × DSH × Node/profile` pair.
21
+ Neither is presented as a timeless compatibility badge or a security certificate.
23
22
 
24
- [Latest Agent-driven headless run](https://github.com/MicroMilo/upstream-radar/actions/runs/32684879130):
25
- **96 executable catalog cells observed · 74 compatible · 22 need review · 0 reproduced incompatibilities · 4 source-only**.
26
- Review signals are never advertised as plugin failures.
23
+ > Listed by the DSH ecosystem in
24
+ > [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/blob/main/data/plugins/MicroMilo__upstream-radar.yml),
25
+ > [awesome-deepseek-harness](https://github.com/0xsline/awesome-deepseek-harness), and
26
+ > [awesome-deepseek-harness-plugins](https://github.com/imsai-sh/awesome-deepseek-harness-plugins/blob/main/catalog/plugins/micromilo--upstream-radar.json).
27
27
 
28
- The first live loop started with 29 review cells. The Agent selected nine
29
- bounded retries; seven became compatible, while two stopped at an explicit Web
30
- client dependency boundary instead of being mislabeled as broken.
28
+ ## The problem
31
29
 
32
- In one line: `DSH/plugin change Agent disposable headless VM exact evidence → retest or fixable issue`.
30
+ A source repository can be green while the package users install is not ready
31
+ for the current DSH host:
33
32
 
34
- ## Why it exists
33
+ - the README advertises a version that was never published;
34
+ - a plugin imports a newer DSH package than its peer range allows;
35
+ - `package.json` and the lockfile describe different releases;
36
+ - an install-time build or dependency script needs tools the user does not have;
37
+ - a DSH host dependency is missing, so the dependency graph cannot be completed.
35
38
 
36
- A healthy repository does not prove that its published plugin still works.
37
- The artifact users install must resolve against a specific DSH host, Node
38
- runtime, profile, and dependency set—and any of them can change overnight.
39
+ These are ecosystem relationship problems. They are easy to miss when the two
40
+ repositories are checked separately.
39
41
 
40
- Upstream Radar checks the relationship, not just the two repositories. A local
41
- pre-publish check asks, “does this plugin pass today?” Radar asks, “which
42
- maintained plugins stopped passing after the ecosystem changed?”
42
+ ## What Radar does
43
43
 
44
- ## The loop
44
+ 1. **Pin the real inputs.** Read the exact npm artifact, DSH version, Node
45
+ runtime, profile, lockfile, and dependency paths.
46
+ 2. **Compare the relationship.** Detect upstream changes, package/release drift,
47
+ incomplete graphs, and DSH contract mismatches.
48
+ 3. **Observe when execution matters.** In a fresh, secret-free runner, install,
49
+ register, and load the exact artifact; record the result and its boundary.
50
+ 4. **Close the loop.** Produce bounded evidence, route meaningful changes to an
51
+ optional DSH Agent, and update or close one maintainer-facing issue after a
52
+ clean retest.
45
53
 
46
54
  ```mermaid
47
55
  flowchart TB
@@ -58,72 +66,70 @@ then chooses whether and how headless should retry. The disposable runner—not
58
66
  the model—establishes the result. A model cannot invent a build package, execute
59
67
  inside the target VM, or turn missing evidence into a pass.
60
68
 
61
- ## What you get
69
+ ## Try a real check
62
70
 
63
- - An exact result for `plugin version × DSH version × Node/profile`, not a
64
- timeless “compatible” badge.
65
- - Agent-planned follow-ups joined with real install/register/load evidence from
66
- the published artifact.
67
- - A maintained result that is retested when DSH or the plugin changes.
68
- - One managed issue that is updated on repeat failures, reopened on regression,
69
- and closed after a clean retest.
71
+ No local DSH profile is needed for this first check. It reviews one exact
72
+ published artifact without executing plugin code:
70
73
 
71
- ## Domain reports from our loop
74
+ ```bash
75
+ npx --yes upstream-radar@0.43.5 inspect \
76
+ @sanqi-normal/dsh-webui-market-plugin@0.5.4 \
77
+ --deep --fail-on never
78
+ ```
72
79
 
73
- These are the 13 maintainer-facing reports filed by Upstream Radar. They are
74
- not all “the plugin is broken”: the first group is runtime compatibility, the
75
- second is the exact package/install boundary, and the third is whether a
76
- dependency graph can be trusted for continuous monitoring.
80
+ This historical DSH plugin release returns `review / incomplete` because its
81
+ published host dependency chain reaches an unavailable package. That is a
82
+ useful, reproducible release/host-contract report—not a claim of malicious
83
+ behavior. See the [full evidence report](examples/dsh/reports/sanqi-market-plugin-dependency-resolution.md).
77
84
 
78
- ### DSH host/plugin contract · 2
85
+ To review your own public repository without installing it:
79
86
 
80
- - **closed** · [Sanqi-normal/dsh-webui-market-plugin#5](https://github.com/Sanqi-normal/dsh-webui-market-plugin/issues/5)
81
- - **open** · [shaoshi20/dshscan#1](https://github.com/shaoshi20/dshscan/issues/1)
87
+ ```bash
88
+ npx --yes upstream-radar@0.43.5 scan \
89
+ https://github.com/owner/dsh-plugin \
90
+ --fail-on never
91
+ ```
82
92
 
83
- ### Published artifact and install contract · 7
93
+ The repository scan reads source manifests, DSH metadata, and lockfiles. It does
94
+ not install dependencies, run lifecycle scripts, load the plugin, start DSH, or
95
+ call an LLM.
84
96
 
85
- - **closed** · [1na-ko/dsh-hdc-bridge#3](https://github.com/1na-ko/dsh-hdc-bridge/issues/3)
86
- - **closed** · [6Mikao9/dsh-wsl-workspace#6](https://github.com/6Mikao9/dsh-wsl-workspace/issues/6)
87
- - **closed** · [3274375092/dsh-voice#2](https://github.com/3274375092/dsh-voice/issues/2)
88
- - **open** · [AmeKrance/anan-thermal-monitor#1](https://github.com/AmeKrance/anan-thermal-monitor/issues/1)
89
- - **open** · [AbcdefgXW/dsh-msg-hub#3](https://github.com/AbcdefgXW/dsh-msg-hub/issues/3)
90
- - **open** · [030611/dsh-verification-receipt#3](https://github.com/030611/dsh-verification-receipt/issues/3)
91
- - **open** · [0xsline/dsh-spotlight#5](https://github.com/0xsline/dsh-spotlight/issues/5)
97
+ ## Run it on every change
92
98
 
93
- ### Dependency graph and source/release alignment · 4
99
+ Copy one of the maintained workflows into your repository:
94
100
 
95
- - **open** · [lninghaha/dsh-coding-subscription-oauth#14](https://github.com/lninghaha/dsh-coding-subscription-oauth/issues/14)
96
- - **open** · [AbcdefgXW/dsh-msg-hub#1](https://github.com/AbcdefgXW/dsh-msg-hub/issues/1)
97
- - **open** · [AbcdefgXW/dsh-toolbox-web#1](https://github.com/AbcdefgXW/dsh-toolbox-web/issues/1)
98
- - **open** · [13071301808/dsh-composer-expand#1](https://github.com/13071301808/dsh-composer-expand/issues/1)
101
+ - [Review one exact plugin across DSH versions](examples/github-actions/dsh-plugin-review-minimal.yml)
102
+ a manual check with artifact evidence and an isolated load matrix.
103
+ - [Observe one plugin repository every day](examples/github-actions/upstream-observer-minimal.yml)
104
+ compares commits, published versions, manifests, and dependency graphs, then
105
+ wakes an Agent only when there is a meaningful change.
106
+ - [Run the dependency gate in CI](examples/github-actions/upstream-radar.yml)
107
+ — checks the lockfile or reviewed Radar configuration before merge.
99
108
 
100
- The browser/web cases you may remember—[`dsh-web-ui#35`](https://github.com/zhu1090093659/dsh-web-ui/issues/35)
101
- and [`dsh-web-ui#71`](https://github.com/zhu1090093659/dsh-web-ui/issues/71)—are
102
- useful historical compatibility references and are closed, but they were not
103
- filed by Upstream Radar and are therefore not counted above. The maintained
104
- `dsh-browser` entries currently observed compatible are also not findings.
109
+ The [isolated observer workflow](.github/workflows/observe-dsh-plugin-install.yml)
110
+ uses a fresh GitHub-hosted runner for code-executing checks. The runner is not
111
+ your workstation and does not receive project secrets.
105
112
 
106
- See the [full classification and evidence index](docs/domain-reports.md) for
107
- validation level, impact, and the boundary between a confirmed runtime issue
108
- and a report that only needs maintainer confirmation.
113
+ ## Evidence from the ecosystem
109
114
 
110
- ## Run one check
115
+ The current [100-plugin compatibility feed](feeds/dsh-plugin-compatibility.md)
116
+ records 74 exact headless passes, 22 review-only results, zero reproduced
117
+ incompatibilities, and four repository-only entries. The review-only group is
118
+ kept separate from failures until the required Web/client or repository install
119
+ plane is actually observed.
111
120
 
112
- ```bash
113
- npx --yes upstream-radar@0.43.3 review dsh-plugin \
114
- <package>@<version> \
115
- --dsh-version <dsh-version>
116
- ```
121
+ As of 2026-08-25, Radar has filed 13 maintainer-facing reports. The outcome is
122
+ more useful than the raw count:
117
123
 
118
- For code-executing checks, use the maintained
119
- [isolated observer workflow](.github/workflows/observe-dsh-plugin-install.yml):
120
- each pair receives a fresh, secret-free GitHub-hosted VM and restricted
121
- container.
124
+ | Outcome | Reports |
125
+ | --- | --- |
126
+ | **Fix shipped and rechecked (5)** | [Sanqi #5](https://github.com/Sanqi-normal/dsh-webui-market-plugin/issues/5) (`0.5.5`), [HDC #3](https://github.com/1na-ko/dsh-hdc-bridge/issues/3) (`0.7.3`), [Voice #2](https://github.com/3274375092/dsh-voice/issues/2) (`0.2.6`), [Msg Hub #1](https://github.com/AbcdefgXW/dsh-msg-hub/issues/1), [Toolbox Web #1](https://github.com/AbcdefgXW/dsh-toolbox-web/issues/1) |
127
+ | **Boundary reviewed or documented (3)** | [Msg Hub #3](https://github.com/AbcdefgXW/dsh-msg-hub/issues/3), [Spotlight #5 / PR #7](https://github.com/0xsline/dsh-spotlight/pull/7), [WSL Workspace #6](https://github.com/6Mikao9/dsh-wsl-workspace/issues/6) — closed without claiming a runtime fix |
128
+ | **Still open (5)** | [Anan #1](https://github.com/AmeKrance/anan-thermal-monitor/issues/1), [Verification Receipt #3](https://github.com/030611/dsh-verification-receipt/issues/3), [dshscan #1](https://github.com/shaoshi20/dshscan/issues/1), [OAuth #14](https://github.com/lninghaha/dsh-coding-subscription-oauth/issues/14), [Composer Expand #1](https://github.com/13071301808/dsh-composer-expand/issues/1) |
122
129
 
123
- Inspect the [live compatibility matrix](examples/dsh/install-observer/README.md),
124
- the [directory-consumable evidence feed](feeds/dsh-plugin-compatibility.md),
125
- the [first 50-plugin corpus](examples/dsh/first-batch/README.md), or the
126
- [architecture notes](docs/architecture.md).
130
+ “Closed” is not automatically “fixed.” The [full domain report index](docs/domain-reports.md)
131
+ records the evidence, validation level, PR coverage, and remaining boundary for
132
+ every report.
127
133
 
128
134
  <p align="center">
129
135
  <strong>If Upstream Radar helps the DSH ecosystem stay compatible, <a href="https://github.com/MicroMilo/upstream-radar">please give it a Star</a> ⭐</strong>
package/dist/src/cli.js CHANGED
@@ -205,7 +205,8 @@ Usage:
205
205
  [--report <report.md>] [--dsh-version <v1>,<v2>,...]
206
206
  [--reverse-index <index.json>]
207
207
  [--dsh-agent-command <executable>]
208
- [--dsh-agent-arg <argument>] [--llm-env-file <path>] [--retry-pending]
208
+ [--dsh-agent-arg <argument>] [--llm-env-file <path>]
209
+ [--retry-pending | --retry-pending-only]
209
210
  [--ecosystem <dsh|codex|pi>] [--id <id>] [--package <name>]
210
211
  [--package-path <path>] [--lockfile <path>] [--lockfile-type <npm|pnpm>]
211
212
  [--ref <branch>] [--json]
@@ -238,6 +239,11 @@ keys; it never writes the key or endpoint to observations.json.
238
239
  If a ModelBest-style base URL ends in /llm/v1, a 404 also retries the known
239
240
  /llm/openai/v1 path.
240
241
 
242
+ --retry-pending-only consumes durable Agent tasks from observations.json
243
+ without reading GitHub/npm, reviewing artifacts, or changing source observation
244
+ points. It requires an Agent or model configuration and fails while any retry
245
+ still remains pending.
246
+
241
247
  The exact npm artifact review is independent of the DSH Agent/model. It runs
242
248
  when a meaningful change has a published package, and its dependency findings
243
249
  remain in the report even when no model is configured or the model endpoint is
@@ -471,7 +477,7 @@ Usage:
471
477
  upstream-radar doctor [config.json] [options]
472
478
  upstream-radar scan <directory-or-github-url> [--json] [--fail-on <warn|review|block|never>]
473
479
  upstream-radar inspect [npm:]<package>@<exact-version> [--deep] [--json] [--fail-on <warn|review|block|never>]
474
- upstream-radar observe <targets.yml|github-url> [--state <observations.json>] [--report <report.md>] [--dsh-version <v1>,<v2>,...] [--reverse-index <index.json>] [--dsh-agent-command <executable>] [--dsh-agent-arg <argument>] [--llm-env-file <path>] [--retry-pending] [--ecosystem <dsh|codex|pi>] [--id <id>] [--package <name>] [--package-path <path>] [--lockfile <path>] [--lockfile-type <npm|pnpm>] [--ref <branch>] [--json]
480
+ upstream-radar observe <targets.yml|github-url> [--state <observations.json>] [--report <report.md>] [--dsh-version <v1>,<v2>,...] [--reverse-index <index.json>] [--dsh-agent-command <executable>] [--dsh-agent-arg <argument>] [--llm-env-file <path>] [--retry-pending | --retry-pending-only] [--ecosystem <dsh|codex|pi>] [--id <id>] [--package <name>] [--package-path <path>] [--lockfile <path>] [--lockfile-type <npm|pnpm>] [--ref <branch>] [--json]
475
481
  upstream-radar graph <npm-lock|pnpm-lock> <lockfile> [--root <package>@<exact-version>] [--json]
476
482
  upstream-radar graph reverse <reports-directory> [--package <name>@<exact-version>] [--output <index.json>] [--json]
477
483
  upstream-radar profile-check [profile-directory] [--patch <path>] [--report <path>] [--summary] [--json]
@@ -1852,6 +1858,7 @@ async function runObserve(args) {
1852
1858
  let reverseIndexPath;
1853
1859
  let registry;
1854
1860
  let retryPending = false;
1861
+ let retryPendingOnly = false;
1855
1862
  let json = false;
1856
1863
  let inlineEcosystem;
1857
1864
  let inlineId;
@@ -1870,6 +1877,9 @@ async function runObserve(args) {
1870
1877
  else if (argument === '--retry-pending') {
1871
1878
  retryPending = true;
1872
1879
  }
1880
+ else if (argument === '--retry-pending-only') {
1881
+ retryPendingOnly = true;
1882
+ }
1873
1883
  else if (argument === '--ecosystem' || argument === '--id' || argument === '--package' || argument === '--package-path' || argument === '--lockfile' || argument === '--lockfile-type' || argument === '--ref' || argument === '--dsh-version' || argument === '--state' || argument === '--report' || argument === '--reverse-index' || argument === '--dsh-agent-command' || argument === '--dsh-agent-arg' || argument === '--llm-env-file' || argument === '--registry') {
1874
1884
  const value = args[index + 1];
1875
1885
  if (value === undefined || (value.startsWith('-') && argument !== '--dsh-agent-arg'))
@@ -1959,10 +1969,17 @@ async function runObserve(args) {
1959
1969
  if (agentCommand !== undefined && llmEnvFile !== undefined) {
1960
1970
  throw new Error('observe accepts either --dsh-agent-command or --llm-env-file, not both');
1961
1971
  }
1972
+ if (retryPending && retryPendingOnly) {
1973
+ throw new Error('observe accepts either --retry-pending or --retry-pending-only, not both');
1974
+ }
1975
+ if (retryPendingOnly && agentCommand === undefined && llmEnvFile === undefined) {
1976
+ throw new Error('--retry-pending-only requires --dsh-agent-command or --llm-env-file');
1977
+ }
1962
1978
  const result = await runObserver(config, previousState, {
1963
1979
  source,
1964
1980
  ...(reverseDependencyIndex === undefined ? {} : { reverseDependencyIndex }),
1965
1981
  retryPending,
1982
+ retryPendingOnly,
1966
1983
  artifactReviewer: async (spec, target) => reviewObserverArtifact(spec, target, registry),
1967
1984
  ...(agentOptions === undefined ? {} : {
1968
1985
  agent: (task, prompt) => runDshAgentCommand(task, prompt, agentOptions),
@@ -1978,10 +1995,11 @@ async function runObserve(args) {
1978
1995
  }
1979
1996
  process.stdout.write(json ? reportJson : renderObserverReport(result.report));
1980
1997
  const observerExit = observerExitCode(result.report);
1998
+ const pendingRetryExit = retryPendingOnly && result.report.pendingTasks.length > 0 ? 1 : 0;
1981
1999
  if (result.report.agent.failed > 0) {
1982
- process.stderr.write('upstream-radar: static observation completed; DSH Agent/model analysis remains pending. See the report and rerun with --retry-pending.\n');
2000
+ process.stderr.write(`upstream-radar: DSH Agent/model analysis remains pending. See the report and rerun with ${retryPendingOnly ? '--retry-pending-only' : '--retry-pending'}.\n`);
1983
2001
  }
1984
- return observerExit;
2002
+ return observerExit === 0 && pendingRetryExit === 0 ? 0 : 1;
1985
2003
  }
1986
2004
  async function runQuickstart(args) {
1987
2005
  let directory = process.cwd();