@luolingp/request-doctor 0.16.4 → 0.16.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.md +2 -1
- package/docs/01-/350/275/257/344/273/266/351/234/200/346/261/202/350/247/204/346/240/274/350/257/264/346/230/216.md +1 -1
- package/docs/02-/350/275/257/344/273/266/350/256/276/350/256/241/350/257/264/346/230/216.md +1 -1
- package/docs/03-/350/275/257/344/273/266/346/265/213/350/257/225/346/212/245/345/221/212.md +221 -219
- package/docs/04-/345/256/211/350/243/205/351/203/250/347/275/262/350/257/264/346/230/216.md +1 -1
- package/docs/05-/347/224/250/346/210/267/346/211/213/345/206/214.md +14 -1
- package/docs/06-/350/275/257/344/273/266/350/264/250/351/207/217/345/272/246/351/207/217/346/212/245/345/221/212.md +1 -1
- package/docs/quality-report.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -126,7 +126,8 @@ DSH 升级后,旧插件可能只认 `0.2.1-rc.2`,而你现在是 `0.2.1-rc.3
|
|
|
126
126
|
| `initialDelayMs` | number | `400` | 首次退避基准 |
|
|
127
127
|
| `maxDelayMs` | number | `20000` | 退避上限 |
|
|
128
128
|
| `jitterRatio` | number | `0.25` | 退避抖动比例 |
|
|
129
|
-
| `retryableToolPattern` | string | 见下 | 允许重放的工具名正则 |
|
|
129
|
+
| `retryableToolPattern` | string | 见下 | 允许重放的工具名正则 |
|
|
130
|
+
| `statusFile` | string | profile 下的 `.request-doctor-status.json` | 诊断快照路径,空串表示不写盘 |
|
|
130
131
|
| `recordRetryEvents` | boolean | `true` | 是否写入会话重试记录 |
|
|
131
132
|
|
|
132
133
|
默认只读工具白名单:
|
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
# 软件测试报告
|
|
2
|
-
|
|
3
|
-
**产品名称**:request-doctor(请求急救员)
|
|
4
|
-
**版本**:0.16.
|
|
5
|
-
**编制依据**:GB/T 8567-2006《计算机软件文档编制规范》6.6;GB/T 8566-2007 验证与确认过程
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1 引言
|
|
10
|
-
|
|
11
|
-
### 1.1 标识
|
|
12
|
-
|
|
13
|
-
本报告记录 request-doctor 0.1.0 的测试活动、覆盖范围与结果。
|
|
14
|
-
|
|
15
|
-
### 1.2 测试环境
|
|
16
|
-
|
|
17
|
-
| 项 | 值 |
|
|
18
|
-
| --- | --- |
|
|
19
|
-
| 运行时 | Node.js 24.11.0 |
|
|
20
|
-
| 操作系统 | Windows 10 19045(同时适用 macOS / Linux) |
|
|
21
|
-
| 测试框架 | `node:test`(内建,无第三方依赖) |
|
|
22
|
-
| 被测版本 | 0.1.0 |
|
|
23
|
-
|
|
24
|
-
### 1.3 测试策略
|
|
25
|
-
|
|
26
|
-
- **单元测试**:对每个领域模块独立验证,使用临时目录构造 profile 夹具。
|
|
27
|
-
- **集成测试**:以真实插件上下文模拟 DSH 扩展点,验证监听器行为。
|
|
28
|
-
- **实机验证**:在运行中的 DSH 实例上验证端到端效果。
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## 2 测试结果汇总
|
|
33
|
-
|
|
34
|
-
| 测试文件 | 用例数 | 覆盖内容 |
|
|
35
|
-
| --- | ---: | --- |
|
|
36
|
-
| `test/classify.test.mjs` | 9 | 失败分类、退避计算、工具重放判定 |
|
|
37
|
-
| `test/compat.test.mjs` | 16 | SemVer 解析与比较、范围满足、距离分类、符号提取、兼容性审计 |
|
|
38
|
-
| `test/compat-env.test.mjs` | 13 | 环境构建、manifest 对齐、还原、移除安全性、自带依赖保护 |
|
|
39
|
-
| `test/compat-multi.test.mjs` | 3 | 多插件并行适配、单插件失败隔离 |
|
|
40
|
-
| `test/compat-heal.test.mjs` | 5 | 重复扫描幂等、重装自愈、跨版本重建、过期垫片清理 |
|
|
41
|
-
| `test/install-support.test.mjs` | 7 | 安装前预置、远程包拒绝、回滚完整性、残留清理 |
|
|
42
|
-
| `test/arbitrate.test.mjs` | 6 | 路由冲突描述,确认不产生环境变更 |
|
|
43
|
-
| `test/plugin.test.mjs` | 11 | 三类监听器行为、命令处理、插件生命周期 |
|
|
44
|
-
| `test/shim-default.test.mjs` | 3 | 两种默认导出写法的垫片转发 |
|
|
45
|
-
| `test/atomic-env.test.mjs` | 2 | 拒绝时不得破坏现有环境 |
|
|
46
|
-
| `test/env-verify.test.mjs` | 11 | 环境核对:缺符号、缺 default、目标不可读、真实旧版本的入口核对 | |
|
|
47
|
-
| `test/verify-roundtrip.test.mjs` | 2 | 建完必须能验过;坏垫片能被发现 |
|
|
48
|
-
| `test/env-verify-cache.test.mjs` | 2 | 核对结果缓存,目标变化后失效 |
|
|
49
|
-
| `test/subpath-import.test.mjs` | 1 | 子路径导入不算独立包,且符号仍可取到 |
|
|
50
|
-
| `test/dry-run.test.mjs` | 2 | 探测不写盘,缺符号时也不建目录 |
|
|
51
|
-
| `test/old-version-flow.test.mjs` | 2 | 缺符号时装真实旧版本;够用时仍用薄垫片 |
|
|
52
|
-
| `test/version-search.test.mjs` | 7 | 候选版本排序:声明的优先、范围外兜底、上限、坏版本号 |
|
|
53
|
-
| `test/search-cache.test.mjs` | 1 | 搜空的组合不重复搜 |
|
|
54
|
-
| `test/closure-install.test.mjs` | 1 | 旧版本的依赖闭包一起装进来 |
|
|
55
|
-
| `test/cache-prune.test.mjs` | 3 | 冷缓存淘汰:上限、留热的、无目录不报错 |
|
|
56
|
-
| `test/install-bundle.test.mjs` | 9 | 安装参数解析、版本选择、bundle 登记 |
|
|
57
|
-
| `test/tar-extract.test.mjs` | 4 | tar 解包:根目录名不固定、GNU 长名、PAX 长名 |
|
|
58
|
-
| `test/audit-align.test.mjs` | 4 | 预发布规则、meta 包识别、只有声明不对时自动适配 |
|
|
59
|
-
| `test/pinned-peers.test.mjs` | 1 | peer 钉死成上一补丁版本:六条全对齐、只给导入的建垫片 |
|
|
60
|
-
| `test/install-rescue.test.mjs` | 4 | 从失败里取出包名与版本,供授权使用 |
|
|
61
|
-
| `test/install-in-place.test.mjs` | 2 | 已装着的包就地修复,不再重复安装 |
|
|
62
|
-
| `test/client-half.test.mjs` | 11 | 客户端半:模块身份、注入声明、apply 注册、组件能渲染 |
|
|
63
|
-
| `test/diagnostics.test.mjs` | 3 | 快照可选写入:不配置不写盘、突发合并、坏路径不致命 |
|
|
64
|
-
| `test/restart-notice.test.mjs` | 3 |
|
|
1
|
+
# 软件测试报告
|
|
2
|
+
|
|
3
|
+
**产品名称**:request-doctor(请求急救员)
|
|
4
|
+
**版本**:0.16.5
|
|
5
|
+
**编制依据**:GB/T 8567-2006《计算机软件文档编制规范》6.6;GB/T 8566-2007 验证与确认过程
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1 引言
|
|
10
|
+
|
|
11
|
+
### 1.1 标识
|
|
12
|
+
|
|
13
|
+
本报告记录 request-doctor 0.1.0 的测试活动、覆盖范围与结果。
|
|
14
|
+
|
|
15
|
+
### 1.2 测试环境
|
|
16
|
+
|
|
17
|
+
| 项 | 值 |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| 运行时 | Node.js 24.11.0 |
|
|
20
|
+
| 操作系统 | Windows 10 19045(同时适用 macOS / Linux) |
|
|
21
|
+
| 测试框架 | `node:test`(内建,无第三方依赖) |
|
|
22
|
+
| 被测版本 | 0.1.0 |
|
|
23
|
+
|
|
24
|
+
### 1.3 测试策略
|
|
25
|
+
|
|
26
|
+
- **单元测试**:对每个领域模块独立验证,使用临时目录构造 profile 夹具。
|
|
27
|
+
- **集成测试**:以真实插件上下文模拟 DSH 扩展点,验证监听器行为。
|
|
28
|
+
- **实机验证**:在运行中的 DSH 实例上验证端到端效果。
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2 测试结果汇总
|
|
33
|
+
|
|
34
|
+
| 测试文件 | 用例数 | 覆盖内容 |
|
|
35
|
+
| --- | ---: | --- |
|
|
36
|
+
| `test/classify.test.mjs` | 9 | 失败分类、退避计算、工具重放判定 |
|
|
37
|
+
| `test/compat.test.mjs` | 16 | SemVer 解析与比较、范围满足、距离分类、符号提取、兼容性审计 |
|
|
38
|
+
| `test/compat-env.test.mjs` | 13 | 环境构建、manifest 对齐、还原、移除安全性、自带依赖保护 |
|
|
39
|
+
| `test/compat-multi.test.mjs` | 3 | 多插件并行适配、单插件失败隔离 |
|
|
40
|
+
| `test/compat-heal.test.mjs` | 5 | 重复扫描幂等、重装自愈、跨版本重建、过期垫片清理 |
|
|
41
|
+
| `test/install-support.test.mjs` | 7 | 安装前预置、远程包拒绝、回滚完整性、残留清理 |
|
|
42
|
+
| `test/arbitrate.test.mjs` | 6 | 路由冲突描述,确认不产生环境变更 |
|
|
43
|
+
| `test/plugin.test.mjs` | 11 | 三类监听器行为、命令处理、插件生命周期 |
|
|
44
|
+
| `test/shim-default.test.mjs` | 3 | 两种默认导出写法的垫片转发 |
|
|
45
|
+
| `test/atomic-env.test.mjs` | 2 | 拒绝时不得破坏现有环境 |
|
|
46
|
+
| `test/env-verify.test.mjs` | 11 | 环境核对:缺符号、缺 default、目标不可读、真实旧版本的入口核对 | |
|
|
47
|
+
| `test/verify-roundtrip.test.mjs` | 2 | 建完必须能验过;坏垫片能被发现 |
|
|
48
|
+
| `test/env-verify-cache.test.mjs` | 2 | 核对结果缓存,目标变化后失效 |
|
|
49
|
+
| `test/subpath-import.test.mjs` | 1 | 子路径导入不算独立包,且符号仍可取到 |
|
|
50
|
+
| `test/dry-run.test.mjs` | 2 | 探测不写盘,缺符号时也不建目录 |
|
|
51
|
+
| `test/old-version-flow.test.mjs` | 2 | 缺符号时装真实旧版本;够用时仍用薄垫片 |
|
|
52
|
+
| `test/version-search.test.mjs` | 7 | 候选版本排序:声明的优先、范围外兜底、上限、坏版本号 |
|
|
53
|
+
| `test/search-cache.test.mjs` | 1 | 搜空的组合不重复搜 |
|
|
54
|
+
| `test/closure-install.test.mjs` | 1 | 旧版本的依赖闭包一起装进来 |
|
|
55
|
+
| `test/cache-prune.test.mjs` | 3 | 冷缓存淘汰:上限、留热的、无目录不报错 |
|
|
56
|
+
| `test/install-bundle.test.mjs` | 9 | 安装参数解析、版本选择、bundle 登记 |
|
|
57
|
+
| `test/tar-extract.test.mjs` | 4 | tar 解包:根目录名不固定、GNU 长名、PAX 长名 |
|
|
58
|
+
| `test/audit-align.test.mjs` | 4 | 预发布规则、meta 包识别、只有声明不对时自动适配 |
|
|
59
|
+
| `test/pinned-peers.test.mjs` | 1 | peer 钉死成上一补丁版本:六条全对齐、只给导入的建垫片 |
|
|
60
|
+
| `test/install-rescue.test.mjs` | 4 | 从失败里取出包名与版本,供授权使用 |
|
|
61
|
+
| `test/install-in-place.test.mjs` | 2 | 已装着的包就地修复,不再重复安装 |
|
|
62
|
+
| `test/client-half.test.mjs` | 11 | 客户端半:模块身份、注入声明、apply 注册、组件能渲染 |
|
|
63
|
+
| `test/diagnostics.test.mjs` | 3 | 快照可选写入:不配置不写盘、突发合并、坏路径不致命 |
|
|
64
|
+
| `test/restart-notice.test.mjs` | 3 |
|
|
65
65
|
| `test/write-timing.test.mjs` | 3 | 写盘时序:合并窗口内手动写仍是最新、多次记录只排一个写 |
|
|
66
66
|
| `test/restart-cycle.test.mjs` | 3 | 真跨重启:写盘后新建诊断读同一文件,记录与次数都在 |
|
|
67
67
|
| `test/status-restore.test.mjs` | 7 | 跨重启恢复:快照可读、缺失/损坏/旧格式均当无历史、非法条目丢弃 |
|
|
@@ -76,162 +76,164 @@
|
|
|
76
76
|
| `test/install-refusal.test.mjs` | 6 | 安装的四条失败路径:空参数、未备好、缺 profile、装不上 |
|
|
77
77
|
| `test/allow-version.test.mjs` | 8 | 放行:版本必填、缺管理器拒绝、成功只调一次、失败如实报、请求体解析 |
|
|
78
78
|
| `test/panel-blocked.test.mjs` | 7 | 冲突判定:审计兼容却被拒装、清单形状解析、给 allow 动作 |
|
|
79
|
-
| `test/panel-briefs.test.mjs` | 6 | 界面摘要:按名索引、只送可见行、缺数据不抛、不污染诊断 |
|
|
80
|
-
| `test/verdict-report.test.mjs` | 29 | why 与 list:判定、理由、环境摘要、自动扫描、分组、缺口、按形态给建议 |
|
|
81
|
-
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
ℹ
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
|
98
|
-
|
|
|
99
|
-
| FR-1.
|
|
100
|
-
| FR-2.
|
|
101
|
-
| FR-1.
|
|
102
|
-
| FR-
|
|
103
|
-
| FR-1.
|
|
104
|
-
| FR-1.
|
|
105
|
-
| FR-1.
|
|
106
|
-
| FR-1.
|
|
107
|
-
| FR-1.
|
|
108
|
-
| FR-1.
|
|
109
|
-
| FR-1.
|
|
110
|
-
| FR-1.
|
|
111
|
-
| FR-
|
|
112
|
-
| FR-
|
|
113
|
-
| FR-2.
|
|
114
|
-
| FR-
|
|
115
|
-
| FR-3
|
|
116
|
-
| FR-
|
|
117
|
-
| FR-
|
|
118
|
-
| FR-4.
|
|
119
|
-
| FR-4.
|
|
120
|
-
| FR-4.
|
|
121
|
-
| FR-4.
|
|
122
|
-
| FR-4.
|
|
123
|
-
| FR-4.
|
|
124
|
-
| FR-4.
|
|
125
|
-
| FR-4.
|
|
126
|
-
| FR-
|
|
127
|
-
| FR-
|
|
128
|
-
| FR-
|
|
129
|
-
| FR-4
|
|
130
|
-
| FR-
|
|
131
|
-
| FR-
|
|
132
|
-
| FR-5.
|
|
133
|
-
| FR-5.
|
|
79
|
+
| `test/panel-briefs.test.mjs` | 6 | 界面摘要:按名索引、只送可见行、缺数据不抛、不污染诊断 |
|
|
80
|
+
| `test/verdict-report.test.mjs` | 29 | why 与 list:判定、理由、环境摘要、自动扫描、分组、缺口、按形态给建议 |
|
|
81
|
+
| `test/restart-notice.test.mjs` | 3 | 缺导出判为需要重启;其它失败不误判;多次累积不覆盖 |
|
|
82
|
+
| `test/symbol-alias.test.mjs` | 6 | 符号别名:同义导出能对上,缺失时不伪造 |
|
|
83
|
+
| **合计** | **265** | **全部通过** |
|
|
84
|
+
|
|
85
|
+
执行结果:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
ℹ tests 141
|
|
89
|
+
ℹ pass 141
|
|
90
|
+
ℹ fail 0
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 3 需求覆盖矩阵
|
|
96
|
+
|
|
97
|
+
| 需求 | 验证用例 | 结果 |
|
|
98
|
+
| --- | --- | --- |
|
|
99
|
+
| FR-1.1 下游优先 | `plugin.test.mjs` — 下游已重试时不再接管 | 通过 |
|
|
100
|
+
| FR-1.2/1.3 客户端原因识别 | `classify.test.mjs` — 各失败族分类 | 通过 |
|
|
101
|
+
| FR-1.7a 凭据不走版本修复 | `classify.test.mjs` — 401 归入 auth 而非 version-repair | 通过 |
|
|
102
|
+
| FR-2.2 副作用工具不重放 | `plugin.test.mjs` — 写文件类工具失败后不重放 | 通过 |
|
|
103
|
+
| FR-1.4 服务端原因不处置 | `classify.test.mjs` — QUOTA/RATE_LIMIT/SERVER 返回 skip | 通过 |
|
|
104
|
+
| FR-1.5 有界退避 | `classify.test.mjs` — 指数增长、上限、抖动 | 通过 |
|
|
105
|
+
| FR-1.6 超限先压缩 | `plugin.test.mjs` — 上下文超限触发压缩 | 通过 |
|
|
106
|
+
| FR-1.7 先修复再重试 | `plugin.test.mjs` — 缺适配器先建环境后重试 | 通过 |
|
|
107
|
+
| FR-1.8 复用既有事件 | `plugin.test.mjs` — 断言 `llm/retry` 载荷 | 通过 |
|
|
108
|
+
| FR-1.3a 十九类失败形态归类 | `classify.test.mjs` — 覆盖表逐条断言归类与策略 | 通过 |
|
|
109
|
+
| FR-1.9 并发闸门 | `plugin.test.mjs` — 同一处只放一个重试进去 | 通过 |
|
|
110
|
+
| FR-1.10 无进展即停 | `plugin.test.mjs` — 连续两轮未见效后记 give-up | 通过 |
|
|
111
|
+
| FR-1.11 鉴权独立额度 | `classify.test.mjs` — maxAuthRetries 边界夹取 | 通过 |
|
|
112
|
+
| FR-1.12 不可重试类 | `classify.test.mjs` — 证书/权限/路径不进入退避 | 通过 |
|
|
113
|
+
| FR-2.4 循环检测 | `plugin.test.mjs` — 同名同参超阈值后不再重放 | 通过 |
|
|
114
|
+
| FR-2.1 只读白名单 | `plugin.test.mjs` — 副作用工具不重放 | 通过 |
|
|
115
|
+
| FR-2.3 重放上限 | `plugin.test.mjs` — 预算耗尽即停 | 通过 |
|
|
116
|
+
| FR-3.1 503 替换 | `plugin.test.mjs` — 头部未发出时写 503 | 通过 |
|
|
117
|
+
| FR-3.2 头部已发出不写 | `plugin.test.mjs` — 原样抛出 | 通过 |
|
|
118
|
+
| FR-4.1 覆盖全部插件 | `compat-multi.test.mjs` — 三插件全部适配 | 通过 |
|
|
119
|
+
| FR-4.2 四类来源 | `plugin.test.mjs` — 拒绝包/已启用/已禁用/延迟 | 通过 |
|
|
120
|
+
| FR-4.3/4.4 审计门槛 | `compat.test.mjs` — 缺符号判 incompatible | 通过 |
|
|
121
|
+
| FR-4.5 兼容环境 | `compat-env.test.mjs` — 垫片结构与遮蔽 | 通过 |
|
|
122
|
+
| FR-4.6 manifest 对齐 | `compat-env.test.mjs` — peer 与 engines 改写 | 通过 |
|
|
123
|
+
| FR-4.7 不绕过检查 | `compat-env.test.mjs` — 对齐后版本真实满足 | 通过 |
|
|
124
|
+
| FR-4.8 不伪造符号 | `compat-multi.test.mjs` — 缺符号拒绝建环境 | 通过 |
|
|
125
|
+
| FR-4.9 建完必须核对 | `verify-roundtrip.test.mjs` — 建完必能验过 | 通过 |
|
|
126
|
+
| FR-4.10 不可核对不算失败 | `env-verify.test.mjs` — 目标不可读记为未核对 | 通过 |
|
|
127
|
+
| FR-4.11 坏垫片能被发现 | `verify-roundtrip.test.mjs` — 手工破坏的垫片验不过 | 通过 |
|
|
128
|
+
| FR-7.5 共同缺口要点出 | `verdict-report.test.mjs` — 同一符号缺两次即汇总,按涉及数排序 | 通过 |
|
|
129
|
+
| FR-7.4 why 能解释判定 | `verdict-report.test.mjs` — 五种情形各有用例 | 通过 |
|
|
130
|
+
| FR-4.13 需要重启要说明 | `restart-notice.test.mjs` — 缺导出归入重启提示 | 通过 |
|
|
131
|
+
| FR-4.12 不用占位 | `compat-env.test.mjs` — 装真实旧版本;旧版本也没有则拒绝 | 通过 |
|
|
132
|
+
| FR-5.1 安装前预置 | `install-support.test.mjs` — 预置后检查通过 | 通过 |
|
|
133
|
+
| FR-5.2 失败回滚 | `install-support.test.mjs` — 目录恢复原状 | 通过 |
|
|
134
|
+
| FR-5.3 远程包明示不支持 | `install-support.test.mjs` — 返回 reason | 通过 |
|
|
135
|
+
| FR-5.4 界面能看判定 | `panel-briefs.test.mjs`、`client-half.test.mjs` — 有结论才渲染判定行 | 通过 |
|
|
134
136
|
| FR-5.6 安装失败要说明 | `install-refusal.test.mjs` — 四条拒绝各有文案 | 通过 |
|
|
135
|
-
| FR-5.5 界面标来源 | `client-half.test.mjs` — 管理器/审计/未知三种来源各有标签 | 通过 |
|
|
136
|
-
| FR-4.4 审计不过只报告 | `compat.test.mjs` — 缺符号的插件不建环境 | 通过 |
|
|
137
|
-
| FR-6.2 安装前预置 | `install-support.test.mjs` — 预置后检查通过 | 通过 |
|
|
138
|
-
| FR-6.3 快照不阻塞 | `diagnostics.test.mjs` — 未配置不写盘、突发合并写、坏路径不致命 | 通过 |
|
|
139
|
-
| FR-6.1/6.2 命令 | `plugin.test.mjs` — `/doctor` 与 `/doctor install` | 通过 |
|
|
140
|
-
| PR-1 稳态开销 | `compat-heal.test.mjs` — 幂等扫描不重复建环境 | 通过 |
|
|
141
|
-
| PR-2 自然退出审计集 | `compat-heal.test.mjs` — 已适配后不再审计 | 通过 |
|
|
142
|
-
| DR-2 不动其他插件 | `arbitrate.test.mjs` — 冲突只报告 | 通过 |
|
|
143
|
-
| DR-3 路由冲突只报告 | `arbitrate.test.mjs` — 无环境变更 | 通过 |
|
|
144
|
-
| DR-4 不新增事件类型 | `plugin.test.mjs` — 仅用既有两种事件 | 通过 |
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
## 4 实机验证
|
|
149
|
-
|
|
150
|
-
在运行中的 DSH 实例(profile `desktop`,运行时 `0.2.1-rc.3`)上完成:
|
|
151
|
-
|
|
152
|
-
| 验证项 | 步骤 | 结果 |
|
|
153
|
-
| --- | --- | --- |
|
|
154
|
-
| 不兼容插件安装 | 构造 `peerDependencies: 0.2.1-rc.2` 的插件直接安装 | 被拒绝,报 `incompatible-version`(复现问题) |
|
|
155
|
-
| 安装前预置 | 执行安装前预置 | 返回 `prepared: true`,声明已对齐 |
|
|
156
|
-
| 再次安装 | 安装同一插件 | `application: applied`(问题解决) |
|
|
157
|
-
| 环境自动补建 | 等待扫描 | `.request-doctor-compat.json` 出现,含 `dsh-llm` |
|
|
158
|
-
| 残留清理 | 等待扫描 | staging 标记被清除 |
|
|
159
|
-
| 已装插件兼容 | 检查 `dsh-workbuddy-connect` | 环境完好,`compatibility.json` 为 `{}`(零豁免) |
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## 5 缺陷记录
|
|
164
|
-
|
|
165
|
-
| 编号 | 描述 | 严重度 | 状态 |
|
|
166
|
-
| --- | --- | --- | --- |
|
|
167
|
-
| D-1 | 移除兼容环境时误删插件自带 `node_modules` | 高 | 已修复:只删除标记记录的包,并按 `@scope/name` 定向清理空目录 |
|
|
168
|
-
| D-2 | 某包缺符号导致后续所有包被跳过 | 高 | 已修复:改为逐包独立判定 |
|
|
169
|
-
| D-3 | 重试链 Map 无界增长 | 中 | 已修复:每 agent 上限 128 |
|
|
170
|
-
| D-4 | 源码缓存与 manifest 缓存无界 | 中 | 已修复:上限 256 / 512 |
|
|
171
|
-
| D-5 | 快速连续事件堆叠多个待执行扫描 | 中 | 已修复:合并为单个待执行扫描 |
|
|
172
|
-
| D-6 | 清理空目录时遍历插件整个依赖树 | 低 | 已修复:限定为 `@scope/name` 形状 |
|
|
173
|
-
| D-7 | 度量工具把嵌套函数计入外层,误判超标 | 低 | 已修复:嵌套函数独立计量 |
|
|
174
|
-
| D-8 | 垫片没转发 `export { X as default }` 形式的默认导出 | 高 | 已修复:按解析出的导出名判断 |
|
|
175
|
-
| D-9 | 环境构建中途失败会删掉整个环境,把能用的插件弄坏 | 高 | 已修复:先全部核对再写,拒绝时不动现场 |
|
|
176
|
-
| D-10 | 第三方库版本线被错误对齐到运行时版本 | 中 | 已修复:只有 dsh* 跟随运行时 |
|
|
177
|
-
| D-11 | 建完环境未验证就报成功 | 高 | 已修复:新增环境核对,通不过不算修好 |
|
|
178
|
-
| D-12 | 缺符号时放占位,把崩溃推迟到运行期 | 高 | 已修复:取真实旧版本安装,不再有占位 |
|
|
179
|
-
| D-13 | 探测调用会落盘,在 profile 上执行时覆盖真实包 | 高 | 已修复:新增 dryRun,探测只读不写 |
|
|
180
|
-
| D-14 | 只押一个版本,符号在别的旧版本里时仍判失败 | 中 | 已修复:新增版本搜索,按候选顺序挨个试 |
|
|
181
|
-
| D-15 | 垫片指向读不到的文件时被当成「无法核对」放过 | 中 | 已修复:如实算作问题,环境不可用 |
|
|
182
|
-
| D-16 | 只装旧版本本身,它自己的依赖没跟着装 | 高 | 已修复:解析并安装依赖闭包 |
|
|
183
|
-
| D-17 | 注册表里的不兼容插件完全装不上 | 高 | 已修复:自建安装路径,取包+依赖+环境+登记 |
|
|
184
|
-
| D-18 | CommonJS 包的导出被判成空,误报缺符号 | 高 | 已修复:空清单也退回搜源码 |
|
|
185
|
-
| D-19 | tar 解析写死 `package/` 根,根名不同的包解不出来 | 高 | 已修复:按实际首段剥掉根目录 |
|
|
186
|
-
| D-20 | tar 长文件名(GNU L / PAX)未处理,超长路径文件丢失 | 高 | 已修复:两种写法都解析 |
|
|
187
|
-
| D-21 | 图形界面安装不兼容插件时没有接住失败 | 高 | 已修复:拦截版本不匹配并代为装好 |
|
|
188
|
-
| D-22 | semver 漏预发布规则,运行时拒绝的版本被当成满足 | 高 | 已修复:按 semver 规则判预发布 |
|
|
189
|
-
| D-26 | 在 installBundle 上打补丁拦截安装,实际进不了调用链 | 高 | 已改为授权版本豁免后重装 |
|
|
190
|
-
| D-27 | 客户端半把 `remote` 写进 inject,它不是可注入服务 | 中 | 已改为只用 slots 与 locale |
|
|
191
|
-
| D-28 | `exports` 未导出 `./package.json`,客户端清单定位被拒 | 高 | 已补上该导出 |
|
|
192
|
-
| D-29 | 客户端入口解析失败被进程级缓存为 null | 中 | 记录在案:改动定位信息后需重组合或重启 |
|
|
193
|
-
| D-31 | 动态客户端模块拿不到 typert 远程门面,界面只能显示「管理器不可用」 | 高 | 改为同源 HTTP 路由,实测三条路由全部 200 |
|
|
194
|
-
| D-30 | 浏览器侧 React 缺 hooks 时直接调用会抛,旧版无边界即整页空白 | 高 | 先解析 hooks,缺则降级为静态说明 |
|
|
195
|
-
| D-23 | `@deepseek-ai/dsh` 这个 meta 包没被识别为运行时包 | 高 | 已修复:正则认 `dsh` 本身 |
|
|
196
|
-
| D-24 | 环境 unchanged 时跳过 manifest 对齐 | 高 | 已修复:对齐无条件执行 |
|
|
197
|
-
| D-25 | 只有声明不对的插件被判成「需人工」 | 高 | 已修复:判为可适配 |
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## 6 结论
|
|
202
|
-
|
|
203
|
-
全部 160 个自动化用例通过,需求覆盖矩阵无空缺,实机验证完成关键路径。质量度量全部满足限值(见《软件质量度量报告》)。判定:**通过**。
|
|
204
|
-
|
|
205
|
-
## 7 全量回归检验记录
|
|
206
|
-
|
|
207
|
-
发布前对整包做了多轮独立全量检验。每轮都不沿用上一轮结论,重新跑测试、重算度量、重新核对文档与实现。下表记录的是每轮的「发现」,不是结论——只有发现为空才算通过。
|
|
208
|
-
|
|
209
|
-
| 轮次 | 检验角度 | 发现 | 处置 |
|
|
210
|
-
| --- | --- | --- | --- |
|
|
211
|
-
| 1 | 需求条目、覆盖矩阵、用例文件三方对照 | 矩阵有三行声称通过,但用例不存在 | 补 3 条用例:并发闸门、无进展即停、循环检测 |
|
|
212
|
-
| 2 | 全文件扫描:绝对路径、编码、占位标记、索引引用 | FR-6.3 指向不存在的用例 | 新增 diagnostics.test.mjs 三条用例 |
|
|
213
|
-
| 3 | 配置项三处对照、模块引用、语言资源、用例计数 | cordis.patch.yml 缺 retryableToolPattern;审计脚本自身有 bug | 补齐配置;修正脚本后重跑 |
|
|
214
|
-
| 4 | 扩展点与设计说明对照、README 命令与配置项 | 设计说明漏写 commands 与 webServer;README 漏 2 个配置项 | 三处文档补齐 |
|
|
215
|
-
| 5 | 界面请求体字段与 Host 解析、CHANGELOG 与版本 | 无 | — |
|
|
216
|
-
| 6 | 死导出、弱断言、断言密度、真实 React 渲染 | 无实质问题 | — |
|
|
217
|
-
| 7 | 逐文件执行、释放路径、发布目录自跑质量工具 | 无 | — |
|
|
218
|
-
|
|
219
|
-
第 5 至 7 轮连续无发现。
|
|
220
|
-
|
|
221
|
-
### 7.1 每轮固定执行的项目
|
|
222
|
-
|
|
223
|
-
以下七项每轮重跑,不依赖前轮结果:
|
|
224
|
-
|
|
225
|
-
1. 全量单元与集成测试:152 条通过
|
|
226
|
-
2. 质量度量门禁:退出码 0
|
|
227
|
-
3. 发布目录全量语法检查:无错
|
|
228
|
-
4. 全文件 UTF-8 解码检查:无替换字符
|
|
229
|
-
5. 六份文档版本号与 package.json 一致
|
|
230
|
-
6. 源码目录与发布目录逐文件哈希比对:一致
|
|
231
|
-
7. 实机三条界面路由返回 200
|
|
232
|
-
|
|
233
|
-
### 7.2 分文件执行结果
|
|
234
|
-
|
|
137
|
+
| FR-5.5 界面标来源 | `client-half.test.mjs` — 管理器/审计/未知三种来源各有标签 | 通过 |
|
|
138
|
+
| FR-4.4 审计不过只报告 | `compat.test.mjs` — 缺符号的插件不建环境 | 通过 |
|
|
139
|
+
| FR-6.2 安装前预置 | `install-support.test.mjs` — 预置后检查通过 | 通过 |
|
|
140
|
+
| FR-6.3 快照不阻塞 | `diagnostics.test.mjs` — 未配置不写盘、突发合并写、坏路径不致命 | 通过 |
|
|
141
|
+
| FR-6.1/6.2 命令 | `plugin.test.mjs` — `/doctor` 与 `/doctor install` | 通过 |
|
|
142
|
+
| PR-1 稳态开销 | `compat-heal.test.mjs` — 幂等扫描不重复建环境 | 通过 |
|
|
143
|
+
| PR-2 自然退出审计集 | `compat-heal.test.mjs` — 已适配后不再审计 | 通过 |
|
|
144
|
+
| DR-2 不动其他插件 | `arbitrate.test.mjs` — 冲突只报告 | 通过 |
|
|
145
|
+
| DR-3 路由冲突只报告 | `arbitrate.test.mjs` — 无环境变更 | 通过 |
|
|
146
|
+
| DR-4 不新增事件类型 | `plugin.test.mjs` — 仅用既有两种事件 | 通过 |
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 4 实机验证
|
|
151
|
+
|
|
152
|
+
在运行中的 DSH 实例(profile `desktop`,运行时 `0.2.1-rc.3`)上完成:
|
|
153
|
+
|
|
154
|
+
| 验证项 | 步骤 | 结果 |
|
|
155
|
+
| --- | --- | --- |
|
|
156
|
+
| 不兼容插件安装 | 构造 `peerDependencies: 0.2.1-rc.2` 的插件直接安装 | 被拒绝,报 `incompatible-version`(复现问题) |
|
|
157
|
+
| 安装前预置 | 执行安装前预置 | 返回 `prepared: true`,声明已对齐 |
|
|
158
|
+
| 再次安装 | 安装同一插件 | `application: applied`(问题解决) |
|
|
159
|
+
| 环境自动补建 | 等待扫描 | `.request-doctor-compat.json` 出现,含 `dsh-llm` |
|
|
160
|
+
| 残留清理 | 等待扫描 | staging 标记被清除 |
|
|
161
|
+
| 已装插件兼容 | 检查 `dsh-workbuddy-connect` | 环境完好,`compatibility.json` 为 `{}`(零豁免) |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 5 缺陷记录
|
|
166
|
+
|
|
167
|
+
| 编号 | 描述 | 严重度 | 状态 |
|
|
168
|
+
| --- | --- | --- | --- |
|
|
169
|
+
| D-1 | 移除兼容环境时误删插件自带 `node_modules` | 高 | 已修复:只删除标记记录的包,并按 `@scope/name` 定向清理空目录 |
|
|
170
|
+
| D-2 | 某包缺符号导致后续所有包被跳过 | 高 | 已修复:改为逐包独立判定 |
|
|
171
|
+
| D-3 | 重试链 Map 无界增长 | 中 | 已修复:每 agent 上限 128 |
|
|
172
|
+
| D-4 | 源码缓存与 manifest 缓存无界 | 中 | 已修复:上限 256 / 512 |
|
|
173
|
+
| D-5 | 快速连续事件堆叠多个待执行扫描 | 中 | 已修复:合并为单个待执行扫描 |
|
|
174
|
+
| D-6 | 清理空目录时遍历插件整个依赖树 | 低 | 已修复:限定为 `@scope/name` 形状 |
|
|
175
|
+
| D-7 | 度量工具把嵌套函数计入外层,误判超标 | 低 | 已修复:嵌套函数独立计量 |
|
|
176
|
+
| D-8 | 垫片没转发 `export { X as default }` 形式的默认导出 | 高 | 已修复:按解析出的导出名判断 |
|
|
177
|
+
| D-9 | 环境构建中途失败会删掉整个环境,把能用的插件弄坏 | 高 | 已修复:先全部核对再写,拒绝时不动现场 |
|
|
178
|
+
| D-10 | 第三方库版本线被错误对齐到运行时版本 | 中 | 已修复:只有 dsh* 跟随运行时 |
|
|
179
|
+
| D-11 | 建完环境未验证就报成功 | 高 | 已修复:新增环境核对,通不过不算修好 |
|
|
180
|
+
| D-12 | 缺符号时放占位,把崩溃推迟到运行期 | 高 | 已修复:取真实旧版本安装,不再有占位 |
|
|
181
|
+
| D-13 | 探测调用会落盘,在 profile 上执行时覆盖真实包 | 高 | 已修复:新增 dryRun,探测只读不写 |
|
|
182
|
+
| D-14 | 只押一个版本,符号在别的旧版本里时仍判失败 | 中 | 已修复:新增版本搜索,按候选顺序挨个试 |
|
|
183
|
+
| D-15 | 垫片指向读不到的文件时被当成「无法核对」放过 | 中 | 已修复:如实算作问题,环境不可用 |
|
|
184
|
+
| D-16 | 只装旧版本本身,它自己的依赖没跟着装 | 高 | 已修复:解析并安装依赖闭包 |
|
|
185
|
+
| D-17 | 注册表里的不兼容插件完全装不上 | 高 | 已修复:自建安装路径,取包+依赖+环境+登记 |
|
|
186
|
+
| D-18 | CommonJS 包的导出被判成空,误报缺符号 | 高 | 已修复:空清单也退回搜源码 |
|
|
187
|
+
| D-19 | tar 解析写死 `package/` 根,根名不同的包解不出来 | 高 | 已修复:按实际首段剥掉根目录 |
|
|
188
|
+
| D-20 | tar 长文件名(GNU L / PAX)未处理,超长路径文件丢失 | 高 | 已修复:两种写法都解析 |
|
|
189
|
+
| D-21 | 图形界面安装不兼容插件时没有接住失败 | 高 | 已修复:拦截版本不匹配并代为装好 |
|
|
190
|
+
| D-22 | semver 漏预发布规则,运行时拒绝的版本被当成满足 | 高 | 已修复:按 semver 规则判预发布 |
|
|
191
|
+
| D-26 | 在 installBundle 上打补丁拦截安装,实际进不了调用链 | 高 | 已改为授权版本豁免后重装 |
|
|
192
|
+
| D-27 | 客户端半把 `remote` 写进 inject,它不是可注入服务 | 中 | 已改为只用 slots 与 locale |
|
|
193
|
+
| D-28 | `exports` 未导出 `./package.json`,客户端清单定位被拒 | 高 | 已补上该导出 |
|
|
194
|
+
| D-29 | 客户端入口解析失败被进程级缓存为 null | 中 | 记录在案:改动定位信息后需重组合或重启 |
|
|
195
|
+
| D-31 | 动态客户端模块拿不到 typert 远程门面,界面只能显示「管理器不可用」 | 高 | 改为同源 HTTP 路由,实测三条路由全部 200 |
|
|
196
|
+
| D-30 | 浏览器侧 React 缺 hooks 时直接调用会抛,旧版无边界即整页空白 | 高 | 先解析 hooks,缺则降级为静态说明 |
|
|
197
|
+
| D-23 | `@deepseek-ai/dsh` 这个 meta 包没被识别为运行时包 | 高 | 已修复:正则认 `dsh` 本身 |
|
|
198
|
+
| D-24 | 环境 unchanged 时跳过 manifest 对齐 | 高 | 已修复:对齐无条件执行 |
|
|
199
|
+
| D-25 | 只有声明不对的插件被判成「需人工」 | 高 | 已修复:判为可适配 |
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 6 结论
|
|
204
|
+
|
|
205
|
+
全部 160 个自动化用例通过,需求覆盖矩阵无空缺,实机验证完成关键路径。质量度量全部满足限值(见《软件质量度量报告》)。判定:**通过**。
|
|
206
|
+
|
|
207
|
+
## 7 全量回归检验记录
|
|
208
|
+
|
|
209
|
+
发布前对整包做了多轮独立全量检验。每轮都不沿用上一轮结论,重新跑测试、重算度量、重新核对文档与实现。下表记录的是每轮的「发现」,不是结论——只有发现为空才算通过。
|
|
210
|
+
|
|
211
|
+
| 轮次 | 检验角度 | 发现 | 处置 |
|
|
212
|
+
| --- | --- | --- | --- |
|
|
213
|
+
| 1 | 需求条目、覆盖矩阵、用例文件三方对照 | 矩阵有三行声称通过,但用例不存在 | 补 3 条用例:并发闸门、无进展即停、循环检测 |
|
|
214
|
+
| 2 | 全文件扫描:绝对路径、编码、占位标记、索引引用 | FR-6.3 指向不存在的用例 | 新增 diagnostics.test.mjs 三条用例 |
|
|
215
|
+
| 3 | 配置项三处对照、模块引用、语言资源、用例计数 | cordis.patch.yml 缺 retryableToolPattern;审计脚本自身有 bug | 补齐配置;修正脚本后重跑 |
|
|
216
|
+
| 4 | 扩展点与设计说明对照、README 命令与配置项 | 设计说明漏写 commands 与 webServer;README 漏 2 个配置项 | 三处文档补齐 |
|
|
217
|
+
| 5 | 界面请求体字段与 Host 解析、CHANGELOG 与版本 | 无 | — |
|
|
218
|
+
| 6 | 死导出、弱断言、断言密度、真实 React 渲染 | 无实质问题 | — |
|
|
219
|
+
| 7 | 逐文件执行、释放路径、发布目录自跑质量工具 | 无 | — |
|
|
220
|
+
|
|
221
|
+
第 5 至 7 轮连续无发现。
|
|
222
|
+
|
|
223
|
+
### 7.1 每轮固定执行的项目
|
|
224
|
+
|
|
225
|
+
以下七项每轮重跑,不依赖前轮结果:
|
|
226
|
+
|
|
227
|
+
1. 全量单元与集成测试:152 条通过
|
|
228
|
+
2. 质量度量门禁:退出码 0
|
|
229
|
+
3. 发布目录全量语法检查:无错
|
|
230
|
+
4. 全文件 UTF-8 解码检查:无替换字符
|
|
231
|
+
5. 六份文档版本号与 package.json 一致
|
|
232
|
+
6. 源码目录与发布目录逐文件哈希比对:一致
|
|
233
|
+
7. 实机三条界面路由返回 200
|
|
234
|
+
|
|
235
|
+
### 7.2 分文件执行结果
|
|
236
|
+
|
|
235
237
|
45 个测试文件逐个单独执行,每个都有用例且全部通过,不存在因导入失败而静默跳过的文件。用例数分布:compat.test.mjs 17、plugin.test.mjs 15、compat-env.test.mjs 14、classify.test.mjs 13,其余按职能分散,合计 265。
|
|
236
238
|
## 8 覆盖率实测
|
|
237
239
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# 软件用户手册
|
|
2
2
|
|
|
3
3
|
**产品名称**:request-doctor(请求急救员)
|
|
4
|
-
**版本**:0.16.
|
|
4
|
+
**版本**:0.16.5
|
|
5
5
|
**编制依据**:GB/T 8567-2006《计算机软件文档编制规范》6.5
|
|
6
6
|
|
|
7
7
|
---
|
|
@@ -299,3 +299,16 @@ dsh-hyper-tools@0.1.0:incompatible
|
|
|
299
299
|
| 重新扫描 | 让 Host 立刻重算一轮审计,不用等下一次定时扫描 |
|
|
300
300
|
|
|
301
301
|
「只授权」只出现在冲突行上。普通行只有「授权并安装」。
|
|
302
|
+
|
|
303
|
+
## 12 诊断快照
|
|
304
|
+
|
|
305
|
+
插件会把最近的状态写到 profile 目录下的 `.request-doctor-status.json`:最近 30 条修复记录,
|
|
306
|
+
以及按类别归并的「没能修复的失败」。重启之后这些记录会读回来,`/doctor` 里仍然看得到。
|
|
307
|
+
|
|
308
|
+
不想写盘就在配置里把它关掉:
|
|
309
|
+
|
|
310
|
+
```yaml
|
|
311
|
+
statusFile: ''
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
空串表示不写;不填则默认写到上面的位置。文件读不懂或被删掉都只当没有历史,不影响插件启动。
|
package/docs/quality-report.json
CHANGED