dsh-metaphysics 0.22.0 → 0.38.2

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,413 +1,650 @@
1
- # 更新记录
2
-
3
- 版本按「一组可感知的改动」发,README 与市场条目描述随能力同步。
4
-
5
- ## 0.22.0(已发布)
6
-
7
- 起名不再只是「未收录」三个字:逐字给出五行、判定与可换字。
8
-
9
- - 字库 190 → **391 字**(常用名用字为主,按木/火/土/金/水五行分段):丰(火)、秋(金,秋收成熟)、林(木)这类常见字不再掉「未收录」。
10
- - **逐字判定**:`assessName` 每个字返回五行、释义、性别倾向、来源(`lib` 自建字库 / `user` 你传入的 `charElements` / `none` 未收录)、是否合喜用;未收录的字不猜五行,但会给出**同喜用五行的可换字**(如「秋」不合喜用 → 可换坤(土)、垚(土))。
11
- - **不替用户下判断**:没给生辰时 `favorable` 返回 `null`(不判合不合),结论分「无生辰 / 全未收录 / 全合 / 部分合 / 全不合」五档,并把统计(几个字、几个已知、几个合喜用、字库共几字)写出来。
12
- - **候选去同质化**:`generateNames` 三轮选名(新字 + 新五行组合 → 新字 → 放开)× 字库顺序打散 × 两字异行优先,避免「清一色梓桐」。同一盘 8 个候选示例:李炎梓(火木)、李坤桐(土木)、李楠灿(木火)、李楷垚(木土)、李培炫(土火)、李炜城(火土)、李柏松(木木)、李煜烨(火火)。
13
- - **面板**新增起名卡(`pp.nameHTML`):逐字大字 + 五行 chip + 来源徽标 + 合/不合喜用 + 可换字、八字与喜用一行、结论;生成卡按「名 + 五行 chips + 释义」逐行排,不再是纯文本块。
14
- - 工具参数新增 `charElements`(`{字: 木|火|土|金|水}`,自定义字五行,未收录字也能参与判定);`name` 的出生信息允许省 `datetime` 用 `year/month/day`。
15
- - 测试新增 `test/names.test.mjs` 39 条(字库规模与去重、丰秋林逐字判定、未收录字 + 可换字、charElements 生效与非法忽略、无生辰不判、候选全合喜用、面板结构与接线);统计 **63 个测试文件 / 1784 条断言**。
16
-
17
- ## 0.21.0(已发布)
18
-
19
- 《穷通宝鉴》120 格逐条入库:同一「日主 + 月令」该取什么,书上怎么写的,全都摆出来。
20
-
21
- - 新增 `engine/qiongtong.js`:十天干 × 十二月令共 120 格,每格含用神顺序(首取在前)、原文摘句、出处章号;
22
- - 用神顺序据通行整理表(knowyourbazi 整理表,首格为首选),原文摘句照录 [luckclub.cn](https://www.luckclub.cn/bazi/004/)《穷通宝鉴》每章首段(去掉「徐乐吾曰」评注);
23
- - 数据里的 `quoteStems` 是「原文首段依次提到的天干」,与整理表首取不同处可对照阅读(如正月庚金:表首取戊,原文先举丙);
24
- - 原文全章未见某用神字时(丁酉缺「丙」、癸未缺「壬」)直接写 note「按整理表录入,待以善本核对」,不替它圆场。
25
- - **取用**:调候优先时,寒暖判定定「这一盘缺什么」,穷通宝鉴定「这一格书上取什么」;两者不同向时以调候为先,界面与解释层把两套并列写出,不悄悄合并。
26
- - **评分**:流年天干正落在该格首取时 +0.3,次取 +0.15,理由写明「天干丙正是丑月乙日的首取(穷通宝鉴)」;该干属忌神时不给这笔分。
27
- - **解释层**新增「穷通宝鉴」一节:格(「乙日生于十二月」)+ 用神与首取 + 原文摘句 + 章号;「未纳入」一栏同步改成「已录 120 格,整理表口径、异文处已标 note」。
28
- - **面板**寒暖卡下新增穷通宝鉴块:用神 chips(首取高亮)、原文引句、章号;文本摘要「寒暖:」一行后追加「穷通:十二月乙取丙(首取丙)」。
29
- - 新增 `tools/qiongtong-scrape.mjs`(抓 113 章原文,缓存不入库)与 `tools/qiongtong-build.mjs`(生成 `engine/qiongtong.js`),数据可复现。
30
- - 测试 `test/qiongtong.test.mjs` 31 条:120 格齐全、用神字合法、原文摘句非空、月令月名一致、定值(乙丑取丙、庚寅首取戊/原文先举丙、丁酉与癸未的 note、未知输入返回 null)、1996 寒湿盘接入(detail/评分/解释/面板)。
31
- - 统计:62 个测试文件 / 1745 条断言;client.js 44 模块。
32
-
33
- ## 0.20.0(已发布)
34
-
35
- 调候(寒暖燥湿)不再是脚注:从「扶抑为主 + 一句提示」改成「调候优先 + 扶抑校验」的判定层。
36
-
37
- - 新增 `engine/tiaohou.js`:按月令基础温度、全局火水比例、湿土燥土给出 **寒 / 寒湿 / 寒燥 / 湿滞 / 平 / 燥 / 燥热 / 温热** 八档气候,附温度与燥湿量化值和依据(如「季冬丑月、火0、水1.8、湿土2处」);由此定调候所取(寒湿取丙火、燥热取壬水)与所忌。偏寒偏燥明显时判「调候优先」,否则「扶抑为主」。
38
- - **用神仲裁**:调候所需与扶抑喜忌冲突时显式裁决并说明理由(「寒暖失衡时再补强弱也难受」),不冲突时写「两套取法同向,不必取舍」;`method` 字段改成「调候优先 + 扶抑校验」/「扶抑为主 + 调候校验」,读得出来用了哪套。
39
- - **评分接入调候**:流年/大运评分里,调候优先时天干地支合调候所需加权,合所忌扣权,寒局再逢水再扣(「地支子水加重寒湿」)。以 1996-01-19 盘为例:2020 庚子由「平 0.5」改为「忌 −0.8」并写明水助寒湿;2026 丙午「大吉 4.0」写明「寒湿之局得丙火,解冻」。
40
- - **解释层**新增「寒暖燥湿」一节:气候判定 + 体感白话(按日主五行各写一句)+ 调候取忌 + 仲裁;八字文本摘要加「寒暖:」一行。
41
- - **面板**在「用神」下新增寒暖卡:气候标签、调候优先徽标、寒—平—热标尺、调候取/忌/依据、白话叙述;独立页与面板共用。
42
- - 口径:调候由月令与全局寒暖燥湿判定,未逐条录入《穷通宝鉴》120 条;调候与扶抑的优先级各家有争论,界面与文档都写明采用的是「调候优先、扶抑校验」。
43
- - 测试新增 `test/tiaohou.test.mjs`(32 条:寒/热两盘、仲裁同向与冲突、评分方向与上下限、解释节、摘要行、面板卡);统计 61 个测试文件 / 1714 条断言。
44
-
45
- ## 0.19.0(已发布)
46
-
47
- 黄历、择日、公农历互转三处按「吉历」的用法补齐(只吸收合适的那部分,不搬它的小工具):
48
-
49
- - **黄历增强**:值日十二神(黄道/黑道)、十二时辰吉凶(五鼠遁定干支 + 时家十二神,逐时标吉凶)、二十八宿(吉凶/七政/禽/宫)、胎神、财神/喜神/福神/阳贵/阴贵方位、日柱纳音、六合三合吉配生肖;值日神/二十八宿/胎神/吉神方位与 lunar-javascript 逐日对拍(60 天仅交节当日 1 处日界差异,已注明口径)。
50
- - **择日扩充**:事项从 13 类扩到 27 类(领证/提亲/收送聘金/满月酒/交易/投资/签订合同/搬家入宅/装修建造/试车买车/旅行/赴任/访亲友/入学…),面板与独立页按「常用 / 婚嫁 / 生活 / 建造 / 工商」五组下拉归类;打分与冲属相排除口径不变。
51
- - **公农历互转 `convert`**:新增体系。公历 → 农历(农历年月日、闰月、干支四柱、生肖)与农历 → 公历(闰月须显式指定,小月无三十报错),往返自洽;只知道农历生日时可先转公历再排盘。工具层与面板、独立页都已接入。
52
- - 面板与独立页 tab 由 17 个扩到 **18 个**;黄历 tab 有专属卡片(值日徽标、宜忌、四格、吉神方位、十二时辰吉凶网格)。
53
- - 测试新增 `test/tools3.test.mjs`(14 条:黄历新增字段定值、五鼠遁、十二时辰吉凶、公农历往返/闰月/报错、择日分组与冲属相排除、渲染与接线)。
54
-
55
- ## 0.18.4(已发布)
56
-
57
- 称骨补上**称骨歌原文**与白话释义(此前只有自撰的分档批语):
58
-
59
- - 新增通行本《称骨歌》52 首(二两一钱 … 七两二钱),`CHENGGU_SONG` 按骨重(钱)索引,原文照录;
60
- 各版本有异文,断句标点统一为「,;,。」
61
- - `buildChenggu` 新增 `song` 字段:`{ text, plain, title, source }`;`plain` 是白话释义(自撰,明确不是原文),
62
- 超出 21–72 钱时给出「未见通行本歌诀」而不是编一首
63
- - 文本摘要把「歌诀」与「释义」分两段;口径里写明歌诀为通行本、释义为白话自撰
64
- - 新增 `PP.chengguHTML`:四项骨重表格 + 合计与分档徽标 + 歌诀(两行竖排大字)+ 释义 + 口径;
65
- 面板与独立页的称骨 tab 改用它(原先落到通用文本块)
66
- - 新增 `test/chenggu.test.mjs`(18 条):52 档齐全且都是四句、关键档位不串行、白话不是原文、
67
- summary 两段、渲染器四项与口径、两处界面接线
68
- - 统计:59 个测试文件 / 1668 条断言
69
-
70
- ## 0.18.3(已发布)
71
-
72
- K 线的第二轮打磨(0.18.2 之后的可读性修正):
73
-
74
- - 大运段名从图顶挪到图下的条纹带里,不再和「最高/最低岁」标记抢位置;段名居中,条带随大运交替着色
75
- - 5 年 / 10 年均线在右缘标出末端数值,两条贴太近时自动上下错开
76
- - 纵轴补 0/25/50/75/100 刻度,横轴补「年龄(岁)」与「每岁一分 · 满分 100」;影线用 `clipPath`
77
- 夹在绘图区内,贴边的影线不再溢出
78
- - 新增统计条:全段均值、最好大运、最差大运、波动幅度。旺衰落在换档阈值附近时只给均值与波动,不给
79
- 「最好/最差大运」的顺位
80
- - 图高由 300 提到 322,给刻度与段名条留位
81
- - `test/kline.test.mjs` 增到 29 条(段名条、均线末端值、纵轴刻度、统计条、最好/最差大运)
82
- - 统计:58 个测试文件 / 1650 条断言
83
-
84
- ## 0.18.2(已发布)
85
-
86
- 人生 K 线从「等宽文本 + ASCII」升级成真正的蜡烛图,并嵌进八字结果:
87
-
88
- - 新增 `PP.trendChart` / `PP.trendHTML`:实体=该岁相对上一岁的涨跌、影线=±4 分;叠 5 年 / 10 年均线、
89
- 大运交替底色与分界虚线(段名标顶部)、0–100 固定量程网格、年龄刻度、最高/最低岁标记;悬停看逐年
90
- 「多少岁 / 哪一年 / 什么干支 / 多少分 / 落在哪步大运」。颜色全走 CSS 变量,深浅色与打印跟随
91
- - 「人生K线」tab 不再输出纯文本摘要,直接给图 + 大运分段 chips + 高低年份;数据不足或空值时安全退回文本
92
- - **八字结果底部直接嵌同一张 K 线**(面板与独立页在排八字时顺带算一次 `trend`),与原有的
93
- 「人生运势曲线」(大运阶梯 + 流年折线)并存:曲线看趋势形态,K 线看逐年涨跌
94
- - 新增 `test/kline.test.mjs`(23 条):结构、坐标不越界、无 NaN、空/单点安全、旺衰边界不出高低结论、
95
- 两处嵌入点都在源码里
96
- - 统计:58 个测试文件 / 1644 条断言
97
-
98
- ## 0.18.1(已发布)
99
-
100
- 元数据与检索入口同步,**无运行时行为变化**:
101
-
102
- - 把「玄学 / 算命 / 占卜 / 运势」加进 `package.json` 关键词与描述、`locale/*.json`、市场条目描述、README 与工具描述——之前只写「命理排盘」,用户搜「玄学」搜不到;现在搜「玄学」应能命中
103
- - 工具描述补一条触发条件:用户只搜「玄学」或问「有什么玄学工具」时也应介绍本插件
104
- - 排盘逻辑、输出与测试断言不变;仅 UA 随版本号更新(`dsh-metaphysics/0.18.1`)
105
-
106
- ## 0.18.0(已发布)
107
-
108
- 吸收同生态另一款命理插件「玄机阁」(dsh-xuanji,MIT)的能力:**按行为规格独立实现,不 vendor 源码、
109
- 不引入 iztro / lunar-javascript 依赖**,引擎仍为零外部依赖的纯 ESM。
110
-
111
- ### 九套速查体系(新增)
112
-
113
- 每套都有 `engine/*.js` + 工具分支 + 面板/独立页入口 + 测试,口径固定、同日同结果:
114
-
115
- - **黄历 almanac**:农历、四柱干支(年柱按立春、月柱按节)、建除十二神、宜忌简表、冲煞与财喜神方位、
116
- 上一/下一节气、每日一卦。与 lunar-javascript 对拍四组日期(日柱/月柱/年柱/农历/建除全一致);
117
- 唯一差异是交节当日「上一节气」的日界口径(我们按正午判已交节),已记入 `meta.scope`
118
- - **择日 zeri**:13 类事项 × 建除适配打分,逐日分「推荐 / 可用 / 回避」,当事人属相冲煞日直接排除,
119
- 每条回避都带理由;明确是「排序引导」,不是吉凶断语
120
- - **称骨 chenggu**:年/月/日/时四项骨重求和与分档批语。年表按 `(农历年-4)%60` 查 60 甲子,
121
- 月日时各一张表;对拍公开黄历页修正了初版错表(1990-08-15 巳时应为**五两六钱**,不是五两五钱)
122
- - **小六壬 xiaoliuren**:时间起课(农历月/日/时三掐)与报数起课(三个 1–99),六宫吉凶与白话断语
123
- - **星座 star**:太阳星座档案 + 当日四维基调;基调由日期哈希确定性生成,同一天同一星座永远一致,
124
- 明写「不是随机数,也不是模型编的」
125
- - **生命数字 numerology**:生命路径数 / 生日数 / 态度数,11/22/33 主数保留,逐数给数义与课题;
126
- 与八字是两套口径,混问时会说明不可互相印证
127
- - **人生 K 线 trend**:复用八字的旺衰、大运、流年十神,按固定计分表给 1–100 岁逐年分与 K 线形态、
128
- 分大运 ASCII 走势、最佳/最差年份。旺衰恰好落在换档阈值(±0.3)时只给提示、不给顺位结论
129
- - **风水 fengshui**:八宅命卦(1900s/2000s 男女公式、立春界)、大游年四吉四凶、流年九宫飞星
130
- (2026 一白入中为锚)、24 山门主灶布局倾向、命宅配调停文案;`scope` 明写不含玄空各运盘与现场勘舆
131
- - **起名 name**:评估现有名字或生成候选名;按八字喜用五行(偏强喜克泄耗、偏弱喜生扶)匹配 241 字
132
- 自建字库,未收录的字如实标「未收录」。**不做五格剖象**(需康熙字典笔画)与音韵判断
133
-
134
- ### 1986–1991 夏令时自动校正
135
-
136
- `engine/dst.js`:中国 1986–1991 年夏季行夏令时,钟面时间比标准时快 1 小时。八字/紫微/合盘/验前事/
137
- 生时校正/人生 K 线/风水在排盘前统一校正,跨日时回退到前一天 23:xx 并给出 `dst.note`;
138
- `dst: false` 可显式关闭(出生证已是真实太阳口径时用)。修正了「夏令时出生按钟面时间排盘差一个时辰」的口径错误。
139
-
140
- ### 合婚明细层(hepan 增强)
141
-
142
- 原有总分与三维度**不动**,新增 `detail`:属相六合/三合/六冲/相害/相刑、天干五合、双向十神、
143
- 跨盘地支关系、年命纳音生克、吉凶象计数分档(上 / 中上 / 中 / 需磨合)。冲刑害一律中性叙述,不断「必分」。
144
-
145
- ### 界面
146
-
147
- - 面板与独立页 tab 由 8 个扩到 **17 个**:九套速查体系各有自己的最小输入;速查结果走通用 `pp.quickHTML`
148
- (等宽文本 + 标题),不套命盘模板
149
- - 八字面板补传 `verifyPast`,验前事区块终于会在面板里出现(此前只有独立页有)
150
- - 独立页「方法页」同步体系清单与已知边界
151
-
152
- ### 视觉升级三项(沿用本次工作树)
153
-
154
- 视觉升级三项,均不改计算口径、不新增判断:
155
-
156
- - **色板拉开层级**:`--bg` 压深作「桌面」(`#fffdf8 → #f6f1e6`),`--card` 提到近白(`#fffefb → #fffdf8`),
157
- band / tri / soul / sel / link 一并拉开。`--hair` 随底色同步加深(`#efe9dc → #e9e2d3`),否则比背景还亮、
158
- 发丝线会变成高光。深色块用同一套逻辑(底更沉、卡片更亮)。
159
- 改动前 `--bg` 与 `--card` 只差 1/255,卡片与底色几乎同色,一切「卡片」都浮不起来。
160
- 前景色(ink / muted / red / lu / 十神组)一个未动,对比度、打印样式、可访问性不受影响
161
- - **人生运势曲线**:新增 `pp.curveHTML()`(渲染在八字盘「大运」节内)——大运作阶梯、流年作折线,
162
- 叠在同一坐标系;背景五条档位色带(绿=吉 / 灰=平 / 红=忌),标出全程最高运与最低运,
163
- 今年流年点加粗描边,悬停看逐年「年份(年龄)干支 档位 分值」。
164
- 纯内联 SVG、零依赖,颜色走 CSS 变量,深浅色自动跟随
165
- - 纵轴固定量程 −2.2 ~ 3.2(引擎实测 score ∈ [−2, 3.2]):固定而非自适应,不同盘之间才可比
166
- - 数据不足两步大运则不画(不画半张图);缺 `luck` 字段、传 null / 空对象均不崩
167
- - 新增 `test/curve.test.mjs` 36 条:几何不越界、色带无缝、阶梯形态、点与引擎数据对齐、
168
- 刻度不重叠、安全与无障碍、边界不崩
169
- - **三套内联 SVG 符号**(零依赖、零外部请求,一律 `currentColor` 跟随主题):
170
- - **爻线**:原先 span + 背景色拼接、靠 `flex gap:18%` 留阴爻间隙,字号一变间隙就飘;
171
- 改为 104×12 内联 SVG,间隙按画布坐标固定(两段各 43 + 间隙 18 = 104)。三种尺寸共用一份几何
172
- - **动爻标记**:沿用传统老阳 ○ / 老阴 ×,非动爻留同宽空位,六列对齐不抖;爻线列由 112px 放宽到 128px
173
- - **五行符号**:12×12 描边图标,形状取各元素最易辨识的意象(木=树 / 火=焰 / 土=「土」字骨 /
174
- 金=菱形 / 水=波纹),接入五行分类 chip 与用神喜忌行
175
- - **八卦小象**:14×10 三爻 SVG,接在梅花上下卦标题前;爻位由 `TRI_BITS` 自下而上翻转后渲染
176
- - 新增 `test/symbols.test.mjs` 79 条:三种尺寸几何、阴爻两段+间隙恰为满宽、八个卦逐爻位校验、
177
- 五条元素路径互不相同、整合到六爻/梅花/八字盘、既有结构回归护栏、无脏值无注入面
178
- - 全量 57 文件 / 1621 条 PASS(原 1362),`test:ci` 七道闸全绿
179
- - 新增 `test/tools.test.mjs` 65 条 + `test/tools2.test.mjs` 68 条:黄历对拍、择日排除冲属相、
180
- 称骨四项和、小六壬递推、星座边界、生命数字主数、DST 开关、人生 K 线边界、风水坐向、起名未收录字
181
-
182
- ## 0.17.1(已发布)
183
-
184
- 同步更新,**无运行时行为变化**:
185
-
186
- - README 与仓库现状对齐:补齐奇门 / 合盘(八套体系)、0.16–0.17 的报告化与可核验能力、安装示例版本
187
- - CI 自检加固:新增 `tools/check-bundle.mjs` 产物自检闸(逐模块编译 client.js、核对与源码一致),`test:ci`
188
- 先构建再检查;`ask.test` 不再读取仓库外的生成物
189
- - 仅 UA 字符串随版本号更新(`dsh-metaphysics/0.17.1`),排盘逻辑与输出不变
190
-
191
- ## 0.17.0(已发布)
192
-
193
- 对应「晚子时开关 / 验前事 / 生时校正」三条用户反馈:
194
-
195
- - **晚子时开关**:面板与独立页新增「晚子时换日」(八字/紫微/合盘)与奇门「归当日/归次日」;
196
- 之前引擎已支持 `lateZi` / `lateZiHourMode`,但 UI 没有暴露,用户无法自己调
197
- - **验前事**:工具参数 `verifyPast`(年数)+ 面板/独立页「验前事」区块——列出过去若干年的
198
- 流年信号(冲/合/刑、档位、十神),用户自评「准/不准/不确定」,用 `verifyFit` 算贴合度并给建议;
199
- **只读,不重排、不改盘**;贴合度低时先提示核对出生时间/时区/晚子时
200
- - **生时校正**:`engine/rectify.js` + 工具参数 `rectify`/`events`——对候选时辰逐一排盘,
201
- 按固定规则(事件类别 × 当年十神/关系/档位)打分,返回候选排序与并列说明;
202
- 规则显式可复核,明确「只缩小范围、不替代出生记录」
203
- - 测试:新增 `test/verify.test.mjs` 25 条;全量 53 个文件 / 1362 条 PASS
204
-
205
- ## 0.16.0(已发布)
206
-
207
- 报告化改版,对应与 Seeself 对比后的 R1–R8:
208
-
209
- - **R1 报告骨架**:解析顶部新增「一页读懂」五条摘要(整体 / 事业 / 财富 / 感情 / 节奏);
210
- 目录锚点跳转;新增三张表——八字「大运表 / 流年表 / 触发事件表」、紫微「大限表 / 流年表 / 触发事件表」,
211
- 全部由已有引擎字段摊平,不新增判断;打印加 `break-inside:avoid` 与表格换行规则
212
- - **R2 证据卡**:每个维度的「依据」从一行灰字升级为可展开的 `<details>` 证据卡
213
- (盘面事实 + 技法标签),并给每个维度打「置信度 强/中/弱」(只按证据条数分档,不引新算法);
214
- 文本输出同步:依据行尾附 `置信度:…`
215
- - **R3 追问模式**:新增 `engine/followup.js` 与工具参数 `ask`——围绕已算好的盘回答
216
- 「某一年 / 某方面」的问题(如「2027 年事业怎么样」),只取盘面已有字段,不重排、不猜测;
217
- 找不到年份/未识别方面时明确说找不到并给出可问范围。面板与独立页都加了追问输入框
218
- - **R4 示例报告**:面板与独立页各加「看示例」,固定示例盘(1990-05-12 14:30 男 石家庄)
219
- 走与真实排盘完全相同的渲染路径,无示例专用分支
220
- - **R5 交叉验证层**:新增 `engine/crosscheck.js` 与工具参数 `cross`——八字 × 紫微对
221
- 事业/财富/感情/身体/节奏五项并列对照,标注「同向 / 有张力 / 互补」;只作对照,不合并数值
222
- - **R6 量化表达**:八字/紫微各加「量化口径」分节——明确量化只到档位(十神权重、宫位计数),
223
- 不换算金额、不给疾病诊断;新增 `test/report-extra.test.mjs` 断言不出现金额区间
224
- - **R7 方法与验证页**:独立页内置静态「方法与验证」(体系、对拍 128 条、测试与闸门、口径、已知边界),
225
- 离线可开
226
- - **R8 导出与分享**:面板与独立页加「导出 .md」(盘面 + 解析 + 交叉验证 + 追问),
227
- 独立页保留打印/存 PDF
228
- - 测试:新增 `test/report.test.mjs` 36 条、`test/report-extra.test.mjs` 31 条;
229
- 全量 52 个文件 / 1335 条 PASS
230
-
231
- ## 0.15.0(已发布)
232
-
233
- - **性能**:节气按需计算、牛顿初值用回归年、容差放宽;八字单盘 2.70ms → 1.60ms
234
- - **口径差异对照**:`engine/diff.js` + `tools/caliber-diff.mjs`,区分根因字段与连带变化
235
- - **白话四层**:直答 / 说人话 / 每维一句话 / 追问建议;术语按体系区分
236
- - **规则知识库**:28 条(出处 + 可信度 + 尚未实现清单)
237
- - **卦例对拍扩容**:《卜筮正宗》从 19 条扩到 **128 条**(93 成对 + 35 静卦),
238
- 新增核对动爻个数、缺爻(伏神)、旬空;排除的 5 条连同理由留在
239
- `tools/data-boshizhengzong.mjs` 的 `excluded`
240
- - **引擎入参守卫(P0)**:新增 `engine/validate.js` 的 `assertCivil()`,`buildBazi / buildZiwei /
241
- buildDaliuren / buildQimen / buildHepan / buildZiweiHepan / buildSnapshot` 入口统一校验;
242
- 坏入参从裸 `TypeError` 改为 `E_INPUT`,文案写清「该传什么」(15 类坏输入有契约测试)
243
- - 统一错误工厂 `engine/fail.js`;梅花的 datetime / 数字起卦错误也改为 `E_INPUT`
244
- - **缓存层统一(P0)**:新增 `engine/lru.js`(上限 + TTL + 命中率),节气瞬时/单年/三年窗口/
245
- 地址四处缓存改为同一工厂;`DSH_METRICS=1` 时 `renderText` 打印各缓存命中率
246
- (实测紫微盘 `termInstant` 命中 75%)
247
- - **规则表单一真源(P0 收尾)**:`engine/nayin.js`(六十甲子纳音,bazi/ziwei 共用)、
248
- `engine/sanhe.js`(三合四局 + 单支归属,bazi/hepan/daliuren 共用);纳甲本就在 `liuyao.js` 一份
249
- - `test/tables.test.mjs`:纳音 60 项与八字导出逐项一致、三合同局判定与五行等价、
250
- 乾为天纳甲起例,并用静态检查防止有人再把表复制回各模块
251
-
252
- ## 0.14.3(已发布)
253
-
254
- - **经典通例对拍**:新增 `test/fixtures/classics.json` 与 `test/classics.test.mjs`,把典籍里的规则表当作期望值来验实现——
255
- - 六爻:京房八宫卦序的宫属与世应(八纯上爻、一至五世依次、游魂四爻、归魂三爻),64 卦全表
256
- - 六壬:日干寄宫(甲寅乙辰丙戊巳丁己未庚申辛戌壬亥癸丑)、中气换将(雨水登明亥将起,12 个中气抽样)
257
- - 紫微:纳音定五行局、紫微天府以寅申为轴相照
258
- - 出处与录入方式写在 fixture 的 `meta.sources`,由 `tools/gen-classics-fixture.mjs` 生成,不从引擎输出反推
259
- - 说明:录入的是**通例表**(规则级),不是某本书的例课原文;例课需要可引用的原文,见 README「对拍」
260
- - **卦象/牌阵类也给出「依据」**:六爻列本卦/变卦、世应爻位与六亲六神、动爻、日辰、卦宫;梅花列本卦/互卦/变卦、体用与生克、动爻;六壬列课体、三传、月将、旬空与青龙/朱雀/六合/天后/白虎/子孙是否出现;塔罗列牌阵与牌位、主轴牌、正逆位计数与元素分布
261
- - 至此六个有维度的体系(八字/紫微/六爻/梅花/六壬/塔罗)都能核对依据;奇门走分节形态,事实本就写在 section 正文里
262
- - **《增删卜易》卦例对拍**:从 PDF 电子本(有文字层)录入 9 条原文卦例——「月建 + 日干支 + 本卦 → 变卦」,出处精确到章(元神忌神衰旺章第十、月将章第十六、日辰章第十七、独发章第三十一、星煞章第三十三、用神元神忌神仇神章第九)。引擎须按 64 卦表还原这一对(名字、翻爻、变卦生成)
263
- - 《卜筮正宗》(复城道长精校)此前是**扫描版 PDF、无文字层**;这次拿到同一版本的 **docx**(有文字层),从中提取 138 条带「占事」的卦例,99 条卦名可唯一解析,收 19 条进 `boshizhengzong`
264
- - 每条核对:本卦 → 变卦、卦宫(宫 + 五行,与八宫表互证)、有日期的样本还核旬空
265
- - 书中「空亡」与通用旬空不一致的例子(丙辰日作戌亥,应为子丑)只记卦名卦宫、不断言空亡;1 条卦宫与八宫表冲突(表格串行)不收,原因写在 fixture 的 `meta.sources`
266
- - 原文用字保留异体(遯/遁、干/乾),动爻**不录**——原书卦象图在 PDF 里被压成一行,位置不可靠,硬录等于造数据
267
- - **六爻补旬空**:`buildLiuyao` 现在输出 `xunShou`(旬首)与 `xunKong`(旬空两位),文本摘要多一行「旬首:甲午 旬空:辰巳」;六旬表与「丙辰日空子丑」都有断言
268
- - **双 UI 收口(第一步)**:新增 `src/core.js`,把「爻值解析」「问事体系」「数字输入」三条规则收成单一来源,`app.js` 与 `web-ui.js` 都改为调用 `window.__MPCore`;构建脚本把 core 一并打进 `client.js` 与独立 HTML
269
- - 单测 `test/core.test.mjs`(21 条)直接加载浏览器文件验证;`ask.test.mjs` 改为检查「单一来源 + 两端委托」
270
- - 表单编排(参数拼装)仍各留一份,下一步再收
271
- - **修合盘面板**:合盘的主方性别/出生地被漏在 `bazi|ziwei` 分支之外——0.14.1 起引擎把性别改为必填,面板点「合盘」会直接报 `你(主方)的gender 必须是 male 或 female`,看起来像"合盘不对"。现在三体系共用同一分支,合盘四柱与单盘一致(实测 庚午 辛巳 丁丑 丁未 对 庚午 辛巳 丁丑 丁未)
272
- - **奇门进面板**:新增「奇门」tab,起局时刻 + **换局规则**(fieldset + legend + `role="radiogroup"` 的原生 radio:拆补 / 超神接气 / 置闰,附 `details` 说明),`juMethod` 透传给引擎;盘面下新增 `qimenFactsHTML`,用 `dl > div > dt/dd` 列出局数、节气、四柱、值符、值使、旬首、空亡、驿马、换局规则、晚子时——事实与解读区的结论分开,全部走 `esc()`
273
- - 尚未做(下一步):三栏 Grid 布局、`<template>` 渲染、显式状态机(idle/missing_input/…)、960/1200 断点的布局断言
274
- - **独立页补齐合盘 / 奇门**:`命理排盘.html` 由六个 tab 变八个
275
- - 合盘:对方出生日期/时刻/性别/出生地 + 「合盘方式」八字/紫微切换;主方同样带性别与真太阳时,四柱与单盘一致
276
- - 奇门:换局规则用 `fieldset + legend + role="radiogroup"` 的原生 radio(拆补/超神接气/置闰,附 `details`),加「询问方向(定用神)」;结果 = 九宫盘 + `dl` 事实表 + 分节解读;换规则重起局、换方向只重出解读
277
- - `build-html` 导出 `page()` 且直接运行时才写盘,`test/standalone.test.mjs` 直接对生成源码做结构断言(24 条)
278
- - **解析深化:把"怎么推出来的"也写出来**
279
- - 八字 / 紫微新增四段:**看盘顺序**(月令→旺衰→用神→格局→大运→流年/命宫→三方→四化→大限,逐步引用实际值)、**时间窗**(当前与后续大运 + 近五年流年,带档位与理由)、**交叉校验**(喜忌分量对比、大运与流年同向/反向、调候与扶抑是否一致)、**未纳入**(没算什么、哪些流派差异会改变轻重)
280
- - 六爻 / 六壬补**看卦/看课顺序**(卦宫→世应→动爻→用神→日辰→变卦;月将→四课→三传→课体→神将)与**未纳入**
281
- - 这些段落全部由盘面数据推出,不新增断语;`test/deep.test.mjs` 41 条断言校验结构、关键步骤与"无占位值"
282
- - 测试:44 个文件 / 1147 条 PASS
283
-
284
- ## 0.14.2 —— 口径、复现与性能(已发布)
285
-
286
- - **1929 年前的节气改用当时的地方时**:`termInstantJd` 与农历共用同一套换算(1929-01-01 前为北京地方平时 UTC+7.7611,之后东八区),并顺手修正切点常量的半天偏移。此前农历切换、节气一律 +8,1929 年前出生者在交节前后约 14 分钟内可能月柱整柱错位
287
- - **晚子时口径统一**:`lateZi`(八字/六壬)与 `lateZiHourMode`(奇门)互为别名,一个概念不再有两个参数名;四套体系的摘要都会写明实际采用的口径(换日 / 不换日)。默认值保持原样(八字/六壬换日、奇门不换日),不偷偷改盘
288
- - **无经度必须告警**:没给出生地/经度时,八字与紫微摘要首行出现 ⚠(此前只在一行括号里提一句,海外出生很容易被忽略)
289
- - **可复现**:塔罗/六爻新增 `seed`(同 seed 同结果,可回放、可对拍);塔罗 `castAt` 由 `asOf` 决定;八字流年可用 `asOf` 钉死基准年(此前锚在"当前年份",隔年重算结论就变了);六爻的日辰(六神起法)也可用 `asOf` 固定,不再随本机日期漂移
290
- - **默认离线**:工具新增 `geocode: 'offline' | 'online'`,默认 `offline`——内置坐标表已到地级市,足够真太阳时;只有显式开启才会把出生地原文发给 Nominatim。地址解析加 6 小时缓存,UA 补上版本与仓库地址
291
- - **性能**:`termInstantJd` / `termWindow` 按年缓存(农历换算一次要问几百次中气,而 VSOP87 是全引擎最贵的一段)
292
- - 紫微盘 10.9ms → **0.5ms**,奇门 8.1ms → **0.07ms**,八字 2.4ms → **0.4ms**
293
- - 全量回归 15.8s → **3.3s**
294
- - **无障碍**:结果区补 `role="region"` + `aria-live="polite"`,错误提示 `role="alert"`,通知 `role="status"`
295
- - **工具层**:`geocode` / `seed` 进 schema,`asOf` 说明覆盖紫微/八字/塔罗三个体系;非法 `geocode` 值报 `E_INPUT`
296
- - **CI**:新增 `tools/check-html-sinks.mjs`(innerHTML 拼接必须经过白名单转义函数)与 `tools/check-patterns.mjs`(engine 纯净性、日志、`var`、`debugger`、`new Date()`/`Math.random` 白名单),正/负向都验证过
297
- - **稳定性扫射**:`test/fuzz.test.mjs` —— 用固定种子随机 12 组生日跑遍八个体系,覆盖参数矩阵、边界日期(1600/2400/闰年/1929 切换点)、解析层与"同参数两次结果字节一致"
298
- - **自刑补齐**:辰午酉亥两柱同见判「自刑」,大运/流年支与原局同支也按自刑处理。此前 `buildRelations` 遇到同支直接跳过,四柱里 3 个辰也不会报刑
299
- - **权重口径显式化**:五行占比(1/0.5/0.3)与日主通根(1.2/0.6/0.3)各自命名并注明用途——数值未变,只是不再像"同一件事写了两份"
300
- - **解析加「依据」**:八字与紫微的五个维度各附一行盘面事实(日主旺衰、月令、喜忌、大运流年、宫位主星、煞星),面板渲染 `mp-it-dev`、文本渲染「 依据:…」;卦象类的依据行在 0.14.3 补齐
301
- - **解析失败不再变空壳**:builder 抛错时面板显示「⚠ 解析生成失败」并把原因转义后带出,文本摘要同样标出;此前只返回一个空 dimensions 的对象,用户看到的是"没有解析"
302
- - **结构不变量**:`test/invariants.test.mjs` —— 不依赖外部样盘,用"盘面自身必须成立"的性质守算法:紫微 12 宫支互异/大限连续覆盖、奇门八门八神各一次、六十四卦一一对应、四柱纳音与世应合法。金标准只能覆盖少量样盘,不变量对每张盘都成立
303
- - 测试:39 个文件 / 1011 条 PASS(新增 historical-tz、repro、caliber、tool-geo、fuzz、relations、evidence、invariants 八组)
304
-
305
- ## 0.14.1 —— 先让「通过」可信
306
-
307
- 这一版不加新体系,只补三件会静默出错的地基:测试的失败信号、渲染层的转义、入参的拒绝。
308
-
309
- - **测试不再假绿**:`test/_harness.mjs` 统一断言,任何一条 FAIL 都让进程非零退出。此前 bazi / calendar / liuyao / lunar / shensha / tarot / ziwei / e2e / layout 九个文件只 `console.log`,断言写错也 exit 0,`npm test` 恒报 27/27
310
- - `tools/check-assertions.mjs`:每个文件的 PASS 条数锁进 `test/assertion-baseline.json`,删断言即失败(`npm run test:baseline` 显式重建)
311
- - `tools/verify-tests-can-fail.mjs`:故意写错一条断言,必须变红——保护「测试本身」
312
- - **两处 XSS**:塔罗面板的「所问」与解读段落回显(`src/panel-kit.js`)、独立页错误提示(`src/web-ui.js`)此前把用户原文拼进 `innerHTML`;现改为 `esc()` 与 `textContent`,并加 `test/security.test.mjs` 回归
313
- - **入参校验与错误码**:`compute()` 新增 `E_INPUT / E_RANGE / E_LINES / E_COUNT / E_ASOF / E_PARTNER / E_SYSTEM`
314
- - 日期按月份天数与闰年校验(`1990-02-30`、`2026-04-31` 不再静默滚到下个月)
315
- - `bazi / ziwei / hepan` 的 gender 改为必填(缺省按男命排会让大运/大限方向整个反掉)
316
- - 六爻爻数 ≠ 6 时报错(不再悄悄换成随机卦);塔罗张数非 1/3/5 时报错;`asOf` 非法时报错(不再静默用「此刻」)
317
- - 工具层 `execute()` 统一包上 `[错误码]` 前缀,内部异常不再以堆栈式文案直出
318
- - **合盘口径与单盘对齐**:合盘现在把 `address / longitude / trueSolar / lateZi` 分别透传给双方(工具层也会为 `partner.address` 解析经度)。此前合盘完全忽略地址,同一次出生在单盘是 丁丑 日、在合盘里却是 戊寅 日
319
- - 新增 `test/hepan.test.mjs`:断言「合盘里的你 == 单盘的你」,八字与紫微两条链路都覆盖
320
- - **解析文案修复**:`命局身身强`(level 已含「身」)、`调候上还初夏`(硬拼连接词)、同一段两次「调候上…」、大运与流年档位并成一句导致建议前后矛盾
321
- - 新增 `test/interpret-copy.test.mjs`:对 8 个体系的实际输出做病句/重复/未定义值扫描
322
- - 测试新增 `test/args.test.mjs`(40 条)、`test/security.test.mjs`(10 条)、`test/hepan.test.mjs`(7 条)、`test/interpret-copy.test.mjs`(63 条),全量 31 个文件 893 条 PASS
323
- - CI 增加「断言数不低于基线」与「测试自检」两步
324
-
325
- ## 0.14.0 —— 奇门、合盘与节气精度(此前只存在于工作树,本版一并落库)
326
-
327
- - 新增**奇门遁甲**(时家转盘:拆补 / 超神接气 / 置闰三派取局、值符值使、九宫、空亡驿马)与对应解读
328
- - 新增**合盘**:八字合盘(日主关系 / 夫妻宫 / 五行互补)与紫微合盘(命宫、夫妻宫、五行局)
329
- - 节气计算改用 **VSOP87B 截断级数 + 岁差 + 章动 + 光行差**,与 NAOJ 历要项对拍偏差降到 1 分钟内
330
- - `parseDateTime` 对 ΔT 覆盖范围(1900–2100)之外的年份给出精度提示,摘要顶部标 ⚠
331
- - `geocodeAddress` 支持地址更细时联网(Nominatim)兜底,失败退回内置坐标表
332
- - 六壬补神煞与格局文案;紫微补流月/流日/流时并接入盘面与解读
333
- - `tools/qimen-divergence.mjs`:枚举三派取局的分裂样本,供排盘差异核对
334
-
335
- ## 0.13.6
336
-
337
- - 修 `npm run release` 的发布后核对:npm 的发布是异步的(PUT 返回 202,registry 生效实测要 1–4 分钟),脚本原来 30 秒就判定失败
338
- - 改为对 tarball 轮询 HEAD,最多等 6 分钟;超时只提示「已提交,稍后自查」而不报错
339
- - 顺手核对 `dist-tags`,`latest` 不指向新版本时给出 `npm dist-tag add` 的建议
340
-
341
- ## 0.13.5
342
-
343
- - 新增 `npm run release`(`tools/release.mjs`):一条命令走完「测试 → 构建 → 校验产物 → 发 npm」,token 只从环境变量 `NPM_TOKEN` 读,临时 `.npmrc` 用后即删
344
- - 发布前会拦下三种情况:git 工作区不干净、`client.js` 与源码不同步、registry 上已有同版本
345
- - `-- --dry-run` 只跑到校验;本机没装 npm CLI 时用 `NPM_CLI=/path/to/npm-cli.js` 指定
346
-
347
- ## 0.13.4
348
-
349
- - 新增 `npm run build` / `npm run build:html` / `npm test`:`tools/test-all.mjs` 顺序跑完 20 个测试文件并汇总退出码,省掉手敲一长串 `node test/*.mjs`
350
- - `daliuren` / `meihua` 两处旧测试统一成 `PASS/FAIL` 计数风格(此前只打印 `all pass`,CI 里数不出断言数)
351
- - 补 `CHANGELOG.md`;`engines.node` 声明 `>=18`;SUBMIT 文档补提交状态与阻塞说明
352
- - 新增 GitHub Actions(`.github/workflows/test.yml`):先构建并校验 `client.js` 与源码一致,再跑全部回归
353
-
354
- ## 0.13.3
355
-
356
- - **工具层打通「解析与详解」**:`compute()` 把 `question` / `direction` 透传给 `interpret()`;工具 schema 新增 `withInterpret`、`direction`(综合/财运/事业/感情/健康/学业/出行)与 `asOf`(流月流日流时的基准时刻);`renderText()` 在带解析时附上解析正文与免责声明
357
- - 修 `layout` 测试沿用旧类名 `.pn`(0.13.2 已改 `.ft-pn`)导致的假失败
358
- - 未知体系报错改为列出六种体系(原文案仍写着「紫微斗数尚未接入」)
359
- - `package.json` 补 `author` / `repository` / `homepage` / `bugs`;中英文案重写
360
- - 市场条目描述同步到当前能力(主星庙旺、流月流日流时、解析)
361
- - README 注明真太阳时只按经度修正、未含历史时区与夏令时
362
-
363
- ## 0.13.2
364
-
365
- - 叶子类名按语义补前缀(`bz-` / `dt-` / `flow-` / `ft-` / `ct-` / `hb-` / `ss-` / `ask-` 等 192 处),消除泛词类名复用隐患
366
-
367
- ## 0.13.1
368
-
369
- - 修三个潜伏的结构性缺陷:孤立「身」角标残骸、解析详解块调色板失效、320px 下六爻盘横向溢出
370
- - 打印时折叠的详解自动展开;宫格补 `aria-expanded` 同步
371
-
372
- ## 0.13.0
373
-
374
- - 八字四柱表按专业排盘版式重排(四列并排、无竖线、干支大字、十神分组着色、藏干逐行)
375
- - 末行新增五行旺相休囚死;修 `td.big` 选择器长期失效
376
-
377
- ## 0.12.0
378
-
379
- - 紫微补流月 / 流日 / 流时(斗君逐级下推),接入盘面与解读
380
-
381
- ## 0.11.0
382
-
383
- - 深色主题(盘面颜色全变量化)、存为 PDF / 打印、修 390px 下塔罗 tab 被裁
384
-
385
- ## 0.10.0
386
-
387
- - 紫微宫位可点击展开详情、三方四正联动;修「身宫整格消失」的类名撞车
388
-
389
- ## 0.9.0
390
-
391
- - 紫微十四主星加庙旺得利平不陷亮度标注;塔罗面板可选 1/3/5 张牌阵
392
-
393
- ## 0.8.x
394
-
395
- - 0.8.0 起卦 tab 新增「所问之事 + 询问方向」,解读按问题展开;解析区可折叠
396
- - 0.8.1 紫微解读补化科、流年四化不再截断
397
- - 0.8.2 手机竖屏紫微盘恢复 4×4 宫盘
398
- - 0.8.3 竖屏布局改用容器查询,修窄侧栏下盘面挤成一团
399
-
400
- ## 0.7.0
401
-
402
- - 新增「解析与详解」模块:五维度解析、卦象卦辞爻辞动爻、塔罗连贯解读,带免责提示
403
-
404
- ## 0.6.0
405
-
406
- - 六爻 / 梅花 / 六壬面板重绘(真爻线、体用标注、天地盘方盘);输入区区分出生时间与起卦时刻
407
-
408
- ## 0.5.0
409
-
410
- - 八字 42 神煞(七类、双查法)+ 格局 / 用神 / 大运流年评分
411
- - 紫微 34 格局、大限一览、流年四化
412
- - 塔罗模块重写:78 张牌、牌阵位义、6–8 段解读、体系声明
413
- - 首个进入插件市场投稿流程的版本(awesome-dsh-plugin PR)
1
+ ## 0.38.2(待发布)
2
+
3
+ 紫微格局修掉三处「写得像实现了、其实永远不成立」的判定:夹局的方向、羊陀夹忌、刑囚夹印;顺手把 34 条目录从 README 的 31 条补全,并用独立谓词逐条钉死。
4
+
5
+ - **夹局不分左右**(`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 等)钉住。
6
+ - **羊陀夹忌**:擎羊恒在禄存 +1、陀罗恒在禄存 −1,两星只能夹**禄存**那一宫;旧判据要求「化忌两侧是羊陀」,几何上不可能(1,553 张符合的盘一次都没报)。改为「化忌与禄存同宫」,证据文本写明化忌落在哪一支。
7
+ - **刑囚夹印**:廉贞与天相永远隔偶数宫,字面上的「廉贞、擎羊夹天相」同样不成立(17,568 张盘两向皆零)。按通行说法改为「廉贞天相同**守命宫**于子午、擎羊同宫」——源文说的是「守命」,所以判的是命宫那一宫,廉相羊同宫在别的宫位不报;evidence 写明三颗星同守哪一宫;命宫卯酉、廉贞天相对照遇擎羊的变体未纳入,写进 README 口径。三条来源:知乎「刑囚夹印」、sohu 格局文、ziwei-yun「天相不可能被廉贞和擎羊二星所夹」。
8
+ - **34 条目录补齐**:README 原列 31 条,且把 武贪同行、火贪铃贪 归在吉格(引擎一直是中性)、`双禄交流 / 命无正曜 / 杀破狼` 完全没写。现按引擎口径分三组列出(吉 20 / 中性 5 / 忌 9),`PATTERN_TONE` 改为导出供测试比对;README 与目录的一致性由测试直接解析 README 断言。
9
+ - **结构统计补中性**:`patternSummary` 增 `neutral`,摘要行改成「吉格 N、中性 K、忌格 M」——此前中性格计入 count 却不出现在统计里,count 会大于两档之和。
10
+ - **不新增能力、不动知识库**:知识库仍 47 条(本轮是判定口径修正,不是新规则);格局仍只描述结构、不折吉凶分数。
11
+ - **测试**:新增 `test/ziwei-patterns.test.mjs`(79 条)——34 条目录与 README 三组逐名对齐;312 张盘 × 34 条用独立谓词(只读星位与四化,不调引擎判定)复算,要求每条「零不符且至少命中一次」,专门防死规则;夹局镜像方向、羊陀夹命 ⇔ 禄存守命、羊陀夹忌 ⇔ 化忌同禄存、刑囚夹印守命(含「非命宫同宫不报」反向盘)、摘要计数与确定性各自钉住。故意把 `jia` 改回有序写法时该文件 11 条变红。统计 **81 个测试文件 / 2832 条断言**,七道闸全绿。
12
+
13
+ ## 0.38.1(待发布)
14
+
15
+ 古籍库补上《子平真诠》论格局成败的两章,并把「用神总纲」一位改成按盘取;顺手修掉 why 里拼出「论论财」的旧文案。
16
+
17
+ - **两条原文**(`engine/classics.js`):`zp-chengbai`(九、论用神成败救应,「成中有败,必是带忌;败中有成,全凭救应」)与 `zp-bianhua`(十、论用神变化,「藏庚透壬,则化为财。凡此之类皆用神之变化也」),均照录中华典藏网 53629 / 53630,白话自撰。
18
+ - **为什么是这两章**:0.37.0 起古籍节覆盖了「月令格 × 两书对照」与「调候」,但化气格只剩气候与总纲,组合(官印相生、伤官见官等)没有任何原文可读——这两章正是判「化气成不成」「成格有没有带忌」的出处。
19
+ - **总纲位三选一,不另加位次**:`classicsFor` 的第五条仍是「用神总纲」位——有化气格取「论用神变化」,见组合取「论用神成败救应」,其余取「论用神」通用总纲。上限没有从 5 放宽,也没有让泛论挤掉针对这张盘的话;同盘同时有化气与组合时取「变化」,why 写明取舍。
20
+ - **文案 bug**:此前 why 用 `${书名}论${章名}` 拼,而章名本身已带「论」,实际输出成「子平真诠论论财」「三命通会论论正财」。改为「书名「章名」一条 / 另取」,章节标题去掉序号与开头的「论」;测试加「why 不出现论论」的断言。
21
+ - **知识库 47 条**:新增 `bazi-geju-chengbai`(成中带忌、败中有救)与 `bazi-huagi-bianhua`(月令藏干与合局改变取用),均标 `variant`——成格条件、化气成立条件各家宽严不一,只并列原文与方向,不逐盘判成破。`docs/知识扩展与待核实清单.md` 的条数、统计与注记同步;顺手把上一轮注记里写错的版本号 0.37.2 改回 0.38.0。
22
+ - **口径边界**:专旺格、从格仍没有对应的单章原文(三书里没有可整段照录的专章),不硬凑;古籍节仍只负责「书上怎么说」,不把原文折算成吉凶分数。
23
+ - **测试**:`test/classic-quotes.test.mjs` 新增 13 条(两章原文抽检与典藏网出处、why 无双「论」、三选一互斥、1996 盘取「变化」、化气/组合/无特格三种落点);`test/sanming.test.mjs` 新增 7 条(总纲换条后仍保住两书对照、两张知识卡的出处与「不当断语」口径)。统计 **80 个测试文件 / 2753 条断言**,七道闸全绿。
24
+
25
+ ## 0.38.0(待发布)
26
+
27
+ 补上知识卡里已经写了、引擎却一直没做的一层:**岁运并临与伏吟反吟的逐年提示**。此前 `bazi-suiyun` 卡说「只作变动提示」,但盘面里没有任何地方标出是哪一年,等于只有口径、没有实现。
28
+
29
+ - **四类信号**(`engine/bazi.js` 给每条流年加 `suiyun`):**岁运并临**(当值大运与流年干支相同)、**运年反吟**(大运与流年天克地冲)、**流年伏吟**(流年与年/月/日/时柱干支相同)、**流年反吟**(流年与某柱天克地冲)。每条信号带 `type` / `target` / `detail`,另给 `note` 写明口径。
30
+ - **当值大运怎么取**:流年按立春起算,取与「该年立春到次年立春」区间相交的大运;交运落在这一年里时,前后两步都在本年当过值,两条并列。没有用虚岁近似,也不把交运日抹平。
31
+ - **天克地冲的判据**:天干相克 **且** 地支相冲,缺一不算。例如丙子年对丙午年柱是同干相冲,不标反吟;这条单独在测试里构造验证。
32
+ - **口径与边界**:只标干支重复与对冲,不折分数、不判吉凶——「岁运并临主大凶」一说不采,摘要与解析都写明「只标变动,仍看该年是否动到用神」。大运与原局之间的伏吟反吟未逐年标,四柱十神的引化也未叠入;起运前只有流年这一侧能成立。
33
+ - **四处可见**:摘要加一行「岁运提示(只标干支变动,不判吉凶):2030庚戌 岁运并临;…」;解析新增「岁运提示」节,逐年写清当值大运与每条的出处;白话只在最近一个命中处补一句「变化感强一点,不是好消息也不是坏消息」;面板在流年 chip 下方单列一排提示,chip 悬停给逐条依据。旧结果(没有 `suiyun` 字段)照常渲染,解析退回「近十年没有」的保守说法。
34
+ - **账面口径修正**(`docs/知识扩展与待核实清单.md`):知识库实际已是 45 条(诸家一致 15 / 各家有异说 29 / 待核实 1),清单头部还写着 42 条、统计还停在 15/27/1,一并改对;「岁运并临吉凶」一行补上「已落引擎与界面」。
35
+ - **测试**:新增 `test/suiyun.test.mjs`(102 条)——不复用引擎判定,按「月柱干支顺逆推八步」与「立春区间相交」两套独立写法复算 10 张盘 × 10 年;扫描全部样本核四类信号与事实一致(并临必然同干支、反吟必然天克地冲、伏吟必然同柱);构造同干相冲(丙子 vs 丙午)不算反吟、起运前无大运、年内交运两步并列三条边界;钉住确定性、摘要/解析/白话/面板四处可见、旧结果兼容与知识卡口径。统计 **80 个测试文件 / 2733 条断言**,七道闸全绿。
36
+
37
+ ## 0.37.1(待发布)
38
+
39
+ 界面深修一轮,重点在窄屏:19 个 tab 不再吃掉首屏,两列表单不再被按钮挤成 134px;六爻的化进/化退补上力重。
40
+
41
+ - **桌面抬头改竖排**(`tools/build-html.mjs`):品牌一行、tab 条一行。tab 从右对齐的 flex 换行改为 `repeat(auto-fit,minmax(74px,1fr))` 等宽网格,每格同宽、末行左对齐,不再出现「起名 人格」两项孤零零挂在右边、与上一行错开半个身位。
42
+ - **窄屏 tab 改单行横滑**:3 列网格是为六个 tab 写的,tab 涨到 19 个后要占七行(约 340px),首屏只剩输入框。改回单行横滑,44px 触摸目标、`scrollbar-width:none` + `::-webkit-scrollbar{display:none}` 藏掉滚动条、首尾各留 12px 呼吸位;切到靠后的 tab 时 `scrollTabIntoView()` 把当前项滚到可视区中间(`prefers-reduced-motion` 下用瞬时跳转),避免「页面变了、高亮停在屏幕外」。
43
+ - **窄屏表单两列修好**:根因是 `.go{grid-column:4}`、`.go.ghost{grid-column:3}` 写死给桌面四列,窄屏两列时这两条会生成第 3、4 列隐式 auto 轨道,把两个正文列挤到 134px,性别与按钮全被压扁。窄屏改为「看示例/排盘」分别落在第 1、2 列,性别与出生地各占整行,三个勾选项两两成对,收尾不再留空格。
44
+ - **人格页重做**(`src/panel-kit.js`):结果卡原本是「四行细条 + 段落堆叠」,字小、无层级;现在按「类型抬头(大字类型码 + 名称/关键词 + 已答题数)→ 四维瓦片(双极字母 + 取值条 + 一句取向)→ 一句 → 优势/留意(绿/赭左线两张卡)→ 认知功能链(主导高亮)→ 工作/关系/学习/课题分节」分层。问卷态改成两列编号清单,桌面一眼扫完 24 题。同时把卡片抬头从 `<header>` 改成 `<div>`:页面级 `header{flex-direction:column}` 会把卡片抬头也压成竖排。
45
+ - **顶层卡片没拿到调色板**(根因):变量块只挂在 `.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` 的断言同步改为「各顶层卡共享同一份变量」。
46
+ - **人格问卷改分页问答**(`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` 组件);结果不进「最近排过」——答案没存进历史,重放还原不了问卷。
47
+ - **人格页输入区**:问卷与日期无关,起卦日期/时刻在人格 tab 下隐藏(面板与独立页同步);问卷整行独占,窄屏下 5 格缩字体与内边距、按钮整行、44px 触摸目标;深色下选中格文字随强调色反色(与 tab / 主按钮同一口径)。
48
+ - **桌面副本可同步**:新增 `--desktop` 与 `npm run build:desktop`,一次把同一份页面写到仓库根和 `~/Desktop/命理排盘.html`。桌面那份是手工拷的产物,源码一改就旧;现在构建就能刷新,页面左上角的版本徽标用来核对。README 三处说明同步更新。
49
+ - **变量补全与观感**:共享变量块补齐 `--ink3/--fx/--sans/--kai`(此前多条形同虚设的字体、次级色规则因此失效)与 `--shadow`,深色另给一套;盘面卡片统一 12px 圆角与外阴影,古籍引文块改为左侧朱线 + 楷体悬挂缩进,`:focus-visible` 统一描边,结果入场只做一次轻微上浮并尊重 `prefers-reduced-motion`。
50
+ - **六爻 · 化进/化退力重**(`engine/liuyao.js` 新增 `jinTuiPower`,挂 `result.jinTuiPower`):此前只标方向,现在把每条进退放回月建五态落档——旺相 → 后劲足(退则退得缓)、休囚 → 后劲有限(退则退得实)、死 → 进得虚、逢月破 → 月破失据、缺月建 → 只报趋势;旬空只标出、不改结论。摘要单列「进退力重」一行;解析在「卦体关系」里逐条写清月建、日辰与档位,「未纳入」删去该项(保留用神两现权重与伏神出伏应期);白话加一句;面板单列一排 chip(后劲足/退得缓绿、其余赭)。只给档位、不折加权分数,吉凶仍落在用神/忌神那一层判。
51
+ - **测试**:`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 条断言**,七道闸全绿。
52
+
53
+ ## 0.37.0(待发布)
54
+
55
+ 古籍库从两本扩到三本:接入《三命通会》卷五、卷六论十神七条,与《子平真诠》同一格局并列对照。
56
+
57
+ - **三命通会 7 条**(`engine/classics.js` 登记 `sanming` 书目):论正官、论正财、论印绶、论食神、论伤官、论阳刃、论建禄各一条,原文照录通行本、逐条给典藏网章节链接,白话释义自撰。选条标准只有一条——与「格局取用」直接相关;神煞、女命、六亲等卷暂不录入。
58
+ - **同格两书并列**:同一个「月令格」,先取《子平真诠》那一条(讲怎么用:顺逆、成败、救应),再取《三命通会》同格一条作对照(讲怎么取、怕什么)。例如正官格:子平真诠讲「刑冲破害为忌、生之护之为喜」,三命通会讲「六格之首,止许一位,多则不宜」。两条各给一句 why,不合并、不调和成一句断语。
59
+ - **条数上限 5**:格局两条 + 气候两条 + 用神总纲一条,正好把默认位占满;未匹配到两书同格时只出一条,不硬凑。
60
+ - **面板书名修正**(`src/panel-kit.js`):此前面板把非子平真诠的条目一律标成「滴天髓」,接入第三本后会串成「滴天髓·卷六·论正财」;改为按书目映射书名,`test/sanming.test.mjs` 钉住这一点。
61
+ - **知识库**:新增 `bazi-sanming-duizhao`(两书分工:一重「用」、一重「取」与「忌」,并列而不合并),全库 **45 条**。
62
+ - **口径**:只录与格局取用直接相关的七条,不声称覆盖全书;两书成书年代与流派不同,用语有出入,照录通行本、不做校勘改字,也不替两家调和。
63
+ - **测试**:新增 `test/sanming.test.mjs`(40 条)——书目与七条完整性、原文逐字抽检、七格「子平在前、三命在后」的对照选取、why 文案、上限与去重、确定性与 limit、摘要/解释层/面板三处可见、知识卡。`test/classic-quotes.test.mjs` 同步改为三书、条目 ≥26、单盘取 2–5 条。统计 **79 个测试文件 / 2571 条断言**,七道闸全绿。
64
+
65
+ ## 0.36.0(待发布)
66
+
67
+ 把 `docs/知识扩展与待核实清单.md` 里登记的两处缺口补上:紫微的「三方四正一起飞」、六爻的「全卦逐爻旺衰」。0.35.x 的面板修复随这一版一起发。
68
+
69
+ - **紫微 · 三方四正复合飞化**(`engine/ziwei.js` 新增 `flyComposite`,挂 `chart.flyComposite`):单宫飞化只回答「这一宫自己去找谁」,这一层把本宫、对宫与两个三合宫共四宫的宫干四化一起摊开——四宫各化禄权科忌,共 16 条,按落宫归堆,落到同一宫就是会照。四类会聚单独成型:**双忌会**(同宫收到 ≥2 个忌)、**禄忌同宫**(禄随忌走)、**三化以上会宫**、**自化**(宫干化出去又落回本宫)。摘要加【三方四正飞化】行(会聚标签 + 四化去向按宫去重);解析新增「三方四正飞化」节,写清哪几股力会到哪一宫;白话加一句「N 股力最后挤在 X 这件事上」;面板并排 chip,悬停给飞入清单。
70
+ - **紫微 · 口径**:会聚判定只看「落在同一宫」这一条结构事实,不折分数、不断吉凶,也未叠大限流年四化;星未上盘时只记星、不记落宫(`to: null`)。三方四正四宫由命宫 +4/+8/+6 推得,与格局识别用的那一套同源。
71
+ - **六爻 · 全卦逐爻旺衰**(`engine/liuyao.js` 新增 `hexagramStrength`,挂 `result.hexStrength`):与用神旺衰同一套判定(月令五态、日辰五关系、月破/暗动/冲空),区别只在不挑用神——六爻每一爻都给一次,世应、动爻、旬空另标,并给出五态分布 `counts`、最旺/最弱爻与世应各自的状态。
72
+ - **六爻 · 不依赖用神**:此前旺衰只在取到用神时才算,没指定所问之事就一片空白;现在 `hexStrength` 在 `buildLiuyao` 之后独立计算,没给 `direction` 也能看整张卦的气。
73
+ - **六爻 · 口径**:只报状态、不折分数;「未纳入」删去「全卦逐爻的月建旺衰」,保留化进化退的实际力重、用神两现取舍、伏神出伏应期三项。
74
+ - **知识库**:新增 `ziwei-sanfang-fei`(复合飞化的会照取法与各家分歧)与 `liuyao-quanggu-shuai`(全卦旺衰与「用神只是一处落点」),并把 `ziwei-feixing` 的 note 从「未做完整飞星串连」更正为「串连与复合飞化已做、未叠大限流年」。全库 **44 条**。
75
+ - **自我介绍与讨论群(只在仓库页)**:README 文末新增「关于:一个人做的插件,欢迎来聊」——写明这是个人作品、能力有限,欢迎就断法口径、神煞取法、解析措辞进群讨论,报 bug 请带输入与结果;`docs/assets/dsh-metaphysics-group*.png` 放群二维码。**不进插件运行时**:面板与离线页不加这条提示,市场条目与 `locale` 描述也只说能力、不说作者(提醒只出现一次,在仓库 README)。市场条目与 `locale` 另补齐了 0.35–0.36 两项新能力。
76
+ - **测试**:新增 `test/ziwei-fly-triad.test.mjs`(44 条)与 `test/liuyao-hex-shuai.test.mjs`(53 条)——四化表与五态五关系都用另一套写法逐格复算(16 条飞化、12 卦 × 3 月 × 6 爻)、归堆与会聚独立过滤比对、60 张盘结构自洽且会聚非死规则、四种冲法构造验证、摘要/解析/白话/面板四处可见、旧结果兼容、确定性。统计 **78 个测试文件 / 2531 条断言**,七道闸全绿。
77
+
78
+ ## 0.35.1(待发布)
79
+
80
+ 修一个会让整个命理面板白屏的崩溃,并让它以后能自己把错误说出来。
81
+
82
+ - **崩溃根因**(`src/app.js`):为了给「问进对话」记住上一张盘,加了一个 `useEffect` 去写 `LAST`,但它落在 `const [result, setResult] = useState(null)` **之前**;React 首渲时读依赖数组撞上 TDZ,抛 `ReferenceError: Cannot access 'result' before initialization`,整个面板渲染失败——桌面端看到的就是「侧栏有『命理』、点开一片空白」。已把该 effect 移到 `result` 声明之后。
83
+ - **渲染兜底**(新增 `PanelGuard`,`React.Component` 的错误边界):面板里任何一层组件抛错时,把错误原文与前 14 行栈直接铺在面板上,并附「__PP / Engine / React / 版本」环境行——不再白屏,也不用开 devtools 才能报错。
84
+ - **版本可见**:构建时把 `package.json` 的版本注入 `window.__MP_VER`,侧栏标题显示为「命理 v0.35.1」;`__ModuleLoader__.load` 的模块描述里也带 `version`。以后一眼能确认应用加载的是哪份构建。
85
+ - 测试与闸门不变:**76 个测试文件 / 2434 条断言**,七道闸全绿。
86
+
87
+ ## 0.35.0(待发布)
88
+
89
+ 面板可以直接把提问送进对话窗了:排完盘点「问进对话」,这张盘的摘要和你的问题会变成一条正常的用户消息,由对话里的模型接着答。
90
+
91
+ - **提问模板**(`engine/followup.js` 新增 `askPrompt`):四段——一句说明(不用重排盘)、`体系 / 所问` 两行、`——盘面摘要——`(取 `compute` 的 `summary`,超 3000 字截断并标「摘要已截断」)、`——回答要求——`(引到具体柱/宫/爻、没依据就说「这盘里看不出来」、不给绝对化断言)。只做文本组装,不调模型、不改盘,返回 `{text, question, system, label, chars, truncated}`。
92
+ - **对话桥**(`src/app.js`):往会话作用域槽位 `conversation.input.right` 注册一个不画界面的组件,从 slot props 取 `inputActions`;点按钮时 `setDraft(text)` 写草稿再 `submit()`,走输入框正常的回车路径——有回合在跑时排队,不打断当前回答。桥没挂上(插件刚装、还没重启,或 Harness 改了槽位名)时退回复制剪贴板并提示,不报错。
93
+ - **按钮位置**:结果卡下方的追问行,「追问」(本地按盘面字段直接答)旁边多一个「问进对话」,两者共用同一个问题输入框。
94
+ - **离线页不动**:`命理排盘.html` 没有 Harness 对话窗,所以只有「追问」,不出现这个按钮。
95
+ - 测试:新增 `test/ask-prompt.test.mjs`(46 条:字段结构、体系名翻译、问题原样带入、摘要截断与占位、六套体系各跑一遍、无绝对化表述、传 null 不抛、确定性);`test/client-bundle.test.mjs` 增加对话桥注册与「提问 → setDraft → submit」源码通路的断言(现在注册三个槽)。
96
+ - 统计:**76 个测试文件 / 2431 条断言**(当时),七道闸全绿。
97
+
98
+ # 更新记录
99
+
100
+ 版本按「一组可感知的改动」发,README 与市场条目描述随能力同步。
101
+
102
+ 0.23.0–0.33.0 都只提交在本地、没有单独发到 npm;这些内容随 **0.34.0** 一并发布。npm 上的 latest 从 0.22.0 直接跳到 0.34.0,`npm i dsh-metaphysics` 装到的就是这一版。
103
+
104
+ ## 0.34.0(已发布)
105
+
106
+ 六爻补上**用神旺衰**:月建给这一段时令的气,日辰给当天的扶克。此前用神只算到「落在哪一爻、与卦体怎么对」,旺不旺一律写「仍要月建日辰」,等于把最关键的一半留白。
107
+
108
+ - **月令五态**:爻五行与月支五行同气为旺、受月令生为相、生月令为休、克月令为囚、被月令克为死(`monthStateOf`)。
109
+ - **日辰五关系**:站在爻这一边说——日辰生我为「日生」、克我为「日克」、同气为「比和」,反过来是我泄日辰(「泄」)或我耗日辰(「耗」)(`dayRelationOf`)。
110
+ - **三种冲法分开命名**:月建冲爻为**月破**,日辰冲静爻为**暗动**,日辰冲旬空之爻为**冲空**,日辰冲动爻为**逢日辰冲**;不再混成一句「被冲」。
111
+ - **月建从哪来**:给了 `datetime`(或 `asOf`)就按节气换月、与八字同源(复用奇门的 `buildSnapshot`)取月支;没给时间就不编月建,只报日辰那一半,摘要里也看不出凭空多出的月份。
112
+ - **四处可见**:摘要加「用神旺衰:月建 午(火) 用神月建相 · 用神与日辰比和」;解析「用神落位与卦体」节加「时令对用神」段(逐爻写月建态与日辰关系、冲法);面板加一排旺衰 chip(旺/相/得日辰生用 ok 色,死/囚/月破/受日辰克/泄/耗用 warn 色);白话加一句「眼下这阵子对这件事是帮着的/不太帮忙/有帮有压」。
113
+ - **口径**:这一层只报状态标签,不折成分数、不断成败;全卦逐爻的旺衰仍未做(现在只算到用神那几爻),化进化退叠上月建日辰后的实际力重也仍未做。
114
+ - **知识库**:新增 `liuyao-yongshen-shuai`(variant)讲五态、五关系与三种冲法,note 写明各家对月破/暗动/冲空取法不完全一致。全库 **42 条**。
115
+ - **发版工具**:新增 `tools/verify-publish.mjs` 与 `--verify-only` 模式——核对以「tarball 能下载、字节与 registry 记的 shasum 一致、关键文件在包里」为准,因为 npm 会先让版本条目可见、附件晚几分钟才落盘(0.34.0 发布时就撞上过这段空窗,`npm publish` 的成功字样并不作数)。
116
+ - **测试**:新增 `test/liuyao-shuai.test.mjs`(52 条)——地支五行 12 支、月令五态与日辰关系各 144 格逐格用另一套写法复算、12 张静卦 × 3 个月建逐爻复算、月破/暗动/冲空/逢日辰冲四种冲法各自构造验证、标签次序、缺月建与缺用神的退化路径、摘要/解析/面板/白话四处可见、旧结果(无 `useGodStrength`)不炸、确定性。统计 **75 个测试文件 / 2379 条断言**(含发布核对工具的 35 条自测)。
117
+
118
+ ## 0.33.0
119
+
120
+ 奇门补上**天盘干的两层**:干对月令的旺衰,以及干与所落宫的生克。此前旺衰只算门与星,干只出现在击刑/入墓这类硬条件里,落宫关系(干与宫谁克谁)完全没说。
121
+
122
+ - **干宫生克**:新增 `stemPalaceRelation(stem, palace)`(`engine/qimen.js`),只吃「天干五行 + 洛书宫五行」,输出 干克宫 / 宫克干 / 干生宫 / 宫生干 / 比和 五种,附五行与一句说明;与门宫关系(门迫、宫制门)并列,**各说各的、不折成一个分数**,两者同时成立时分别列出。
123
+ - **干旺衰**:`STEM_ELEMENT`(甲乙木、丙丁火、戊己土、庚辛金、壬癸水)并入同一套旺相休囚死判定;每宫多 `stemElement` / `stemRelation` / `stemState` 三个字段,中五宫同样有(无门但干与星照算),汇总到 `states.stem`。
124
+ - **三处可见**:摘要【旺衰】行改为「门 … 星 … 干 …」;解读「月令旺衰」段加入天盘干一行与「干宫的落宫关系另算:宫克干 9宫辛、2宫癸;干生宫 7宫己…」;面板事实表新增**「干旺衰」「干宫生克」两行**,九宫格每格底部补干宫关系与干旺衰小字。
125
+ - **口径**:天盘干只认三奇六仪(甲隐于六仪、盘面不出现),所以干旺衰实际覆盖 9 个符号;干宫生克是「天盘干对地盘宫」,不是天盘干对地盘干的**十干克应**——后者 100 组仍未做(各家措辞不一,需先定底本)。
126
+ - **知识库**:`qimen-wangshuai` 扩写为「门、星与天盘干」;新增 `qimen-gan-shengke`(variant)讲干宫五态与「不折分数」,note 写明各家取象宽窄不一、十干克应未做。全库 **41 条**(诸家一致 15 / 各家有异说 25 / 待核实 1)。
127
+ - **测试**:新增 `test/qimen-gan.test.mjs`(53 条)——用天干五行与宫五行重推 10 干 × 9 宫 = 90 组全部复算;合成盘验五侧与缺参;扫 60 个真实盘逐宫核 `stemElement` / `stemRelation` / `stemState`(含中五宫),要求 9 个天盘干、五种干宫关系、五种状态都出现(防死表);`states.stem` 与逐宫一致;三处可见 + 转义;旧结果(无 stemState/stemRelation)不炸;确定性。统计 **73 个测试文件 / 2292 条断言**。
128
+
129
+ ## 0.32.0
130
+
131
+ 八字大运补上**交运时刻(日 / 时辰级)**——此前只有「几岁几月起运」,交运年份在边界处可能差一年内;清单里的 `bazi-dayun-jiaoqi` 从「待核实」转成「各家有异说」。
132
+
133
+ - **口径**:三日折一年。交运时刻 = 出生时刻 + 「出生 → 起运那一侧节令」的真实天数 × 365.2422/3(≈121.7474)。这一条比例同时兑现古法三条换算——3 日折 1 年、1 日折 4 个月(≈121.75 天)、1 时辰折 10 日(≈10.15 天);顺排数到下一节、逆排数到上一节。
134
+ - **每步大运**:在「同月同日同时刻」换,公历闰日(2 月 29 日交运)十年后退到 2 月 28 日;每步带 `fromDate` / `toDate`,八步首尾相接。
135
+ - **结果字段**:`dayun.jiao = { at, jd, scaleDaysPerDay, yearDays, spanDays, from:{name,time}, frame, offsetMinutes, note }`,旧的 `dayun.startAge` 与 `toNextJieDays` 原样保留(向后兼容);交运时刻与四柱同口径(真太阳时盘上就是真太阳时,`frame` 写明)。
136
+ - **三处可见**:摘要「大运:… 起运;交运 1998-08-08 02:51(平太阳时,距芒种 24.7197 天,三日折一年)」;解读「时间窗」节首行给交运时刻与换算说明,大运表新增**「交运」列**;面板运势曲线头部与页脚写交运时刻,大运 chip 的悬停标题带该步交运日期。
137
+ - **知识库**:`bazi-dayun-jiaoqi` 由 todo 改写为 variant——讲清放大口径、同月同日同时刻换、闰日退位,并注明各家对「一年折几日」取法不一(本插件固定 365.2422 日,与按 360 日折算的流派会差一两天)。全库仍 40 条(诸家一致 15 / 各家有异说 24 / 待核实 1)。
138
+ - **测试**:新增 `test/bazi-jiaoyun.test.mjs`(58 条)——比例与三条换算、用 `partsToJd` 独立复算偏移、顺逆取节令、八步相接与每步 10 年、闰日退位(1987-10-10 盘交运 1988-02-29 → 1998-02-28)、22 个盘的全日期合法性扫描、真太阳时口径、四处可见、旧结果兼容、确定性。`test/report.test.mjs` 的大运表断言改为按表头取列号(加列不再让它失败)。统计 **72 个测试文件 / 2239 条断言**。
139
+
140
+ ## 0.31.0
141
+
142
+ 新增第十九套体系:**十六型人格(mbti)**——一份 MBTI **风格**的 24 题问卷。这不是命理,是用户点名要的「isfp / infp 这种问答判断」;口径上单独写清它**不是官方 MBTI 量表**(题目、计分、常模都是自建的,不与任何商业量表对齐),结果只作自我参照。
143
+
144
+ - 新模块 `engine/mbti.js`(纯 ESM、零依赖、确定性计算):`DIMENSIONS`(EI/SN/TF/JP 四维,各带两侧白话与平手侧 I/N/F/P)、`QUESTIONS`(24 题,四维各 6 题,左右交错)、`FUNCTION_STACKS`(16 型 → 四功能码)、`FUNCTIONS`(八种认知功能各一句)、`TYPES`(16 型文案:称号、关键词、一句话、3 条优势、2 条留意、工作/关系/学习/课题)、`mbtiPaper()`(发卷)、`buildMbti({ answers })`(计分)。
145
+ - **计分**:每题净分 =(分数 − 3)× 侧向(题目的 `side` 是该题「像我」时的加分侧),维度净分大于 0 取左字母、小于 0 取右字母、= 0 按平手侧取并标「临界」;强度按「净分 / (答数 × 2)」分四档(临界 ≤12%、轻微 ≤30%、明显 ≤60%、很强)。跳过某题传 `null`(也接受 `''`)不计入分母,**至少答 12 题**才出口径;非数组或超过 24 个报 `E_INPUT`,分值不是 1–5 整数报 `E_RANGE`。
146
+ - **三处可见**:`compute({ system:'mbti' })` 不给 `answers` 时先返回 24 道题与量表说明;给了就返回类型 + 四维强度 + 认知功能栈 + 工作/关系/学习/课题;摘要分节写【十六型人格】【四维】【优势】【留意】【课题】【认知功能】【工作】【关系】【学习】与末行口径声明。
147
+ - **面板与独立页**:侧栏新增「人格」tab(`src/app.js`),独立页新增 `data-tab="mbti"` 与 `#for-mbti` 输入块(`tools/build-html.mjs`),两处都是「24 个分数(1–5,空格或逗号分隔;留空先发问卷)」一个输入框;结果由 `pp.mbtiHTML` 渲染成四维强度条 + 双栏优势/留意 + 认知功能 chips + 四段白话,问卷态则列 24 题清单。tab 从 18 个变 19 个,`test/standalone.test.mjs` 的 tab 清单断言同步。
148
+ - **工具 schema**:`system` enum 与描述加入 `mbti`,新增 `answers` 参数(24 个 1–5 整数,可含 `null`);`locale/en.json` 与 `zh.json` 的体系数从十八/十套速查改为十九/十一套,并点名十六型人格。
149
+ - **不进知识库**:十六型人格不属命理体系、也没接解读层(`interpret()` 不处理它),所以 `engine/interpret-knowledge.js` 仍是 40 条;它的口径声明写在结果自身的 `note` 与 README「精度与口径」里。
150
+ - 测试 `test/mbti.test.mjs` 63 条:问卷结构(24 题、四维各 6 题、左右两侧题数相同、题号唯一、平手侧齐全);试卷模式;**四组样例 × 四维独立复算**(另写「左分 − 右分」实现核净分、取值与类型);强度四档边界;全左=ESTJ、全右=INFP、全 3 分按平手取 INFP;16 型全覆盖且每型文案齐全(3 优势 / 2 留意 / 四场景)、功能栈 4 个合法码;入参校验 8 类;跳题按维度扣减答数、整维跳过标「未作答」;摘要与面板三处可见、转义、旧结果不炸;确定性与「同维同侧换题序不改分」。统计 **71 个测试文件 / 2181 条断言**。
151
+
152
+ ## 0.30.0(待发布)
153
+
154
+ 六爻的**用神落位与卦体联动**:以前解释层只有一句「问工作看官鬼」,并没有真的把用神取出来,所以「用神持世」「用神化退」「用神在六冲卦」这些话都无从对上。现在用神会真的落到某一爻上,再与卦体、动变、旬空串起来看。
155
+
156
+ - `engine/liuyao.js` 新增 `YONGSHEN_RULES`(七档取用)、`yongshenOf(result, { direction, gender, liuqin })`、`PURE_BY_PALACE`(宫 → 首卦,供伏神取用)、飞伏生克表 `WUXING_SAY`/`RELATION_LABEL`。
157
+ - **取用口径**:求财与男命妻缘看妻财、工作职位考核看官鬼、文书合同学历看父母、健康以官鬼为病(子孙为医药)、出行以世爻为用、感情男看妻财女看官鬼;未指明所问之事则不取用神,只给提示,不硬凑。
158
+ - **用神不上卦就取伏神**:回到本宫首卦(八纯卦)找同六亲的爻位,列出伏神与飞神,并按五行标出「飞生伏 / 伏生飞 / 飞克伏 / 伏克飞 / 比和」;首卦同一六亲两现时标「伏神两现」,两句都列出来、**不代选**,也不出出伏日期。
159
+ - **与卦体联动**:六冲卦(主散)、六合卦(主成)、变六冲、变六合、内外卦伏吟、内外卦反吟(并注明来源是地支全冲还是八卦正对)、用神化进 / 化退、用神旬空、用神持世 / 临应 / 发动。标签始终挂「用神」二字,避免把全卦的动势误当成用神的处境。
160
+ - **四处可见**:摘要新增 `用神:官鬼(工作、职位、考核)→ 2爻甲寅木(内卦)` 与 `用神联动:…`;解析在「卦体关系」之后新增「用神落位与卦体」节;面板在卦体 chips 之后加用神 chip 行;白话直答与整段白话各带一句「你问的这件事,在卦里对应第 2 爻」。
161
+ - 知识库按实现重写 `liuyao-yongshen`(七档取用,settled)与 `liuyao-fushen`(伏神取法与两现不代选,variant+note),全库 **40 条**(15 诸家一致 / 23 异说 / 2 待核实)。
162
+ - 测试 `test/liuyao-yongshen.test.mjs` 54 条:七档取用与感情分男女、出行用世;64 卦 × 5 档取用位置逐一核;伏神用 classics.json 里 **56 条带「缺爻」标注的卦例**对拍(伏神位必须等于本宫首卦同位,且与典籍原录的缺爻一致,100 处命中);飞伏生克方向独立按五行复算;卦体联动标签两侧都验;旬空两侧都验;摘要/解析/面板/白话四处可见;旧结果(无 `useGod`)不炸。统计 **70 个测试文件 / 2118 条断言**(当时)。
163
+
164
+ ## 0.29.0(待发布)
165
+
166
+ 紫微的**四化飞星串连**:宫干定四化、四化定落宫,再顺着这条化从落宫接着飞下去——把「命宫化忌进父母宫,父母宫又化忌进福德宫」这种逐宫传递,一路跟到它绕回来为止。
167
+
168
+ - `engine/ziwei.js` 新增 `FLY_TYPES`、`flyStarOf(stem, type)`、`flyStars(chart)`、`flyChain(chart, { from, type, maxSteps })`、`flyChains(chart, { from })`;`buildZiwei()` 结果新增 `fly`(12 宫 × 四化 = 48 条飞化)与 `flyChains`(命宫出发的四支链)。
169
+ - **两条口径**:①飞化只认宫干四化表(中州派表,庚干作太阳禄、武曲权、太阴科、天同忌),星落在哪一宫就写哪一宫,落回本宫记**自化**;②串连只跟**同一支化**逐宫跳,最多 12 步,回到走过的宫即记「成环」。因为「一个宫 → 一个宫」是函数映射,完整盘上每条链必然成环——实测链长为 1、3、4、5、6 步。
170
+ - **三处可见**:摘要新增 `【命宫飞星】禄:命宫→官禄→父母→命宫(成环)…`;解析在「四化」之后新增「四化飞星」节,逐跳写 `命宫(丙)化忌廉贞→父母`、点出成环与自化,并声明「这一层只描方向与牵引,不断吉凶」;面板在四化 chips 之后加四支飞化 chip(`飞忌 命→父母→福德→财帛→交友→父母↺`,title 给逐跳依据)。白话直答也带一句「这几件事是连着转的」。
171
+ - 知识库新增 2 条:`ziwei-feixing`(飞星派 vs 三合派、庚干异说,标 `variant`)、`ziwei-jichuanji`(串连走几跳、借对宫飞化各派不一,本插件走满 12 宫或成环即停,标 `variant`)。
172
+ - 测试 `test/ziwei-fly.test.mjs` 42 条:测试内**独立录入**十天干四化表核 40 条;固定盘 48 条飞化的落宫/地支/自化与盘面 `selfHua` 两处互证;四支链逐步核「宫干 → 化星 → 落宫」与首尾相接;换一张盘核 12 宫出发全成环;固定盘回归快照(禄/权/科/忌四条路径逐字);摘要/解读/白话/面板三处可见;旧结果(缺 `fly`)不炸。统计 **69 个测试文件 / 2064 条断言**。
173
+
174
+ ## 0.28.0(待发布)
175
+
176
+ 离线单文件页 `命理排盘.html` 改为**随 npm 包分发**:之前它只是本地产物(默认写到包目录之外),订阅者装完插件手里并没有这份页面;现在它就在包里。
177
+
178
+ - `tools/build-html.mjs` 的默认输出从 `path.resolve(root, '..', '命理排盘.html')` 改为 `path.resolve(root, '命理排盘.html')`——写进包根,`--out <路径>` 仍可另存(例如同步桌面那份手边的拷贝)。
179
+ - `package.json` 的 `files` 增加 `命理排盘.html`,`exports` 增加 `"./命理排盘.html"`:既会被 npm 发出去,也能用 `require.resolve('dsh-metaphysics/命理排盘.html')` 拿到绝对路径。
180
+ - 重新生成一份进包:`node tools/build-html.mjs` → 689907 字符 / 887419 字节(UTF-8),单文件零依赖,十八个 tab 齐全。外部 URL 只有三类:仓库链接、典籍出处链接(点开才联网)、可选的地理编码在线查询。
181
+ - **介绍同步**:`README.md` 特性表加「离线单文件页(随包分发)」并新增小节,写明包内路径、`require.resolve` 用法、与面板同源同版本、以及只在这两处会联网;`SUBMIT.md` 与市场条目 `submit/xuanfu-web__dsh-metaphysics.yml` 的 en/zh 描述都补上这一句。
182
+ - 测试 `test/standalone.test.mjs` 新增 4 条:`files` 里带离线页、`exports` 能解析、**仓库根那份与 `page()` 逐字相同**(防止改了源码忘了重建、把旧页面发给订阅者)、构建默认目标在包根而不是包外。统计 **68 个测试文件 / 2022 条断言**。
183
+
184
+ ## 0.27.0(待发布)
185
+
186
+ 六爻的「化进神 / 化退神」:动爻变出的地支与本爻同五行、且在顺次上往前一步,这一爻就有后劲;倒着退一步则渐消。
187
+
188
+ - `engine/liuyao.js` 新增 `jinTuiOf(from, to)`、常量 `JIN_TUI_PAIRS` 与 `JIN_OF`/`TUI_OF` 两张单向表;`bodyRelations()` 返回值新增 `jinTui: [{ position, from, to, type: '进'|'退' }]`。
189
+ - **判定口径**:八对顺次——木 寅→卯、火 巳→午、金 申→酉、水 亥→子,土四支成环 丑→辰→未→戌→丑。同五行但不相邻(如寅→辰)不算;同支不变不算;跨五行不算。
190
+ - `bodyLabels()` 在爻伏吟 / 爻反吟之后追加「化进神 5、6」「化退神 4」(进在前),面板 / 摘要 / 解读 / 白话读同一份标签。
191
+ - **三处可见**:摘要「卦体:」行带化进 / 化退;「解读」的「卦体关系」节逐爻写清本支→变支并声明「同一爻化进,也得看用神旺不旺」;面板 chip 化进用 ok 色、化退用 warn 色。
192
+ - 知识库新增 2 条:`liuyao-jintui`(settled,机制与八对表)、`liuyao-jintui-yong`(variant,讲用神化进为得力 / 忌神化进为患加剧,并注明土之进退次序各家不完全一致)。
193
+ - 测试新增 `test/liuyao-jintui.test.mjs` 49 条:五行分组独立生成八对进神再与 12×12 全枚举重算比对、12 条语料卦例逐字对拍、静卦与跨五行不硬凑、摘要 / 面板 chip / 旧结果兼容。`test/liuyao-body.test.mjs` 的 23 条对拍改为只核卦体标签(化进 / 化退另由新测试负责)。统计 **68 个测试文件 / 2018 条断言**。
194
+
195
+ ## 0.26.0(当时)
196
+
197
+ 奇门的「月令旺衰」:八门与九星各自对月支五行分旺、相、休、囚、死,回答「这个符号当下有多少气」。
198
+
199
+ - `engine/qimen.js` 新增 `monthState(element, monthElement)`、`monthElementOf(branch)`、`groupByState(items, monthElement)` 与只读表 `QIMEN_STATE_TABLES`(门/星/月支三张五行表)。
200
+ - **判定口径**:与月令同气为旺、月令所生为相、生月令为休、克月令为囚、被月令克为死。以月支五行为尺(寅卯木、巳午火、申酉金、亥子水、辰戌丑未土),八门与九星各用自己的五行去对;月令取四柱月支,与节气月同一口径。
201
+ - 排盘结果新增 `month: { branch, element }` 与 `states: { gate: {旺,相,休,囚,死}, star: … }`;每个宫多 `gateState` / `starState`(中五宫只有星的)。
202
+ - **三处可见**:摘要多一行「【旺衰】月令 午(火) 门 旺 景门 相 死门/生门 …」;「解读」新增「月令旺衰」节,列出五态归属、五态定义,并声明这一层只说明力量强弱、不折吉凶(门旺而宫克门仍受制);面板奇门盘下方键值表加「月令」「门旺衰」「星旺衰」三行。
203
+ - 知识库新增 2 条(`qimen-wangshuai` 为 settled,`qimen-wangshuai-yong` 标 variant 并写明「按时令/落宫论」的流派差异)。
204
+ - 测试新增 `test/qimen-wangshuai.test.mjs` 36 条:三张表与传世说法对拍、五行对月令的组合全部用测试内独立生克表重算、归堆不重不漏、60 个真实盘逐宫核对门/星状态与月令来源、五态在真实盘里都能出现、摘要/解读/面板三处接线、旧结果缺字段不炸。统计 **67 个测试文件 / 1969 条断言**。
205
+
206
+ ## 0.25.0(当时)
207
+
208
+ 奇门的「宫位条件」补齐两块:六仪击刑、三奇入墓——和门迫一样,都是天盘干落到某个宫就成立的硬条件,只作条件、不打分。
209
+
210
+ - `engine/qimen.js` 新增 `jiXingOf()` / `ruMuOf()` 与只读表 `QIMEN_CONDITION_TABLES`,排盘结果多一个 `conditions: { jiXing, ruMu }`(每项 `{palace, stem, zhi, basis}`)。
211
+ - **判定口径**:
212
+ - 击刑按地支相刑定宫:甲子戊震三(子刑卯)、甲戌己坤二(戌刑未)、甲申庚艮八(申刑寅)、甲午辛离九(午自刑)、甲辰壬巽四(辰自刑)、甲寅癸巽四(寅刑巳)。只判天盘六仪,地盘不计。
213
+ - 入墓按五行墓库定宫:乙木墓未(坤二)、丙丁火墓戌(乾六)。只判天盘三奇;六仪、八门、九星的入墓说法不统一,留白。
214
+ - **三处可见**:摘要多一行「【宫位条件】击刑 … 入墓 …」;「解读」的「宫位条件」段把门迫/宫制门/击刑/入墓并列,每条带依据(如「甲午辛,午自刑」),并声明不自动等同于用神受制;面板奇门盘下方键值表加「击刑」「入墓」两行。
215
+ - 知识库新增 2 条(`qimen-jixing` / `qimen-rumu`,均标 variant 并写明流派差异)。
216
+ - 测试新增 `test/qimen-rules.test.mjs` 49 条:表与「地支相刑 → 该支所在宫」的独立推导逐条对拍、合成宫位验成立/不成立两侧、60 个真实盘扫查(六仪与三奇都能触发,防表变死数据;所标之宫与盘中天盘干一致)、摘要/解读/面板三处接线、旧结果缺 `conditions` 不炸。统计 **66 个测试文件 / 1930 条断言**。
217
+
218
+ ## 0.24.0(当时)
219
+
220
+ 六爻多了「卦体」这一层:六冲卦、六合卦、卦伏吟、卦反吟、爻伏吟、爻反吟,全部由纳甲地支实配推导,并用《增删卜易》体例的 23 条带断语卦例逐条对拍。
221
+
222
+ - `engine/liuyao.js` 新增 `hexBody()` / `bodyRelations()` / `bodyLabels()`:结果里多一个 `body` 字段(`ben` / `bian` 的六冲六合、`fuYin`、`fanYin.by: ['chong'|'pair']`、`yaoFuYin`、`yaoFanYin`),并挂 `body.labels` 供面板与文本共用同一份措辞。
223
+ - **判定口径(可复核)**:
224
+ - 六冲卦 = 六爻地支正好配成子午、寅申、辰戌三组对冲。按纳甲实排共 **10 支**:八纯卦 + 天雷无妄 + 雷天大壮(传统只认八纯,故知识条目按 variant 写并注明分歧)。
225
+ - 六合卦 = 配成子丑、寅亥、卯戌、辰酉、巳申、午未三组相合,正好 **8 支**,与传世名单完全吻合;六冲与六合无交集,重支之卦(如雷水解)不判。
226
+ - 卦伏吟 = 变卦某宫三支与本卦对应宫逐位相同,且**卦确实变了**;纳甲上只有乾震共用子寅辰/午申戌,所以只会出在乾↔震互换。
227
+ - 卦反吟 = 地支三爻全冲,或本卦之宫与变卦之宫在后天八卦上正对(乾巽/坎离/艮坤/震兑);爻伏吟、爻反吟按动爻本支与变支同支/相冲判。
228
+ - **三处可见**:摘要末尾「卦体:」一行;「解析与详解」新增「卦体关系」一节(讲聚散、原地、反复,并声明「标签只说明动势,吉凶仍归用神」),整体维度「依据」加一行卦体;面板六爻卡在爻线下方加 chip 行。
229
+ - 白话层(直答 / 说人话)各补一句卦体的话;知识库新增 4 条(`liuyao-liuchong` / `liuyao-liuhe` / `liuyao-fanyin` / `liuyao-fuyin`)。
230
+ - 测试新增 `test/liuyao-body.test.mjs` 63 条:六合 8 支与传世表对拍、六冲 10 支(含「只认八纯」的差异说明)、伏吟「卦未变不算伏吟」回归、反吟两路分判、23 条卦例逐字对拍;统计 **65 个测试文件 / 1881 条断言**(当时)。
231
+
232
+ ## 0.23.0(未单独发布,并入 0.34.0)
233
+
234
+ 八字结果里多了「古籍原文」:格局、十神喜忌、调候三条线,各引原书一句,并附白话释义与出处。
235
+
236
+ - 新增 `engine/classics.js`:**19 条**原文摘句——`子平真诠` 10 章(论用神、论用神配气候得失、论正官、论财、论印绶、论食神、论偏官、论伤官、论阳刃、论建禄月劫)+ `滴天髓` 通神论 9 条(寒暖、燥湿、衰旺、中和、官杀、伤官、月令、体用、精神),照录中华典藏网通行本,逐条带章名与 url。
237
+ - **匹配规则明确**:先按月令格局取对应十神章(如偏财格 → 论财),再按气候取《滴天髓》寒暖 / 燥湿,再补《论用神配气候得失》,最后以《论用神》兜底;去重后限 4 条,每条写明「为什么取这条」。
238
+ - **三处可见**:八字摘要末尾【古籍】四行;「解析与详解」新增「古籍原文」一节;面板八字卡在寒暖/穷通之后新增古籍块(书名·章、原句、白话释义)。
239
+ - 口径:原文照录通行本(各本有异文),释义为白话自撰;不把原句改写成结论,也不合并不同流派的说法。
240
+ - 测试新增 `test/classic-quotes.test.mjs` 34 条(19 条完整性、10 处原文定值抽检、匹配规则、解释层/摘要/面板接线);统计 **64 个测试文件 / 1818 条断言**。
241
+
242
+ ## 0.22.0(已发布)
243
+
244
+ 起名不再只是「未收录」三个字:逐字给出五行、判定与可换字。
245
+
246
+ - 字库 190 → **391 字**(常用名用字为主,按木/火/土/金/水五行分段):丰(火)、秋(金,秋收成熟)、林(木)这类常见字不再掉「未收录」。
247
+ - **逐字判定**:`assessName` 每个字返回五行、释义、性别倾向、来源(`lib` 自建字库 / `user` 你传入的 `charElements` / `none` 未收录)、是否合喜用;未收录的字不猜五行,但会给出**同喜用五行的可换字**(如「秋」不合喜用 → 可换坤(土)、垚(土))。
248
+ - **不替用户下判断**:没给生辰时 `favorable` 返回 `null`(不判合不合),结论分「无生辰 / 全未收录 / 全合 / 部分合 / 全不合」五档,并把统计(几个字、几个已知、几个合喜用、字库共几字)写出来。
249
+ - **候选去同质化**:`generateNames` 三轮选名(新字 + 新五行组合 → 新字 → 放开)× 字库顺序打散 × 两字异行优先,避免「清一色梓桐」。同一盘 8 个候选示例:李炎梓(火木)、李坤桐(土木)、李楠灿(木火)、李楷垚(木土)、李培炫(土火)、李炜城(火土)、李柏松(木木)、李煜烨(火火)。
250
+ - **面板**新增起名卡(`pp.nameHTML`):逐字大字 + 五行 chip + 来源徽标 + 合/不合喜用 + 可换字、八字与喜用一行、结论;生成卡按「名 + 五行 chips + 释义」逐行排,不再是纯文本块。
251
+ - 工具参数新增 `charElements`(`{字: 木|火|土|金|水}`,自定义字五行,未收录字也能参与判定);`name` 的出生信息允许省 `datetime` 用 `year/month/day`。
252
+ - 测试新增 `test/names.test.mjs` 39 条(字库规模与去重、丰秋林逐字判定、未收录字 + 可换字、charElements 生效与非法忽略、无生辰不判、候选全合喜用、面板结构与接线);统计 **63 个测试文件 / 1784 条断言**。
253
+
254
+ ## 0.21.0(已发布)
255
+
256
+ 《穷通宝鉴》120 格逐条入库:同一「日主 + 月令」该取什么,书上怎么写的,全都摆出来。
257
+
258
+ - 新增 `engine/qiongtong.js`:十天干 × 十二月令共 120 格,每格含用神顺序(首取在前)、原文摘句、出处章号;
259
+ - 用神顺序据通行整理表(knowyourbazi 整理表,首格为首选),原文摘句照录 [luckclub.cn](https://www.luckclub.cn/bazi/004/)《穷通宝鉴》每章首段(去掉「徐乐吾曰」评注);
260
+ - 数据里的 `quoteStems` 是「原文首段依次提到的天干」,与整理表首取不同处可对照阅读(如正月庚金:表首取戊,原文先举丙);
261
+ - 原文全章未见某用神字时(丁酉缺「丙」、癸未缺「壬」)直接写 note「按整理表录入,待以善本核对」,不替它圆场。
262
+ - **取用**:调候优先时,寒暖判定定「这一盘缺什么」,穷通宝鉴定「这一格书上取什么」;两者不同向时以调候为先,界面与解释层把两套并列写出,不悄悄合并。
263
+ - **评分**:流年天干正落在该格首取时 +0.3,次取 +0.15,理由写明「天干丙正是丑月乙日的首取(穷通宝鉴)」;该干属忌神时不给这笔分。
264
+ - **解释层**新增「穷通宝鉴」一节:格(「乙日生于十二月」)+ 用神与首取 + 原文摘句 + 章号;「未纳入」一栏同步改成「已录 120 格,整理表口径、异文处已标 note」。
265
+ - **面板**寒暖卡下新增穷通宝鉴块:用神 chips(首取高亮)、原文引句、章号;文本摘要「寒暖:」一行后追加「穷通:十二月乙取丙(首取丙)」。
266
+ - 新增 `tools/qiongtong-scrape.mjs`(抓 113 章原文,缓存不入库)与 `tools/qiongtong-build.mjs`(生成 `engine/qiongtong.js`),数据可复现。
267
+ - 测试 `test/qiongtong.test.mjs` 31 条:120 格齐全、用神字合法、原文摘句非空、月令月名一致、定值(乙丑取丙、庚寅首取戊/原文先举丙、丁酉与癸未的 note、未知输入返回 null)、1996 寒湿盘接入(detail/评分/解释/面板)。
268
+ - 统计:62 个测试文件 / 1745 条断言;client.js 44 模块。
269
+
270
+ ## 0.20.0(已发布)
271
+
272
+ 调候(寒暖燥湿)不再是脚注:从「扶抑为主 + 一句提示」改成「调候优先 + 扶抑校验」的判定层。
273
+
274
+ - 新增 `engine/tiaohou.js`:按月令基础温度、全局火水比例、湿土燥土给出 **寒 / 寒湿 / 寒燥 / 湿滞 / 平 / 燥 / 燥热 / 温热** 八档气候,附温度与燥湿量化值和依据(如「季冬丑月、火0、水1.8、湿土2处」);由此定调候所取(寒湿取丙火、燥热取壬水)与所忌。偏寒偏燥明显时判「调候优先」,否则「扶抑为主」。
275
+ - **用神仲裁**:调候所需与扶抑喜忌冲突时显式裁决并说明理由(「寒暖失衡时再补强弱也难受」),不冲突时写「两套取法同向,不必取舍」;`method` 字段改成「调候优先 + 扶抑校验」/「扶抑为主 + 调候校验」,读得出来用了哪套。
276
+ - **评分接入调候**:流年/大运评分里,调候优先时天干地支合调候所需加权,合所忌扣权,寒局再逢水再扣(「地支子水加重寒湿」)。以 1996-01-19 盘为例:2020 庚子由「平 0.5」改为「忌 −0.8」并写明水助寒湿;2026 丙午「大吉 4.0」写明「寒湿之局得丙火,解冻」。
277
+ - **解释层**新增「寒暖燥湿」一节:气候判定 + 体感白话(按日主五行各写一句)+ 调候取忌 + 仲裁;八字文本摘要加「寒暖:」一行。
278
+ - **面板**在「用神」下新增寒暖卡:气候标签、调候优先徽标、寒—平—热标尺、调候取/忌/依据、白话叙述;独立页与面板共用。
279
+ - 口径:调候由月令与全局寒暖燥湿判定,未逐条录入《穷通宝鉴》120 条;调候与扶抑的优先级各家有争论,界面与文档都写明采用的是「调候优先、扶抑校验」。
280
+ - 测试新增 `test/tiaohou.test.mjs`(32 条:寒/热两盘、仲裁同向与冲突、评分方向与上下限、解释节、摘要行、面板卡);统计 61 个测试文件 / 1714 条断言。
281
+
282
+ ## 0.19.0(已发布)
283
+
284
+ 黄历、择日、公农历互转三处按「吉历」的用法补齐(只吸收合适的那部分,不搬它的小工具):
285
+
286
+ - **黄历增强**:值日十二神(黄道/黑道)、十二时辰吉凶(五鼠遁定干支 + 时家十二神,逐时标吉凶)、二十八宿(吉凶/七政/禽/宫)、胎神、财神/喜神/福神/阳贵/阴贵方位、日柱纳音、六合三合吉配生肖;值日神/二十八宿/胎神/吉神方位与 lunar-javascript 逐日对拍(60 天仅交节当日 1 处日界差异,已注明口径)。
287
+ - **择日扩充**:事项从 13 类扩到 27 类(领证/提亲/收送聘金/满月酒/交易/投资/签订合同/搬家入宅/装修建造/试车买车/旅行/赴任/访亲友/入学…),面板与独立页按「常用 / 婚嫁 / 生活 / 建造 / 工商」五组下拉归类;打分与冲属相排除口径不变。
288
+ - **公农历互转 `convert`**:新增体系。公历 → 农历(农历年月日、闰月、干支四柱、生肖)与农历 → 公历(闰月须显式指定,小月无三十报错),往返自洽;只知道农历生日时可先转公历再排盘。工具层与面板、独立页都已接入。
289
+ - 面板与独立页 tab 由 17 个扩到 **18 个**;黄历 tab 有专属卡片(值日徽标、宜忌、四格、吉神方位、十二时辰吉凶网格)。
290
+ - 测试新增 `test/tools3.test.mjs`(14 条:黄历新增字段定值、五鼠遁、十二时辰吉凶、公农历往返/闰月/报错、择日分组与冲属相排除、渲染与接线)。
291
+
292
+ ## 0.18.4(已发布)
293
+
294
+ 称骨补上**称骨歌原文**与白话释义(此前只有自撰的分档批语):
295
+
296
+ - 新增通行本《称骨歌》52 首(二两一钱 … 七两二钱),`CHENGGU_SONG` 按骨重(钱)索引,原文照录;
297
+ 各版本有异文,断句标点统一为「,;,。」
298
+ - `buildChenggu` 新增 `song` 字段:`{ text, plain, title, source }`;`plain` 是白话释义(自撰,明确不是原文),
299
+ 超出 21–72 钱时给出「未见通行本歌诀」而不是编一首
300
+ - 文本摘要把「歌诀」与「释义」分两段;口径里写明歌诀为通行本、释义为白话自撰
301
+ - 新增 `PP.chengguHTML`:四项骨重表格 + 合计与分档徽标 + 歌诀(两行竖排大字)+ 释义 + 口径;
302
+ 面板与独立页的称骨 tab 改用它(原先落到通用文本块)
303
+ - 新增 `test/chenggu.test.mjs`(18 条):52 档齐全且都是四句、关键档位不串行、白话不是原文、
304
+ summary 两段、渲染器四项与口径、两处界面接线
305
+ - 统计:59 个测试文件 / 1668 条断言
306
+
307
+ ## 0.18.3(已发布)
308
+
309
+ K 线的第二轮打磨(0.18.2 之后的可读性修正):
310
+
311
+ - 大运段名从图顶挪到图下的条纹带里,不再和「最高/最低岁」标记抢位置;段名居中,条带随大运交替着色
312
+ - 5 年 / 10 年均线在右缘标出末端数值,两条贴太近时自动上下错开
313
+ - 纵轴补 0/25/50/75/100 刻度,横轴补「年龄(岁)」与「每岁一分 · 满分 100」;影线用 `clipPath`
314
+ 夹在绘图区内,贴边的影线不再溢出
315
+ - 新增统计条:全段均值、最好大运、最差大运、波动幅度。旺衰落在换档阈值附近时只给均值与波动,不给
316
+ 「最好/最差大运」的顺位
317
+ - 图高由 300 提到 322,给刻度与段名条留位
318
+ - `test/kline.test.mjs` 增到 29 条(段名条、均线末端值、纵轴刻度、统计条、最好/最差大运)
319
+ - 统计:58 个测试文件 / 1650 条断言
320
+
321
+ ## 0.18.2(已发布)
322
+
323
+ 人生 K 线从「等宽文本 + ASCII」升级成真正的蜡烛图,并嵌进八字结果:
324
+
325
+ - 新增 `PP.trendChart` / `PP.trendHTML`:实体=该岁相对上一岁的涨跌、影线=±4 分;叠 5 年 / 10 年均线、
326
+ 大运交替底色与分界虚线(段名标顶部)、0–100 固定量程网格、年龄刻度、最高/最低岁标记;悬停看逐年
327
+ 「多少岁 / 哪一年 / 什么干支 / 多少分 / 落在哪步大运」。颜色全走 CSS 变量,深浅色与打印跟随
328
+ - 「人生K线」tab 不再输出纯文本摘要,直接给图 + 大运分段 chips + 高低年份;数据不足或空值时安全退回文本
329
+ - **八字结果底部直接嵌同一张 K 线**(面板与独立页在排八字时顺带算一次 `trend`),与原有的
330
+ 「人生运势曲线」(大运阶梯 + 流年折线)并存:曲线看趋势形态,K 线看逐年涨跌
331
+ - 新增 `test/kline.test.mjs`(23 条):结构、坐标不越界、无 NaN、空/单点安全、旺衰边界不出高低结论、
332
+ 两处嵌入点都在源码里
333
+ - 统计:58 个测试文件 / 1644 条断言
334
+
335
+ ## 0.18.1(已发布)
336
+
337
+ 元数据与检索入口同步,**无运行时行为变化**:
338
+
339
+ - 把「玄学 / 算命 / 占卜 / 运势」加进 `package.json` 关键词与描述、`locale/*.json`、市场条目描述、README 与工具描述——之前只写「命理排盘」,用户搜「玄学」搜不到;现在搜「玄学」应能命中
340
+ - 工具描述补一条触发条件:用户只搜「玄学」或问「有什么玄学工具」时也应介绍本插件
341
+ - 排盘逻辑、输出与测试断言不变;仅 UA 随版本号更新(`dsh-metaphysics/0.18.1`)
342
+
343
+ ## 0.18.0(已发布)
344
+
345
+ 吸收同生态另一款命理插件「玄机阁」(dsh-xuanji,MIT)的能力:**按行为规格独立实现,不 vendor 源码、
346
+ 不引入 iztro / lunar-javascript 依赖**,引擎仍为零外部依赖的纯 ESM。
347
+
348
+ ### 九套速查体系(新增)
349
+
350
+ 每套都有 `engine/*.js` + 工具分支 + 面板/独立页入口 + 测试,口径固定、同日同结果:
351
+
352
+ - **黄历 almanac**:农历、四柱干支(年柱按立春、月柱按节)、建除十二神、宜忌简表、冲煞与财喜神方位、
353
+ 上一/下一节气、每日一卦。与 lunar-javascript 对拍四组日期(日柱/月柱/年柱/农历/建除全一致);
354
+ 唯一差异是交节当日「上一节气」的日界口径(我们按正午判已交节),已记入 `meta.scope`
355
+ - **择日 zeri**:13 类事项 × 建除适配打分,逐日分「推荐 / 可用 / 回避」,当事人属相冲煞日直接排除,
356
+ 每条回避都带理由;明确是「排序引导」,不是吉凶断语
357
+ - **称骨 chenggu**:年/月/日/时四项骨重求和与分档批语。年表按 `(农历年-4)%60` 查 60 甲子,
358
+ 月日时各一张表;对拍公开黄历页修正了初版错表(1990-08-15 巳时应为**五两六钱**,不是五两五钱)
359
+ - **小六壬 xiaoliuren**:时间起课(农历月/日/时三掐)与报数起课(三个 1–99),六宫吉凶与白话断语
360
+ - **星座 star**:太阳星座档案 + 当日四维基调;基调由日期哈希确定性生成,同一天同一星座永远一致,
361
+ 明写「不是随机数,也不是模型编的」
362
+ - **生命数字 numerology**:生命路径数 / 生日数 / 态度数,11/22/33 主数保留,逐数给数义与课题;
363
+ 与八字是两套口径,混问时会说明不可互相印证
364
+ - **人生 K 线 trend**:复用八字的旺衰、大运、流年十神,按固定计分表给 1–100 岁逐年分与 K 线形态、
365
+ 分大运 ASCII 走势、最佳/最差年份。旺衰恰好落在换档阈值(±0.3)时只给提示、不给顺位结论
366
+ - **风水 fengshui**:八宅命卦(1900s/2000s 男女公式、立春界)、大游年四吉四凶、流年九宫飞星
367
+ (2026 一白入中为锚)、24 山门主灶布局倾向、命宅配调停文案;`scope` 明写不含玄空各运盘与现场勘舆
368
+ - **起名 name**:评估现有名字或生成候选名;按八字喜用五行(偏强喜克泄耗、偏弱喜生扶)匹配 241 字
369
+ 自建字库,未收录的字如实标「未收录」。**不做五格剖象**(需康熙字典笔画)与音韵判断
370
+
371
+ ### 1986–1991 夏令时自动校正
372
+
373
+ `engine/dst.js`:中国 1986–1991 年夏季行夏令时,钟面时间比标准时快 1 小时。八字/紫微/合盘/验前事/
374
+ 生时校正/人生 K 线/风水在排盘前统一校正,跨日时回退到前一天 23:xx 并给出 `dst.note`;
375
+ `dst: false` 可显式关闭(出生证已是真实太阳口径时用)。修正了「夏令时出生按钟面时间排盘差一个时辰」的口径错误。
376
+
377
+ ### 合婚明细层(hepan 增强)
378
+
379
+ 原有总分与三维度**不动**,新增 `detail`:属相六合/三合/六冲/相害/相刑、天干五合、双向十神、
380
+ 跨盘地支关系、年命纳音生克、吉凶象计数分档(上 / 中上 / 中 / 需磨合)。冲刑害一律中性叙述,不断「必分」。
381
+
382
+ ### 界面
383
+
384
+ - 面板与独立页 tab 由 8 个扩到 **17 个**:九套速查体系各有自己的最小输入;速查结果走通用 `pp.quickHTML`
385
+ (等宽文本 + 标题),不套命盘模板
386
+ - 八字面板补传 `verifyPast`,验前事区块终于会在面板里出现(此前只有独立页有)
387
+ - 独立页「方法页」同步体系清单与已知边界
388
+
389
+ ### 视觉升级三项(沿用本次工作树)
390
+
391
+ 视觉升级三项,均不改计算口径、不新增判断:
392
+
393
+ - **色板拉开层级**:`--bg` 压深作「桌面」(`#fffdf8 → #f6f1e6`),`--card` 提到近白(`#fffefb → #fffdf8`),
394
+ band / tri / soul / sel / link 一并拉开。`--hair` 随底色同步加深(`#efe9dc → #e9e2d3`),否则比背景还亮、
395
+ 发丝线会变成高光。深色块用同一套逻辑(底更沉、卡片更亮)。
396
+ 改动前 `--bg` 与 `--card` 只差 1/255,卡片与底色几乎同色,一切「卡片」都浮不起来。
397
+ 前景色(ink / muted / red / lu / 十神组)一个未动,对比度、打印样式、可访问性不受影响
398
+ - **人生运势曲线**:新增 `pp.curveHTML()`(渲染在八字盘「大运」节内)——大运作阶梯、流年作折线,
399
+ 叠在同一坐标系;背景五条档位色带(绿=吉 / 灰=平 / 红=忌),标出全程最高运与最低运,
400
+ 今年流年点加粗描边,悬停看逐年「年份(年龄)干支 档位 分值」。
401
+ 纯内联 SVG、零依赖,颜色走 CSS 变量,深浅色自动跟随
402
+ - 纵轴固定量程 −2.2 ~ 3.2(引擎实测 score ∈ [−2, 3.2]):固定而非自适应,不同盘之间才可比
403
+ - 数据不足两步大运则不画(不画半张图);缺 `luck` 字段、传 null / 空对象均不崩
404
+ - 新增 `test/curve.test.mjs` 36 条:几何不越界、色带无缝、阶梯形态、点与引擎数据对齐、
405
+ 刻度不重叠、安全与无障碍、边界不崩
406
+ - **三套内联 SVG 符号**(零依赖、零外部请求,一律 `currentColor` 跟随主题):
407
+ - **爻线**:原先 span + 背景色拼接、靠 `flex gap:18%` 留阴爻间隙,字号一变间隙就飘;
408
+ 改为 104×12 内联 SVG,间隙按画布坐标固定(两段各 43 + 间隙 18 = 104)。三种尺寸共用一份几何
409
+ - **动爻标记**:沿用传统老阳 ○ / 老阴 ×,非动爻留同宽空位,六列对齐不抖;爻线列由 112px 放宽到 128px
410
+ - **五行符号**:12×12 描边图标,形状取各元素最易辨识的意象(木=树 / 火=焰 / 土=「土」字骨 /
411
+ 金=菱形 / 水=波纹),接入五行分类 chip 与用神喜忌行
412
+ - **八卦小象**:14×10 三爻 SVG,接在梅花上下卦标题前;爻位由 `TRI_BITS` 自下而上翻转后渲染
413
+ - 新增 `test/symbols.test.mjs` 79 条:三种尺寸几何、阴爻两段+间隙恰为满宽、八个卦逐爻位校验、
414
+ 五条元素路径互不相同、整合到六爻/梅花/八字盘、既有结构回归护栏、无脏值无注入面
415
+ - 全量 57 文件 / 1621 条 PASS(原 1362),`test:ci` 七道闸全绿
416
+ - 新增 `test/tools.test.mjs` 65 条 + `test/tools2.test.mjs` 68 条:黄历对拍、择日排除冲属相、
417
+ 称骨四项和、小六壬递推、星座边界、生命数字主数、DST 开关、人生 K 线边界、风水坐向、起名未收录字
418
+
419
+ ## 0.17.1(已发布)
420
+
421
+ 同步更新,**无运行时行为变化**:
422
+
423
+ - README 与仓库现状对齐:补齐奇门 / 合盘(八套体系)、0.16–0.17 的报告化与可核验能力、安装示例版本
424
+ - CI 自检加固:新增 `tools/check-bundle.mjs` 产物自检闸(逐模块编译 client.js、核对与源码一致),`test:ci`
425
+ 先构建再检查;`ask.test` 不再读取仓库外的生成物
426
+ - 仅 UA 字符串随版本号更新(`dsh-metaphysics/0.17.1`),排盘逻辑与输出不变
427
+
428
+ ## 0.17.0(已发布)
429
+
430
+ 对应「晚子时开关 / 验前事 / 生时校正」三条用户反馈:
431
+
432
+ - **晚子时开关**:面板与独立页新增「晚子时换日」(八字/紫微/合盘)与奇门「归当日/归次日」;
433
+ 之前引擎已支持 `lateZi` / `lateZiHourMode`,但 UI 没有暴露,用户无法自己调
434
+ - **验前事**:工具参数 `verifyPast`(年数)+ 面板/独立页「验前事」区块——列出过去若干年的
435
+ 流年信号(冲/合/刑、档位、十神),用户自评「准/不准/不确定」,用 `verifyFit` 算贴合度并给建议;
436
+ **只读,不重排、不改盘**;贴合度低时先提示核对出生时间/时区/晚子时
437
+ - **生时校正**:`engine/rectify.js` + 工具参数 `rectify`/`events`——对候选时辰逐一排盘,
438
+ 按固定规则(事件类别 × 当年十神/关系/档位)打分,返回候选排序与并列说明;
439
+ 规则显式可复核,明确「只缩小范围、不替代出生记录」
440
+ - 测试:新增 `test/verify.test.mjs` 25 条;全量 53 个文件 / 1362 条 PASS
441
+
442
+ ## 0.16.0(已发布)
443
+
444
+ 报告化改版,对应与 Seeself 对比后的 R1–R8:
445
+
446
+ - **R1 报告骨架**:解析顶部新增「一页读懂」五条摘要(整体 / 事业 / 财富 / 感情 / 节奏);
447
+ 目录锚点跳转;新增三张表——八字「大运表 / 流年表 / 触发事件表」、紫微「大限表 / 流年表 / 触发事件表」,
448
+ 全部由已有引擎字段摊平,不新增判断;打印加 `break-inside:avoid` 与表格换行规则
449
+ - **R2 证据卡**:每个维度的「依据」从一行灰字升级为可展开的 `<details>` 证据卡
450
+ (盘面事实 + 技法标签),并给每个维度打「置信度 强/中/弱」(只按证据条数分档,不引新算法);
451
+ 文本输出同步:依据行尾附 `置信度:…`
452
+ - **R3 追问模式**:新增 `engine/followup.js` 与工具参数 `ask`——围绕已算好的盘回答
453
+ 「某一年 / 某方面」的问题(如「2027 年事业怎么样」),只取盘面已有字段,不重排、不猜测;
454
+ 找不到年份/未识别方面时明确说找不到并给出可问范围。面板与独立页都加了追问输入框
455
+ - **R4 示例报告**:面板与独立页各加「看示例」,固定示例盘(1990-05-12 14:30 男 石家庄)
456
+ 走与真实排盘完全相同的渲染路径,无示例专用分支
457
+ - **R5 交叉验证层**:新增 `engine/crosscheck.js` 与工具参数 `cross`——八字 × 紫微对
458
+ 事业/财富/感情/身体/节奏五项并列对照,标注「同向 / 有张力 / 互补」;只作对照,不合并数值
459
+ - **R6 量化表达**:八字/紫微各加「量化口径」分节——明确量化只到档位(十神权重、宫位计数),
460
+ 不换算金额、不给疾病诊断;新增 `test/report-extra.test.mjs` 断言不出现金额区间
461
+ - **R7 方法与验证页**:独立页内置静态「方法与验证」(体系、对拍 128 条、测试与闸门、口径、已知边界),
462
+ 离线可开
463
+ - **R8 导出与分享**:面板与独立页加「导出 .md」(盘面 + 解析 + 交叉验证 + 追问),
464
+ 独立页保留打印/存 PDF
465
+ - 测试:新增 `test/report.test.mjs` 36 条、`test/report-extra.test.mjs` 31 条;
466
+ 全量 52 个文件 / 1335 条 PASS
467
+
468
+ ## 0.15.0(已发布)
469
+
470
+ - **性能**:节气按需计算、牛顿初值用回归年、容差放宽;八字单盘 2.70ms → 1.60ms
471
+ - **口径差异对照**:`engine/diff.js` + `tools/caliber-diff.mjs`,区分根因字段与连带变化
472
+ - **白话四层**:直答 / 说人话 / 每维一句话 / 追问建议;术语按体系区分
473
+ - **规则知识库**:28 条(出处 + 可信度 + 尚未实现清单)
474
+ - **卦例对拍扩容**:《卜筮正宗》从 19 条扩到 **128 条**(93 成对 + 35 静卦),
475
+ 新增核对动爻个数、缺爻(伏神)、旬空;排除的 5 条连同理由留在
476
+ `tools/data-boshizhengzong.mjs` 的 `excluded`
477
+ - **引擎入参守卫(P0)**:新增 `engine/validate.js` 的 `assertCivil()`,`buildBazi / buildZiwei /
478
+ buildDaliuren / buildQimen / buildHepan / buildZiweiHepan / buildSnapshot` 入口统一校验;
479
+ 坏入参从裸 `TypeError` 改为 `E_INPUT`,文案写清「该传什么」(15 类坏输入有契约测试)
480
+ - 统一错误工厂 `engine/fail.js`;梅花的 datetime / 数字起卦错误也改为 `E_INPUT`
481
+ - **缓存层统一(P0)**:新增 `engine/lru.js`(上限 + TTL + 命中率),节气瞬时/单年/三年窗口/
482
+ 地址四处缓存改为同一工厂;`DSH_METRICS=1` 时 `renderText` 打印各缓存命中率
483
+ (实测紫微盘 `termInstant` 命中 75%)
484
+ - **规则表单一真源(P0 收尾)**:`engine/nayin.js`(六十甲子纳音,bazi/ziwei 共用)、
485
+ `engine/sanhe.js`(三合四局 + 单支归属,bazi/hepan/daliuren 共用);纳甲本就在 `liuyao.js` 一份
486
+ - `test/tables.test.mjs`:纳音 60 项与八字导出逐项一致、三合同局判定与五行等价、
487
+ 乾为天纳甲起例,并用静态检查防止有人再把表复制回各模块
488
+
489
+ ## 0.14.3(已发布)
490
+
491
+ - **经典通例对拍**:新增 `test/fixtures/classics.json` 与 `test/classics.test.mjs`,把典籍里的规则表当作期望值来验实现——
492
+ - 六爻:京房八宫卦序的宫属与世应(八纯上爻、一至五世依次、游魂四爻、归魂三爻),64 卦全表
493
+ - 六壬:日干寄宫(甲寅乙辰丙戊巳丁己未庚申辛戌壬亥癸丑)、中气换将(雨水登明亥将起,12 个中气抽样)
494
+ - 紫微:纳音定五行局、紫微天府以寅申为轴相照
495
+ - 出处与录入方式写在 fixture 的 `meta.sources`,由 `tools/gen-classics-fixture.mjs` 生成,不从引擎输出反推
496
+ - 说明:录入的是**通例表**(规则级),不是某本书的例课原文;例课需要可引用的原文,见 README「对拍」
497
+ - **卦象/牌阵类也给出「依据」**:六爻列本卦/变卦、世应爻位与六亲六神、动爻、日辰、卦宫;梅花列本卦/互卦/变卦、体用与生克、动爻;六壬列课体、三传、月将、旬空与青龙/朱雀/六合/天后/白虎/子孙是否出现;塔罗列牌阵与牌位、主轴牌、正逆位计数与元素分布
498
+ - 至此六个有维度的体系(八字/紫微/六爻/梅花/六壬/塔罗)都能核对依据;奇门走分节形态,事实本就写在 section 正文里
499
+ - **《增删卜易》卦例对拍**:从 PDF 电子本(有文字层)录入 9 条原文卦例——「月建 + 日干支 + 本卦 → 变卦」,出处精确到章(元神忌神衰旺章第十、月将章第十六、日辰章第十七、独发章第三十一、星煞章第三十三、用神元神忌神仇神章第九)。引擎须按 64 卦表还原这一对(名字、翻爻、变卦生成)
500
+ - 《卜筮正宗》(复城道长精校)此前是**扫描版 PDF、无文字层**;这次拿到同一版本的 **docx**(有文字层),从中提取 138 条带「占事」的卦例,99 条卦名可唯一解析,收 19 条进 `boshizhengzong`
501
+ - 每条核对:本卦 → 变卦、卦宫(宫 + 五行,与八宫表互证)、有日期的样本还核旬空
502
+ - 书中「空亡」与通用旬空不一致的例子(丙辰日作戌亥,应为子丑)只记卦名卦宫、不断言空亡;1 条卦宫与八宫表冲突(表格串行)不收,原因写在 fixture 的 `meta.sources`
503
+ - 原文用字保留异体(遯/遁、干/乾),动爻**不录**——原书卦象图在 PDF 里被压成一行,位置不可靠,硬录等于造数据
504
+ - **六爻补旬空**:`buildLiuyao` 现在输出 `xunShou`(旬首)与 `xunKong`(旬空两位),文本摘要多一行「旬首:甲午 旬空:辰巳」;六旬表与「丙辰日空子丑」都有断言
505
+ - **双 UI 收口(第一步)**:新增 `src/core.js`,把「爻值解析」「问事体系」「数字输入」三条规则收成单一来源,`app.js` 与 `web-ui.js` 都改为调用 `window.__MPCore`;构建脚本把 core 一并打进 `client.js` 与独立 HTML
506
+ - 单测 `test/core.test.mjs`(21 条)直接加载浏览器文件验证;`ask.test.mjs` 改为检查「单一来源 + 两端委托」
507
+ - 表单编排(参数拼装)仍各留一份,下一步再收
508
+ - **修合盘面板**:合盘的主方性别/出生地被漏在 `bazi|ziwei` 分支之外——0.14.1 起引擎把性别改为必填,面板点「合盘」会直接报 `你(主方)的gender 必须是 male 或 female`,看起来像"合盘不对"。现在三体系共用同一分支,合盘四柱与单盘一致(实测 庚午 辛巳 丁丑 丁未 对 庚午 辛巳 丁丑 丁未)
509
+ - **奇门进面板**:新增「奇门」tab,起局时刻 + **换局规则**(fieldset + legend + `role="radiogroup"` 的原生 radio:拆补 / 超神接气 / 置闰,附 `details` 说明),`juMethod` 透传给引擎;盘面下新增 `qimenFactsHTML`,用 `dl > div > dt/dd` 列出局数、节气、四柱、值符、值使、旬首、空亡、驿马、换局规则、晚子时——事实与解读区的结论分开,全部走 `esc()`
510
+ - 尚未做(下一步):三栏 Grid 布局、`<template>` 渲染、显式状态机(idle/missing_input/…)、960/1200 断点的布局断言
511
+ - **独立页补齐合盘 / 奇门**:`命理排盘.html` 由六个 tab 变八个
512
+ - 合盘:对方出生日期/时刻/性别/出生地 + 「合盘方式」八字/紫微切换;主方同样带性别与真太阳时,四柱与单盘一致
513
+ - 奇门:换局规则用 `fieldset + legend + role="radiogroup"` 的原生 radio(拆补/超神接气/置闰,附 `details`),加「询问方向(定用神)」;结果 = 九宫盘 + `dl` 事实表 + 分节解读;换规则重起局、换方向只重出解读
514
+ - `build-html` 导出 `page()` 且直接运行时才写盘,`test/standalone.test.mjs` 直接对生成源码做结构断言(24 条)
515
+ - **解析深化:把"怎么推出来的"也写出来**
516
+ - 八字 / 紫微新增四段:**看盘顺序**(月令→旺衰→用神→格局→大运→流年/命宫→三方→四化→大限,逐步引用实际值)、**时间窗**(当前与后续大运 + 近五年流年,带档位与理由)、**交叉校验**(喜忌分量对比、大运与流年同向/反向、调候与扶抑是否一致)、**未纳入**(没算什么、哪些流派差异会改变轻重)
517
+ - 六爻 / 六壬补**看卦/看课顺序**(卦宫→世应→动爻→用神→日辰→变卦;月将→四课→三传→课体→神将)与**未纳入**
518
+ - 这些段落全部由盘面数据推出,不新增断语;`test/deep.test.mjs` 41 条断言校验结构、关键步骤与"无占位值"
519
+ - 测试:44 个文件 / 1147 条 PASS
520
+
521
+ ## 0.14.2 —— 口径、复现与性能(已发布)
522
+
523
+ - **1929 年前的节气改用当时的地方时**:`termInstantJd` 与农历共用同一套换算(1929-01-01 前为北京地方平时 UTC+7.7611,之后东八区),并顺手修正切点常量的半天偏移。此前农历切换、节气一律 +8,1929 年前出生者在交节前后约 14 分钟内可能月柱整柱错位
524
+ - **晚子时口径统一**:`lateZi`(八字/六壬)与 `lateZiHourMode`(奇门)互为别名,一个概念不再有两个参数名;四套体系的摘要都会写明实际采用的口径(换日 / 不换日)。默认值保持原样(八字/六壬换日、奇门不换日),不偷偷改盘
525
+ - **无经度必须告警**:没给出生地/经度时,八字与紫微摘要首行出现 ⚠(此前只在一行括号里提一句,海外出生很容易被忽略)
526
+ - **可复现**:塔罗/六爻新增 `seed`(同 seed 同结果,可回放、可对拍);塔罗 `castAt` 由 `asOf` 决定;八字流年可用 `asOf` 钉死基准年(此前锚在"当前年份",隔年重算结论就变了);六爻的日辰(六神起法)也可用 `asOf` 固定,不再随本机日期漂移
527
+ - **默认离线**:工具新增 `geocode: 'offline' | 'online'`,默认 `offline`——内置坐标表已到地级市,足够真太阳时;只有显式开启才会把出生地原文发给 Nominatim。地址解析加 6 小时缓存,UA 补上版本与仓库地址
528
+ - **性能**:`termInstantJd` / `termWindow` 按年缓存(农历换算一次要问几百次中气,而 VSOP87 是全引擎最贵的一段)
529
+ - 紫微盘 10.9ms → **0.5ms**,奇门 8.1ms → **0.07ms**,八字 2.4ms → **0.4ms**
530
+ - 全量回归 15.8s → **3.3s**
531
+ - **无障碍**:结果区补 `role="region"` + `aria-live="polite"`,错误提示 `role="alert"`,通知 `role="status"`
532
+ - **工具层**:`geocode` / `seed` 进 schema,`asOf` 说明覆盖紫微/八字/塔罗三个体系;非法 `geocode` 值报 `E_INPUT`
533
+ - **CI**:新增 `tools/check-html-sinks.mjs`(innerHTML 拼接必须经过白名单转义函数)与 `tools/check-patterns.mjs`(engine 纯净性、日志、`var`、`debugger`、`new Date()`/`Math.random` 白名单),正/负向都验证过
534
+ - **稳定性扫射**:`test/fuzz.test.mjs` —— 用固定种子随机 12 组生日跑遍八个体系,覆盖参数矩阵、边界日期(1600/2400/闰年/1929 切换点)、解析层与"同参数两次结果字节一致"
535
+ - **自刑补齐**:辰午酉亥两柱同见判「自刑」,大运/流年支与原局同支也按自刑处理。此前 `buildRelations` 遇到同支直接跳过,四柱里 3 个辰也不会报刑
536
+ - **权重口径显式化**:五行占比(1/0.5/0.3)与日主通根(1.2/0.6/0.3)各自命名并注明用途——数值未变,只是不再像"同一件事写了两份"
537
+ - **解析加「依据」**:八字与紫微的五个维度各附一行盘面事实(日主旺衰、月令、喜忌、大运流年、宫位主星、煞星),面板渲染 `mp-it-dev`、文本渲染「 依据:…」;卦象类的依据行在 0.14.3 补齐
538
+ - **解析失败不再变空壳**:builder 抛错时面板显示「⚠ 解析生成失败」并把原因转义后带出,文本摘要同样标出;此前只返回一个空 dimensions 的对象,用户看到的是"没有解析"
539
+ - **结构不变量**:`test/invariants.test.mjs` —— 不依赖外部样盘,用"盘面自身必须成立"的性质守算法:紫微 12 宫支互异/大限连续覆盖、奇门八门八神各一次、六十四卦一一对应、四柱纳音与世应合法。金标准只能覆盖少量样盘,不变量对每张盘都成立
540
+ - 测试:39 个文件 / 1011 条 PASS(新增 historical-tz、repro、caliber、tool-geo、fuzz、relations、evidence、invariants 八组)
541
+
542
+ ## 0.14.1 —— 先让「通过」可信
543
+
544
+ 这一版不加新体系,只补三件会静默出错的地基:测试的失败信号、渲染层的转义、入参的拒绝。
545
+
546
+ - **测试不再假绿**:`test/_harness.mjs` 统一断言,任何一条 FAIL 都让进程非零退出。此前 bazi / calendar / liuyao / lunar / shensha / tarot / ziwei / e2e / layout 九个文件只 `console.log`,断言写错也 exit 0,`npm test` 恒报 27/27
547
+ - `tools/check-assertions.mjs`:每个文件的 PASS 条数锁进 `test/assertion-baseline.json`,删断言即失败(`npm run test:baseline` 显式重建)
548
+ - `tools/verify-tests-can-fail.mjs`:故意写错一条断言,必须变红——保护「测试本身」
549
+ - **两处 XSS**:塔罗面板的「所问」与解读段落回显(`src/panel-kit.js`)、独立页错误提示(`src/web-ui.js`)此前把用户原文拼进 `innerHTML`;现改为 `esc()` 与 `textContent`,并加 `test/security.test.mjs` 回归
550
+ - **入参校验与错误码**:`compute()` 新增 `E_INPUT / E_RANGE / E_LINES / E_COUNT / E_ASOF / E_PARTNER / E_SYSTEM`
551
+ - 日期按月份天数与闰年校验(`1990-02-30`、`2026-04-31` 不再静默滚到下个月)
552
+ - `bazi / ziwei / hepan` 的 gender 改为必填(缺省按男命排会让大运/大限方向整个反掉)
553
+ - 六爻爻数 ≠ 6 时报错(不再悄悄换成随机卦);塔罗张数非 1/3/5 时报错;`asOf` 非法时报错(不再静默用「此刻」)
554
+ - 工具层 `execute()` 统一包上 `[错误码]` 前缀,内部异常不再以堆栈式文案直出
555
+ - **合盘口径与单盘对齐**:合盘现在把 `address / longitude / trueSolar / lateZi` 分别透传给双方(工具层也会为 `partner.address` 解析经度)。此前合盘完全忽略地址,同一次出生在单盘是 丁丑 日、在合盘里却是 戊寅 日
556
+ - 新增 `test/hepan.test.mjs`:断言「合盘里的你 == 单盘的你」,八字与紫微两条链路都覆盖
557
+ - **解析文案修复**:`命局身身强`(level 已含「身」)、`调候上还初夏`(硬拼连接词)、同一段两次「调候上…」、大运与流年档位并成一句导致建议前后矛盾
558
+ - 新增 `test/interpret-copy.test.mjs`:对 8 个体系的实际输出做病句/重复/未定义值扫描
559
+ - 测试新增 `test/args.test.mjs`(40 条)、`test/security.test.mjs`(10 条)、`test/hepan.test.mjs`(7 条)、`test/interpret-copy.test.mjs`(63 条),全量 31 个文件 893 条 PASS
560
+ - CI 增加「断言数不低于基线」与「测试自检」两步
561
+
562
+ ## 0.14.0 —— 奇门、合盘与节气精度(此前只存在于工作树,本版一并落库)
563
+
564
+ - 新增**奇门遁甲**(时家转盘:拆补 / 超神接气 / 置闰三派取局、值符值使、九宫、空亡驿马)与对应解读
565
+ - 新增**合盘**:八字合盘(日主关系 / 夫妻宫 / 五行互补)与紫微合盘(命宫、夫妻宫、五行局)
566
+ - 节气计算改用 **VSOP87B 截断级数 + 岁差 + 章动 + 光行差**,与 NAOJ 历要项对拍偏差降到 1 分钟内
567
+ - `parseDateTime` 对 ΔT 覆盖范围(1900–2100)之外的年份给出精度提示,摘要顶部标 ⚠
568
+ - `geocodeAddress` 支持地址更细时联网(Nominatim)兜底,失败退回内置坐标表
569
+ - 六壬补神煞与格局文案;紫微补流月/流日/流时并接入盘面与解读
570
+ - `tools/qimen-divergence.mjs`:枚举三派取局的分裂样本,供排盘差异核对
571
+
572
+ ## 0.13.6
573
+
574
+ - 修 `npm run release` 的发布后核对:npm 的发布是异步的(PUT 返回 202,registry 生效实测要 1–4 分钟),脚本原来 30 秒就判定失败
575
+ - 改为对 tarball 轮询 HEAD,最多等 6 分钟;超时只提示「已提交,稍后自查」而不报错
576
+ - 顺手核对 `dist-tags`,`latest` 不指向新版本时给出 `npm dist-tag add` 的建议
577
+
578
+ ## 0.13.5
579
+
580
+ - 新增 `npm run release`(`tools/release.mjs`):一条命令走完「测试 → 构建 → 校验产物 → 发 npm」,token 只从环境变量 `NPM_TOKEN` 读,临时 `.npmrc` 用后即删
581
+ - 发布前会拦下三种情况:git 工作区不干净、`client.js` 与源码不同步、registry 上已有同版本
582
+ - `-- --dry-run` 只跑到校验;本机没装 npm CLI 时用 `NPM_CLI=/path/to/npm-cli.js` 指定
583
+
584
+ ## 0.13.4
585
+
586
+ - 新增 `npm run build` / `npm run build:html` / `npm test`:`tools/test-all.mjs` 顺序跑完 20 个测试文件并汇总退出码,省掉手敲一长串 `node test/*.mjs`
587
+ - `daliuren` / `meihua` 两处旧测试统一成 `PASS/FAIL` 计数风格(此前只打印 `all pass`,CI 里数不出断言数)
588
+ - 补 `CHANGELOG.md`;`engines.node` 声明 `>=18`;SUBMIT 文档补提交状态与阻塞说明
589
+ - 新增 GitHub Actions(`.github/workflows/test.yml`):先构建并校验 `client.js` 与源码一致,再跑全部回归
590
+
591
+ ## 0.13.3
592
+
593
+ - **工具层打通「解析与详解」**:`compute()` 把 `question` / `direction` 透传给 `interpret()`;工具 schema 新增 `withInterpret`、`direction`(综合/财运/事业/感情/健康/学业/出行)与 `asOf`(流月流日流时的基准时刻);`renderText()` 在带解析时附上解析正文与免责声明
594
+ - 修 `layout` 测试沿用旧类名 `.pn`(0.13.2 已改 `.ft-pn`)导致的假失败
595
+ - 未知体系报错改为列出六种体系(原文案仍写着「紫微斗数尚未接入」)
596
+ - `package.json` 补 `author` / `repository` / `homepage` / `bugs`;中英文案重写
597
+ - 市场条目描述同步到当前能力(主星庙旺、流月流日流时、解析)
598
+ - README 注明真太阳时只按经度修正、未含历史时区与夏令时
599
+
600
+ ## 0.13.2
601
+
602
+ - 叶子类名按语义补前缀(`bz-` / `dt-` / `flow-` / `ft-` / `ct-` / `hb-` / `ss-` / `ask-` 等 192 处),消除泛词类名复用隐患
603
+
604
+ ## 0.13.1
605
+
606
+ - 修三个潜伏的结构性缺陷:孤立「身」角标残骸、解析详解块调色板失效、320px 下六爻盘横向溢出
607
+ - 打印时折叠的详解自动展开;宫格补 `aria-expanded` 同步
608
+
609
+ ## 0.13.0
610
+
611
+ - 八字四柱表按专业排盘版式重排(四列并排、无竖线、干支大字、十神分组着色、藏干逐行)
612
+ - 末行新增五行旺相休囚死;修 `td.big` 选择器长期失效
613
+
614
+ ## 0.12.0
615
+
616
+ - 紫微补流月 / 流日 / 流时(斗君逐级下推),接入盘面与解读
617
+
618
+ ## 0.11.0
619
+
620
+ - 深色主题(盘面颜色全变量化)、存为 PDF / 打印、修 390px 下塔罗 tab 被裁
621
+
622
+ ## 0.10.0
623
+
624
+ - 紫微宫位可点击展开详情、三方四正联动;修「身宫整格消失」的类名撞车
625
+
626
+ ## 0.9.0
627
+
628
+ - 紫微十四主星加庙旺得利平不陷亮度标注;塔罗面板可选 1/3/5 张牌阵
629
+
630
+ ## 0.8.x
631
+
632
+ - 0.8.0 起卦 tab 新增「所问之事 + 询问方向」,解读按问题展开;解析区可折叠
633
+ - 0.8.1 紫微解读补化科、流年四化不再截断
634
+ - 0.8.2 手机竖屏紫微盘恢复 4×4 宫盘
635
+ - 0.8.3 竖屏布局改用容器查询,修窄侧栏下盘面挤成一团
636
+
637
+ ## 0.7.0
638
+
639
+ - 新增「解析与详解」模块:五维度解析、卦象卦辞爻辞动爻、塔罗连贯解读,带免责提示
640
+
641
+ ## 0.6.0
642
+
643
+ - 六爻 / 梅花 / 六壬面板重绘(真爻线、体用标注、天地盘方盘);输入区区分出生时间与起卦时刻
644
+
645
+ ## 0.5.0
646
+
647
+ - 八字 42 神煞(七类、双查法)+ 格局 / 用神 / 大运流年评分
648
+ - 紫微 34 格局、大限一览、流年四化
649
+ - 塔罗模块重写:78 张牌、牌阵位义、6–8 段解读、体系声明
650
+ - 首个进入插件市场投稿流程的版本(awesome-dsh-plugin PR)