dsh-math-calculator 2.3.2 → 2.3.4

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 CHANGED
@@ -2,6 +2,198 @@
2
2
 
3
3
  本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
4
4
 
5
+ ## [2.3.4] — 2026-11-08
6
+
7
+ 按「总长可以扩容,但控制好一次任务的查询消耗」重做 help 结构。
8
+
9
+ ### 变更(从 14 节拆成 26 节)
10
+
11
+ 先测成本结构,才决定往哪扩:
12
+
13
+ ```
14
+ schema 6212 字符 每轮固定付,拆节降不了 → 不动
15
+ 目录 1083 字符 按需付一次
16
+ 单节 800~8707 按需付 → 最贵是 domains 8707
17
+ ```
18
+
19
+ 所以扩容必须发生在**按需层**。当时有两节是「多个场景压在一起」:
20
+
21
+ ```
22
+ domains 8707 九个互不相关的领域(梁柱/热机/流体/生态/宏观/材料/生物/财政/GDP)
23
+ recipe 5371 三条场景配方 + 通用手法 + 错误码,材料推演独占 2834(53%)
24
+ ```
25
+
26
+ 查「财政赤字」要读梁柱挠度与 Péclet 数;查「帝国会不会崩」要先读 2834 字符材料链。
27
+ 这不合理,所以拆开:
28
+
29
+ ```
30
+ domains → d-struct / d-thermal / d-fluid / d-ecology / d-macro
31
+ d-material / d-bio / d-fiscal / d-gdp (每节 613~1553)
32
+ recipe → recipe / recipe-errors / recipe-fiscal
33
+ recipe-bio / recipe-material (每节 200~2840)
34
+ ```
35
+
36
+ 效果:
37
+
38
+ | 指标 | 拆分前 | 拆分后 |
39
+ |---|---|---|
40
+ | 单节最大 | **8707** | **2840** |
41
+ | 一次典型任务(目录 + 平均节) | 3035 | **2382** |
42
+ | 查领域类内容 | 8707 | **613~1553** |
43
+ | schema(每轮固定) | 6212 | **6212(一分没涨)** |
44
+ | 目录 | 1083 | 1284 |
45
+
46
+ **目录多出的 201 字符,换来 12 个可独立查询的节。**
47
+
48
+ ### 说明(目录怎么控制住)
49
+
50
+ 12 个新节在目录里只给「key=六字标签」一行,不给标题 + 简介:
51
+
52
+ ```
53
+ 领域公式(各 600~1600 字符,按需查):
54
+ d-material=材料本构 · d-bio=生物通用 · d-struct=梁柱结构
55
+ 推演配方(场景特定,按需查):
56
+ recipe-fiscal=文明崩溃链 · recipe-material=材料三层链 ...
57
+ ```
58
+
59
+ 若每节都给两句简介,目录会从 1083 涨到 1821 —— 那等于把「按需付费」又搬回「每次都多付」。
60
+ key + 六字标签足够让人知道**有这一节、叫什么**,详细内容查时再付。
61
+
62
+ ### 测试
63
+
64
+ 98 套 / 4843 项全绿。help-topics 从 76 项扩到 99。
65
+
66
+ 四条旧断言按**原意**更新(不是降标准):
67
+
68
+ | 断言 | 改法 | 理由 |
69
+ |---|---|---|
70
+ | 目录 ≤ 1250 | → ≤ 1400 | 26 节、12 个新节压成紧凑行后实际 1284 |
71
+ | core 节数 9 | → 21 | 拆分产出的节都是 core(它们是公式,不是冷门功能)|
72
+ | core 权重中位数 > extra × 2 | → `>=` | 原判据建立在「core 只有 6 节」;真正要守的是**分档不倒挂** |
73
+ | 高频节简介必须在目录里 | → summary 前 10 字**或** short 在目录里 | 紧凑组只给 short,可发现性仍成立 |
74
+
75
+ schema 预算仍是硬约束且达标:`parameters` 5798/5900、总长 6212/6231、描述 414/450。
76
+ ## [2.3.3] — 2026-11-08
77
+
78
+ 针对三份实践文档(不足清单 17 条、能力评估 4 处缺口、结构性不足 8 条)
79
+ 逐条实测核对。**结论是多数已在本版之前修好**,本版只做确实还缺的四项,
80
+ 外加一处发现路径重构。
81
+
82
+ ### 新增(formula 批量调用)
83
+
84
+ 文档原话:「需要对 22 条公式做批量调用,但 formula 不支持数组,
85
+ 每次只能拆成单条 evaluate,**等于放弃了公式库的全部价值**。」
86
+
87
+ ```
88
+ formulas:[{formula:'kleiber', overrides:{m:100}, label:'大鼠'},
89
+ {formula:'kleiber', overrides:{m:9000000}, label:'巨兽'}]
90
+ ```
91
+
92
+ 复用 `opFormula` 而非重写 —— 单个调用涉及严格解析、单位换算、terse、
93
+ 适用域提示、未生效 key 上报,重写必然漂移。而「单条能算、批量算得不一样」
94
+ 正是本项目反复修过的那类缺陷(1107 报告的批量非有限值)。
95
+
96
+ ### 新增(recurrence 离散递推)
97
+
98
+ 文档给了具体数字说明为什么 `ode` 顶不了:
99
+
100
+ ```
101
+ 离散(每年 ×2) 2^19 = 524,288
102
+ 连续(dP/dt=0.693P) e^(0.693×19) = 522,824 差 0.28%
103
+ ```
104
+
105
+ 0.28% 看着可忽略,但第 33 年换成本「亿人」时差 0.5 亿 ——
106
+ **而写作时写的是「第 33 年,四十二亿人」这种具体整数。**
107
+
108
+ ```
109
+ recurrence:"P*2" periods:20 → 逐期表 + 终值
110
+ recurrence:"P*min(1.2, 1000/P)" → 第 38 期收敛到 1000
111
+ ```
112
+
113
+ 结果末尾直接给「连续近似 vs 离散」的差额,让作者一眼看出用 ode 顶替会差多少。
114
+
115
+ ### 新增(ode 的 `at` 指定采样时点)
116
+
117
+ 文档原话:「我要第 5/10/20 年的值,`ode` 给的是 t=1, 2.9, 4.8, 6.7…
118
+ **没有一年是我要的**。」
119
+
120
+ 现在 `at:[5,10,20]` 用同一套 RK4 走到该时点输出,**不是插值** ——
121
+ 插值会在「第 5 年 1,750.3 人」这种地方引入误差,而年表要的是准数。
122
+
123
+ ### 修复(马力族单位只认 `hp`)
124
+
125
+ 文档原话:「轴马力与指示马力差 5–10%,工具分不出,使用者只能手工乘系数 ——
126
+ 那正是四起千倍级事故中**三起**的源头。」
127
+
128
+ 单位表其实早有 `hp_metric`/`hp_boiler`/`hp_electric`,缺的是**行业实际写法**。
129
+ 补 `shp`、`ihp`、`bhp`、`hp(metric)`、`PS`。另有两处须特殊处理:
130
+
131
+ | 写法 | 为什么不能直接注入 | 处理 |
132
+ |---|---|---|
133
+ | `hp(metric)` | 含括号,进不了「纯中文」展开表;被解析成「调用 hp 函数」 | 归一化层改写为「公制马力」 |
134
+ | `PS` | **在 mathjs 里是电导单位**(量纲 S),`known()` 放过它 → `1 PS to W` 报 unit_mismatch | 同样改写 |
135
+
136
+ ### 变更(help 目录按「算术 / 建模」重分组)
137
+
138
+ 这是三份文档里最该修的一条。原话:
139
+
140
+ > 「一个能做动力学 + 参数扫描 + 499 条领域公式的工具,**被排在了『低频』栏里**。」
141
+ > 「我写了 300 行 Python 做逐年迭代、参数扫描、双状态耦合 ——
142
+ > 而 ode、sensitivity、formula 就在那里,只是排在低频栏最后一行。」
143
+
144
+ 原始证据很硬:该会话调用 18 次、手写 6 个脚本约 300 行,而脚本做的事工具全有。
145
+
146
+ ```
147
+ ── 一、算术 ── evaluate / units / solve
148
+ ── 二、建模与推演 ── ★ 正在手写循环/逐年表/参数扫描?先看这几节
149
+ ode / formula / world / derivation / recipe / domains
150
+ ── 三、其余能力 ── workspace / linalg / stats / constants / balance
151
+ ```
152
+
153
+ `ode`、`derivation`、`recipe` 从 extra 升为 core(core 6 → 9 节)。
154
+ **分档依据从「纯实测频率」扩成「频率 + 错过的机会」** ——
155
+ 频率只反映已经发生的使用,反映不了「本该用而没用」的机会数,
156
+ 而那正是这份文档暴露的核心问题。
157
+
158
+ ### 修复(一处结构缺陷:批量字段被无条件重建覆盖)
159
+
160
+ `runMathTool` 里 `const result: MathResult = { ok: true, ... }` **无条件重建**返回对象,
161
+ 把挂在 `outcome` 上的批量字段全丢了:
162
+
163
+ ```
164
+ 正文:成功 0,失败 3
165
+ 结构化:failed = undefined ← 读哪个?
166
+ ```
167
+
168
+ 正文与结构化字段不一致比只给正文更糟。现在显式搬运 `ok`/`partial`/`failed`/`succeeded`。
169
+ 这条影响所有 operation,所以测试里加了逐类复查。
170
+
171
+ ### 说明(核实后判定「已经修好」或「不改」的部分)
172
+
173
+ 文档里多数条目实测已在本版之前修复,逐条留档:
174
+
175
+ | 条目 | 现状 |
176
+ |---|---|
177
+ | 不足 2/3 批量漏检非有限值 | **已修**(1107):`failed=2`、`ok=false`、`partial=true` |
178
+ | 不足 6 `to` 报错分类 | **已修**:`not_a_quantity`,提示明确 |
179
+ | 不足 7 目标单位被忽略 | **已修**:`1 hp to kW` → `0.74569987 kW` |
180
+ | 不足 8 precision 静默算错 | **已修**:p=8/16 都有截断提示 |
181
+ | 不足 10 label 语法 | **已修**:help 已文档化对象形态,并注明 `=` 不支持 |
182
+ | 结构性 1 workspace 变量不生效 | **误判**:两步式(先 `set` 开开关)即可用 |
183
+ | 不足 11 单条/批量格式不一致 | **保留取舍**:批量要千分位与量级,单条要干净的数据通道 |
184
+
185
+ ### 测试
186
+
187
+ 98 套 / 4820 项全绿。新增 `gap-fills.mjs` 43 项。
188
+
189
+ 两处旧断言按**原意**放宽(不是降标准):
190
+
191
+ | 断言 | 改法 | 理由 |
192
+ |---|---|---|
193
+ | help 目录 ≤ 900 | → ≤ 1250 | 三节从折叠改为展开是按文档要求做的,不是膨胀 |
194
+ | 参数 `=== 46`、operation `=== 30` | → `>=` | 加参数会让这条红,而加参数是正常演进;改下限才守住「没被删」 |
195
+
196
+ schema 预算仍是硬约束且达标:`parameters` 5798/5900、总长 6212/6231、描述 414/450。
5
197
  ## [2.3.2] — 2026-11-08
6
198
 
7
199
  修一个**自己抓出来的量级错误**,并把材料部分扩成完整的三层推演链。
package/dsh.plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "dsh-math-calculator",
3
- "version": "2.3.2",
3
+ "version": "2.3.4",
4
4
  "main": "lib/index.js",
5
5
  "description": "DSH 原生数学与架空世界推演插件:高精度计算、404 条公式、常数与星球推演。",
6
6
  "engines": {