dsh-gokifu-compact 1.9.3 → 1.11.0
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/CHANGELOG.md +109 -0
- package/README.md +2 -2
- package/docs//346/226/271/346/241/210-/346/214/201/347/273/255/344/274/230/345/214/226.md +88 -0
- package/docs//346/236/266/346/236/204-/346/210/277/351/227/264/345/245/221/347/272/246.md +623 -0
- package/docs//346/236/266/346/236/204-/346/234/200/345/260/217/344/272/244/344/273/230/346/210/277/351/227/264.md +682 -0
- package/docs//346/236/266/346/236/204-/350/277/201/347/247/273/350/256/241/345/210/222.md +607 -0
- package/docs//350/215/211/347/250/277-/346/214/201/347/273/255/344/274/230/345/214/226.md +57 -0
- package/evidence/bench-2000.json +9 -9
- package/package.json +1 -1
- package/scripts/doctor.mjs +1 -1
- package/scripts/install.mjs +6 -183
- package/src/engine.mjs +73 -447
- package/src/rooms/config-schema.mjs +307 -0
- package/src/{summary-prompt.mjs → rooms/facts-prompt.mjs} +0 -16
- package/src/rooms/hot-inject.mjs +260 -0
- package/src/{keeper.mjs → rooms/keeper.mjs} +99 -7
- package/src/{graph.mjs → rooms/kifu-model.mjs} +0 -10
- package/src/rooms/kifu-persist.mjs +291 -0
- package/src/{ledger.mjs → rooms/ledger.mjs} +3 -10
- package/src/rooms/preset-format.mjs +201 -0
- package/src/{worldstate.mjs → rooms/world.mjs} +1 -1
- package/src/ui.mjs +32 -133
- package/src/extract.mjs +0 -90
- /package/src/{range.mjs → rooms/fold-planner.mjs} +0 -0
- /package/src/{verifier.mjs → rooms/verify.mjs} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,114 @@
|
|
|
1
1
|
# 更新记录
|
|
2
2
|
|
|
3
|
+
## 1.11.0 — 2026-10-30
|
|
4
|
+
|
|
5
|
+
### 最小交付房间架构收口:A2 + A3 全部完成(**首个把 16 房间落到底的正式版**)
|
|
6
|
+
|
|
7
|
+
1.10.0 只做到 A3-1a/b/c(三个房间 + 8 个门面还在)。这一版把 **A3 剩余四刀、删门面、四条新门禁**全部做完:
|
|
8
|
+
**`src/` 顶层只剩 `engine.mjs`(R09)与 `ui.mjs`(R11)**,其余 11 个房间全部在 `src/rooms/`,
|
|
9
|
+
**8 个旧门面已删除**(任何复活都会被门禁判红)。
|
|
10
|
+
|
|
11
|
+
**A3 物理搬迁 · 后四刀(纯移动,旧路径留一行 `export *` 门面)**
|
|
12
|
+
|
|
13
|
+
| 刀 | 房间 | 文件 | 自证方式 |
|
|
14
|
+
|---|---|---|---|
|
|
15
|
+
| A3-1d | `R00 kifu-model` | `src/graph.mjs`(1,136 行 / 47,853 B)→ `src/rooms/kifu-model.mjs` | `git` 100% 重命名,0 行改动;导出面 43 === 43 |
|
|
16
|
+
| A3-1e | `R03 keeper` | `src/keeper.mjs` + `src/extract.mjs` → `src/rooms/keeper.mjs`(12,335 B) | 合并正文与「两份备份去 import 后拼接」**逐字节相同**;导出 11 === 11 |
|
|
17
|
+
| A3-1f | `R06 ledger` | `src/ledger.mjs`(871 行 / 55,948 B)→ `src/rooms/ledger.mjs` | 对备份 `diff` **只有 2 行**(`./graph.mjs`→`../graph.mjs`、`./verifier.mjs`→`../verifier.mjs`) |
|
|
18
|
+
| A3-1g | `R07 facts-prompt` | `src/summary-prompt.mjs`(101 行)→ `src/rooms/facts-prompt.mjs` | `cmp` **逐字节相同**,零 import 修正 |
|
|
19
|
+
|
|
20
|
+
**A3-2 · 删除 8 个旧门面 + 一次性改 import**
|
|
21
|
+
|
|
22
|
+
- `git rm src/{verifier,range,worldstate,graph,keeper,extract,ledger,summary-prompt}.mjs`
|
|
23
|
+
- 重写 **44 个文件 / 77 行** import(纯路径,无断言改动):`src/engine.mjs` 6 条、`src/rooms/*` 5 条、
|
|
24
|
+
`test/` 37 文件 + `scripts/doctor.mjs`
|
|
25
|
+
- **pack 75 → 67(−8)**:这正是「门面存在时同一份实现有两个入口」的代价被消掉的直接体现
|
|
26
|
+
|
|
27
|
+
**A3-2-fix + A3-3 · 让「删门面」可被机器判定(4 + 2 条新门禁,`rooms` 9 → 15 用例)**
|
|
28
|
+
|
|
29
|
+
| 规则 | 断言 |
|
|
30
|
+
|---|---|
|
|
31
|
+
| `src/` 顶层白名单 | 只允许 `engine.mjs` / `ui.mjs`(harness 生成物不计) |
|
|
32
|
+
| 已删门面引用扫描 | `src/` 与 `test/` 不得引用那 8 个名字;按**解析后的绝对路径**判定(房间内部同目录引用放行) |
|
|
33
|
+
| 最终路径 | `ROOMS` 每项 `file === <id>.mjs` 且真实存在;房间集合必须等于契约 11 个 |
|
|
34
|
+
| **C1/R-C 精确化** | `@deepseek-ai/*` 的 **import** 只允许出现在 `src/engine.mjs`,且宿主说明符集合必须**恰好**那 4 个 —— 判据按**说明符**而非裸文本,所以 preset 块与注释里仍可写官方包名(行为面冻结) |
|
|
35
|
+
| **R-E** | `src/engine.mjs` 不得 import `rooms/migrate.mjs`(P6-C「禁止 engine 启动钩子」的机器判据) |
|
|
36
|
+
| **R-F** | `src/`·`scripts/`·`lib/` 不得出现 `allowedModels` 字样(宿主全局配置,插件不读不写) |
|
|
37
|
+
|
|
38
|
+
每条都带**判据自检**与**变异自检**(恢复 `src/graph.mjs`、把测试 import 改回旧路径、给引擎偷 import `schemastery`、
|
|
39
|
+
给 engine 加 migrate import、在 doctor 里写 `allowedModels` —— 5 组全部实测变红,还原后 15/0)。
|
|
40
|
+
|
|
41
|
+
**隔离实例运行时验证(A2-R / A3-R)**
|
|
42
|
+
|
|
43
|
+
- **A2-R PASS**:`tmp/dsh-gokifu-compact/test-home/`(独立 `DSH_HOME` + profile `test`,headless 不占端口)——
|
|
44
|
+
`compaction start → summary → end` 一次完整、`foldCount=1`、摘要含完整棋谱结构;桌面
|
|
45
|
+
`profiles/desktop/cordis.patch.yml` sha256 `047a342e…` / mtime / size **三项跑前跑后全同**,19387 同 PID 仍在监听。
|
|
46
|
+
- **A3-R PASS**:在 `0b61fb9` 干净树上复跑(跑前/跑后 `git status` 均 0 项)—— EXIT 0、`foldCount=1`、摘要 **7 段齐全**、桌面与仓库零变化。
|
|
47
|
+
|
|
48
|
+
**验证**
|
|
49
|
+
|
|
50
|
+
- 全量:**430 passed / 0 failed**(36 个测试文件;A3-2-fix 426 + A3-3 新增 4)
|
|
51
|
+
- `rooms` 架构门禁:**15/0** · `verify-install`:**16/16**
|
|
52
|
+
- `bench 2000`:**351 tokens** / 1.133 ms(81,260 / 386,945 字符、1.41 MB、2001 节点)—— 与迁移基线逐字一致
|
|
53
|
+
- `npm pack --dry-run --json`:**67 文件** / 539,339 B / `9f7e2a4b0c923066eb7ef29ffa6d26364da6715f`;`test/`·`tmp/`·harness 命中 **0**
|
|
54
|
+
|
|
55
|
+
**未验证(必须知道)**
|
|
56
|
+
|
|
57
|
+
- **A2-R / A3-R 都是隔离实例,不是 live 桌面重启** —— live 侧(19387)的注入与落盘行为仍未在真实会话中观测。
|
|
58
|
+
- **运行期收益未验证** —— 性能数字全部来自离线夹具。
|
|
59
|
+
- `lib/client.js` 的 `FIELDS`(15 键)仍是配置的第 4 份来源(收敛 4/5),留待 R12。
|
|
60
|
+
- R14 `migrate` 房间仍未创建(P6-C 原型在 `test/archive-dangling.mjs`,未接 CLI)。
|
|
61
|
+
|
|
62
|
+
## 1.10.0 — 2026-10-30
|
|
63
|
+
|
|
64
|
+
### 房间化架构:A2 五刀 + A3 前三刀(**GitHub 试用版,桌面不自动更新**)
|
|
65
|
+
|
|
66
|
+
> ⚠ **分发说明**:1.10.0 **只发 GitHub Release,不发 npm**。DSH 桌面端只认 npm registry,
|
|
67
|
+
> 因此**不会自动更新到本版**;想试用请从本 Release 的源码/tarball 手动安装。
|
|
68
|
+
> npm 上的 `latest` 仍是 1.9.3。
|
|
69
|
+
|
|
70
|
+
这一版把「上下文压缩后端」从单文件堆拆成 **16 个房间(R00–R15)**,落地了 A2 全部五刀与 A3 前三刀。
|
|
71
|
+
**行为零变更**:所有搬迁都是纯移动 + 旧路径留一行 `export * from "…"` 门面,热清单文本 / classify 判据 /
|
|
72
|
+
`graph.json`·delta 字节 / preset 块格式**一个字节都没动**。
|
|
73
|
+
|
|
74
|
+
**A2 · 五刀(抽房间 + 收敛配置来源 + 删死接口)**
|
|
75
|
+
|
|
76
|
+
| 刀 | 房间 | 内容 | 验收 |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| A2-1 | `R15 preset-format`(8,364 B) | preset 纯文本格式 `parseEngineBlock` / `renderEngineBlock` / `replaceCompactionBlock` / `engineBlock` / `KEY_COMMENTS`;`src/ui.mjs` 与 `scripts/install.mjs` 双用(install 必须 re-export,删掉会让 3 个测试红) | 390/0 · pack 65 |
|
|
79
|
+
| A2-4 | `R15 config-schema`(14,968 B) | 配置的**单一来源**:`SCHEMA` 23 键 / `PRESET_KEYS` 16 / `BASE_KEYS` 11;`resolve()` / `describe()` / `validatePatch()` / `engineBlock()` 全部派生。**收敛 4/5** —— `lib/client.js` 的 `FIELDS`(15 键硬编码)仍是第 4 份,留待 R12 | 401/0 · pack 66 |
|
|
80
|
+
| A2-5 | — | 死接口清理(纯删除):`renderTranspositionWarning` / `incomingEdges` / `outgoingEdges` 及 engine 里的无用 import / re-export | 401/0(同数)· pack 66(−664 B) |
|
|
81
|
+
| A2-2 | `R01 kifu-persist`(12,364 B) | 落盘与增量协议搬出 engine:`load` / `flush` / `persistBudget` / `paths`,吃注入的 fs `port`。**两处行为单列**:① load 读不出/版本不符 ⇒ `{repaired, repairedReason}` + 一行 warn(旧版静默建空图);② flush 失败 ⇒ `{ok:false, error, dirtyKept:true}`,dirty 照旧不清 | 412/0 · pack 67 |
|
|
82
|
+
| A2-3 | `R08 hot-inject`(12,554 B) | 每步注入策略搬出 engine(259 行):`#bindLedger` / `foldFailureWarning` / `ledgerDigest` / `findLedgerNode` / `messageTextOf` / `elideLegacyLedgers`;`createUserMessage` 由 R09 参数注入 ⇒ **R08 不 import DSH** | 424/0 · pack 68 |
|
|
83
|
+
|
|
84
|
+
> A2 之间还有一刀 **A2-2-fix**:`rooms` 门禁补 `ROOMS` 登记表与 4 条用例(未登记文件必须红、方向依赖断言),416/0。
|
|
85
|
+
|
|
86
|
+
**A3 · 前三刀(物理搬迁,旧路径留一行门面)**
|
|
87
|
+
|
|
88
|
+
| 刀 | 房间 | 文件 | 验收 |
|
|
89
|
+
|---|---|---|---|
|
|
90
|
+
| A3-1a | `R04 verify` | `src/verifier.mjs` → `src/rooms/verify.mjs`(17,914 B,325 行原样) | 424/0(同数)· pack 69 |
|
|
91
|
+
| A3-1b | `R02 fold-planner` | `src/range.mjs` → `src/rooms/fold-planner.mjs`(6,502 B,git 100% 相似度) | 424/0(同数)· pack 70 |
|
|
92
|
+
| A3-1c | `R05 world` | `src/worldstate.mjs` → `src/rooms/world.mjs`(3,292 B);内部 import `./graph.mjs` → `../graph.mjs`(下沉一层) | 424/0(同数)· pack 71 |
|
|
93
|
+
|
|
94
|
+
**四条可静态断言的架构方向规则**(`test/rooms.test.mjs`,9/0):
|
|
95
|
+
R-A `src/**` 不得 import `scripts/`/`lib/`;R-B R00–R08 不得 import `@deepseek-ai/*`/R09/R11/`scripts/`;
|
|
96
|
+
R-C **R09 之外**任何文件不得 import `@deepseek-ai/*`;R-D `lib/client.js` 不 import 仓库内文件、R10/R14 不 import R09。
|
|
97
|
+
|
|
98
|
+
**验证**
|
|
99
|
+
|
|
100
|
+
- 全量:**424 passed / 0 failed**(36 个测试文件)
|
|
101
|
+
- `verify-install`:**16/16**
|
|
102
|
+
- `bench 2000`:**351 tokens** / 1.336 ms(81260 / 386945 字符、1.41 MB、2001 节点)—— 与迁移基线逐字一致(ms 为运行噪声)
|
|
103
|
+
- `npm pack --dry-run --json`:**71 文件** / 537,438 B / `49c13887ff3fa9c23e46d573df7410f84b00b3a0`;`test/`·`tmp/`·harness 命中 **0**
|
|
104
|
+
- `rooms` 架构门禁:**9/0**
|
|
105
|
+
|
|
106
|
+
**未验证(必须知道)**
|
|
107
|
+
|
|
108
|
+
- **真机重启验证(A2-R)未做** —— 全部 424 项都在假 ctx / 夹具上跑;真实 surface `replace` 行为未在桌面 DSH 上观测。
|
|
109
|
+
- **运行期收益未验证** —— 性能数字全部来自离线夹具。
|
|
110
|
+
- A3 物理搬迁只做了 3/7 刀:`graph` / `keeper+extract` / `ledger` / `summary-prompt` 仍在原位。
|
|
111
|
+
|
|
3
112
|
## 1.9.3 — 2026-10-30
|
|
4
113
|
|
|
5
114
|
### 修 README 版本行(1.9.2 的发布缺陷)
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# dsh-GOkifu-compact
|
|
2
2
|
|
|
3
|
-
> 当前版本:**`1.
|
|
3
|
+
> 当前版本:**`1.11.0`** · npm [`dsh-gokifu-compact`](https://www.npmjs.com/package/dsh-gokifu-compact) · [GitHub Releases](https://github.com/MYCF711/dsh-GOkifu-compact/releases) · 更新记录见 [CHANGELOG.md](CHANGELOG.md)
|
|
4
4
|
|
|
5
5
|
**DSH 的棋谱式上下文压缩后端 —— 把「历史 → 一段摘要」换成「历史 → 可复盘的棋谱 DAG + 每步只有 323 tokens 的热清单」。**
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
热清单 323 tokens (2000 边压力测试;旧版全量渲染 28,800)
|
|
9
9
|
失败保留 8 / 8 (真实模型对照;官方 8 段模板 4.67 / 8)
|
|
10
10
|
清单开销 0.2% of prompt (v1.3.1 起;事故会话的旧版是 21.3%)
|
|
11
|
-
验证
|
|
11
|
+
验证 430 项单测 · 真实包 8/8 · 真实进程 fold 3~6/6
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
GO = 围棋,kifu = 棋谱,compact = 压缩。一局棋下完,棋谱上不只有落子顺序,还有每一手的评语。
|
|
@@ -1882,3 +1882,91 @@ QUICKSTART.md 01:47:37 4,953 B b6c32c6e9cf60fc2…
|
|
|
1882
1882
|
|
|
1883
1883
|
- 只写事实与契约;**不含新测量**。
|
|
1884
1884
|
- **未验证**:Release 正文内容;`git archive` 与工作树包差异(`01e358e1…` / 435,440 B)的完整成因;运行期收益(贯穿全篇的同一项)。
|
|
1885
|
+
|
|
1886
|
+
---
|
|
1887
|
+
|
|
1888
|
+
## 三十六 · ✅ **1.9.3 已发布并后验 PASS** · 1.9.2 缺陷修复链 + **A0 硬断言**(2026-10-30 03:44)
|
|
1889
|
+
|
|
1890
|
+
> 逐项证据见根 `计划表.md` §九十八–§一百、`ws-release-1.9.3/REPORT.md`(124 行)、`ws-post-publish-1.9.3/REPORT.md`(90 行)。
|
|
1891
|
+
|
|
1892
|
+
### 36.1 发布事实
|
|
1893
|
+
|
|
1894
|
+
| 项 | 值 |
|
|
1895
|
+
|---|---|
|
|
1896
|
+
| **commit** | **`283cac9d0fcd1b0bfddde950554bd76cbeac5aa5`** |
|
|
1897
|
+
| **tag** | **`v1.9.3`**(annotated,`03:37:59`)→ `283cac9` = `origin/main` |
|
|
1898
|
+
| **npm** | `@1.9.3` · **shasum `e117c876dde005d8cf34322937500bba2e74700d`** |
|
|
1899
|
+
| **包** | **61 文件 / 439,590 B / unpacked 1,117,957 B** · `latest=1.9.3` |
|
|
1900
|
+
| **全树指纹** | **`c2fe8e8749d172b342c37ca6be611502fdc320ee4fdce9270c9f678836537339`** |
|
|
1901
|
+
| **后验** | **PASS**(npm/tag/Release/tarball/doctor 全绿,无阻断) |
|
|
1902
|
+
|
|
1903
|
+
**门禁**:**A0**(新增)· G1 **378/0(30 文件)** · G2 **16/16** · G3 **6/0** · G3b doctor 0/2 · G4 **61 文件**。
|
|
1904
|
+
|
|
1905
|
+
### 36.2 🔑 **A0 硬断言:把这次的错变成机器拦截**(**本节最重要**)
|
|
1906
|
+
|
|
1907
|
+
> **A0:`README` 版本行 == `package.json` version** —— `README 1.9.3 / pkg 1.9.3 → PASS · EXIT 0`
|
|
1908
|
+
|
|
1909
|
+
**背景**:1.9.2 发布时 `package.json` 与 `CHANGELOG` 都改到 1.9.2,**唯独 `README:3` 的「当前版本」仍停在 1.9.1** ⇒ 包内第一眼就是错版本 ⇒ `task-62` 后验抓出 ⇒ 发 1.9.3 修。
|
|
1910
|
+
**⇒ 根因是「bump 时漏改一处」,这类错靠人眼查不住**(`README:3` 与 `README:11` 同在一屏,很容易只改一处)。
|
|
1911
|
+
**⇒ A0 把它变成了会 `exit` 非 0 的门禁步骤** —— **这就是「用门禁强制,别用文档要求」的落地。**
|
|
1912
|
+
|
|
1913
|
+
**⇒ 固化候选(建议补进 36.3 的下一次清单)**:
|
|
1914
|
+
1. **`CHANGELOG` 顶部版本 == `package.json` version**(目前只靠 G3 的 `check-maintenance` 间接保证);
|
|
1915
|
+
2. **`README` 里所有数字字段(单测数 / 文件数 / 版本号)一次性 `grep` 对照** —— 本次 `README:11` 的 `373 → 378` 是我漏掉、由 release 补上的(我上轮只 `grep` 了版本号)。
|
|
1916
|
+
|
|
1917
|
+
### 36.3 1.9.2 `FAIL` → 1.9.3 修复链
|
|
1918
|
+
|
|
1919
|
+
```
|
|
1920
|
+
1.9.2(03:22:55): pkg ✅ / CHANGELOG ✅ / README:3 ❌(1.9.1)
|
|
1921
|
+
↓ task-62 后验 FAIL
|
|
1922
|
+
1.9.3 修复: README:3→1.9.3 · README:11 373→378 · CHANGELOG 加 1.9.3 节 · pkg→1.9.3
|
|
1923
|
+
↓ 新增 A0 硬断言
|
|
1924
|
+
门禁通过(378/0 · 16/16 · 6/0 · 61/439,590/e117c876)
|
|
1925
|
+
↓
|
|
1926
|
+
1.9.3 发布 → task-65 后验 PASS
|
|
1927
|
+
```
|
|
1928
|
+
|
|
1929
|
+
**🔴 一条不可逆后果(已发布内容改不回来)**:**`dsh-gokifu-compact@1.9.2` 包内 `README:3` 永久是 `1.9.1`(npm 不可变)**,只能靠 1.9.3 覆盖用户的安装来源。
|
|
1930
|
+
**⇒ 定稿:发布前的版本一致性检查是**唯一**机会 —— 发出去的错改不回来。**
|
|
1931
|
+
|
|
1932
|
+
### 36.4 包内容 5 文件 diff(**证明「无未知成分」**)
|
|
1933
|
+
|
|
1934
|
+
方法(release 侧):`curl` 拉 registry 的 `1.9.2.tgz` 解包为基线,对 1.9.3 的 `files[]` **逐条 `Buffer.equals`**。
|
|
1935
|
+
|
|
1936
|
+
| 文件 | 1.9.2 | 1.9.3 | 差 |
|
|
1937
|
+
|---|---:|---:|---:|
|
|
1938
|
+
| `CHANGELOG.md` | 74,894 | 75,671 | **+777** |
|
|
1939
|
+
| `README.md` | 14,351 | 14,351 | **0(同大小、内容不同)** |
|
|
1940
|
+
| `docs/方案-持续优化.md` | 151,971 | 156,395 | **+4,424** |
|
|
1941
|
+
| `docs/草稿-持续优化.md` | 97,028 | 101,119 | **+4,091** |
|
|
1942
|
+
| `package.json` | 2,293 | 2,293 | **0(同大小、内容不同)** |
|
|
1943
|
+
|
|
1944
|
+
**其余 56 个文件逐字节相同;文件数 61 = 61;无未知成分。**
|
|
1945
|
+
**⇒ `+3,825 B`(tarball)来源 = `docs/` 两份(未压缩 +8,515)+ `CHANGELOG` +777,压缩后吻合。**
|
|
1946
|
+
**⇒ 同时给出两个「同大小、内容不同」实例(`README` / `package.json`)—— 第三次印证「尺寸不能判断有无变更」。**
|
|
1947
|
+
|
|
1948
|
+
### 36.5 🔴 基线起点纪律:**三次同型事故后的定稿**
|
|
1949
|
+
|
|
1950
|
+
| 次 | 场景 | 后果 |
|
|
1951
|
+
|---|---|---|
|
|
1952
|
+
| 1(1.9.1) | 先打基线 → scribe 改 `docs/方案` 修 V4 | **G4 基线作废 ⇒ re-gate** |
|
|
1953
|
+
| 2(1.9.2) | scribe 报 03:21:19 快照 → release 03:21:41 回填 373 | **确认的 `f2da22b4…` 立即过期** |
|
|
1954
|
+
| 3(1.9.3) | 预检跑完 → `CHANGELOG` **03:36:40** 又改 +114 B | **`03:35:23` 起点被越过** |
|
|
1955
|
+
|
|
1956
|
+
> **定稿:基线起点的唯一可靠定义 = 写入方签字停手之后的现测时刻。**
|
|
1957
|
+
> **任何由第三方观察推定的时刻都会被打穿** —— 观察只能看到「已经发生的写入」,看不到「还没发生的写入」。
|
|
1958
|
+
|
|
1959
|
+
**四步操作(缺一不可)**:① 写入方回「已停」;② 停手后立刻现测六份 `mtime + sha256`;③ **再跑 `npm pack` 取 shasum**(必须在 ② 之后);④ 基线记录同时写「时刻 + 六份 sha + pack shasum + 全树指纹」。
|
|
1960
|
+
**⇒ 推论:`precheck` 与 `baseline` 是两个不同东西 —— 预检用来「发现阻断」,基线用来「事后对账」。** 1.9.3 的预检 shasum `7070e8e5…` 已被后续写入作废,就是实证。
|
|
1961
|
+
|
|
1962
|
+
### 36.6 后验清单的**正面范式**(建议固化为发布流程的最后一步)
|
|
1963
|
+
|
|
1964
|
+
1. **只验发布物**(npm tarball + `git archive`),**不验工作树**(避免被后续改动污染出假通过);
|
|
1965
|
+
2. **六项逐位比对**:`shasum` / `integrity` / `unpackedSize` / tag 三处 commit / Release 字段 / 解包内容;
|
|
1966
|
+
3. **解包后实跑 `doctor`** —— 证「包里的东西**能跑**」,不只是「文件在」;
|
|
1967
|
+
4. **把上一版的缺陷项单独列出来验**(`README:3` / `README:11`),**不泛泛说「都 OK」**。
|
|
1968
|
+
|
|
1969
|
+
### 36.7 本节边界
|
|
1970
|
+
|
|
1971
|
+
- 只写事实与纪律;**不含新测量**。
|
|
1972
|
+
- **未验证**:真机 `npx install` 到真实 profile;Release 正文未逐字核;`assets=[]` 是否本应有附件;运行期收益(贯穿全篇的同一项)。
|