dsh-metaphysics 0.62.5 → 0.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +147 -3
- package/client.almanac.js +49 -49
- package/client.chart.js +222 -0
- package/client.chenggu.js +57 -57
- package/client.convert.js +50 -50
- package/client.daliuren.js +116 -105
- package/client.fengshui.js +44 -44
- package/client.js +394 -273
- package/client.liuyao.js +112 -101
- package/client.mbti.js +50 -50
- package/client.name.js +51 -51
- package/client.numerology.js +50 -50
- package/client.qimen.js +110 -99
- package/client.star.js +66 -66
- package/client.tarot.js +113 -102
- package/client.xiaoliuren.js +51 -51
- package/client.zeri.js +50 -50
- package/engine/diff.js +14 -0
- package/engine/index.js +33 -5
- package/engine/interpret.js +37 -4
- package/engine/structure.js +1 -1
- package/engine/xiaoliuren.js +6 -2
- package/engine/ziwei.js +114 -19
- package/index.js +22 -2
- package/package.json +1 -1
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +464 -70
- package/client.bazi.js +0 -211
- package/client.hepan.js +0 -210
- package/client.trend.js +0 -202
- package/client.ziwei.js +0 -211
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,148 @@
|
|
|
1
|
-
## 0.
|
|
1
|
+
## 0.64.0(2026-11-10,已发布)
|
|
2
|
+
|
|
3
|
+
> 本段主题(2026-11-10):自化从「虚下划线徽章」换成文墨天机式的彩色小箭头,修掉 push-tag / autopublish 的 SSH 兜底在这台机上必崩的问题,并按文墨设置树补上「流年四化取干」「十干四化变体」「命主取法」三档口径。**默认盘逐字节不变**:新增开关的默认值等于旧行为。
|
|
4
|
+
|
|
5
|
+
### SSH 兜底:msys git 起不了 `sh`,只能改走 `GIT_SSH`
|
|
6
|
+
|
|
7
|
+
> 症状:`tools/push-tag.mjs` 的 HTTPS 三次重试全失败时,SSH 兜底也必失败,报 `sh.exe: *** fatal error - couldn't create signal pipe, Win32 error 5`。
|
|
8
|
+
|
|
9
|
+
- **根因:msys 的 `git.exe` 只要需要起 `sh -c` 就崩**。原实现用 `-c core.sshCommand=...` 和 `GIT_SSH_COMMAND` 这两种写法,两者都要求 git 通过 shell 拼命令行,于是无论 key 对不对都先在 `sh` 上死掉。实测三种传参(`tools/ssh-fallback.mjs`):`GIT_SSH_COMMAND` 崩在 `couldn't create signal pipe`;不带覆盖的默认路径同样崩;**只有 `GIT_SSH=<ssh.exe 绝对路径>`(git 直接 exec,不经 shell)能走通**,返回的是干净的 `Permission denied (publickey)`——传输层通了,只差 key。
|
|
10
|
+
- **第二处:Windows OpenSSH 不认环境变量改的 HOME**。原实现想用临时目录里的 `~/.ssh/config` 交代私钥,但 `ssh -G` 探针证明三条路都不通(不覆盖 / `USERPROFILE=` / `HOME=` 全都读不到临时 config,`port` 仍是 22、`identitiesonly` 仍是 no)。改成把一段带标记的 Host 块临时写进**真实** `%USERPROFILE%\.ssh\config`,`finally` 里先还原配置(哪怕删 key 的 API 卡住,用户 ssh 配置也不该长时间被改)、再删 deploy key、最后清临时目录。
|
|
11
|
+
- **第三处:URL 不能再带 `:443`**。`GIT_SSH` 的 simple variant 不允许 git 自己拼 `-p`,端口交给 config 里的 `Port 443`;推送地址改用不带端口的 `ssh://git@ssh.github.com/...`。私钥 ACL 收窄到当前用户(太宽会被 ssh 忽略)。
|
|
12
|
+
- **两处重复实现合并成一份**(新文件 `tools/ssh-fallback.mjs`):`push-tag.mjs` 与 `autopublish.mjs` 原来各抄一份同样的 SSH 兜底、各带同样的 bug,现在都只调 `pushOverSshWithKey()`;两边启动时都会用 `clearStaleBlock()` 清掉上次崩在中途留下的临时 Host 块(含缺结束标记的半截块)。
|
|
13
|
+
- **`push-tag.mjs` 新增 `--ssh-only`**:跳过 HTTPS 直接走兜底,用来单独验证兜底路径。
|
|
14
|
+
- **实测**:`node tools/push-tag.mjs v0.0.0-sshprobe --ssh-only` → 三次都成功推上 `ssh.github.com:443`,deploy key 用完即删,`%USERPROFILE%\.ssh\config` 运行前后都复原成「不存在」。探测 tag 与 deploy key 都已清干净(远端只剩 `v0.63.0`,`GET /repos/.../keys` 为 0)。
|
|
15
|
+
- **测试补了 8 条**(`test/push-tag.test.mjs` 43 PASS、`test/autopublish.test.mjs` 55 PASS):传输层断言改为查共享模块、要求两边都接线到共享模块、要求启动时清残留;并把 `stripManagedBlock` 从源码切出来实跑,覆盖「缺结束标记的半截块」与「多段标记并存」。
|
|
16
|
+
|
|
17
|
+
### 自化改成彩色小箭头:箭头尖顶住星名,才读得出「化回本宫」
|
|
18
|
+
|
|
19
|
+
> 症状:自化原来只是一枚虚下划线的彩色小字(`禄/权/科/忌`),摊在星曜行尾。用户对照文墨天机后指出:那边是从宫缘飞出的彩色小箭头。
|
|
20
|
+
|
|
21
|
+
- **形态**:`zhaMark()` 画一支 22×9 的 SVG 短箭头(`z-shaft` 弧线 + `z-head` 箭头尖),stroke 跟 `currentColor`,颜色由 `.pp-zha.lu/.quan/.ke/.ji` 决定,与四化同色系。
|
|
22
|
+
- **位置定在星名左边**(`src/panel-kit.js` `starsHTML`):先后试过左上角绝对定位、左缘垂直居中——都压住星名(实测压掉「紫微 庙」)。改成 inline 后,**放星名右边箭头朝外,视觉上成了「从本宫飞出去」,语义正好反**;最终放在星名前、箭头尖顶住星名,读成「这笔化飞出去又落回本宫」。宫位详情里的「宫干四化」行也用同一支箭头(`${箭头}${星名}`),盘面靠位置、详情靠文字。
|
|
23
|
+
- **自化徽章与虚下划线一并退场**:`.pp-m.self` 样式与 `cellHTML` 里的 `pp-zh` 徽章已删(`.pp-zh` 的 CSS 与三合隐藏规则同步清掉),自化只剩箭头一种表示,不再出现「同一件事画两遍」。
|
|
24
|
+
- **图例跟着换**:盘心图例文案 `虚下划线=自化` → `箭头=自化`;`.pp-zhlegend` 的符号从 `→禄` 文本换成真箭头(用 `zhaMark` 渲染),图例与盘面同一套图形。
|
|
25
|
+
- **三合视图同时藏箭头**:`#ppm-sc-sanhe:checked~.pp-body .pp-zha{display:none}`,否则三合派会漏出四化信息——浏览器实测三合下 `.pp-zha` 的 `display` 为 `none`。
|
|
26
|
+
- **测试**(`test/layout.test.mjs` 69 PASS):原来的 `pp-zh` / `pp-m self` / `虚下划线=自化` 三条换成四条——箭头类名存在、四化颜色分层 + 图例口径、读屏说明含「宫干化回本宫」、SVG 含 `z-shaft` 与 `z-head` 两条路径。
|
|
27
|
+
|
|
28
|
+
### 新增第十二类流派开关:流年四化取干(文墨「依据流年天干 / 依据流年命宫天干」)
|
|
29
|
+
|
|
30
|
+
> 来源:文墨天机 2.5.26 设置树 `group_other` 里的「流年四化-依据流年天干 / 流年四化-依据流年命宫天干」。此前我们的流年四化固定按流年天干取,这条口径没有出口。
|
|
31
|
+
|
|
32
|
+
- **`liunianSihua`**(`engine/ziwei.js`):`year-stem`(默认,与该年干支的天干一致,与旧盘逐字节相同)/ `life-palace-stem`(改用该年流年命宫那一宫的宫干)。
|
|
33
|
+
- **取干结果随盘回显**:每年新增 `sihuaStem`(实际用的那一干)与 `sihuaStemFrom`(`流年天干` / `流年命宫天干`)。四化是被哪张表定的,不靠猜。
|
|
34
|
+
- **实测**:1990-05-12 男命,2026–2037 十二年**取干十二年全不同**(年干随年份走,命宫宫干由五虎遁从生年干起,本来就是两张表),四颗化星随之全变;本命宫盘 12 宫逐字节不变。这条数据被写进代码注释与参数说明,因为一开始误以为「多数年份同干、只差个别年」,是实测推翻的。
|
|
35
|
+
- **接线五处**:`ZIWEI_SCHOOL_DEFAULTS` / `ZIWEI_SCHOOL_OPTIONS`、`engine/index.js` 的 `ZIWEI_SCHOOL_KEYS` 与摘要 `labels`、根 `index.js` 的 `OPTION_KEYS` / 参数说明 / `SYSTEM_PARAMS.ziwei` / schema、`engine/diff.js` 的 `CALIBER_SWITCHES.ziwei`,以及 `rules.schools` 与 `rules.liunian` 两段规则文字。
|
|
36
|
+
- **测试**(`test/ziwei-schools.test.mjs` 133 PASS,新增 12 条):默认取干等于年干且来源写「流年天干」、另一档等于该宫 `stem`、换口径不动本命宫盘、确实换掉四化、`mutagenHits` 跟着换、两条口径下都是四条、非默认口径进摘要流派行而默认口径不插流派行。
|
|
37
|
+
- **三处计数锁同步**:`ZIWEI_SCHOOL_OPTIONS` 十一类 → 十二类(`ziwei-schools.test.mjs` / `ziwei-zuoyao.test.mjs`)、`CALIBER_SWITCHES.ziwei` 13 组 → 14 组(`caliber-diff.test.mjs` 三条)、`schema-budget.test.mjs` 的 `OLD_KEYS` 88 → 89。
|
|
38
|
+
|
|
39
|
+
### 新增第十三类流派开关:十干四化变体(文墨「十干四化」全表)
|
|
40
|
+
|
|
41
|
+
> 来源:文墨天机 2.5.26 的十干四化设置项。此前我们只有庚干 5 变体(`gengYearSihua`),甲/戊/辛/壬/癸五干的变体没有出口,用户选不到。
|
|
42
|
+
|
|
43
|
+
- **`sihuaVariant`**(`engine/ziwei.js` 的 `SIHUA_VARIANTS`,表里 16 条、开关暴露 11 档):变体名一律取文墨原文四字,按「禄 权 科 忌」顺序念,**名字本身就是那张表**——「廉破曲阳」= 廉贞化禄、破军化权、文曲化科、太阳化忌。可选:廉破曲阳(甲)、贪阴阳机(戊)、阳武同阴/阳武府同/阳武府相/阳武同相(庚)、巨阳武昌(辛)、梁紫府武/梁紫相武(壬)、破巨阳贪(癸);乙丙丁己四干文墨没有变体。表里另六条(廉破武阳/贪阴右机/阳武阴同/巨阳曲昌/梁紫辅武/破巨阴贪)就是各干通行表本身,不必单独选,所以没进枚举。`default`(默认)各干走通行表,与旧盘逐字节相同。
|
|
44
|
+
- **不新增五个参数的取舍**:每干一个开关(`jiaSihua`/`wuSihua`/…)要吃满 2045 字符的 schema 预算余量里的绝大部分,而工具定义每次调用都整份进上下文。变体名自带天干,一个参数足够表达全部十六档。
|
|
45
|
+
- **两把开关的作用范围不同,这一条是实测撞出来的**:「`gengYearSihua` 只换生年四化里庚年那一支」是既有约定(旧盘与存档依赖),而 `sihuaVariant` 换的是**宫干自化、大限宫干、飞星、流年共用的那张表**。第一版把两者塞进同一个 `sihuaTableOf()`,立刻被既有断言 `庚干变体不动宫干自化` 打红——属实是回归,不是测试过时。现在拆成两个入口:`sihuaTableOf()` 只认 `sihuaVariant`(宫干/飞星/流年用),`natalSihuaTableOf()` 先看 `sihuaVariant`、没命中再让 `gengYearSihua` 生效(生年四化用)。
|
|
46
|
+
- **变体与天干不符时不串表**:拿癸干变体套到甲干上,甲干照旧走通行表,不会把别人的表套过来(有断言钉住)。庚干两项同时指定时以 `sihuaVariant` 为准——它说的是「整张表长这样」,比单点覆盖更明确。
|
|
47
|
+
- **八处直取 `MUTAGEN[...]` 全部改走按盘取表**(`engine/ziwei.js` 七处 + `engine/interpret.js` 一处):宫干自化、宫内 `daxian.mutagen`、流年 `mutagen`、`daxianList.mutagenHits`、`flyStarOf`、`enrichLiunian`、`flowOf` 的 `mutagenHits`、以及 `zwNatalSihua` 补齐未上盘四化时查的那张表。`flyStarOf(stem, type)` 增可选第三参 `schools`,不给时沿用通行表,旧调用零漂移。
|
|
48
|
+
- **实测**:十六档逐档验证「在该干为年干的年份上真能改到盘」——五档与本插件通行表完全一致(甲/戊/辛/壬/癸各自的默认档,即 `廉破武阳`/`贪阴右机`/`巨阳曲昌`/`梁紫辅武`/`破巨阴贪`),其余十一档全部改盘;换变体后 12 宫星曜落宫逐字节不变,只有四化相关字段变。
|
|
49
|
+
- **接线五处**:`ZIWEI_SCHOOL_DEFAULTS` / `ZIWEI_SCHOOL_OPTIONS`、`engine/index.js` 的 `ZIWEI_SCHOOL_KEYS` 与摘要 `labels`、根 `index.js` 的 `OPTION_KEYS` / 参数说明 / `SYSTEM_PARAMS.ziwei` / schema、`engine/diff.js` 的 `CALIBER_SWITCHES.ziwei`(口径卡只拿「甲干廉破曲阳」当对照样本,不枚举十六档),以及 `rules.schools` 一段规则文字。
|
|
50
|
+
- **测试**(`test/ziwei-schools.test.mjs` 153 PASS,新增 20 条):默认档等于通行表、变体随盘回显、甲干变体把科从武曲换到文曲而禄权忌不动、宫干四化与飞星跟着换、星曜落宫不变、癸变体套甲干无效、乙丙丁己无变体、庚干优先级、十六档都是完整四条、非默认进摘要流派行。
|
|
51
|
+
- **三处计数锁同步**:`ZIWEI_SCHOOL_OPTIONS` 十二类 → 十三类(`ziwei-schools` / `ziwei-zuoyao`)、`CALIBER_SWITCHES.ziwei` 14 组 → 15 组(`caliber-diff` 四条含口径卡行数与标签列表)、`schema-budget.test.mjs` 的 `OLD_KEYS` 89 → 90。
|
|
52
|
+
|
|
53
|
+
### 新增第十四类流派开关:命主取法(文墨「安命主 - 依据斗数全书 / 依据中州派理论」)
|
|
54
|
+
|
|
55
|
+
> 来源:文墨天机 2.5.26 设置树 `group_other` 里的「安命主 - 依据斗数全书 / 安命主 - 依据中州派理论」。此前我们的命主固定按命宫地支取,中州派这条口径没有出口。
|
|
56
|
+
>
|
|
57
|
+
> 这条一开始以为是硬骨头:先试着从 APK 里挖表值——解 `App.swf`(`CWS` + `inflateSync{Z_SYNC_FLUSH}`,3.2MB DoABC 标签、18162 条字符串常量),`贪狼/巨门/禄存/文曲/廉贞/武曲/破军` 这些星名**在字符串常量表里一条都没有**,581 处星名命中全是「马头带箭」「日月夹财」这类格局断语。判定为「表值编译进字节码,静态挖不出,不猜」。**后来发现根本不用挖**——两派的差别不是两张表,是「拿哪个地支去查同一张表」。
|
|
58
|
+
|
|
59
|
+
- **`mingzhuSchool`**(`engine/ziwei.js`):`soul-branch`(默认,按命宫所在宫位的地支查表,与旧盘逐字节相同)/ `year-branch`(按生年年支查表,即中州派)。
|
|
60
|
+
- **依据**:《紫微斗数全书》卷二「安命主」定的是那张十二支表(子贪狼、丑亥巨门、寅戌禄存、卯酉文曲、辰申廉贞、巳未武曲、午破军),两派的用法不同:通行本拿命宫地支查,中州派拿生年年支查。iztro 的实现就是这个形状——`earthlyBranches[algorithm === 'zhongzhou' ? earthlyBranchOfYear : earthlyBranchOfSoulPalace].soul`,同一张表换索引。所以不必新造表,`MING_ZHU` 一字未动,只换了查表用的地支。
|
|
61
|
+
- **两派差异有多大要看得见**:实测命宫地支恰好等于生年年支的只占约 8%,即九成以上的人两派命主不同——所以换档时盘上不能只悄悄改一个字。新增 `lifeMasterNote`,两派结果不同时把另一派的结果一并写在括号里(「通行本按命宫地支戌取禄存;中州派按生年年支午取破军」),盘心、摘要、解析三处都会显示;两支相同时该字段缺席,不留空括号。同时新增 `lifeMasterSchool` 回显实际用的取法。
|
|
62
|
+
- **换取法不动盘**:命主是「查表得到的一颗标记星」,不是安星结果。断言钉住 12 宫星曜 JSON 逐字节相等、命宫/身宫/五行局不变——只有命主那一格变。
|
|
63
|
+
- **接线五处**:`ZIWEI_SCHOOL_DEFAULTS` / `ZIWEI_SCHOOL_OPTIONS`、`engine/index.js` 的 `ZIWEI_SCHOOL_KEYS` 与摘要 `labels`、根 `index.js` 的 `OPTION_KEYS` / 参数说明 / `SYSTEM_PARAMS.ziwei` / schema、`engine/diff.js` 的 `CALIBER_SWITCHES.ziwei`,以及 `rules.schools` 与 `rules.masters` 两段规则文字。
|
|
64
|
+
- **实测**:1990-05-12T14:30 男命,命宫在戌、生年年支午 → 默认 `禄存`,中州派 `破军`;1990–2001 十二年扫描 9 年不同 3 年相同(相同的是命宫地支恰等于年支那几年),12 宫逐字节不变。
|
|
65
|
+
- **测试**(`test/ziwei-schools.test.mjs` 172 PASS,新增 17 条):默认取法、默认命主等于命宫地支查表、中州派命主等于生年年支查表、两派该盘确实不同、不动宫位与星曜、不动命宫身宫五行局、两派不同时写辨认说明、说明随档位换叙述顺序、两支相同时结果一致且不写说明、十二年扫描大多不同(钉开关生效,不钉具体次数)、十二支表齐全、表就是《全书》那七颗星、非默认进摘要流派行、摘要命主行带辨认说明。
|
|
66
|
+
- **三处计数锁同步**:`ZIWEI_SCHOOL_OPTIONS` 十三类 → 十四类(`ziwei-schools` / `ziwei-zuoyao`)、`CALIBER_SWITCHES.ziwei` 15 组 → 16 组(`caliber-diff` 四条含口径卡行数与标签列表)、`schema-budget.test.mjs` 的 `OLD_KEYS` 90 → 91(工具定义 12786 / 14500 字符)。
|
|
67
|
+
- **还没做的**:文墨中州派与通行本另有四处差异(戊庚壬三干的四化「科」、天使天伤位置、截路空亡有无、岁前十二神大耗改岁破),这四条本版没接,仍按通行本走。
|
|
68
|
+
|
|
69
|
+
## 0.63.0(2026-11-10,已发布)
|
|
70
|
+
|
|
71
|
+
> 本段主题(2026-11-10):修「问进对话」的 chip 挂不上(C3 对话桥)、把命盘类四个 tab 合并成一个分块、补 B15 三项量化字段的输出通道,再按文墨天机的样式重做紫微盘面(三方四正菱形闭环、四化/飞星/三合三视图、自化图示图例)与宿主侧栏宣纸纸纹。**不改任何排盘口径、不新增体系**;文墨 APK 只作只读逆向参照,其安星流派与十干四化变体表只存档、未接入引擎。
|
|
72
|
+
|
|
73
|
+
### C3 对话桥:`slots.inject` 的 callback 必须返回可调用 disposer
|
|
74
|
+
|
|
75
|
+
> 症状:面板里点「问进对话」一直回「对话输入框还没就绪」,输入框右侧也看不到「命理·问」chip。
|
|
76
|
+
> 这条从 0.35.0 挂到现在没修好,之前几轮的排查方向(槽位未声明、注册时机、ctx.effect 包裹)都不对。
|
|
77
|
+
|
|
78
|
+
- **根因:`slots.register` 实测返回对象,不是函数**(`src/app.js`):宿主文档写的是「the idempotent definition disposer」,我们据此认为 `tryReg` 的返回值就是可调用清理器,于是直接 `return d` 交给 `slots.inject` 做 callback 返回值。但真机上 `typeof d === 'object'`——callback 返回的不是可调用 disposer,宿主判这次贡献无效:**座位占住了、`register` 不抛错、组件却永远不渲染**。面板自检把这句话原样打了出来,是这次定位的关键证据:`贡献 sidebar.panellist=object,main=object,input.right=undefined,composer.dock=undefined`。
|
|
79
|
+
- **修法**:新增 `asDisposer()`,按能力探测把返回值归一成函数——函数直接用;有 `dispose` / `off` / `cancel` / `unregister` 方法的包一层;都认不出就退化成空清理器(仍满足「可调用」契约,不静默失效)。`tryReg` 统一走它。
|
|
80
|
+
- **第二处缺陷:补注册与正式注册撞 id**(同上):`sessionSeat` 走 `slots.inject` 的挂起路径时 `tryReg` 还没执行、`seatOk` 是空的,700ms 后的 `seatRetry` 就用**同一个 id** 再注册一次。宿主对同 id 要么抛错要么覆盖,会把先落地的那份挤掉。现在补注册有一次性闸(`seatRetryDone`),且只在 `seatOk` 确实为空时执行。
|
|
81
|
+
- **第三处缺陷:补注册换新 id 会长出多个 chip**(同上):旧实现用 `metaphysics-ask-1/-2/…` 逐轮补注册,而 `conversation.input.right` 是 **list** 槽,每次都挂一个新条目。已改为始终用同一个 id。
|
|
82
|
+
- **`sessionSeat` 的 run 现在透传返回值**:这一处本身不是根因(传给 `slots.inject` 的是 `install`,它本来就返回 disposer),但 `ctx.effect.run` 返回 `undefined` 会让外层 effect 变成空效果、卸载时收不干净,一并修正。
|
|
83
|
+
- **自检文案去掉技术词**(同上):`bridgeDiagText` 原来会打印 `=object` / `=undefined`,而面板有一条「结果里不许出现 null / undefined / NaN」的闸,诊断信息把闸打红了。改成「已挂上 / 未挂上」,信息量不减、不再污染结果卡。
|
|
84
|
+
- **测试补了三条能守住根因的断言**(`test/client-bundle.test.mjs`):① 四个座位的 inject callback 都返回函数;② 把 `register` 的返回值钉成**对象**形态,要求归一化后仍可调用——**这条做过变异验证:撤掉 `asDisposer` 立刻红(`sidebar.panellist→object`),恢复立刻绿**;③ 同一槽位不许用同一 id 注册两次。旧测试的 mock 只提供了 `register`、没有 `inject`,走的是直调分支,所以从来测不到真实路径——这也是这个 bug 能活这么久的原因。
|
|
85
|
+
- **真机确认(2026-11-10,发版前)**:宿主输入框工具条上「识图」与模型选择之间已出现 `命理·问` chip,C3 这条从 0.35.0 挂到现在的链路结案。离线测试只能证明代码契约修对,真机这一眼才是「用户确实看得到」的证据;面板结果卡下方的「桥自检」行保留,后续若再出现挂不上仍可直接读状态。
|
|
86
|
+
|
|
87
|
+
### D1+ 命盘四 tab 合并成一块
|
|
88
|
+
|
|
89
|
+
- **命盘四 tab 合并:18 块 → 15 块,分块合计 gzip 2.56MB → 1.89MB**(`tools/build-client.mjs`):八字 / 紫微 / 合盘 / 趋势原先各自背一套完整公共栈(`index` 42KB + `interpret` 49KB + `interpret-knowledge` 22KB + `plain-summary` 15KB + `classics` 12KB ≈ 140KB gzip)。用户在四个 tab 间切换时每切一次就重复下载一遍——「八字 → 紫微 → 合盘」这条最普通的路径累计 **809KB**,其中约 405KB 是重复字节。合并后单块 gzip **247KB**(几乎等于原来 bazi 单块),四 tab 全逛一遍从 809KB 降到 **336KB**,**省 58%**。
|
|
90
|
+
- **这不是「抽共享块」**:先按常规思路量过,抽共享块在 DSH 上不成立——模块系统要求分块自包含(`dsh.client.external` 只解析到冻结的静态表或独立动态包 row,而本插件只注册一个 entry id),分块 factory 拿到的 `require` 是裸的,只有入口层的 `require.async` 由宿主注入。而且就算抽得出来也**不省**:实测「只看八字」在两种方案下都是 462KB,只是把同样的字节从 A 文件搬到 B 文件。真正能去掉重复的路径是「在一个自包含分块内让多个 tab 共用一套栈」。
|
|
91
|
+
- **单块预算不用动**:合并后最大块 247KB,离 288KB 上限仍有 41KB 余量,`CHUNK_GZIP_CAP` 与 `CHUNKS_TOTAL_GZIP_CAP` 一个数字都没改。`bundle-budget.test.mjs` 的「单块预算没有被抬成空闸」(`max * 1.3 >= CAP`)继续成立。
|
|
92
|
+
- **尺寸底线改成与声明同源**(`test/bundle-budget.test.mjs`):原先写死 `files.length >= 18`,合并后变成假失败。改为「磁盘分块与 `CHUNKS` 声明一一对应」——多一个少一个都算漂移,比一个魔数更能拦住真实问题。
|
|
93
|
+
- **懒加载器的兜底改指 chart**(`src/engine-lazy.js`):未知 tab 原先回落到 `client.bazi.js`,该文件已不存在;改指 `client.chart.js`(命盘类四 tab 共用块),至少能排出命盘而不是取到 404。
|
|
94
|
+
- **测试补了「只下载一次」这条真断言**(`test/chunks.test.mjs`、`test/perf-instrumentation.test.mjs`):原先只断言「缓存不重复拉取」用的是单 tab 重复调用,测不出跨 tab 的重复;现在四个命盘 tab 依次切换后断言 `client.chart.js` 只被取 1 次,跨块切换(命盘 → 六爻)才取第 2 块。这一条正是本次合并的目的,撤掉合并即红。
|
|
95
|
+
- **验证**:九道闸全绿(163/163 文件、47.3s;check-bundle `client.js` 290KB / gzip 90KB、**15 块** gzip 合计 **1.89MB**、单块上限 288KB、逐模块 71 个、宿主形态可执行且与源码逐字节一致;check-verification 新鲜;check-patterns / check-html-sinks / check-perf / check-secrets 均过)。`e2e-dom` 152 项通过。断言基线 **8772 → 8758**——**减少的 14 条全部来自分块数变少**(每块 6 条 × 少 3 块 = 18 条,另新增 4 条缓存断言),没有一条真实检查被删。
|
|
96
|
+
- **顺带修的引用**:`tools/release.mjs` 的发布产物核对清单、`test/autopublish.test.mjs` 的白名单、`test/bridge.test.mjs` 与 `test/ziwei-zuoyao.test.mjs` 读取的分块文件,全部从 `client.bazi.js` / `client.ziwei.js` 改到 `client.chart.js`。这类硬编码文件名在合并时会静默失配(测试读不到文件就跳过),已逐个改到并跑绿。
|
|
97
|
+
|
|
98
|
+
### B15:0.62.5 三项量化字段接上输出通道
|
|
99
|
+
|
|
100
|
+
> 上一版它们只存在于结果对象里——算得出、没人看得见,按本仓「引擎字段 → 摘要/解析 → 面板 → 独立页 → 测试 → CHANGELOG」的每步验收算没做完。**不改任何排盘口径、不改旺衰分与喜忌、不新建知识卡**。
|
|
101
|
+
|
|
102
|
+
- **八大地支结构接进四处,并说清与旺衰分的关系**(`engine/index.js`、`engine/interpret.js`、`src/panel-kit.js`、`test/bazi-structure.test.mjs`):`strength.branchStructure` 自 0.62.5 起就在结果里,但摘要、解析、面板、独立页一处都没显示。现补:摘要新增「地支结构:四支 AABA(年午A、月巳A、日丑B、时未A) 日支独异,不易从(静态从格 ≈20%)」一行;解析新增「地支结构」一节,逐支列阵营与宫位分值、异类支、地支与干支两段平衡,并明写**「这是并列的第二套静态视图,不改上面的旺衰评分,也不参与取格与喜忌」**;面板在「日主强弱」下方加 `.pp-struct` 行(code + 逐支阵营 + 异类 + 从格概率 + 平衡比),悬停给方法与边界。
|
|
103
|
+
- **三柱模式不把占位时支冒充实有**(同上):`hourUnknown` 时第四支是正午占位,摘要写「三支+占位 …… 时午A·占位」,面板同款;从格概率一律不套。这里有一处措辞要留意——`bs.word` 本身已被 `bazi.js` 的 `hourUnknown` 分支改写成「时柱暂缺,第四支为正午占位,不套从格概率」,所以摘要**不能再追加同句**,初版重复说了两遍,已由断言 `(match(/…/g)||[]).length === 1` 钉死。
|
|
104
|
+
- **暗合接进三处,并明确「另列不并」**(同上):`relations.anhe` 同样只算不显。摘要按对数写「暗合:…(另列,不并入上面的合冲刑害;只一对,按口径可忽略 / 共 N 对)」;解析新增「暗合」一节,明写与三合三会六合六冲刑害是**两条线、不合并计分、不折旺衰**;面板在关系行下加 `.pp-anhe` 行。无暗合的盘这三处都不出现(不用空行占位)。
|
|
105
|
+
- **起运岁精确值接进三处**(`engine/index.js`、`engine/interpret.js`、`src/panel-kit.js`、`test/bazi-jiaoyun.test.mjs`):`dayun.startAgeExact` 是 0.62.5 为对齐第三方排盘加的(截断到日/时 23/23 全中,四舍五入到月只有 15/23),但同样没有输出通道——恰恰是它最能解释「为什么和别家差一个月」。摘要新增「起运岁(精确):8 年 2 个月 26 天 8 小时(截断到年月日时;上面「8岁3个月」是四舍五入到月,两者同源)」;解析「时间窗」写明差一个月的边界常出在日/时这两位、第三方给到日时按这行核对;面板页脚在「N岁起运(交运…)」后加「精确 N年N月N天N时(截断到日时;上面是四舍五入到月)」。
|
|
106
|
+
- **旧结果兼容**:三处都是新增可选行,缺字段时整块不渲染(`startAgeExact` / `branchStructure` / `anhe` 任一缺席都不出空行、不出 `undefined`),`test/bazi-jiaoyun.test.mjs` 第十二、十三节与 `test/bazi-structure.test.mjs` 第七至九节各有一组「删字段后照常渲染」的对照断言。
|
|
107
|
+
- **验证**:`build-client` → 改文档 → 再 `build-client` + `build-html` → 全量 `test:ci` 九步全绿(**163/163** 测试文件、46.7s;check-bundle `client.js` 290KB / gzip 89KB、18 块 gzip 合计 2.56MB、单块上限 288KB、逐模块 71 个、宿主形态可执行且与源码逐字节一致;check-verification 两产物新鲜;凭据扫描 345 文件干净;check-patterns 81 文件;HTML 注入面 5 文件;check-perf 29 项,1000 盘 401ms / RSS 76MB;`verify-tests-can-fail` 15 PASS / 1 FAIL → exit 1 符合预期)。断言基线 **8729 → 8772**(+43,全在结构/交运两档),`test/bazi-structure.test.mjs` 81 条、`test/bazi-jiaoyun.test.mjs` 77 条。`e2e-dom` 152 项、`e2e-panel` 110 项通过。分块 gzip:**bazi 247.5KB**(逼近 288KB 上限,因 `interpret` 新增两节),其余不变。
|
|
108
|
+
- **一处已知的取舍(已随 D1+ 解决)**:B15 落地后 `client.bazi.js` 涨到 **247.5KB**,当时解析栈被 bazi/ziwei/hepan/trend 四块各存一份,写着「再加同类文案就该拆共享块」。D1+ 把四块并成 `client.chart.js` 之后,解析栈只存一份,四 tab 共用同一块 247KB——这笔账已结,见上面 D1+ 第一条。
|
|
109
|
+
|
|
110
|
+
### D5:反馈入口、UI 美化与小六壬 meta 修复
|
|
111
|
+
|
|
112
|
+
> 上一轮遗留的「反馈入口」收尾,加上一轮纯 CSS 的层次感整理。不改排盘口径。
|
|
113
|
+
|
|
114
|
+
- **反馈入口常驻面板底部**(`src/app.js`、`src/panel-kit.js`、`test/feedback-report.test.mjs` 28 条):一键「复制反馈报告 / 开 issue」,报告含版本、开关状态、完整输入、结果摘要前 40 行、报错原文与排盘句柄(拿到句柄可精确复现同一张盘),用户只需补一句「哪里不对」。隐私边界写死并钉成断言:不读本机命盘档案、不采集设备信息。
|
|
115
|
+
- **UI 美化只动 CSS,零逻辑改动**(`src/app.js`、`src/panel-kit.js`):学习本机 `dsh-plugin-wallpaper-engine` 的令牌工艺(`--dur` / `--dur-fast` / `--ease` + 圆角令牌,浅暗双主题同注入)与 GitHub `ziwei-chart` 的层次感——宫位卡 hover 光晕、命宫双环选中态、中宫「图章」内框、主星字号锚点、煞星圆点、亮度徽章胶囊化、`prefers-reduced-motion` 全局关停。浏览器实测十二宫格、命宫高亮、中宫内框与亮度徽章均正常渲染。
|
|
116
|
+
- **小六壬 `question` 不再写进 meta**(`engine/xiaoliuren.js`、`engine/index.js`、渲染器):800 次跨体系模糊测试发现 `question` 存在 `meta` 里而句柄按设计不收 `question`,回放后 `meta.question` 变空、看起来像盘变了。移到顶层(与其他体系一致),渲染器兼容旧 `meta.question`。修后 800 次模糊测试 0 异常。
|
|
117
|
+
- **验证**:164/164 文件、8794 条断言全绿;`e2e-dom` 152 项、`e2e-panel` 110 项;九道闸全过;`client.js` gzip 93KB(100KB 预算内)。
|
|
118
|
+
|
|
119
|
+
### D5+:学文墨天机的盘面(三方四正 / 三视图 / 自化图示)与宿主宣纸纸纹
|
|
120
|
+
|
|
121
|
+
> 用户拿文墨天机截图提了三件事:三视图要有真区别、自化图示要看得见、左侧插件面板要有水墨底纹。全程只改 `src/panel-kit.js` 与 `src/app.js` 的渲染/CSS,不动引擎结果。
|
|
122
|
+
|
|
123
|
+
- **三方四正菱形闭环**(`src/panel-kit.js` 的 `drawSanfang()`):点宫位后取 `[本宫, 对宫, 三合1, 三合2]` 四锚点首尾相连成闭环菱形,两条对角线在中宫交叉,与文墨的连线形态一致。纯 SVG overlay、`pointer-events:none` 不挡交互,锚点吸在中宫边界(x=25/75,y 压回 25~75),所有线段都落在中宫矩形内、不穿周边宫位;本宫红点、其余三方墨点,再点收起。浏览器实测「所有线段坐标都在 25~75 内」。
|
|
124
|
+
- **三视图是真分派,不是切个显隐**(`src/panel-kit.js`):新增「四化 / 飞星 / 三合」单选用 CSS 兄弟选择器驱动。四化保留全量四化徽章与自化;飞星把**每宫宫干四化**摊进宫内(`.pp-fx`),同时藏起四化徽章与视图徽章;三合藏掉**全部** `.pp-m` 四化徽章、`.pp-zh` 自化、`.pp-viewhua` 与 `.pp-flywrap` 飞星串连 chip,只留三方四正盘面。第一版只做了浅层显隐、用户反馈「三个都差不多,没区别」,这一版按真派重做,宿主三张截图逐档确认。
|
|
125
|
+
- **飞星数据源修正**:宫位对象本身没有 `mutagenHits`(实测 keys 里只有 `selfHua`),宫干四化在 `r.daxianList[].mutagenHits`。`ziweiHTML()` 先按地支汇成 `flyByBranch`,`fxLineHTML()` 再据此生成「丙戌宫干 禄→官禄 权→财帛 科→交友 忌→父母」这类逐宫行。`.pp-flywrap` 也从 `.pp` 外挪进 `.pp` 内,否则 `#ppm-sc-sanhe:checked~.pp-flywrap` 够不到、三合仍漏飞星 chip。
|
|
126
|
+
- **自化图示图例 + 彩色徽章**(同上):中宫下方新增 `.pp-zhlegend`(`自化图示 →禄 →权 →科 →忌`),四色对应禄/权/科/忌;宫内自化徽章沿用同套色并加虚下划线。**边界要说清**:文墨原版是从宫位边缘飞出的彩色小箭头,本版目前是「图例 + 彩色徽章」,没有做宫缘箭头;用户这轮问的是「能不能理解它划线的逻辑」,连线与划色逻辑已对齐,箭头形态未实现。
|
|
127
|
+
- **宿主侧栏宣纸纸纹**:初版把 `feTurbulence` 纸纹铺在 `.mp-panel::before`,用户反馈「左边插件面板没有、网页端也不明显」——根因是 `.mp-panel` 只是底部表单块,宿主侧栏根是 `.mp-wrap`、上方卡片是 `.mp-tgroup`。最终把纸纹铺到 `.mp-wrap` 整个侧栏(`background-attachment:local`,浅色暖白 / 深色墨底两套),`.mp-tgroup` 换宣纸卡片色,`.mp-panel` 收成同色系表单块。宿主整列从上到下统一米色的截图已确认;离线页 `命理排盘.html` 是另一套 CSS,不作宿主侧栏的验证依据。
|
|
128
|
+
- **文墨天机 APK 只读逆向成果(存档,未实现)**:从 `App.swf` 的 ABC 字符串表取到完整设置树——安星流派开关(庙陷 4 / 命主 2 / 流年四化 2 / 天马 2 / 天空 2 / 截空旬空 4 / 魁钺 4 / 天使天伤 2 / 长生 3)、十干四化变体表、飞星派与四化派两组显示开关、底部三按钮即三种视图。这些与现有 `school` 开关高度重合,作为后续「流派补全」的参照存档;**本版一个都没接进引擎**,三视图只是显示层分派。
|
|
129
|
+
- **验证**:`check-bundle` `client.js` 306KB / gzip 96KB、引擎分块 15 个(gzip 合计 1.89MB,单块上限 288KB)、逐模块编译 71 个、宿主形态可执行且与源码一致;`standalone.test.mjs` 40 PASS / 0 FAIL;`check-assertions.mjs` 164 文件 / 8794 条 PASS(基线未动);全量 `test-all.mjs` 164/164 通过、`test:ci` 九道闸全绿。真机确认三视图三档差异、自化图例、整侧栏宣纸底纹,以及输入框右侧 `命理·问` chip。
|
|
130
|
+
|
|
131
|
+
## 0.62.5(2026-11-09,已发布)
|
|
132
|
+
|
|
133
|
+
## 0.62.5(2026-11-09,已发布)
|
|
134
|
+
|
|
135
|
+
- **八大地支结构接进四处,并说清与旺衰分的关系**(`engine/index.js`、`engine/interpret.js`、`src/panel-kit.js`、`test/bazi-structure.test.mjs`):`strength.branchStructure` 自 0.62.5 起就在结果里,但摘要、解析、面板、独立页一处都没显示。现补:摘要新增「地支结构:四支 AABA(年午A、月巳A、日丑B、时未A) 日支独异,不易从(静态从格 ≈20%)」一行;解析新增「地支结构」一节,逐支列阵营与宫位分值、异类支、地支与干支两段平衡,并明写**「这是并列的第二套静态视图,不改上面的旺衰评分,也不参与取格与喜忌」**;面板在「日主强弱」下方加 `.pp-struct` 行(code + 逐支阵营 + 异类 + 从格概率 + 平衡比),悬停给方法与边界。
|
|
136
|
+
- **三柱模式不把占位时支冒充实有**(同上):`hourUnknown` 时第四支是正午占位,摘要写「三支+占位 …… 时午A·占位」,面板同款;从格概率一律不套。这里有一处措辞要留意——`bs.word` 本身已被 `bazi.js` 的 `hourUnknown` 分支改写成「时柱暂缺,第四支为正午占位,不套从格概率」,所以摘要**不能再追加同句**,初版重复说了两遍,已由断言 `(match(/…/g)||[]).length === 1` 钉死。
|
|
137
|
+
- **暗合接进三处,并明确「另列不并」**(同上):`relations.anhe` 同样只算不显。摘要按对数写「暗合:…(另列,不并入上面的合冲刑害;只一对,按口径可忽略 / 共 N 对)」;解析新增「暗合」一节,明写与三合三会六合六冲刑害是**两条线、不合并计分、不折旺衰**;面板在关系行下加 `.pp-anhe` 行。无暗合的盘这三处都不出现(不用空行占位)。
|
|
138
|
+
- **起运岁精确值接进三处**(`engine/index.js`、`engine/interpret.js`、`src/panel-kit.js`、`test/bazi-jiaoyun.test.mjs`):`dayun.startAgeExact` 是 0.62.5 为对齐第三方排盘加的(截断到日/时 23/23 全中,四舍五入到月只有 15/23),但同样没有输出通道——恰恰是它最能解释「为什么和别家差一个月」。摘要新增「起运岁(精确):8 年 2 个月 26 天 8 小时(截断到年月日时;上面「8岁3个月」是四舍五入到月,两者同源)」;解析「时间窗」写明差一个月的边界常出在日/时这两位、第三方给到日时按这行核对;面板页脚在「N岁起运(交运…)」后加「精确 N年N月N天N时(截断到日时;上面是四舍五入到月)」。
|
|
139
|
+
- **旧结果兼容**:三处都是新增可选行,缺字段时整块不渲染(`startAgeExact` / `branchStructure` / `anhe` 任一缺席都不出空行、不出 `undefined`),`test/bazi-jiaoyun.test.mjs` 第十二、十三节与 `test/bazi-structure.test.mjs` 第七至九节各有一组「删字段后照常渲染」的对照断言。
|
|
140
|
+
- **验证**:`build-client` → 改文档 → 再 `build-client` + `build-html` → 全量 `test:ci` 九步全绿(**163/163** 测试文件、46.7s;check-bundle `client.js` 290KB / gzip 89KB、18 块 gzip 合计 2.56MB、单块上限 288KB、逐模块 71 个、宿主形态可执行且与源码逐字节一致;check-verification 两产物新鲜;凭据扫描 345 文件干净;check-patterns 81 文件;HTML 注入面 5 文件;check-perf 29 项,1000 盘 401ms / RSS 76MB;`verify-tests-can-fail` 15 PASS / 1 FAIL → exit 1 符合预期)。断言基线 **8729 → 8772**(+43,全在结构/交运两档),`test/bazi-structure.test.mjs` 81 条、`test/bazi-jiaoyun.test.mjs` 77 条。`e2e-dom` 152 项、`e2e-panel` 110 项通过。分块 gzip:**bazi 247.5KB**(逼近 288KB 上限,因 `interpret` 新增两节),其余不变。
|
|
141
|
+
- **一处已知的取舍**:`client.bazi.js` 从 243.7 涨到 **247.5KB**,离 288KB 上限还剩 40KB。结构节与暗合节都进了解析栈(`interpret.js`),而解析栈被 bazi/ziwei/hepan/trend 四块各存一份——再加同类文案就该考虑拆共享块,本轮不动。
|
|
142
|
+
|
|
143
|
+
## 0.62.5(2026-11-09,已发布)
|
|
144
|
+
|
|
145
|
+
> 已发布:npm `dsh-metaphysics@0.62.5`,shasum `2be34a0c3be03b1285ae72f10f42bc73c9ce7627`,104 个文件;tag `v0.62.5` → `985b3c4`,[GitHub release](https://github.com/xuanfu-web/dsh-metaphysics/releases/tag/v0.62.5) 已建,`main` 已推送。
|
|
2
146
|
|
|
3
147
|
> 本段主题(2026-11-08,B14):把书目覆盖表里最后 3 项「只有书名、没有原文」升级成有原文——易传(十翼)、奇门遁甲元灵经、奇门遁甲秘笈大全。覆盖表 **74 / 3 / 69 → 77 / 0 / 69**,「只有书名」这一类清零。不改排盘口径、不新建知识卡(`KNOWLEDGE` 仍 59 张)。
|
|
4
148
|
|
|
@@ -9,7 +153,7 @@
|
|
|
9
153
|
- **十干克应卡由「通行说」升「已定位」,但 note 写明只证三组不证全表**(`engine/citations.js` 的 `CARD_CITATIONS['qimen-ganying']`、`engine/interpret-knowledge.js`):升级依据是元灵经卷二甲加甲「吉凶不定,惟看门如何。门吉则吉,门凶则凶」,正是该卡「先取成象、再与门星神合看,不单独回答事情成不成」那一层的原文。但卷二「天盘加地盘吉凶」**只存天盘甲、乙、丙三组,各 9 条、三组都缺「加戊」,页面到「丙加地盘癸」为止,丁以下七组未收**,所以 refs 只证这三组与这一层口径,note 与卡片都写明**不证通行 100 组表全文**,其余七十馀组仍取通行表汇编、无单条原文。「通行说」卡片 8 → **7 张**(待补仍 1 张),计数锁同步改。
|
|
10
154
|
- **底本缺陷照录不代改**(`docs/知识扩展与待核实清单.md` 附十三):说卦传第三章被底本误题作「《老子。说卦传》」;震/巽/坎类象有 □①-⑥ 缺字,只引干净的乾、坤两段;大衍章下一句「归奇於□①以象闰」有缺字,引到「揲之以四以象四时」为止(断言钉死 quote 结尾与不含「归奇」);三奇入墓歌「丁奇乙未临艮土」中「乙未」未详,照录并写明疑有讹脱;秘笈页内「干」即乾、「直符」即值符、「尅」即克,引文照原字、解析时归一;秘笈分类页**跳过卷三**(003 是卷二、004 是卷四),实收 29 卷;说卦传只明写六方,**坤西南、兑正西两方本页没有明写**,由秘笈总序补证,两条白话互相点名,不拿说卦传冒充八方俱全。
|
|
11
155
|
|
|
12
|
-
- **验证**:按附五记的收尾顺序重建——改引擎与文案 → `build-client` → 改文档与 CHANGELOG → 再 `build-client` + `build-html` → 生成 `docs/citations.html` → `test-all` → `check-assertions --update` → **再 `build-html`** → 全量 `test:ci` 九步全绿(**155/155** 测试文件,用时 40.4s;check-bundle `client.js` 289 KB / gzip 89 KB、18 块 gzip 合计 **2.51 MB**、单块上限 **288 KB**、逐模块编译 70 个、宿主形态可执行且与源码逐字节一致;check-verification 2 个产物与源码渲染逐字节一致;凭据扫描 **337** 文件干净;check-patterns 80 文件;HTML 注入面 5 文件;check-perf 29 项,1000 混合盘 **336 ms / RSS 94 MB**;`verify-tests-can-fail` 15 PASS / 1 FAIL → exit 1)。断言基线 **8376 → 8415**(只增不减,B14 净增 39 全在 citations 一档),`test/citations.test.mjs` **210 → 249 PASS / 0 FAIL**。分块 gzip:**bazi 233.6 / hepan 232.3 / ziwei 228.8 / liuyao 195.2 / qimen 187.6 KB**,最大块离 288 KB 上限还有约 54 KB——进分块的只有 16 条定位字段、5 张卡的 refs 与 source/note、两个只读视图(`QIMEN_JU_TABLE` / `QIMEN_BASE_TABLES`)与本段条目标题,17 条原文白话与 8 页底本全在不打包的 fuwen/fixture 侧。`docs/citations.html` 重建到 **451 KB**、统计 464 → 497 条,与 `buildCitationsHTML()`
|
|
156
|
+
- **验证**:按附五记的收尾顺序重建——改引擎与文案 → `build-client` → 改文档与 CHANGELOG → 再 `build-client` + `build-html` → 生成 `docs/citations.html` → `test-all` → `check-assertions --update` → **再 `build-html`** → 全量 `test:ci` 九步全绿(**155/155** 测试文件,用时 40.4s;check-bundle `client.js` 289 KB / gzip 89 KB、18 块 gzip 合计 **2.51 MB**、单块上限 **288 KB**、逐模块编译 70 个、宿主形态可执行且与源码逐字节一致;check-verification 2 个产物与源码渲染逐字节一致;凭据扫描 **337** 文件干净;check-patterns 80 文件;HTML 注入面 5 文件;check-perf 29 项,1000 混合盘 **336 ms / RSS 94 MB**;`verify-tests-can-fail` 15 PASS / 1 FAIL → exit 1)。断言基线 **8376 → 8415**(只增不减,B14 净增 39 全在 citations 一档),`test/citations.test.mjs` **210 → 249 PASS / 0 FAIL**。分块 gzip:**bazi 233.6 / hepan 232.3 / ziwei 228.8 / liuyao 195.2 / qimen 187.6 KB**,最大块离 288 KB 上限还有约 54 KB——进分块的只有 16 条定位字段、5 张卡的 refs 与 source/note、两个只读视图(`QIMEN_JU_TABLE` / `QIMEN_BASE_TABLES`)与本段条目标题,17 条原文白话与 8 页底本全在不打包的 fuwen/fixture 侧。`docs/citations.html` 重建到 **451 KB**、统计 464 → 497 条,与 `buildCitationsHTML()` 逐字节一致。桌面副本当时停在 0.62.2;已在 0.62.5 收尾时按用户要求一并刷新(覆盖前留了 0.62.4 回滚副本)。
|
|
13
157
|
|
|
14
158
|
> 续(2026-11-09):结掉「交运只有数学自证、没有第三方对拍」这笔欠账,把炳祥课堂的力量量化层接成只读标注,再把已吸收的命理知识收束成一份可执行的口径总纲。全程不改 L0/L1 结论——旺衰分、喜忌、取格、交运字段一律原样,新增字段都是并列只读。
|
|
15
159
|
|
|
@@ -18,7 +162,7 @@
|
|
|
18
162
|
- **炳祥课堂的力量量化层接入为只读标注,不动既有旺衰、喜忌与取格**(新增 `engine/structure.js`,改 `engine/bazi.js` / `engine/geju.js` / `engine/interpret.js`):`strength.branchStructure` 给八大地支结构 code(AAAA…ABBA)、从格静态概率与平衡度;`strength.weightPct` 按柱给年 13% / 月 41% / 日 27% / 时 19%;`frame.bingyao` 病药(正格 >35%、从格 >15%,从格按类型反转喜忌)、`frame.xianshen` 闲神(食伤与官杀较弱者,4% 最佳、≥10% 显忌,显性 ×3 只进文案排序)、`frame.patternScore` 成格评分(只评正八格月令格,建禄/羊刃/月劫等外格不评)、`relations.anhe` 暗合另列、不混入合冲刑害;解析层新增「病药」「闲神」两节与「量化口径」说明。三柱(时辰未知)一律打 `placeholderHour`、不套从格概率、时柱权重不计入合计(81%)且不归一化。七个新测试文件共 238 条断言。
|
|
19
163
|
- **撤掉三处过度声称,命中率从虚高改回可核**(`tools/backtest-jiaoyun.mjs`、`docs/命理口径总纲.md` §6):① 旧样本把上游已扣过夏令时的 `chart.datetime` 再喂 `dst:true`,等于扣两次(民用时间错 1 小时、交运错 5 天),现改喂原文钟表时间 `time.clock` 并加 `frameOk` 闸门(20/20),另用「双重扣必给出不同结果」反向证伪该闸门不是恒真;② Multifate 页面没印四柱与「几天」,旧样本把本机值当厂家值填进去、凭空多出一例「命中」,现一律记 `published:false` 并剔除出分母,四柱命中由 23/23 修正为 **22/22**;③ 枇杷八字那份输出自相矛盾,旧稿替它编了「取节错误」根因,现改判 `UNUSABLE_CASES` 不入分母。偏差均值随之由 3.70 天修正为 **3.48 天**。
|
|
20
164
|
- **《命理口径总纲》入仓:23 条裁决,冲突处直接选定主口径并写清理由与置信边界**(新增 `docs/命理口径总纲.md`、`docs/炳祥八字-课程知识内化.md`,改 `docs/参考资料与对拍来源.md` §7、`docs/知识扩展与待核实清单.md` §三.2、`docs/对话记录与决策日志.md`):明确不做兼透次序/三会改格、体用能量比、紫微破格/奇门入墓/六爻用神多现,应期只到年运不推流日;旺衰保留现有相对分,炳祥百分比只作宫位百分比与结构概率的只读视图;51%、旺衰 90% / 调候 10%、大运:流年 3:2~2:1 等课堂口径只进解读注记,不改判定。
|
|
21
|
-
- **验证**:`build-client` → 改文档与 CHANGELOG → 再 `build-client` + `build-html` → 全量 `test:ci` 九步全绿(**163/163** 测试文件;check-bundle 逐块均在上限内、宿主形态与源码逐字节一致;check-verification 两产物与源码渲染一致;凭据扫描干净;check-patterns / check-html-sinks / check-perf 均过)。断言基线 **8376 → 8729**(只增不减:citations 段 +39,八字新测试 +314),已按 `check-assertions --update` 重算。另顺手钉死 `bool-flags.test.mjs` 里紫微 `flow` 读本机当前时刻带来的偶发噪声(加 `asOf
|
|
165
|
+
- **验证**:`build-client` → 改文档与 CHANGELOG → 再 `build-client` + `build-html` → 全量 `test:ci` 九步全绿(**163/163** 测试文件;check-bundle 逐块均在上限内、宿主形态与源码逐字节一致;check-verification 两产物与源码渲染一致;凭据扫描干净;check-patterns / check-html-sinks / check-perf 均过)。断言基线 **8376 → 8729**(只增不减:citations 段 +39,八字新测试 +314),已按 `check-assertions --update` 重算。另顺手钉死 `bool-flags.test.mjs` 里紫微 `flow` 读本机当前时刻带来的偶发噪声(加 `asOf`),不改引擎行为。桌面副本(`~/Desktop/命理排盘.html`)按用户要求随 0.62.5 一并刷新,覆盖前留了一份 0.62.4 回滚副本。
|
|
22
166
|
|
|
23
167
|
## 0.62.4(2026-11-07,已发布)
|
|
24
168
|
|