dsh-metaphysics 0.34.0 → 0.46.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/CHANGELOG.md CHANGED
@@ -1,8 +1,314 @@
1
+ ## 0.46.5(已发布 2026-10-30)
2
+
3
+ 「问进对话」只把盘面摘要和问题送进对话,模型得自己再推一遍结论——同一张盘,面板里读到的「说人话」和对话开场可能不是一套口径。这一版把面板已算好的白话结论一并交给模型。
4
+
5
+ - **缺口在哪**(`engine/followup.js`):`askPrompt` 只读 `r.summary`,而 `interpret(r, ask)` 产出的 `answer`(直答)与 `plain`(说人话)只存在于面板结果对象 `it` 里。用户点「问进对话」后,模型看到的是原始盘面,开场结论全靠现场发挥;问法或流派稍有出入,就会与面板上的结论打架。
6
+ - **改动**:`askPrompt(r, { interpret })` 新增可选解析对象;有 `interpret` 时,在「所问」与「盘面摘要」之间插入「开场结论」小节,原样带上 `answer`(直答)与 `plain`(说人话),并把回答要求第 1 条改成「先沿用上面的开场结论,再用一句不用术语的话说清主线」。调用方没传时回退读 `r.interpret`(`compute({ withInterpret: true })` 的结果);两者都没有就完全不加这一节,固定骨架保持原样。
7
+ - **接线**(`src/app.js`):面板两处调用都带 `interpret: result.it`;`LAST` 增加 `it` 字段,输入框右侧的「命理·问」也能拿到同一份白话底稿,而不是只带摘要。
8
+ - **账面**:1996 盘(所问「今年考运」)提问文本 2353 → 2669 字,底稿只多 316 字(直答 106 + 说人话 144 + 小节标题),没有把提问撑成小作文;未传解析时逐字不变。
9
+ - **口径**:底稿只做「同一口径」的搬运,不改写、不摘要;模型仍被要求压成一句无术语的话,避免直接复读盘面术语。
10
+ - **测试**:`test/ask-prompt.test.mjs` +13 条——底稿小节存在且排在摘要之前、直答/说人话原样带入、回答要求指向底稿、未传解析时不加小节、`r.interpret` 自动回退、空解析对象不加空小节、无问题时底稿不说「先答所问」、带底稿仍逐字确定;`test/client-bundle.test.mjs` +2 条锁住面板两处调用都带 `interpret`、桥的 `LAST` 保留解析对象。统计 **94 个测试文件 / 3643 条断言**,七道闸全绿。
11
+
12
+ ## 0.46.4(已并入 0.46.5)
13
+
14
+ 0.46.3 有三处「写进了文案、没落进代码」:文末分歧清单只列前 4 条、面板仍显示「问题:(未填写)/先答所问」、归属稳定性测试并不存在。这一版把三处补齐,并把它们钉进断言。
15
+
16
+ - **分歧清单不再截断**(`engine/interpret.js`):`caveats.slice(0, 4)` 让 1996 盘的 13 条分歧只显示 4 条,另有 9 条不在任何段落、其中 7 条原注整份报告都读不到——与 0.46.3 写的「信息不丢」相反。现在按状态拆开:「待核实」仍归「尚未实现(不猜)」并附原注;其余分歧逐条列出(已展开的只留条目名,未展开的附原注),同一句原注不会出现两遍。
17
+ - **没问事就别喊「答所问」**(`src/panel-kit.js`、`engine/index.js`):奇门只选方向时,面板回显原来是「问题:(未填写)|询问方向:财运」,直答标题也固定写「先答所问」。现在没填问题只回显方向,标题改为「先看结论」;填了问题仍用「先答所问」。奇门的直答也从泛泛的「五个维度」改为「排盘事实、用神、宫位条件几节」,并点明所选方向。
18
+ - **测试补真**(`test/interpret-dedupe.test.mjs`,28 条):归属稳定性按 7 个方向 × 有事/无事 逐一对拍「卡片→维度」签名;分歧清单断言行数等于条目数、未展开条目的原注必须在、已展开的不重复贴;`knowledgeCount` 同时与「唯一卡片数」「逐维挂载总数」独立核对;面板侧用源码锁住旧「(未填写)」串已删除。0.46.3 里那句没有测试支撑的说法,至此才有对应断言。
19
+ - **口径**:信息完整优先于尾部紧凑——文末清单从 4 行回到 13 行,1996 盘解析文本 9099 → 9965 字(无问题)/ 10051 字(有问题),`knowledgeCount` 仍为 10,正文五维没有新增复读。
20
+ - **测试**:新增 94 个文件 / 3628 条断言,七道闸全绿。
21
+
22
+ ## 0.46.3(已并入 0.46.5)
23
+
24
+ 同一段「规则注解」在报告里复读了两三遍:1996 示例盘的 29 条注解里,只有 16 张是不同的卡。这次把注解改成「一张卡全报告只挂一次、每维最多 3 条」,没填问题时也不再假称「你问的这件事」。
25
+
26
+ - **缺口在哪**(`engine/interpret.js` 的 `enrichPlain`):知识卡按维度静态挂载,而 `knowledgeFor(system, dimKey)` 对「整体运势 / 事业发展 / 健康」会返回同一批通用条目,于是「月令不是一个月」「大运管十年基调」「同一个格,子平真诠怎么用、三命通会怎么取」这类解释在正文里出现 2–3 次,把五段判断冲散。实测 1996 盘:整体 14 条、事业 10 条(9 条重复)、感情 3 条(2 条重复)、健康 2 条(两条全重复)——29 条里 16 张不同,段落被复读切成碎片。
27
+ - **改动**:先按固定维度次序(整体 → 工作 → 事业 → 感情 → 健康)分派,已出现过的 id 跳过,每维再截到 3 条。次序用固定表而不是显示顺序,是因为「所问之事」会把某一维提前——按显示顺序先到先得的话,同一张盘换个问法,注解归属就整体搬家(归属稳定性测试在 0.46.4 补上)。文末「这套规则有多稳」对已展开的条目只留一句索引,不再贴一遍全文;被截掉的分歧条目也应进文末清单(0.46.4 修正:此处当时实际只列了前 4 条,另有 9 条及其 7 条原注被漏掉)。
28
+ - **顺手**(`engine/interpret-plain.js`、`engine/interpret.js`):没填问题时抬头不再写「问题:(未填写)」,正文也不再假称「具体到你问的这件事」——改成「没指定问题,就按……的顺序往下看」。这是「读者视角」的最后一点漏:没问问题却硬答「你问的这件事」,最容易被当成模板腔(面板侧的回显与「先答所问」标题在 0.46.4 一并修正)。
29
+ - **账面**:1996 盘解析文本 11862 → 9099 字(−23%),`knowledgeCount` 29 → 10,五维正文之间不再有整块复读。
30
+ - **测试**:`test/interpret-knowledge.test.mjs` +5 条——同卡不重复、每维 ≤3、`knowledgeCount` 与实际挂载一致、无问题时抬头不写「未填写」、正文不假称「你问的这件事」。统计 **93 个测试文件 / 3600 条断言**,七道闸全绿。
31
+
32
+ ## 0.46.2(已并入 0.46.5)
33
+
34
+ 离线页的「验前事 / 生时校正」原来是原生控件:年份框 21px、按钮 31px 灰底;窄屏下三档判断按钮 22px,追问框 37px、导出按钮 39px,「点任一宫位看详情」只有 2.25:1。
35
+
36
+ - **缺口在哪**:这两块由 `web-ui.js` 输出 `.mp-btn` / `.mp-input`,但基础样式只写在 DSH 宿主的 `src/app.js` 里(且用的是 `--dsw-*` 变量),离线页从没定义过——于是年份与类型退回 21px 原生输入框,「算贴合度 / 计算候选时辰」退回 31px 灰按钮,和整页的米色卡片明显不是一套。
37
+ - **实测口径**:用无头 Chrome 通过 CDP 在 390px 视口、浅色/深色两套配色下逐个点开 19 个 tab,量 `#out` 内溢出、可点区域尺寸与文字对比度。修复前:验前事三档按钮 32×22、年份框 21px、按钮 31px;全页每个 tab 的追问框 37px、导出按钮 39px;紫微提示条 2.25:1。
38
+ - **改动**(只碰页面层与结果区模板):`tools/build-html.mjs` 给页面补一套同变量的 `.mp-verify/.mp-rect` 按钮与输入框样式(含聚焦环),窄屏把三档按钮排成等分三列、标签独占一行,`.mp-chip` / 验前事按钮 / 年份与类型框 / 追问框 / 导出按钮统一抬到 44px,追问输入改 16px 避免 iOS 聚焦缩放;`src/panel-kit.js` 的 `.pp-soon` 由 `--faint` 改 `--muted`(浅色 4.77:1、深色 7.73:1);`src/web-ui.js` 删掉两处把按钮压到 12px/31px 的行内样式。
39
+ - **口径不变**:颜色全走既有页面变量,深色仍是只换变量;`test/theme.test.mjs` 锁定的打印、深色、窄屏 tab 规则一条未动(50 条断言原样通过)。
40
+ - **测试**:新增 `test/ui-controls.test.mjs`(15 条)——页面控件样式、无硬编码色、窄屏 44px、提示条对比度(从变量声明取色独立复算)。修复后复测:19 个 tab × 浅/深 0 处横向溢出、0 个 <44px 控件、0 处对比度 <3:1。统计 **93 个测试文件 / 3595 条断言**(+15),七道闸全绿。
41
+
42
+ ## 0.46.1(已并入 0.46.5)
43
+
44
+ 偏财格不再引《论正财》,七杀格补上三命对照:九个走月令的格,这才真正做到「子平在前、三命在后」各一条。
45
+
46
+ - **缺口在哪**:三命通会此本正财、偏财分章,引擎却让两格共用 tag「财」——1996 示例盘就是偏财格,古籍节里挂的却是《三命通会·卷六·论正财》。七杀格更只有子平《论偏官》一条,没有三命对照,而 README 已写「同一个格,子平真诠在前讲怎么用,三命通会紧随作对照」。
47
+ - **两条原文**(`engine/classics.js`):`smt-piancai`(卷六·论偏财 7650,「乃众人之财也……切忌有姊妹兄弟分夺」)与 `smt-guansha-liu`(卷五·官煞去留杂论 7599,「天干透者易去,月支所藏者难去」)。均按典藏网章页逐字核验(2/2 通过),照录不加省略号,plain 为白话自撰。
48
+ - **七杀为何取「官煞去留杂论」**:该本三命通会没有单列「论偏官」章,硬凑一篇改名就是造出处;取同卷讲官煞混杂去留的这一篇作对照,章名照录,plain 写明「七杀格遇正官混杂,就按这一篇看取舍」。
49
+ - **接线**:`GEJU_KEY` 把正财格、偏财格拆成两个 tag,子平《论财》同时标「正财」「偏财」,于是两格都是子平在前、三命本格章在后;七杀格 / 偏官格指向官煞篇。5 条上限、专旺从格先占位、总纲位三选一均未动,其余盘选条逐字节不变。
50
+ - **文档与知识卡**:`bazi-sanming-duizhao` 补写「此本正财偏财分章、七杀无专章」;清单四·1 与 README 致谢的「十四篇」改对为十六篇;README 里写死的「90 个测试文件 / 3423 条断言」改为「取自断言基线」,避免每轮过期。
51
+ - **测试**:`test/sanming.test.mjs` 的条目分组由「章名是否以论开头」改为显式 id 清单(官煞篇不是「论」字题),新增偏财 / 七杀配对与正反两向(偏财不引正财章、正财不误取偏财章);`test/classic-quotes.test.mjs` 用 1996 偏财盘钉住对照条;`test/tongguan.test.mjs` 的 1996 选条期望同步为 `smt-piancai`。统计 **92 个测试文件 / 3580 条断言**(+13),七道闸全绿。
52
+
53
+ ## 0.46.0(已并入 0.46.5)
54
+
55
+ 紫微补齐九类流派开关:此前只做了闰月三档,换派只能拿到默认盘;现在每一项都能单独切换,且不传时盘面与旧版完全一致。
56
+
57
+ - **缺口在哪**:0.42.0 把参考项目的「其余九类流派开关」明确留作后续,引擎里亮度、庚干四化、天马、天空、截空旬空、魁钺、天伤天使、长生起点、晚子时都只有一种写法;工具 schema 也没有对应参数,模型侧无法要求「按全书派排」。
58
+ - **改动**(`engine/ziwei.js`):新增 `ZIWEI_SCHOOL_DEFAULTS` / `ZIWEI_SCHOOL_OPTIONS` / `ziweiSchoolsOf`,九个开关逐个落到安星与起盘——`brightnessSchool` 四套亮度数值表按星逐年转中文(QS/XD1 七档、ZZ/XD2 五档);`gengYearSihua` 五个庚干四化变体;`tianmaSchool` 年支/生月三合;`tiankongSchool` 不排/年支顺行/加生时;`jiekongSchool` 不排/单星/正副/占验,启用时同时排旬空副旬;`kuiyueSchool` 四派魁钺(生年与流年同表);`tianshiTianshang` 中州派阴男阳女互换;`changshengSchool` 火土派把土五局长生起点从申改寅;`lateZishi` next-day 时 23:00 后起盘日顺延。
59
+ - **接线**:`engine/index.js` 透传九个平铺参数与嵌套 `schools`(八字 × 紫微交叉验证同样生效);根 `index.js` 的 MCP schema 新增九个字段与枚举;摘要只在改动默认时补一行【流派】,默认盘不多噪音。
60
+ - **口径**:不传或传非法值一律回默认,默认仍是 49 星盘面;庚干变体只作用于生年四化,宫干自化与大限/流年四化不随之改变(已写进 `rules.schools`)。
61
+ - **测试**:新增 `test/ziwei-schools.test.mjs`(73 条)——默认盘逐字节不变、九项各自独立生效、非法值回退、嵌套参数、compute 透传与摘要。统计 **92 个测试文件 / 3567 条断言**(+73),七道闸全绿。
62
+
63
+ ## 0.45.2(已并入 0.46.5)
64
+
65
+ 玄空的 `period` 非整数不再静默落回九运,而是按入参错误报 `E_INPUT`。
66
+
67
+ - **缺口在哪**:`engine/index.js` 只把 `Number.isInteger(period)` 传给引擎,`2.5` 或字符串 `"9"` 会被直接丢掉,`buildXuankong` 随后走缺省分支排九运——调用方拿到的是一张看似正常的盘,而不是「运写错了」。
68
+ - **改动**:`buildXuankong` 先校验「显式给了 period 就必须是整数」(`null` / `undefined` 仍算未给),不符合与越界共用同一条 `E_INPUT` 文案;`index.js` 不再预先过滤 period,原样交给引擎判定。
69
+ - **口径不变**:合法 1–9 的整数仍优先于 `fortuneYear`;未给 period 时仍按 `fortuneYear` 定运,再缺省九运并注明。
70
+ - **测试**:`test/fengshui-xuankong.test.mjs` 补 4 条(非整数/字符串报错、错误码、`null` 仍缺省),`test/tool-fengshui.test.mjs` 补 2 条(两种非整数在工具层都显示 `[E_INPUT]`)。统计 **91 个测试文件 / 3494 条断言**(+6),七道闸全绿。
71
+
72
+ ## 0.45.1(已并入 0.46.5)
73
+
74
+ 风水引擎的入参校验改走统一错误工厂,工具层不再把「坐向写错」这类调用错误标成内部异常。
75
+
76
+ - **缺口在哪**:`engine/fengshui.js` 的坐向、性别、生日、运越界都裸抛 `new Error`,到 `index.js` 的工具 catch 里没有 `code`,一律落到 `[E_INTERNAL]`;模型侧据此会把「参数该改」误判成「插件坏了」。
77
+ - **改动**:六处入参校验改用 `fail('E_INPUT', …)`——非 24 山、命卦缺性别、命卦缺完整生日、缺坐向、坐向不对宫、运越界。`mingGua` 落中宫的「命卦计算异常:落中宫」是内部一致性守卫,不是入参错误,仍保持无码 → `E_INTERNAL`。
78
+ - **口径不变**:文案、判定条件与结果字段均未改,只补错误码;工具层现有 `code || E_INTERNAL` 的透传逻辑不用动。
79
+ - **测试**:`test/tool-fengshui.test.mjs` 补 7 条(+7)——运越界与坐向不对宫各加一条码断言,另表驱动五组入参错误,要求文案匹配且前缀恒为 `[E_INPUT]`。统计 **91 个测试文件 / 3488 条断言**(+7),七道闸全绿。
80
+
81
+ ## 0.45.0(已并入 0.46.5)
82
+
83
+ 把「通关」从一句取象变成可复核的结构判定:用神与忌神相战时,指出五行里唯一能接上的那一行,并如实报它在局中的分量。
84
+
85
+ - **缺口在哪**:`engine/geju.js` 的文案一直写「身中和,先取调候与通关」,但引擎从未算过通关;`classics.js` 也只录了寒暖/燥湿等滴天髓条目,没有通神论「通关」原文。
86
+ - **判定口径**(`engine/geju.js` 的 `tongguanOf`):只在「用神与克它的忌神两行在局中各 ≥1.5 分」时成立相战;通关行由五行生克唯一确定(克方所生、又生用神,金克木以水为关),按分量分「可通 / 关弱 / 为忌 / 未通」四档,`usable` 仅指「可通」。通关行若在本盘属忌神,只标「为忌」、不当桥用;只写进用神 detail、摘要与解释层,不折分数、不断吉凶,也不判通关之力够不够用。
87
+ - **原文与选条**(`engine/classics.js`):新增 `dt-tongguan`(通神论·通关,典藏网 153091,原句照录「关内有织女,关外有牛郎,此关若通也,相邀入洞房」)。只在 `usable` 时占一位,并让泛论「用神配气候」让位;寒暖/燥湿的具体条目照留,整节仍以 5 条为限。未通的盘(如 1996 盘)经典选条保持原样。
88
+ - **知识卡**(`engine/interpret-knowledge.js`):新增 `bazi-tongguan`,标 `variant` 并写明分歧——各家对「两神相战」取哪两神不一(日主与官杀 / 用神与忌神 / 局中最旺两行),本插件固定取用神与克它的忌神。知识库 50 条(15 / 34 / 1)。
89
+ - **已知边界**:调候与扶抑可能给出同一行同时在喜在忌(扫射中约四分之一盘);本插件不改写喜忌表,通关判定按现表计算,并在清单里写明。
90
+ - **测试**:新增 `test/tongguan.test.mjs`(58 条)——五组相克各给唯一通关行、1.4/1.5 阈值与四档分类、喜忌顺序与空结果、24 年逐月真实盘独立重算与确定性、可通/未通两盘的经典选条、摘要/解释层/面板可见性与知识卡。统计 **91 个测试文件 / 3481 条断言**(+58),七道闸全绿。
91
+
92
+ ## 0.44.2(已并入 0.46.5)
93
+
94
+ 补齐模型侧调用玄空的最后一环:工具 schema 声明 `action:'xuankong'` 与 `period`,并让「今年」只补进命卦。
95
+
96
+ - **缺口在哪**:玄空下卦在引擎与两个界面都能用,但模型工具 `metaphysics_chart` 的 `action` 枚举只有 natal / advise / assess / generate,没有 `xuankong`,也没有 `period` 参数——对话里让模型排玄空,schema 层面就过不去。
97
+ - **另一个隐患**:`run()` 原先把「没给 fortuneYear 就补今年」的规则写成「fengshui 且不是 advise」,玄空一旦可调用,缺省会得到 fortuneYear=今年,九运缺省提示永远不出现,按年定运与默认九运两种口径悄悄混在一起。现在只对 natal(含未写 action 的缺省)补年份,玄空严格走 `period` → `fortuneYear` → 九运并注明。
98
+ - **改动**(`index.js`):`action` 枚举加 `xuankong`;新增 `period`(1–9,优先于 fortuneYear);`sitting` / `facing` / `fortuneYear` 与 `system` 的说明同步覆盖玄空;年份补全条件收窄到 natal。
99
+ - **口径不变**:显式 `period` 优先;给了 `fortuneYear` 按该年定运并回运程起止;两者都没有才缺省九运(2024–2043)并写明提示。
100
+ - **测试**:新增 `test/tool-fengshui.test.mjs`(19 条)——枚举与 period 声明、显式运不注入年份、按年定运的起止、缺省九运且不被今年顶替、命卦仍默认今年、非法运与坐向不自洽在工具层报错。统计 **90 个测试文件 / 3423 条断言**(+19),七道闸全绿。
101
+
102
+ ## 0.44.1(已并入 0.46.5)
103
+
104
+ 风水结果在 DSH 侧栏与独立页同步换了展示:从一段摘要文本变成方位网格,侧栏主按钮文案也按 tab 归位。
105
+
106
+ - **为什么**:上一轮把玄空下卦算出来了,但结果只是 `renderText` 的文本墙——九宫运/山/向挤在方括号里,旺山旺向与表法只能逐字读。侧栏面板里这个问题更明显(没有等宽排版)。
107
+ - **共用一份渲染**(`src/panel-kit.js` 的 `pp.fengshuiHTML`):侧栏(`src/app.js`)与独立页(`src/web-ui.js`)都挂到同一个函数,改一处两边同步。
108
+ - **玄空**:按后天八卦三行九宫(巽离坤 / 震中兑 / 艮坎乾),每宫依次列运/山/向三数;与当运相同的数高亮(中宫运数本身即当运,故 9 运、8 运各 3 处高亮);卡头写山盘/向盘的入中星与顺逆,以及「盘面」「表法」两个独立 chip;下方事实行写当运落宫、合十、表法说明。
109
+ - **八宅命卦**:八向格(中宫留空)标星名与吉/凶,四吉四凶各四;给了流年时加一行年紫白(入中星 + 八宫星名)。
110
+ - **门主灶**:同一张八向格 + 门/灶/床/厕四行 + 命宅配(给了生辰才有)。
111
+ - 所有文本走 `esc()`,布局文案或宅卦名里塞 `<img>` / `<script>` 不会变成标签。
112
+ - **侧栏动作按钮**:速查类 tab(黄历/农历/择日/称骨/小六壬/星座/生命数字/人生K/风水/起名)由「起卦」改为「看结果」,奇门为「起局」,空状态提示同步改成「填好参数,点『看结果』」。
113
+ - **没改什么**:引擎与输出字段未动,仍是展示层改动;`meta.scope` 与免责声明原文照旧。
114
+ - **测试**:新增 `test/fengshui-ui.test.mjs`(43 条)——九宫顺序与 27 个数、当运高亮、9 运无局与 8 运乾巽到山到向两套盘、八宅四吉四凶与年紫白、门主灶四行与命宅配、转义、侧栏/独立页接线与按钮文案。统计 **89 个测试文件 / 3404 条断言**(+43),七道闸全绿。
115
+
116
+ ## 0.44.0(已并入 0.46.5)
117
+
118
+ 风水补上一直挂着的玄空飞星:不是只加一张表,而是把「运盘 → 山盘 → 向盘」的挨星规则真正跑通,并让盘面与通行旺山旺向表逐运对得上。
119
+
120
+ - **缺口在哪**:README 的风水段一直明写「不含玄空各运盘」。八宅命卦、大游年、年紫白都是单星飞布,缺的正是玄空最核心的**下卦三盘**:当运星入中排运盘,再取坐宫/向宫的运星入中排山盘、向盘,最后看当运山星是否到坐、当运向星是否到向。
121
+ - **关键口径(这一轮最容易踩错的地方)**:山盘/向盘的顺逆**不是**按坐山本身的阴阳,而是按「入中运星的本宫(本位卦)同元龙之山」的阴阳;五黄入中时按本山阴阳。按本山阴阳会把旺山旺向算成每运固定的六局,与通行二十四山旺山旺向表(一运、九运无局)对不上;改按本宫同元龙后,九运旺山旺向表与盘面逐运吻合。
122
+ - **新增能力**(`engine/fengshui.js`):`periodOfYear`(1864 起一运、每运 20 年、九运 180 年一轮)、`MOUNTAIN_META`(24 山三元龙与阴阳)、`xuankongChart` 与 `action:'xuankong'`。输出九宫逐宫的 `运/山/向`、山盘与向盘的入中星与顺逆依据、当运星落宫、山星/向星合十宫位,以及**表法**旺山旺向(通行表)与**盘面**旺山旺向(当运星是否落坐/向)两套结论并列;两者口径不同,不合并、不互相覆盖,文案里写明差在哪。缺省运为九运(2024–2043)并给出提示,也可传 `period`(1–9)或 `fortuneYear`。
123
+ - **没做什么**:替卦 / 兼向、年月日时飞星、形峦与现场勘舆、具体应期。`meta.scope` 与免责声明逐条写明。
124
+ - **界面**:面板与独立页的风水速查加第三个模式「玄空」,坐山/朝向沿用 24 山输入,另加「运(1–9)」输入;结果仍走摘要文本,九宫按「巽离坤 / 震中兑 / 艮坎乾」三行排出。
125
+ - **测试**:新增 `test/fengshui-xuankong.test.mjs`(119 条)——三元九运边界、24 山三元龙阴阳逐条、七张公开盘面数字(含双星会向、五黄入中)、每运 12 局三盘均为 1–9 排列、**盘面旺山旺向与通行表逐运一致**(两套独立数据互证)、坐向互通、216 局确定性、运的来源与输入边界、`compute` 接线与摘要。统计 **88 个测试文件 / 3361 条断言**(+119),七道闸全绿。
126
+
127
+ ## 0.43.1(已并入 0.46.5)
128
+
129
+ 专旺格与从格终于有原文可读:三命通会里其实有七篇专章,此前清单写的「三书没有可整段照录的专章」是错的。
130
+
131
+ - **缺口在哪**:`docs/知识扩展与待核实清单.md` 四·1 一直写着「专旺格与从格暂无对应的单章原文条目(三书里没有可整段照录的专章),暂不硬凑」。核对典藏网目录后发现三命通会卷六有曲直、炎上、从革、润下、稼穑五篇,卷五有弃命从煞、卷六有弃命从财——正好对着引擎里已有的专旺五格与从财格、从杀格。于是这一轮不是「补口径」,是补上本可以早就有的原文。
132
+ - **七条原文**(`engine/classics.js`):`smt-quzhi`(卷六·曲直 7630)、`smt-yanshang`(卷六·炎上 7631)、`smt-congge`(卷六·从革 7632)、`smt-runxia`(卷六·润下 7633)、`smt-jiasi`(卷六·稼穑 7634)、`smt-congsha`(卷五·弃命从煞 7598)、`smt-congcai`(卷六·弃命从财 7652)。原文取连续段落照录、不加省略号也不改写;白话自撰。原文里「多主眼疾」「破家不仁之人」这类旧说重话照录,但明确只记原文、不拿来断人。
133
+ - **接线**(`classicsFor`):命中的专旺格 / 从财格 / 从杀格先取单章原文,排在月令格之前——专旺或从格是这张盘的定义性结构,先占位才不会被后面两条气候与总纲挤掉;整节仍以 5 条为上限,不额外放宽。从儿格(食伤)、从强格(印 / 比劫)三书里没有可整段照录的专章,`SPECIAL_CLASSIC` 不登记、不硬凑,测试里用两张真实盘反向核过「不误配」。
134
+ - **知识库 49 条**:新增 `bazi-zhuanwang-yuanwen`(专旺五格的成格条件比「身强」细)与 `bazi-congge-yuanwen`(弃命相从、见根气即破格),均标 `variant`——专旺是否必须成方局、从格是否允许微根,各家宽严不一;只列结构与原文,不断贵贱,也不补专旺的破格条件。顺手把清单表格里漏登的三条历史条目(紫微三方四正复合飞化、六爻用神旺衰、六爻全卦逐爻旺衰)补齐,表格从 44 行对到 49 条。
135
+ - **口径修正**:清单四·1 与 README 致谢里「三书没有专章 / 只取七条」的说法一并改对,写明「十四篇:论十神七篇 + 专旺五格与弃命从煞、从财七篇」,并注明从儿、从强仍未录。
136
+ - **测试**:`test/classic-quotes.test.mjs` 新增七张真实盘(曲直 / 炎上 / 从革 / 润下 / 稼穑 / 从财 / 从杀)逐格核「命中的单章排第一、why 点名、仍守 5 条上限」,另加从儿 / 从强两条反向用例、limit 截断、摘要与解释层可见;`test/sanming.test.mjs` 条目数由 7 改为 14(并拆出「7 论十神 + 7 格局篇」两个计数),逐条核原文、章名、典藏网链接、链接互不重复、tag 不与月令十神混用,并钉住两张新知识卡。统计 **87 个测试文件 / 3242 条断言**(+57),七道闸全绿。
137
+
138
+ ## 0.43.0(已并入 0.46.5)
139
+
140
+ 解读从「五维度 + 若干节」升级成可读的报告:紫微补逐宫与分层格局,八字补命局框架、画像、流年叙述与专业建议;措辞收进两份独立词库,引擎与说法彻底分开。
141
+
142
+ - **缺口在哪**:此前的解读只有五个维度和几张表——维度说得对,但不成篇。用户拿到紫微盘,看不到「这十二个宫各自是什么味道」;拿到八字盘,看不到「这个人的框架、长什么样、哪一年顺」,只能自己去拼盘面。对照市面上的成篇解读,差的是**结构与措辞**这两层,不是数据。
143
+ - **紫微新增四块**(`engine/interpret.js`):① **命身底色**——命宫主星 + 亮度 + 双星组合 + 身宫落点一句话说清;② **逐宫分析**——十二宫各一条 `【宫·支】主星(亮度)|吉星|煞星|四化`,下接「读法」;③ **三层格局**——有利格局 / 结构提示 / 忌格提醒,每条写 `名称 · 人话 · 依据(盘面事实) · 做法`,按 tone 着色;④ **行动建议**四条。只把六煞(擎羊/陀罗/火星/铃星/地空/地劫)写进五个维度,其余杂曜留在逐宫,避免一眼看去全是星名。
144
+ - **八字新增四节**:**命局框架**(日主/用神/格局三行,末尾一句命局基调)、**正面画像**(外在取象 / 性格底色 / 事业与家庭)、**流年时间轴**(近三年逐条给档位与理由,用「可能性」措辞并声明档位不是断语)、**专业建议**(喜用落地 / 忌神自觉 / 地支关系 / 调候四件可做的事)。
145
+ - **两份词库**(新增 `engine/ziwei-words.js`、`engine/bazi-words.js`):紫微侧 12 宫取象、14 主星(别称/关键词/得地与失地两种语气/长处/要留意的点)、24 组双星、14 煞星、18 吉星、四化落宫、七档亮度、34 条格局读法;八字侧 10 天干取象、10 颗十神 + 5 组(十神权重底层给的是组名,组与单颗各有一套话)、旺衰 × 用神方向的六种命局基调、地支冲合刑害破的手感。**词库不含判断条件**——要不要说、说哪一条由引擎决定,换个排盘引擎结论也不会被说反。
146
+ - **命局基调按权重取**:`frameToneOf(level, favorRoles)` 只看角色不动分数;调用方先把 `favorRoles` 按十神权重排好再传入,于是「身强喜食伤财官杀」取到的是分量最重那一支(泄),而不是固定顺序的第一条。强档没有对应基调时回落「泄」、弱档回落「生」,都写明理由。
147
+ - **面板**:分节支持 tone(左框线 + 标题色:有利绿、提示橙、忌格红)与 `**加粗**`、换行分段(此前整节挤成一坨);逐宫、三层格局各有独立锚点,目录可跳。
148
+ - **术语表**(`engine/interpret-plain.js`):补 庙旺 / 三方四正 / 命主 / 身主 / 五行局 / 自化 / 飞星 / 正曜 / 借对宫 / 双星 / 墓库 / 伏吟 / 反吟 十三条,仍按「正文里真的出现过」才展示,并按体系取不同释义。
149
+ - **顺手改掉两处重复**:紫微「说人话」不再复述直答里的命宫与身宫,改说「你与环境怎么互动」与重心;八字性格底色的单颗十神只补「落在哪个角色上」,不再把组的那句抄一遍。
150
+ - **测试**:新增 `test/ziwei-words.test.mjs`(55 条)与 `test/bazi-words.test.mjs`(46 条)——词库条目数与引擎表一一对应(34 条格局名与 `PATTERN_TONE` 双向零差集)、双星 key 必须能拆成两颗真实主星、亮度三档齐全、煞星不写成判决、基调优先序与回落、地支关系去重与「自刑优先于刑」、四节存在且引用本盘真实字段、面板把 `**` 与换行渲染成 `<b>` 与段落、全文无 undefined/NaN。**87 个测试文件 / 3185 条断言**,七道闸全绿。
151
+ - **边界**:词库只给倾向与做法,不下断语;格局读法覆盖现有 34 条,新增格局未入词库时按 tone 回落成通用句而不是现编;逐宫只写星曜与四化,不叠大限流年的三层算力;健康维度只用煞星星情,不给脏腑诊断。
152
+
153
+ ## 0.42.0(已并入 0.46.5)
154
+
155
+ 紫微的闰月从两档补到三档,默认换成主流排盘的「按日切分」;顺手修掉流年斗君二次换月。
156
+
157
+ - **缺口在哪**:此前只有「闰月按本月」与 `leapAsNext`(整月归次月)两档,默认按本月。闰月后半月出生的人,主流排盘按次月起盘,我们却按本月,命宫、身宫、五行局、十四主星位置、大限起运、流月斗君整条链都差一个月——盘看起来完整,宫位却系统性偏移。
158
+ - **三档口径**(`engine/ziwei.js` 新增 `LEAP_POLICIES` / `leapPolicyOf` / `effectiveLunarMonth`):`split`(默认,1–15 归本月、16 起归次月,按日切分)、`next`(整月归次月)、`prev`(整月归本月);`leapAsNext: true` 保留为 `next` 的旧写法,`leapMonth` 优先于它。不认识的取值回落到默认,不抛错。工具参数同步成枚举,`rules.leapMonth` 写明三档与默认。
159
+ - **为何改默认**:参考开源项目 [ziwei-doushu](https://github.com/Renhuai123/ziwei-doushu)(MIT)的流派配置与其 150 组金标准盘对照结论——主流排盘默认「月中分界」。我们不引入其引擎,只采纳这一条排盘口径,并把它做成可切回的开关;不想换的人传 `leapMonth: 'prev'` 即回到旧口径。
160
+ - **盘里能看见**:`lunar` 保留 `monthRaw`(原始闰月)与换算后的 `month`、`leapPolicy`,闰月另给一句说明(「闰4月按日切分……本盘闰月21日按5月」);摘要的农历行写成「2020年闰4月21日(按5月起盘)」,不再把 21 日写成「闰5月21日」;面板宫盘抬头同样处理。
161
+ - **修掉一个旧 bug**:`flowOf` 里的流年斗君此前用 `chart.lunar.month`(已是换算后的月)再按 `leapAsNext` 加一次月,闰月 + `leapAsNext` 会多推一个月。现在起盘时只换一次,流月/流日/流时全部直接读换算结果。
162
+ - **边界**:闰十二月十六起回绕到正月只换月序、不老一岁(闰腊月极罕见,明写不猜);1–15/16–30 的分界按通行「月中」,不提供逐日自由配置;不引入参考项目的其余九类流派开关(庚年四化变体、亮度流派、安天马/天空/截空等),留作后续。
163
+ - **测试**:新增 `test/ziwei-leap.test.mjs`(44 条)——2020 闰四月的初十/十五/十六/廿一四个边界、三档口径函数与默认/别名/未知值回落、起盘月与命宫紫微斗君逐项对照、前半月 split 与 prev 同盘、`leapAsNext` 与 `next` 等价、斗君只换一次月、非闰月三档排出同一张盘、compute 透传与摘要/面板文案。**85 个测试文件 / 3084 条断言**,七道闸全绿。
164
+
165
+ ## 0.41.0(已并入 0.46.5)
166
+
167
+ 起名补上一直被写在「不做」里的两层:**五格剖象**(天格/人格/地格/外格/总格 + 81 数理 + 三才)与**音韵检查**。此前 README 明写「不做五格(需康熙字典笔画)与音韵」,等于把最常被问的两件事推给用户;这一轮把笔画与读音数据补全,再按通行算法落地。
168
+
169
+ - **数据层**(新增 `engine/name-data.js`):391 个用字逐字补**拼音、声调、康熙笔画**(按繁体字形与偏旁本字计:华→華14、马→馬10、静→静16、涛→濤18、灵→靈24、兰→蘭23、丰→豐18、书→書10、画→畫12、云→雲12、风→風9、阳→陽17;氵→水4、艹→艸6、辶→辵7、阝左→阜8、阝右→邑7);单姓笔画表约 120 个(王4/李7/张11/刘15/陈16/罗20/郑19),复姓 13 个逐字存(欧阳 15/17、司马 5/10、夏侯 10/9…);81 数理取通行本,分吉/半吉/凶三档。数据与字库由测试逐条对齐——391 条一一对应,多一个字少一个字都会红。
170
+ - **五格**(`engine/name.js` 新增 `wuge`):单姓双名 天格=姓+1、人格=姓末+名首、地格=名两字和、外格=总−人+1、总格=全部;单姓单名 地格=名+1、**外格固定 2**(没有「外侧」,通行本记 2,不是 1);复姓 天格=两字和、外格=总−人+1(等价于复姓单名的「姓首字+1」)。数理超 81 按 −80 回绕(104→24),三才取天/人/地个位对五行,再按生克给一句「一路相生 / 相连相克 / 吉凶各派看法不一」,不折算分数。
171
+ - **缺笔画不半算**:任一字查不到康熙笔画,整体返回 `available:false` 并点名是哪个字,提示用 `strokeOverrides`(逐字)或 `surnameStrokes`(按姓)补;补进来的字在结果与面板里都标「用户指定」。姓超两字、姓不在表、只给名不给姓,都走同一条「算不了」的路,不拿简体笔画或猜测顶上。
172
+ - **音韵**(新增 `phonetics`):只报可数的事实——全名同调、相邻同声母、相邻同韵母、相邻同音(叠字),再按条数判「顺口 / 略拗 / 拗口」。声母先切 zh/ch/sh,y/w 按拼写当声母。**不做语义谐音**(需要词库),摘要与注释都写明「谐音、方言读法还得自己读三遍」。
173
+ - **排序而非判定**:生成候选名把五格格数当第三顺位(合喜用 → 两字异行 → 五格 → 性别倾向 → 字库序),注释写清「是排序不是吉名判定」;姓的笔画不在表里时这一轮不按五格排序,也不伪造。
174
+ - **四处可见**:摘要各加一行【五格】【音韵】;面板新增五格格阵(5 列,吉/半吉/凶各配色)、笔画行(用户指定标「(指定)」)、三才行与音韵行(拼音+调、声调序列、水平徽标、逐条问题),算不了时显示原因而不是空白;生成候选的每个名字带「五格 N/5 吉」与音韵水平 chip。
175
+ - **顺手修掉一处静默丢参**:页面上「评名字」虽然显示出生日期,`src/web-ui.js` 与 `src/app.js` 却在提交前 `delete args.datetime`,于是填了生辰也永远得到「给出生年月日才能判断」;现在生辰填了就传、空着才删,评估能按喜用判,面板里的八字行也随之出现。
176
+ - **测试**:新增 `test/name-wuge.test.mjs`(103 条)——数据完整性(读音表与字库双向零差集、声调 1–4、笔画 1–40、拼音正则、81 条数理档位)、康熙锚点(静16/涛18/灵24/兰23/丰18/书10/画12/云12/风9/阳17 等 16 字与 7 个姓)、81 回绕、四类姓氏结构的五格数与吉凶、三才、缺笔画/超长姓/无名的落点、笔画覆盖与来源标注、音韵四类问题与顺口反例(王沐宸)、compute 接线与面板渲染,以及两处入口不再丢生辰。**84 个测试文件 / 3040 条断言**,七道闸全绿。
177
+ - **边界**:81 数理各派对少数数取法有出入,按通行本取一套;五格只是传统数理游戏,不参与喜用判定,也不改结论。
178
+
179
+ ## 0.40.0(已并入 0.46.5)
180
+
181
+ 六爻的伏神补上「出伏条件」:飞伏生克与月建日辰并列摆出,归成四档,只判条件、不出应期。
182
+
183
+ - **缺口在哪**:知识卡 `liuyao-fushen` 一直写着伏神看「日月生扶」,引擎却只算飞伏生克(飞生伏 / 伏生飞 / 飞克伏 / 伏克飞 / 比和)——月建、日辰从未落到伏神那一爻上。卡上是口径、盘上没有实现,这一轮把这一层补上。
184
+ - **四档判定**(`engine/liuyao.js` 新增 `fushenAccess`,挂 `result.fushenAccess`):先并列两栏——助(飞生伏、伏克飞、日辰生、日辰比和、月建旺、月建相)与压(飞克伏、日辰克、月破);有助无压为「可出」、有助有压为「有助有压」、有压无助为「受压难出」、两者都无为「未得助」;没有飞伏关系时记「飞伏未知」,不猜。
185
+ - **四处可见**:摘要单列「伏神出伏:第2爻可出」;解析在飞伏段后逐条写该爻的月建(五行、五态、是否月破)、日辰(五行、五关系)与助压明细;白话按档位补一句(「出得来」是条件、不等于马上应验);面板在旺衰 chip 下单列一排(可出绿,有助有压 / 受压难出赭)。
186
+ - **口径与边界**:四档只并列条件,不排「飞伏与日月谁先谁后」的各家优先级;月破算压、伏神旬空只标出而不并入档位,都是明写的取法,不假装是共识。**应期仍未做**——这一层只回答「现在出不出得来」,不给具体日期;`docs/知识扩展与待核实清单.md` 的四·3 与文末注同步写明「条件是条件、应期另算」。
187
+ - **测试**:新增 `test/liuyao-chufu.test.mjs`(53 条)——用独立的五行生克与相冲表复算 64 卦 × 4 个询问方向 × 12 个月 × 12 日 = 6,048 组,要求逐组零不符、四档都出现、四种真实飞伏关系都覆盖;四条从真实盘里挑的边界(地雷复·学业 寅卯「可出」、亥卯「有助有压」、地火明夷·财 子子「受压难出」、地山谦·财 午辰「未得助」);缺月建只看日辰、飞伏关系未知、伏神旬空只标不改档、传 null 不抛四条兜底;摘要/解析/白话/面板四层可见、旧结果兼容、断言输出里没有应期字段。统计 **83 个测试文件 / 2937 条断言**,七道闸全绿。
188
+
189
+ ## 0.39.0(已并入 0.46.5)
190
+
191
+ 首屏从「19 个 tab 平铺」改成按目的分三组,并保留一键切回平铺。此前第一次来的人得先猜「梅花」「称骨」是什么;现在按「问一件事 / 看一个人 / 查日子」分组,每项带一句白话。同一轮还改了「问进对话」的提问模板:原来它只约束证据与口气,模型答出来是一串带引用的术语流,读的人不知道这张盘在说什么。
192
+
193
+ - **三组入口**(`tools/build-html.mjs`):问一件事(六爻/梅花/塔罗/奇门/六壬/小六壬)、看一个人(八字/紫微/合盘/人格/称骨/数字/人生K)、查日子(黄历/择日/农历/星座/风水/起名)——19 项一个不落,顺序按用途重排,不按引擎模块排。
194
+ - **每项一句白话**:「摇六次,问一件事」「四柱看一生格局」「挑个办事的好日子」,不用先懂术语再点。
195
+ - **最近用过**(`src/web-ui.js`):只记入口名与时间,最多 3 条,存 `mp.recent.tabs`;点入口、点起卦/排盘、人格问卷提交时记录,首屏默认 tab 不记;`localStorage` 读写都包 try/catch,隐私模式下只是不记,不影响使用;读回的值先过「当前页面真实入口」白名单,不直接拼进选择器。
196
+ - **平铺回退**:19 个 tab 原样保留在页面上,右上角「分组 / 平铺」一键切换并记住选择(`mp.first.view`),旧用户的肌肉记忆不受影响。
197
+ - **手机端**:每组先露 4 项,其余折在「还有 N 个」后面(`nth-child(n+5)` + `.open`),三组铺完不再把表单推到第二屏以下;桌面三列、中屏一列。
198
+ - **样式**:卡片沿用纸色 + 朱红(选中项实心),深色下文字反色;打印时首屏分组、视图开关与 tab 条一律不打印,纸面仍是「抬头 + 盘面 + 解读」。
199
+ - **追问读不懂**(`engine/followup.js`、`test/ask-prompt.test.mjs`):此前「回答要求」只有三条——引到具体柱/宫/爻、没依据就说看不出来、别给绝对断言。这三条只管**证据**与**口气**,不管**可读性**,于是照它答出来的东西是一串带引用的术语流:知道「甲有问题、乙有问题」,却不知道这张盘到底在说什么。现在模板先交代一句「读者不懂命理」,再给一套骨架:**开头一句不用术语的结论**(只读这句也该有收获)→ 判断**最多两条、按重要性排序**,每条分 `盘面|白话|倾向|边界` 四行(盘面只引字段不掺解释;白话把上一行的术语当场翻掉,一个词只翻一次、不连续堆三个以上;倾向用「更可能……」讲清现实含义;边界写清何时不成立,盘面没给的直接写「这盘里看不出来」)→ 收尾一句「**如果只记一件事**」,给可核对、可动手的观察点并点明它出自哪条依据。`调候 / 化气 / 通关 / 空亡 / 争合` 单独点名要求落地;「格局很好」「运程不顺」这类没有信息的空话禁掉。
200
+ - **默认问法也改口**:空问题时原来问「请先总览这张盘」,而「总览」本身就在邀请逐字段复述——模型当然照着摘要念一遍。改成「先用一句白话讲清这张盘的主线,再指出最值得注意的一两处,并说明每处的具体依据」。
201
+ - **固定骨架有长度上限**:抬头 + 回答要求约 520 字,不随 `maxChars` 变;测试里那条「固定骨架本身不超过 900 字」专门盯它别长成小作文。顺带修掉一条会误报的旧断言——原来写「整段提问 < 800 字」,骨架一长就红,现在拆成「摘要正文真的截到 maxChars」与「骨架另有上限」两条,各盯各的。
202
+ - **测试**:新增 `test/first-screen.test.mjs`(44 条)——三组名称与顺序、19 项与平铺集合逐一对齐、每项都有白话、记录时机(入口/主按钮/问卷)、存储上限与去重、读写失败降级、手机折叠与 aria、两套入口共用 `activate`、深色反色与打印隐藏。其中 `.recent[hidden]` 一条专盯「`display:flex` 盖掉 `[hidden]`」——首版就踩了,没记录时页头挂着一个空的「最近用过」。`test/ask-prompt.test.mjs` 由 46 条增至 54 条(骨架四行齐全、无术语结论、难词点名、收尾句、空话黑名单、默认问法改口)。统计 **83 个测试文件 / 2937 条断言**,七道闸全绿。
203
+
204
+ ## 0.38.2(已发布 2026-10-29)
205
+
206
+ 紫微格局修掉三处「写得像实现了、其实永远不成立」的判定:夹局的方向、羊陀夹忌、刑囚夹印;顺手把 34 条目录从 README 的 31 条补全,并用独立谓词逐条钉死。
207
+
208
+ - **夹局不分左右**(`engine/ziwei.js` 的 `jia`):旧写法只认「A 在命宫前一宫、B 在后一宫」这一种顺序,但「夹」只要求两星分居命宫前后。实测 69,120 张盘:**昌曲夹命 0/8、羊陀夹命 0/1,474 从未命中**,日月夹命(237:231)、左右夹命(470:457)、魁钺夹命(283:292)各漏约一半。改为两向都认;`test/ziwei-patterns.test.mjs` 用镜像方向的真实盘(1955-01-02、1955-06-22、1956-02-14 等)钉住。
209
+ - **羊陀夹忌**:擎羊恒在禄存 +1、陀罗恒在禄存 −1,两星只能夹**禄存**那一宫;旧判据要求「化忌两侧是羊陀」,几何上不可能(1,553 张符合的盘一次都没报)。改为「化忌与禄存同宫」,证据文本写明化忌落在哪一支。
210
+ - **刑囚夹印**:廉贞与天相永远隔偶数宫,字面上的「廉贞、擎羊夹天相」同样不成立(17,568 张盘两向皆零)。按通行说法改为「廉贞天相同**守命宫**于子午、擎羊同宫」——源文说的是「守命」,所以判的是命宫那一宫,廉相羊同宫在别的宫位不报;evidence 写明三颗星同守哪一宫;命宫卯酉、廉贞天相对照遇擎羊的变体未纳入,写进 README 口径。三条来源:知乎「刑囚夹印」、sohu 格局文、ziwei-yun「天相不可能被廉贞和擎羊二星所夹」。
211
+ - **34 条目录补齐**:README 原列 31 条,且把 武贪同行、火贪铃贪 归在吉格(引擎一直是中性)、`双禄交流 / 命无正曜 / 杀破狼` 完全没写。现按引擎口径分三组列出(吉 20 / 中性 5 / 忌 9),`PATTERN_TONE` 改为导出供测试比对;README 与目录的一致性由测试直接解析 README 断言。
212
+ - **结构统计补中性**:`patternSummary` 增 `neutral`,摘要行改成「吉格 N、中性 K、忌格 M」——此前中性格计入 count 却不出现在统计里,count 会大于两档之和。
213
+ - **不新增能力、不动知识库**:知识库仍 47 条(本轮是判定口径修正,不是新规则);格局仍只描述结构、不折吉凶分数。
214
+ - **测试**:新增 `test/ziwei-patterns.test.mjs`(79 条)——34 条目录与 README 三组逐名对齐;312 张盘 × 34 条用独立谓词(只读星位与四化,不调引擎判定)复算,要求每条「零不符且至少命中一次」,专门防死规则;夹局镜像方向、羊陀夹命 ⇔ 禄存守命、羊陀夹忌 ⇔ 化忌同禄存、刑囚夹印守命(含「非命宫同宫不报」反向盘)、摘要计数与确定性各自钉住。故意把 `jia` 改回有序写法时该文件 11 条变红。统计 **81 个测试文件 / 2832 条断言**,七道闸全绿。
215
+
216
+ ## 0.38.1(已并入 0.38.2)
217
+
218
+ 古籍库补上《子平真诠》论格局成败的两章,并把「用神总纲」一位改成按盘取;顺手修掉 why 里拼出「论论财」的旧文案。
219
+
220
+ - **两条原文**(`engine/classics.js`):`zp-chengbai`(九、论用神成败救应,「成中有败,必是带忌;败中有成,全凭救应」)与 `zp-bianhua`(十、论用神变化,「藏庚透壬,则化为财。凡此之类皆用神之变化也」),均照录中华典藏网 53629 / 53630,白话自撰。
221
+ - **为什么是这两章**:0.37.0 起古籍节覆盖了「月令格 × 两书对照」与「调候」,但化气格只剩气候与总纲,组合(官印相生、伤官见官等)没有任何原文可读——这两章正是判「化气成不成」「成格有没有带忌」的出处。
222
+ - **总纲位三选一,不另加位次**:`classicsFor` 的第五条仍是「用神总纲」位——有化气格取「论用神变化」,见组合取「论用神成败救应」,其余取「论用神」通用总纲。上限没有从 5 放宽,也没有让泛论挤掉针对这张盘的话;同盘同时有化气与组合时取「变化」,why 写明取舍。
223
+ - **文案 bug**:此前 why 用 `${书名}论${章名}` 拼,而章名本身已带「论」,实际输出成「子平真诠论论财」「三命通会论论正财」。改为「书名「章名」一条 / 另取」,章节标题去掉序号与开头的「论」;测试加「why 不出现论论」的断言。
224
+ - **知识库 47 条**:新增 `bazi-geju-chengbai`(成中带忌、败中有救)与 `bazi-huagi-bianhua`(月令藏干与合局改变取用),均标 `variant`——成格条件、化气成立条件各家宽严不一,只并列原文与方向,不逐盘判成破。`docs/知识扩展与待核实清单.md` 的条数、统计与注记同步;顺手把上一轮注记里写错的版本号 0.37.2 改回 0.38.0。
225
+ - **口径边界**:专旺格、从格仍没有对应的单章原文(三书里没有可整段照录的专章),不硬凑;古籍节仍只负责「书上怎么说」,不把原文折算成吉凶分数。
226
+ - **测试**:`test/classic-quotes.test.mjs` 新增 13 条(两章原文抽检与典藏网出处、why 无双「论」、三选一互斥、1996 盘取「变化」、化气/组合/无特格三种落点);`test/sanming.test.mjs` 新增 7 条(总纲换条后仍保住两书对照、两张知识卡的出处与「不当断语」口径)。统计 **80 个测试文件 / 2753 条断言**,七道闸全绿。
227
+
228
+ ## 0.38.0(已并入 0.38.2)
229
+
230
+ 补上知识卡里已经写了、引擎却一直没做的一层:**岁运并临与伏吟反吟的逐年提示**。此前 `bazi-suiyun` 卡说「只作变动提示」,但盘面里没有任何地方标出是哪一年,等于只有口径、没有实现。
231
+
232
+ - **四类信号**(`engine/bazi.js` 给每条流年加 `suiyun`):**岁运并临**(当值大运与流年干支相同)、**运年反吟**(大运与流年天克地冲)、**流年伏吟**(流年与年/月/日/时柱干支相同)、**流年反吟**(流年与某柱天克地冲)。每条信号带 `type` / `target` / `detail`,另给 `note` 写明口径。
233
+ - **当值大运怎么取**:流年按立春起算,取与「该年立春到次年立春」区间相交的大运;交运落在这一年里时,前后两步都在本年当过值,两条并列。没有用虚岁近似,也不把交运日抹平。
234
+ - **天克地冲的判据**:天干相克 **且** 地支相冲,缺一不算。例如丙子年对丙午年柱是同干相冲,不标反吟;这条单独在测试里构造验证。
235
+ - **口径与边界**:只标干支重复与对冲,不折分数、不判吉凶——「岁运并临主大凶」一说不采,摘要与解析都写明「只标变动,仍看该年是否动到用神」。大运与原局之间的伏吟反吟未逐年标,四柱十神的引化也未叠入;起运前只有流年这一侧能成立。
236
+ - **四处可见**:摘要加一行「岁运提示(只标干支变动,不判吉凶):2030庚戌 岁运并临;…」;解析新增「岁运提示」节,逐年写清当值大运与每条的出处;白话只在最近一个命中处补一句「变化感强一点,不是好消息也不是坏消息」;面板在流年 chip 下方单列一排提示,chip 悬停给逐条依据。旧结果(没有 `suiyun` 字段)照常渲染,解析退回「近十年没有」的保守说法。
237
+ - **账面口径修正**(`docs/知识扩展与待核实清单.md`):知识库实际已是 45 条(诸家一致 15 / 各家有异说 29 / 待核实 1),清单头部还写着 42 条、统计还停在 15/27/1,一并改对;「岁运并临吉凶」一行补上「已落引擎与界面」。
238
+ - **测试**:新增 `test/suiyun.test.mjs`(102 条)——不复用引擎判定,按「月柱干支顺逆推八步」与「立春区间相交」两套独立写法复算 10 张盘 × 10 年;扫描全部样本核四类信号与事实一致(并临必然同干支、反吟必然天克地冲、伏吟必然同柱);构造同干相冲(丙子 vs 丙午)不算反吟、起运前无大运、年内交运两步并列三条边界;钉住确定性、摘要/解析/白话/面板四处可见、旧结果兼容与知识卡口径。统计 **80 个测试文件 / 2733 条断言**,七道闸全绿。
239
+
240
+ ## 0.37.1(已并入 0.38.2)
241
+
242
+ 界面深修一轮,重点在窄屏:19 个 tab 不再吃掉首屏,两列表单不再被按钮挤成 134px;六爻的化进/化退补上力重。
243
+
244
+ - **桌面抬头改竖排**(`tools/build-html.mjs`):品牌一行、tab 条一行。tab 从右对齐的 flex 换行改为 `repeat(auto-fit,minmax(74px,1fr))` 等宽网格,每格同宽、末行左对齐,不再出现「起名 人格」两项孤零零挂在右边、与上一行错开半个身位。
245
+ - **窄屏 tab 改单行横滑**:3 列网格是为六个 tab 写的,tab 涨到 19 个后要占七行(约 340px),首屏只剩输入框。改回单行横滑,44px 触摸目标、`scrollbar-width:none` + `::-webkit-scrollbar{display:none}` 藏掉滚动条、首尾各留 12px 呼吸位;切到靠后的 tab 时 `scrollTabIntoView()` 把当前项滚到可视区中间(`prefers-reduced-motion` 下用瞬时跳转),避免「页面变了、高亮停在屏幕外」。
246
+ - **窄屏表单两列修好**:根因是 `.go{grid-column:4}`、`.go.ghost{grid-column:3}` 写死给桌面四列,窄屏两列时这两条会生成第 3、4 列隐式 auto 轨道,把两个正文列挤到 134px,性别与按钮全被压扁。窄屏改为「看示例/排盘」分别落在第 1、2 列,性别与出生地各占整行,三个勾选项两两成对,收尾不再留空格。
247
+ - **人格页重做**(`src/panel-kit.js`):结果卡原本是「四行细条 + 段落堆叠」,字小、无层级;现在按「类型抬头(大字类型码 + 名称/关键词 + 已答题数)→ 四维瓦片(双极字母 + 取值条 + 一句取向)→ 一句 → 优势/留意(绿/赭左线两张卡)→ 认知功能链(主导高亮)→ 工作/关系/学习/课题分节」分层。问卷态改成两列编号清单,桌面一眼扫完 24 题。同时把卡片抬头从 `<header>` 改成 `<div>`:页面级 `header{flex-direction:column}` 会把卡片抬头也压成竖排。
248
+ - **顶层卡片没拿到调色板**(根因):变量块只挂在 `.pp,.mp-it` 上,而人格、黄历、称骨、人生 K 线、起名、速查这些卡片是直接插进 `#out` 的兄弟节点,`var(--band)`/`var(--card)` 全部失效 → 卡片退化成没底色、没边框的一堆字,这正是人格页看着丑的主因。变量块扩到 `.mp-al/.mp-cg/.mp-kline/.mp-mb/.mp-nm/.mp-quick` 等全部顶层卡片,`test/theme.test.mjs` 的断言同步改为「各顶层卡共享同一份变量」。
249
+ - **人格问卷改分页问答**(`src/web-ui.js`、`src/app.js`、`tools/build-html.mjs`、`src/panel-kit.js`):原来是一个「24 题分数」文本框——让用户自己数 24 个数字,像在填表格。现在照常见在线测评的做法:**4 题一页、共 6 页**,每题 1–5 五格单选(完全不像 / 不太像 / 说不准 / 有点像 / 很像我),顶部有进度条与「第 n / 6 页 · 已答 x / 24」,底部是上一页 / 下一页 / 看结果 / 清空。答满 12 题就能先出结果(与引擎的 `E_INPUT` 门槛一致),不够时按钮禁用并写明还差几题;最后一页收起「下一页」,「看结果」与原主按钮二选一,不再重复两个入口。题目与 1–5 的说法都从引擎的问卷态取(`compute({system:'mbti'})`),前端不抄一份;答案按题序存成数组,末尾连着没答的去掉再交给 `answers`,中途未答的按引擎口径算「跳过」。独立页与 DSH 面板共用同一套分页交互(面板是 `MbtiQuiz` 组件);结果不进「最近排过」——答案没存进历史,重放还原不了问卷。
250
+ - **人格页输入区**:问卷与日期无关,起卦日期/时刻在人格 tab 下隐藏(面板与独立页同步);问卷整行独占,窄屏下 5 格缩字体与内边距、按钮整行、44px 触摸目标;深色下选中格文字随强调色反色(与 tab / 主按钮同一口径)。
251
+ - **桌面副本可同步**:新增 `--desktop` 与 `npm run build:desktop`,一次把同一份页面写到仓库根和 `~/Desktop/命理排盘.html`。桌面那份是手工拷的产物,源码一改就旧;现在构建就能刷新,页面左上角的版本徽标用来核对。README 三处说明同步更新。
252
+ - **变量补全与观感**:共享变量块补齐 `--ink3/--fx/--sans/--kai`(此前多条形同虚设的字体、次级色规则因此失效)与 `--shadow`,深色另给一套;盘面卡片统一 12px 圆角与外阴影,古籍引文块改为左侧朱线 + 楷体悬挂缩进,`:focus-visible` 统一描边,结果入场只做一次轻微上浮并尊重 `prefers-reduced-motion`。
253
+ - **六爻 · 化进/化退力重**(`engine/liuyao.js` 新增 `jinTuiPower`,挂 `result.jinTuiPower`):此前只标方向,现在把每条进退放回月建五态落档——旺相 → 后劲足(退则退得缓)、休囚 → 后劲有限(退则退得实)、死 → 进得虚、逢月破 → 月破失据、缺月建 → 只报趋势;旬空只标出、不改结论。摘要单列「进退力重」一行;解析在「卦体关系」里逐条写清月建、日辰与档位,「未纳入」删去该项(保留用神两现权重与伏神出伏应期);白话加一句;面板单列一排 chip(后劲足/退得缓绿、其余赭)。只给档位、不折加权分数,吉凶仍落在用神/忌神那一层判。
254
+ - **测试**:`test/theme.test.mjs` 第五节改为「单行横滑 + 藏滚动条 + 首尾呼吸位 + 44px 触摸目标 + 切 tab 自动滚入视野 + 两列内按钮不生成额外轨道」,共 50 条断言;`test/mbti.test.mjs` 新增分页问卷一节(25 条)——离线页容器/样式、web-ui 的每页 4 题与 12 题门槛、事件委托、面板 `MbtiQuiz` 单跑校验(一页 4 题、刻度来自引擎、进度文案、按钮禁用与末页无「下一页」)、题面不复制到页面/面板;`test/liuyao-jintui.test.mjs` 新增第六节(27 条)——五态两行档位逐档复算、月破与缺月建两条边界、旬空只标不改结论、摘要/解析/白话/面板四处可见、旧结果不出该排。统计 **79 个测试文件 / 2631 条断言**,七道闸全绿。
255
+
256
+ ## 0.37.0(已并入 0.38.2)
257
+
258
+ 古籍库从两本扩到三本:接入《三命通会》卷五、卷六论十神七条,与《子平真诠》同一格局并列对照。
259
+
260
+ - **三命通会 7 条**(`engine/classics.js` 登记 `sanming` 书目):论正官、论正财、论印绶、论食神、论伤官、论阳刃、论建禄各一条,原文照录通行本、逐条给典藏网章节链接,白话释义自撰。选条标准只有一条——与「格局取用」直接相关;神煞、女命、六亲等卷暂不录入。
261
+ - **同格两书并列**:同一个「月令格」,先取《子平真诠》那一条(讲怎么用:顺逆、成败、救应),再取《三命通会》同格一条作对照(讲怎么取、怕什么)。例如正官格:子平真诠讲「刑冲破害为忌、生之护之为喜」,三命通会讲「六格之首,止许一位,多则不宜」。两条各给一句 why,不合并、不调和成一句断语。
262
+ - **条数上限 5**:格局两条 + 气候两条 + 用神总纲一条,正好把默认位占满;未匹配到两书同格时只出一条,不硬凑。
263
+ - **面板书名修正**(`src/panel-kit.js`):此前面板把非子平真诠的条目一律标成「滴天髓」,接入第三本后会串成「滴天髓·卷六·论正财」;改为按书目映射书名,`test/sanming.test.mjs` 钉住这一点。
264
+ - **知识库**:新增 `bazi-sanming-duizhao`(两书分工:一重「用」、一重「取」与「忌」,并列而不合并),全库 **45 条**。
265
+ - **口径**:只录与格局取用直接相关的七条,不声称覆盖全书;两书成书年代与流派不同,用语有出入,照录通行本、不做校勘改字,也不替两家调和。
266
+ - **测试**:新增 `test/sanming.test.mjs`(40 条)——书目与七条完整性、原文逐字抽检、七格「子平在前、三命在后」的对照选取、why 文案、上限与去重、确定性与 limit、摘要/解释层/面板三处可见、知识卡。`test/classic-quotes.test.mjs` 同步改为三书、条目 ≥26、单盘取 2–5 条。统计 **79 个测试文件 / 2571 条断言**,七道闸全绿。
267
+
268
+ ## 0.36.0(已并入 0.38.2)
269
+
270
+ 把 `docs/知识扩展与待核实清单.md` 里登记的两处缺口补上:紫微的「三方四正一起飞」、六爻的「全卦逐爻旺衰」。0.35.x 的面板修复随这一版一起发。
271
+
272
+ - **紫微 · 三方四正复合飞化**(`engine/ziwei.js` 新增 `flyComposite`,挂 `chart.flyComposite`):单宫飞化只回答「这一宫自己去找谁」,这一层把本宫、对宫与两个三合宫共四宫的宫干四化一起摊开——四宫各化禄权科忌,共 16 条,按落宫归堆,落到同一宫就是会照。四类会聚单独成型:**双忌会**(同宫收到 ≥2 个忌)、**禄忌同宫**(禄随忌走)、**三化以上会宫**、**自化**(宫干化出去又落回本宫)。摘要加【三方四正飞化】行(会聚标签 + 四化去向按宫去重);解析新增「三方四正飞化」节,写清哪几股力会到哪一宫;白话加一句「N 股力最后挤在 X 这件事上」;面板并排 chip,悬停给飞入清单。
273
+ - **紫微 · 口径**:会聚判定只看「落在同一宫」这一条结构事实,不折分数、不断吉凶,也未叠大限流年四化;星未上盘时只记星、不记落宫(`to: null`)。三方四正四宫由命宫 +4/+8/+6 推得,与格局识别用的那一套同源。
274
+ - **六爻 · 全卦逐爻旺衰**(`engine/liuyao.js` 新增 `hexagramStrength`,挂 `result.hexStrength`):与用神旺衰同一套判定(月令五态、日辰五关系、月破/暗动/冲空),区别只在不挑用神——六爻每一爻都给一次,世应、动爻、旬空另标,并给出五态分布 `counts`、最旺/最弱爻与世应各自的状态。
275
+ - **六爻 · 不依赖用神**:此前旺衰只在取到用神时才算,没指定所问之事就一片空白;现在 `hexStrength` 在 `buildLiuyao` 之后独立计算,没给 `direction` 也能看整张卦的气。
276
+ - **六爻 · 口径**:只报状态、不折分数;「未纳入」删去「全卦逐爻的月建旺衰」,保留化进化退的实际力重、用神两现取舍、伏神出伏应期三项。
277
+ - **知识库**:新增 `ziwei-sanfang-fei`(复合飞化的会照取法与各家分歧)与 `liuyao-quanggu-shuai`(全卦旺衰与「用神只是一处落点」),并把 `ziwei-feixing` 的 note 从「未做完整飞星串连」更正为「串连与复合飞化已做、未叠大限流年」。全库 **44 条**。
278
+ - **自我介绍与讨论群(只在仓库页)**:README 文末新增「关于:一个人做的插件,欢迎来聊」——写明这是个人作品、能力有限,欢迎就断法口径、神煞取法、解析措辞进群讨论,报 bug 请带输入与结果;`docs/assets/dsh-metaphysics-group*.png` 放群二维码。**不进插件运行时**:面板与离线页不加这条提示,市场条目与 `locale` 描述也只说能力、不说作者(提醒只出现一次,在仓库 README)。市场条目与 `locale` 另补齐了 0.35–0.36 两项新能力。
279
+ - **测试**:新增 `test/ziwei-fly-triad.test.mjs`(44 条)与 `test/liuyao-hex-shuai.test.mjs`(53 条)——四化表与五态五关系都用另一套写法逐格复算(16 条飞化、12 卦 × 3 月 × 6 爻)、归堆与会聚独立过滤比对、60 张盘结构自洽且会聚非死规则、四种冲法构造验证、摘要/解析/白话/面板四处可见、旧结果兼容、确定性。统计 **78 个测试文件 / 2531 条断言**,七道闸全绿。
280
+
281
+ ## 0.35.1(已并入 0.38.2)
282
+
283
+ 修一个会让整个命理面板白屏的崩溃,并让它以后能自己把错误说出来。
284
+
285
+ - **崩溃根因**(`src/app.js`):为了给「问进对话」记住上一张盘,加了一个 `useEffect` 去写 `LAST`,但它落在 `const [result, setResult] = useState(null)` **之前**;React 首渲时读依赖数组撞上 TDZ,抛 `ReferenceError: Cannot access 'result' before initialization`,整个面板渲染失败——桌面端看到的就是「侧栏有『命理』、点开一片空白」。已把该 effect 移到 `result` 声明之后。
286
+ - **渲染兜底**(新增 `PanelGuard`,`React.Component` 的错误边界):面板里任何一层组件抛错时,把错误原文与前 14 行栈直接铺在面板上,并附「__PP / Engine / React / 版本」环境行——不再白屏,也不用开 devtools 才能报错。
287
+ - **版本可见**:构建时把 `package.json` 的版本注入 `window.__MP_VER`,侧栏标题显示为「命理 v0.35.1」;`__ModuleLoader__.load` 的模块描述里也带 `version`。以后一眼能确认应用加载的是哪份构建。
288
+ - 测试与闸门不变:**76 个测试文件 / 2434 条断言**,七道闸全绿。
289
+
290
+ ## 0.35.0(已并入 0.38.2)
291
+
292
+ 面板可以直接把提问送进对话窗了:排完盘点「问进对话」,这张盘的摘要和你的问题会变成一条正常的用户消息,由对话里的模型接着答。
293
+
294
+ - **提问模板**(`engine/followup.js` 新增 `askPrompt`):四段——一句说明(不用重排盘)、`体系 / 所问` 两行、`——盘面摘要——`(取 `compute` 的 `summary`,超 3000 字截断并标「摘要已截断」)、`——回答要求——`(引到具体柱/宫/爻、没依据就说「这盘里看不出来」、不给绝对化断言)。只做文本组装,不调模型、不改盘,返回 `{text, question, system, label, chars, truncated}`。
295
+ - **对话桥**(`src/app.js`):往会话作用域槽位 `conversation.input.right` 注册一个不画界面的组件,从 slot props 取 `inputActions`;点按钮时 `setDraft(text)` 写草稿再 `submit()`,走输入框正常的回车路径——有回合在跑时排队,不打断当前回答。桥没挂上(插件刚装、还没重启,或 Harness 改了槽位名)时退回复制剪贴板并提示,不报错。
296
+ - **按钮位置**:结果卡下方的追问行,「追问」(本地按盘面字段直接答)旁边多一个「问进对话」,两者共用同一个问题输入框。
297
+ - **离线页不动**:`命理排盘.html` 没有 Harness 对话窗,所以只有「追问」,不出现这个按钮。
298
+ - 测试:新增 `test/ask-prompt.test.mjs`(46 条:字段结构、体系名翻译、问题原样带入、摘要截断与占位、六套体系各跑一遍、无绝对化表述、传 null 不抛、确定性);`test/client-bundle.test.mjs` 增加对话桥注册与「提问 → setDraft → submit」源码通路的断言(现在注册三个槽)。
299
+ - 统计:**76 个测试文件 / 2431 条断言**(当时),七道闸全绿。
300
+
1
301
  # 更新记录
2
302
 
3
303
  版本按「一组可感知的改动」发,README 与市场条目描述随能力同步。
4
304
 
5
- ## 0.34.0(待发布)
305
+ 0.23.0–0.33.0 都只提交在本地、没有单独发到 npm;这些内容随 **0.34.0** 一并发布。npm 上的 latest 从 0.22.0 直接跳到 0.34.0,`npm i dsh-metaphysics` 装到的就是这一版。
306
+
307
+ 0.35.0–0.38.1 同样只提交在本地;这些内容随 **0.38.2** 一并发布(2026-10-29),npm 上的 latest 从 0.34.0 直接跳到 0.38.2。
308
+
309
+ 0.39.0–0.46.4 同样只提交在本地;这些内容随 **0.46.5** 一并发布(2026-10-30),npm 上的 latest 从 0.38.2 直接跳到 0.46.5。
310
+
311
+ ## 0.34.0(已发布)
6
312
 
7
313
  六爻补上**用神旺衰**:月建给这一段时令的气,日辰给当天的扶克。此前用神只算到「落在哪一爻、与卦体怎么对」,旺不旺一律写「仍要月建日辰」,等于把最关键的一半留白。
8
314
 
@@ -13,7 +319,8 @@
13
319
  - **四处可见**:摘要加「用神旺衰:月建 午(火) 用神月建相 · 用神与日辰比和」;解析「用神落位与卦体」节加「时令对用神」段(逐爻写月建态与日辰关系、冲法);面板加一排旺衰 chip(旺/相/得日辰生用 ok 色,死/囚/月破/受日辰克/泄/耗用 warn 色);白话加一句「眼下这阵子对这件事是帮着的/不太帮忙/有帮有压」。
14
320
  - **口径**:这一层只报状态标签,不折成分数、不断成败;全卦逐爻的旺衰仍未做(现在只算到用神那几爻),化进化退叠上月建日辰后的实际力重也仍未做。
15
321
  - **知识库**:新增 `liuyao-yongshen-shuai`(variant)讲五态、五关系与三种冲法,note 写明各家对月破/暗动/冲空取法不完全一致。全库 **42 条**。
16
- - **测试**:新增 `test/liuyao-shuai.test.mjs`(52 条)——地支五行 12 支、月令五态与日辰关系各 144 格逐格用另一套写法复算、12 张静卦 × 3 个月建逐爻复算、月破/暗动/冲空/逢日辰冲四种冲法各自构造验证、标签次序、缺月建与缺用神的退化路径、摘要/解析/面板/白话四处可见、旧结果(无 `useGodStrength`)不炸、确定性。统计 **74 个测试文件 / 2344 条断言**。
322
+ - **发版工具**:新增 `tools/verify-publish.mjs` 与 `--verify-only` 模式——核对以「tarball 能下载、字节与 registry 记的 shasum 一致、关键文件在包里」为准,因为 npm 会先让版本条目可见、附件晚几分钟才落盘(0.34.0 发布时就撞上过这段空窗,`npm publish` 的成功字样并不作数)。
323
+ - **测试**:新增 `test/liuyao-shuai.test.mjs`(52 条)——地支五行 12 支、月令五态与日辰关系各 144 格逐格用另一套写法复算、12 张静卦 × 3 个月建逐爻复算、月破/暗动/冲空/逢日辰冲四种冲法各自构造验证、标签次序、缺月建与缺用神的退化路径、摘要/解析/面板/白话四处可见、旧结果(无 `useGodStrength`)不炸、确定性。统计 **75 个测试文件 / 2379 条断言**(含发布核对工具的 35 条自测)。
17
324
 
18
325
  ## 0.33.0
19
326
 
@@ -129,7 +436,7 @@
129
436
  - 白话层(直答 / 说人话)各补一句卦体的话;知识库新增 4 条(`liuyao-liuchong` / `liuyao-liuhe` / `liuyao-fanyin` / `liuyao-fuyin`)。
130
437
  - 测试新增 `test/liuyao-body.test.mjs` 63 条:六合 8 支与传世表对拍、六冲 10 支(含「只认八纯」的差异说明)、伏吟「卦未变不算伏吟」回归、反吟两路分判、23 条卦例逐字对拍;统计 **65 个测试文件 / 1881 条断言**(当时)。
131
438
 
132
- ## 0.23.0(已发布)
439
+ ## 0.23.0(未单独发布,并入 0.34.0)
133
440
 
134
441
  八字结果里多了「古籍原文」:格局、十神喜忌、调候三条线,各引原书一句,并附白话释义与出处。
135
442