dsh-metaphysics 0.56.0 → 0.58.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 CHANGED
@@ -1,6 +1,108 @@
1
+ ## 0.58.0(2026-11-01,已发布)
2
+
3
+ > 本版主题:把「盘送不进对话」这条路补成三条不依赖宿主的通道(C3),顺手让自动发布可观测、可自愈,再把引文里两句长期误署的话改回原书。
4
+ >
5
+ > 包含:C3 对话桥替代(深链 / 复制 / 结构化参数)、§5.8 自动发布加固、B6 通行说复核、B6 通根透干复核(误署纠正)、B6 第五批(大六壬 3 条)、C4-a 三方合盘、C4-b 择日候选日比较、C4-c 同盘多口径并排、D1+ 首屏耗时回显、A1+ 推导链出处、D4 发布回滚、自检修复(见下)。
6
+
1
7
  ## 未发布
2
8
 
3
- > 按主题累积:攒够一组相关改动再发一版。发版时把本段改名为 `## x.y.z(日期,已发布)`,同时升 `package.json` 版本号。
9
+ - **C3 对话桥替代**(`engine/bridge.js`、`src/app.js`、`src/web-ui.js`):会话槽位 `conversation.input.right` 不稳,桥一断就没路把盘送进对话;这一版给出三条不依赖宿主的通道。
10
+ - 深链:`#mp=<句柄>&q=<问题>`,参数走 C1 句柄编码,截断或改字报 `E_HANDLE` 而不是静默排成另一张盘。面板首屏先读链接再排盘(表单状态下一帧才生效,同一批值经 `run` 的 over 直传,不会先闪一张旧盘);独立页在 `setTab` 之后填表单再排,并在结果顶部写「已按链接还原:体系|问题」,没填回表单的参数(如合盘对方)如实列出,不悄悄丢。
11
+ - 复制:完整提问(与桥发出去的是同一份)、一句话精简(体系 + 句柄 + 问题,≤200 字)、结构化参数(`{"tool":"metaphysics","args":{handle,…}}`,助手可直接照 args 调 compute)。
12
+ - 面板在追问框下加一排芯片「复制提问 / 复制精简 / 复制参数 / 复制深链」,桥可用时保留、桥缺席时就是主通道;独立页在追问区加「复制提问」、导出栏加「复制深链」。
13
+ - 证据:`test/bridge.test.mjs` 88 条(深链往返与四柱复现、四种写法可解析、六类坏链接不抛异常且带 code、表单还原与未还原提示、三档文本与 JSON、无句柄不编链接、不改盘面对象、面板与独立页接线、bridge 进公共栈);无头 Chrome 实测 `命理排盘.html#mp=…` 打开后四柱与问题一致、坏句柄回落到默认盘。
14
+
15
+ - **§5.8 自动发布加固**(`tools/autopublish.mjs`、计划任务):把「定时跑但出了问题看不出来」补成可观测、可自愈。
16
+ - 每天 23:00 与 23:30 双跑:第二跑在指纹未变时只写一行日志,等于给第一跑的一次兜底重试。
17
+ - 每次运行开头写 `运行开始(auto/dry-run/init/force,pid …)`;**无改动也写一行**(原来是完全静默,事后查不出任务跑没跑);日志超过 512KB 自动裁到最近 800 行。
18
+ - 失败写 `tools/.autopublish-error`(内容含失败原因与时间),成功一次自动删掉;未捕获异常也留痕。该文件进 `.gitignore`。
19
+ - GitHub HTTPS 连续失败且报错像「连不上」(443 / timeout / SSL / RPC failed)时,自动生成临时 ed25519 → 调 API 注册 deploy key → 走 `ssh://git@ssh.github.com:443/...` 推一次 → 无论成败删 key、删本地私钥;「推被拒」不触发兜底。
20
+ - 证据:`test/autopublish.test.mjs` 28 条(未知参数仍立即拒绝且不碰状态文件、加固项接线、dry-run 写运行开始、配置缺失时退出码 1 且写错误文件、失败后不留锁也不改状态)。
21
+
22
+ - **B6 通行说复核(8 张逐张过一遍底本)**(`engine/citations.js`、`engine/interpret-knowledge.js`):
23
+ - `liuyao-jintui-yong` 由通行说改为 refs:《增删卜易》卷二·進神退神章第二十九「進神退神者,爻之動而化也,化進化退,吉凶禍福有喜忌之分,所喜者宜於化進,所忌者宜化退神。」底本已经把喜忌落在进退上;把「喜/忌」具体落到用神/忌神两档仍标为本插件引申(写进知识卡 note)。
24
+ - 其余七张维持通行说,但把「查过什么」写进理由:紫微飞星三张——`《紫微斗數全書》`卷一、卷三全文检索「宮干/飛星/三方同飛/忌轉忌」均无命中,底本只有生年四化;奇门干宫生克——统宗已抓四卷只有「星相克/仪相克/门相克」与「时干克日干」;十干克应——检索到的「十干克應歌訣」署诸葛亮、释意者为近人,属现代韵语,不能当原文;通根透干——当时没定位到,留待联网复核(下一轮已改判,见「B6 通根透干复核」);塔罗逆位——韦特《Pictorial Key to the Tarot》1911 已入公有领域,但原书对逆位态度含混,未给「逆位=受阻/内化」这套固定读法。
25
+ - 53 张卡:45 张已定位原文(+1)、7 张通行说(−1)、1 张待补。`docs/citations.html` 同步重建。
26
+ - 证据:`test/citations.test.mjs` 59 条(新增 3 条:用神化进退落到進神退神章、source 为 verified、通行说剩七张且待补一张)。
27
+
28
+ - **B6 通根透干复核:通行说是误署,改引《滴天髓·干支总论》**(`engine/citations.js`、`engine/interpret-knowledge.js`):
29
+ - 说法查证。常被引作《滴天髓》的「地支所藏之干,本静以待用,透出干头,则显其用矣。故干以通根为美,支以透出为贵」,在**滴天髓底本全文**里检索「本静以待用/干以通根为美/透出干头」零命中;在**《子平真诠》沈孝瞻原文**(论十干十二支,中华典藏本 984 字)里同样零命中。它实际出现在《子平真诠》**评注本**卷一·论十干十二支的注文(附支藏人元图、十二月令人元司令分野表之后的按语)。也就是说:网络通行写法「《滴天髓》云:地支所藏之干……」把注文署给了原书。
30
+ - 改判依据。该注文自身引的才是《滴天髓》:「天全一气,不可使地德莫之载;地全三物,不可使天道莫之容」——这句在本地所收滴天髓底本「干支总论」里逐字可对上,语义正好是「天干要地支承载(通根)、地支藏干要透出天干(透出)」。故本卡只引这句可核的原文,注文那两句写进 `note` 作说明,不冒充原文。
31
+ - 结果:`bazi-tonggen-tougan` 由通行说改为 refs(新增引文 `dt-yiqi-tonggen`,《滴天髓·干支总论》);引文库 93→94 条;**46 张已定位 / 6 张通行说 / 1 张待补**。`docs/citations.html` 现在也会把 `note` 显示在已定位条目下,误引纠正看得见。
32
+ - 证据:`test/citations.test.mjs` 62 条(新增 3 条:改引干支总论、引文确为原句、note 写明误署;通行说计数 7→6)。
33
+
34
+ - **D4 发布回滚**(`tools/release.mjs` + `tools/release-rollback.mjs`):发版失败、或发布后附件核对没通过时,打印一套可照抄的回滚步骤,不自动动 registry。
35
+ - `rollbackPlan()` 按原因出步骤:`publish-failed` 先查「版本条目有没有建出来」;两种情况都给出「`npm dist-tag add …@上一版 latest` → `npm deprecate` 问题版本 → 网页 2FA 删包(automation token 会被 403 拒)→ `npm version patch --no-git-tag-version` → CHANGELOG 改回未发布段」;打过 tag 时再加本地删 tag 与远端删 tag 两步。
36
+ - `release.mjs` 在发布前记住 registry 上的 `dist-tags.latest`,作为回退目标;`npm publish` 失败与 `verifyPublish` 失败都自动打印这套步骤,并给出单独跑的等价命令。
37
+ - 新增 `node tools/release-rollback.mjs`(`npm run rollback:plan`):默认只打印;`--apply dist-tag` 需要 `NPM_TOKEN`,只代为把 latest 指回上一版;`unpublish` / `deprecate` / 删远程 tag 一律只打印,由人确认后执行。
38
+ - 证据:`test/release-rollback.test.mjs` 40 条(两种原因的步骤与命令、无上一版时不猜号、tagged 两步、未知 reason 回落、排版与不打印 token、CLI 退出码与 `--apply` 限制、release.mjs 接线与 verify-only 不把问题版本当上一版)。
39
+
40
+ - **自检修复**(`engine/index.js`、`src/web-ui.js`):两处只在真实浏览器/连续操作下才暴露的一致性问题。
41
+ - `partner2: null` 在排盘前归一化为未传:原先 compute 当它没给,句柄却把 `partner2:null` 编进去,同一对盘会拿到两个句柄。
42
+ - 独立页耗时行改存 `last.perf`,由 `paint()` 末尾补回:切询问方向等重绘会换掉整段结果区,原先那一行随之消失;现在重绘后仍在且只有一行。
43
+ - 证据:`test/hepan-triple.test.mjs` 新增 2 条(null 不出三方、与省略同句柄);`test/perf-instrumentation.test.mjs` 增至 41 条(耗时行入状态、paint 末尾补回);headless Chromium 实测切方向后 `.mp-perf` 仍为 1 行。
44
+
45
+ - **B6 第五批:大六壬原文录入**(`engine/citations.js`):《大六壬大全》维基文库四库全书本,新增 3 条,`daliuren-sike` 由通行说改为 refs。
46
+ - 卷一·起例「十干寄宫」:`甲课寅兮乙课辰,丙戊课巳不须论。丁己课未庚申上,辛戌壬亥是其真。癸课原来丑宫坐,分明不用四正神。`——四课起手。
47
+ - 卷一·起例「贼克法」:`取课先从下贼呼,如无下贼上克初。初传之上名中次,中上加临是末居。三传既定天盘将,此是入式法第一。`——九宗门取初传。
48
+ - 卷二·神将释「月将」:`逆布者谓之月将,其实即十二神也。`——月将定义;加时布盘仍标通行口诀、不标卷次。
49
+ - 引文库合计 **93 条**(八字经典 41 + 引文索引 52),53 张卡里 44 张已定位原文、8 张通行说、1 张待补;`test/fixtures/citation-sources.json` 增至 58 个章页,`docs/citations.html` 同步重建。
50
+ - 证据:`test/citations.test.mjs` 新增 6 条(书目登记、四课三传带 refs、三章定位、无省略号),共 56 条;`test/trace-sources.test.mjs` 同步把大六壬三层的出处改为已核验卷次。
51
+
52
+ - **A1+ 推导链出处**(`engine/trace.js`):16 层的 `source` 统一成「出处;实现:engine/…」,能对上已录入篇名的才写书名卷次。
53
+ - 六爻:六亲对读《增删卜易》卷一·用神章第八;伏神引卷二·飛伏神章第二十八;旺衰引卷一·月將章第十六、日辰章第十七。纳甲、世应明写「规则表 / 通行动诀,本仓未录入古籍章页」。
54
+ - 八字:格局引《子平真诠》八、论用神(专求月令),调候参《穷通宝鉴》五行总论;旺衰**明写本仓量化规则、非古籍定数**;四宫标 Tyme 1.5.4 口径与 704 组对拍、未照录古籍章页。
55
+ - 紫微:格局引《紫微斗数全书》卷三·论人命入格、谈星要论(与引文索引同源)。
56
+ - 奇门:盘面事实引《奇门遁甲统宗》卷一·奇门秘诀总赋;旺衰引卷三;宫位引卷二与卷十一·玄机赋(中);用神表与十干克应明写「本仓表,非古籍原文」。
57
+ - 大六壬:本环境没有可稳定核验的公有领域章页,三层只标「通行口诀,未标卷次」,不拿别书条文冒充。
58
+ - 证据:`test/trace-sources.test.mjs` 35 条(16 层都有实现位置、书名只能在已登记的五本里、所引篇名能在引文库找到、各体系「有据 / 无据」的措辞、Markdown 导出原样保留);`test/trace.test.mjs` 同步文本断言。
59
+
60
+ - **D1+ 首屏耗时回显**(`src/engine-lazy.js`、`src/app.js`、`src/web-ui.js`、`src/panel-kit.js`):
61
+ - `__mpEnsureEngine` 记录每次取块耗时与是否命中缓存(`window.__MP_LAST_LOAD`),不埋点上报、不发网络请求。
62
+ - 面板从点击到两帧后记「首屏」,并拆出引擎取块与排盘两段;连续点两次时旧回调按 `perfSeq` 丢弃,不会把上一次的数字盖到新结果上。
63
+ - 独立页记「排盘」与「渲染(组 HTML + 写 DOM 的同步时间)」,明确不把浏览器真正绘制的那一帧算进来。
64
+ - 结果顶部缝一行灰色小字:`首屏 42ms|引擎 18ms(首次加载)· 排盘 9ms`,悬停说明「本机实测,不含网络与服务端」。缺哪段省略哪段,不编数字、不出 NaN。
65
+ - 证据:`test/perf-instrumentation.test.mjs` 39 条(三种组合的排版、缓存标注与缺省、NaN/负数、懒加载两次调用与缓存、面板/独立页计时接线、无上报调用)。
66
+
67
+ - **C4-a 三方合盘**(`engine/hepan.js · tripleOf` + `engine/index.js`):`hepan` 新增可选 `partner2`(字段同 `partner`),结果多一个 `triple`——
68
+ - `pairs`:三对(你×对方 / 你×第三方 / 对方×第三方)各给 `total`、`level` 与三维度分数,顺序固定;`a-b` 与顶层 `score` 完全一致,另两对与「单独拿这两人排合盘」逐分相同,翻过来排也一样。
69
+ - `best` / `hardest` / `spread` / `focus`:最顺、最需磨合、最高最低分差、三对之间分歧最大的那一维。**分差不足 3 分时不点名**,摘要改说「三对分数接近,不排名」,避免假精确。
70
+ - **不合成「三人总分」**:三方只把三对两两关系并列——和不同的人相处是不同的事,合成一个数会把差异抹平。
71
+ - 八字与紫微两种合盘都支持;`partner2: null` 视同未传,非对象或缺 `datetime` 报 `E_PARTNER` 并点名 `partner2`。
72
+ - 第三人进排盘句柄与影子盘指纹(换第三人=另一组盘,`baseId` 随之改变),下一轮只传 `handle` 即可复现同一组三方。
73
+ - 面板与独立页:合盘 tab 勾「三方合盘(加入第三人)」后展开第三方日期/时刻/性别/出生地;结果区在三维度后加三对并列小表(分数 + 三维度),只在该勾选时出现。
74
+ - 证据:`test/hepan-triple.test.mjs` 54 条(结构、与单独合盘/颠倒顺序一致、最顺与最需磨合、分歧维度、null 与坏输入、文本、紫微、句柄与影子盘、面板表与转义、面板/独立页/模板/宿主 schema 接线)。
75
+
76
+ - **C4-b 择日候选日比较**(`engine/zeri.js` + 面板/独立页):`zeri` 新增可选 `candidates`(2–12 个真实公历日期)。
77
+ - 给了就只比这几天(去重、保持输入顺序),不再按 `startDate` 扫区间;逐日分数与区间模式同一套公式,同一批日子逐分一致。
78
+ - 结果多一个 `compare`:`best`(这一组最高分与结论、同分者)、`spread`(最高与最低分差)、`note`(「胜出只表示更合所问事项,不代表好多少」)。全部因冲属相被排除时 `best` 为 `null`,摘要如实写「都因冲属相被排除」,不硬推一个。
79
+ - 入参守卫:不是数组、少于 2 个、超过 12 个、去重后不足 2 天、`2026-02-30` 这类不存在的日期,一律 `E_INPUT` 并说清改法;区间模式仍必须给 `startDate`。
80
+ - 面板与独立页:择日表单新增「候选日(可空,只比这几天)」,逗号/顿号/空格分隔;结果区在候选模式下画逐日表(日期+农历 / 干支+建除 / 分数 / 结论 / 理由),最优行标「最优」,下方并列推荐、可用、回避与比较口径;区间模式仍用原文案,不铺 60 行表。
81
+ - 候选日进句柄,下一轮只传 `handle` 即可复现同一组比较。
82
+ - 证据:`test/zeri-candidates.test.mjs` 48 条(与区间模式同分、去重、冲煞排除、全排除、五类坏输入、文本、句柄、面板表与转义、四处接线)。
83
+
84
+ - **C4-c 同盘多口径并排**(`engine/diff.js · CALIBER_VIEWS`):口径对照的每一行多回 `views`——只挑会影响结论的几项做两列并排,不改盘、不重算、不判优劣。
85
+ - 八字:日柱 / 时柱 / 旺衰 / 格局(`frame.primaryName`)/ 喜用 / 起运;紫微:命宫 / 身宫支 / 五行局 / 身主 / 起大限;奇门:日柱 / 局数 / 值符 / 值使。字段取两张盘里已有的值,缺省写 `—`,不把对象硬串成 JSON。
86
+ - 摘要里每行多一句「并排:日柱 丙辰 → 乙卯;…」,只列变化项;面板与独立页在根因后加 `mp-cview` 表(列名用档位名,例如「换日 / 不换日」),同样只列变化项。
87
+ - 紫微身宫取 `body.branch`;原先写的 `body.ganzhi` 不存在,会一直显示 `—`。
88
+ - 证据:`test/caliber-diff.test.mjs` 新增 21 条(视图键与行数、单元格格式、子年身主 火星 → 铃星、午年无变化项、奇门晚子时落日柱、文本并排、面板表与转义)。
89
+
90
+ ## 0.57.0(2026-11-01,已发布)
91
+
92
+ > 本版主题:排盘句柄与一句话改参、推导链 Markdown 导出、喜忌中性档、引文索引三批补录、性能门槛。
93
+
94
+ - **B6 第二/三/四批原文录入**(`engine/citations.js`):知识卡的「已定位原文」由 17 张增至 **43 张**,通行说由 35 张降至 **9 张**,待补仍 1 张。
95
+ - 第二批 7 条,均取自中华典藏网公有领域底本、逐字核验后照录:《三命通会》卷二「论五行旺相休囚死并寄」(旺相休囚死)、卷三「总论诸神煞」(神煞取用)、卷三「论空亡」(空亡)、卷二「论大运」(起运)、卷七「论六亲」(六亲)、卷二「论三刑」(刑冲),以及《穷通宝鉴》「五行总论」(调候)。《穷通宝鉴》该本页首未标卷次,条目只写篇名、不替它补卷号。`bazi-tonggen-tougan` 仍留通行说——《滴天髓》只有「壬水通根透癸」的单条,没有泛论通根透干的段落,不拿个案冒充通则。
96
+ - 第三批 6 条:《奇门遁甲统宗》卷一「奇门秘诀总赋」(阴阳遁与超神接气)、卷十一「玄机赋(中)」(六仪击刑、三奇入墓)、卷三(旺相休囚)、卷二(八门迫制与有气无气),以及《梅花易数》卷二「体用生克」。奇门章节只标页面实有的卷次与篇题,`qimen-gan-shengke`(干与落宫生克)留通行说——底本只有「奇仪对日干」的十神条,未见单列干宫生克条,不拿十神条文冒充。
97
+ - 第四批 13 条:《增删卜易》(维基文库本,**繁体照录**)——卷一用神、月将、日辰、动变生克冲合、六神、六合、六冲、反伏、各门类应期总注,卷二飞伏神与进神退神;覆盖 `liuyao-yongshen`、`liuyao-fushen`、`liuyao-wangshuai`、`liuyao-yongshen-shuai`、`liuyao-quanggu-shuai`、`liuyao-dongbian`、`liuyao-liushen`、`liuyao-liuhe`、`liuyao-liuchong`、`liuyao-fanyin`、`liuyao-fuyin`、`liuyao-jintui`、`liuyao-yingqi` 十三张卡。`liuyao-jintui-yong` 仍留通行说:底本把进退落在「動而化」的吉凶喜忌与应期上,未见单列「用神化進/化退」条,按用神与忌神分档是本插件引申。
98
+ - 引文库合计 **90 条**(八字经典 41 + 引文索引 49:紫微 23、三命通会 6、增删卜易 13、奇门 5、穷通宝鉴 1、梅花 1)。`test/fixtures/citation-sources.json` 同步到 56 个章页快照,`test/citations.test.mjs` 累计 50 条断言(书目登记、卡片带 refs、各条取书与章名、无省略号)。大六壬仍标通行说:本环境无可稳定核验的公有领域章页(ctext 明示禁止抓取、中华典藏网未收)。
99
+ - **D3 性能门槛**(`tools/check-perf.mjs`):`tools/bench.mjs` 拆出 `runBench()` 与 `CASES` 供复用(CLI 行为不变,`--json` 仍可用),新增门槛脚本对八体系样本逐项判超限——首次 150ms、p50 10ms、p95 25ms、带解析 250ms、1000 盘 4000ms、RSS 800MB。阈值按文档目标(bazi p50 < 1.5ms、1000 盘 < 400ms)留 5–10 倍余量,拦的是数量级回退而非毫秒级抖动;`DSH_PERF_SCALE=3` 可按倍数为慢机放大上限,不改代码。`npm run bench` 只测不判,`npm run check:perf` 判超限,`test:ci`、GitHub Actions 与 `tools/autopublish.mjs` 的发布闸门都串上。证据:`test/perf.test.mjs` 29 条(八体系基准形状、真实样本判定、超限样本必红、阈值余量与放大、npm/CI/自动发布/README/方案接线);本机实测 bazi 首次约 20ms、p50 0.78ms、1000 盘约 355ms、RSS 约 80MB、带解析 <8ms。
100
+ - **自动发布参数校验**(`tools/autopublish.mjs`):只认 `--dry-run` / `--init` / `--force`,其余参数(例如误写 `--dry`)立即以退出码 1 拒绝并列出可用参数,不再静默忽略后照常提交推送;未知参数不触碰状态文件。证据:`test/autopublish.test.mjs` 8 条。
101
+ - **C2 一句话改参**(`engine/revise.js`):把「换成紫微看 2030 年事业」「女命」「晚子时算次日」「出生在成都」「不用真太阳时」「详细解读一下」这类原话翻成参数补丁再排盘,可配合 `handle` 使用——上一轮的出生信息不必重报。**只认明确句式**:换体系必须有切换词(换成 / 改成 / 看 / 用 / 按…),单提一句「紫微里怎么说」不换盘;出生年份与时辰一句话给不出分秒,不猜,改为在 `ignored` 里明说改不了、请直传 `datetime`。识别不到时盘面一字不动,`applied` 为空。结果 `revision` 回传 `text` / `applied`(`key`、`label`、`value`、`display`、`from`、`fromDisplay`、`ignored`),旧值翻成中文(`system: bazi → 八字`、布尔 → 开 / 关、`asOf` → 年份),没设过的记「(未设)」而不是编默认值。改参先生效、后跑地址解析与日期补全,换体系会连带改走另一套默认值;句柄记的是改后参数、不含 `revise` 原文,所以同一张盘换个说法得到同一句柄。摘要末尾给「【改参】原话 + 逐条 旧 → 新 + 未处理」,面板与独立页给改参卡(先改动、后句柄)。`revision` 属请求回显,影子盘指纹与口径对照均忽略。
102
+ - **C1 排盘句柄**(`engine/handle.js`):每次排盘在结果里回一个自包含短句柄 `mc1.<base64url>.<8 位校验>`,下一次只传 `handle` + 增量参数(`asOf`、`direction`、`question`、换 `system` 看同一时刻另一套盘)即可,不必重报出生信息。句柄把参数本身编码进去而不是存在内存里——宿主一次工具调用可能落在不同进程,内存句柄拿不到下一轮。只收影响盘面的参数:`trace` / `shadow` / `withInterpret` / `cross` / `ask` / `caliber` / `geocode` 这些输出开关不进句柄,所以要不要解析、要不要推导链都不改变句柄;`seed` / `asOf` / 各流派开关必须留下,否则复现不出同一张盘。键序固定(键名排序),参数写法不同也得到同一句柄;校验位用 FNV-1a,截断、改字、错前缀都报 `E_HANDLE` 并给修复提示,不会静默排成另一张盘。base64url 与 UTF-8 均为自带实现(不依赖 Buffer / btoa / TextEncoder),引擎在 Node、浏览器与 vm 沙箱里都能跑。`compute` 入口先 `resolveHandle` 再排盘,显式 `undefined` 不覆盖句柄字段;宿主工具新增 `handle` 参数,并在地址解析、日期补全之前先并回参数,避免追问时漏掉出生地导致真太阳时不同。结果摘要末尾附「【排盘句柄】+ 用法」;面板与独立页给句柄卡与「复制句柄」按钮,并写明「是编码不是加密,含出生时间与出生地,别公开贴出」。影子盘指纹与口径对照忽略 `handle`(它反映的是另一次请求,不是盘面差异)。随机抽牌 / 起卦:句柄复现参数、不复现牌面,要复现须带 `seed`。
103
+ - **F 喜忌中性档**(`engine/geju.js`):忌神里全局分量不足 0.5 的另列 `neutral`(含 `element` / `role` / `verb` / `weight`),摘要、解析层、白话层与面板 chip(`中性偏忌 X 0.3 分`)都写明「近零,不作实忌」。**只是展示分档,`avoid` 不变**——局中没有不等于运里不来,大运/流年遇之仍按忌计,评分与调候结论一律不动。
104
+ - **A5 推导链导出**(`engine/trace.js`):`trace: true` 时结果同时给 `traceText`——同一份层的 Markdown(标题 + 每层结果/规则/输入表/出处),可直接贴进对话或文档;表格单元格转义 `|` 与换行。面板推导链抽屉加「复制 Markdown」按钮(内容取自隐藏 textarea,与引擎同源,不在前端重排)。五个体系(六爻 / 八字 / 紫微 / 奇门 / 大六壬)共用同一份导出逻辑。
105
+ - **测试**:新增 `test/handle.test.mjs`(70 条:往返、增量、换体系、键序、输出开关不进句柄、截断/改字/错前缀、中文与表情、影子盘不受影响、宿主 schema 与执行、面板与独立页接线)、`test/revise.test.mjs`(68 条:九条改参规则的命中与不命中、改参后盘面真变化、未设原值回显、忽略项提示、句柄配合、宿主执行、改参卡转义与接线)、`test/trace-export.test.mjs`(60 条)、`test/yongshen-neutral.test.mjs`(29 条)、`test/citations.test.mjs`(50 条,含 B6 第二/三/四批 23 条)、`test/perf.test.mjs`(29 条)、`test/autopublish.test.mjs`(8 条:未知参数直接拒绝、白名单固定)。当前 **122 个测试文件 / 5653 条断言**,七道闸 + 性能门槛全绿。
4
106
 
5
107
  ## 0.56.0(2026-11-01,已发布)
6
108
 
package/README.md CHANGED
@@ -18,7 +18,7 @@ Chinese metaphysics (玄学 / xuanxue) for [DeepSeek Harness](https://github.com
18
18
  - **梅花**:时间/数字起卦、体用生克分档、互变错综四卦齐出,本卦上下卦分块标体用
19
19
  - **大六壬**:天地盘 4×4 方盘(天盘大字、地盘小字、天将右下)、四课、九宗门三传、格局(贼克/元首/重审/伏吟/返吟/八专等)
20
20
  - **奇门遁甲**:时家转盘,拆补 / 超神接气 / 置闰三流派取局;九宫、值符值使、空亡驿马、门迫与宫制门严格区分;六仪击刑(按地支相刑定宫)与三奇入墓(按五行墓库定宫)逐宫标出;八门、九星与天盘干按月令分旺相休囚死;天盘干与所落宫另论干宫生克(干克宫/宫克干/干生宫/宫生干/比和)
21
- - **合盘**:八字或紫微双盘对照(日主、夫妻宫、五行互补 / 互落宫、四化引动)
21
+ - **合盘**:八字或紫微双盘对照(日主、夫妻宫、五行互补 / 互落宫、四化引动);可再加第三人做**三方合盘**——你×对方、你×第三方、对方×第三方三对并列,指出最顺/最需磨合的一对与分歧最大的一维,不合成「三人总分」
22
22
  - **塔罗**:78 张全牌、1/3/5 张牌阵,逐牌牌位义 + 整体解读,体系与逆位口径写明
23
23
  - **速查十件**:黄历(四柱/建除/宜忌/冲煞/节气 + 值日十二神/时辰吉凶/二十八宿/胎神/吉神方位/纳音/六合三合)、农历(公农历互转)、择日(27 类事项、按五组归类、冲属相排除)、称骨(骨重 + 称骨歌原文 + 释义)、
24
24
  小六壬(时间/报数起课)、星座(档案 + 当日基调)、生命数字(生命路径/生日/态度数)、人生 K 线(逐年分与形态)、
@@ -30,11 +30,13 @@ Chinese metaphysics (玄学 / xuanxue) for [DeepSeek Harness](https://github.com
30
30
  - **一页读懂 + 三张表**:整体/事业/财富/感情/节奏五条摘要;大运表、流年表、触发事件表(紫微是大限/流年/触发)
31
31
  - **证据卡 + 置信度**:每条维度结论可展开到逐条盘面事实与所用技法,置信度按证据条数分强/中/弱
32
32
  - **追问**:工具参数 `ask`,围绕已算好的盘回答「2027 年事业怎么样」这类问题;不重排、不猜测,找不到会明说
33
+ - **排盘句柄**:每次结果带 `handle`(形如 `mc1.…`),下一次只传 `{ handle, asOf, direction, question }` 这类增量就能追问同一张盘,或传 `{ handle, system: 'ziwei' }` 看同一时刻另一套盘,不必重报出生时间与出生地。句柄把参数编码进去(不依赖进程内存),键序固定、带校验位,截断或改字报 `E_HANDLE`;`trace` / `shadow` / `withInterpret` 这类输出开关不进句柄。它是编码不是加密——含出生时间与出生地,别公开贴出。随机抽牌只复现参数、不复现牌面,要复现须带 `seed`
34
+ - **一句话改参**:工具参数 `revise`(可配合 `handle`)接住「换成紫微看 2030 年事业」「女命」「晚子时算次日」「出生在成都」「不用真太阳时」「详细解读一下」这类原话,引擎翻成参数补丁再排盘,并在结果 `revision` 里回报改了哪些、没认哪些。只认明确句式——换体系要有切换词,单提一句「紫微里怎么说」不换盘;出生年份与时辰一句话给不出分秒,不猜,改为提示直传 `datetime`。识别不到时盘面一字不动。摘要给「【改参】原话 + 旧 → 新 + 未处理」,面板与独立页给改参卡
33
35
  - **八字 × 紫微 交叉验证**:工具参数 `cross`,五项并列对照,标注同向 / 有张力 / 互补
34
36
  - **晚子时开关**:23:00 后算次日还是当日,面板与独立页都能切;奇门另有「归当日 / 归次日」
35
- - **口径对照**:同一个盘只换一个开关——八字晚子时 / 真太阳时;紫微闰月、真太阳时与十类流派开关(共 12 组);奇门取局 / 晚子时归日。结果下方折叠列出「根因字段 旧值 → 新值」与连带变化数;面板、独立页与工具参数 `diff: true` 共用同一份开关表。只列差异,不判哪套更准,不改盘面
37
+ - **口径对照**:同一个盘只换一个开关——八字晚子时 / 真太阳时;紫微闰月、真太阳时与十类流派开关(共 12 组);奇门取局 / 晚子时归日。结果下方折叠列出「根因字段 旧值 → 新值」、几项关键结论的两列并排(日柱 / 旺衰 / 格局 / 喜用 / 起运等,只列变化项)与连带变化数;面板、独立页与工具参数 `diff: true` 共用同一份开关表。只列差异,不判哪套更准,不改盘面
36
38
  - **影子盘 ID**:工具参数 `shadow: true`(面板与独立页默认开启)为结果生成 `LY-XXXXXXX` 短 ID。同一组归一化参数——键序无关、默认值等价、地址与等值经度等价——在任何机器上得到同一 ID;`baseId` 不含版本,`id` 含版本。面板可一键复制,同一 `baseId` 重排时自动与本地上一张盘比对,版本升级或字段变化会展开列出根因(如「时柱 甲子 → 壬辰」)。塔罗 / 六爻未给 `seed` 时把实际牌面 / 六爻值算进 ID,不把两次不同的抽牌误认成同一张盘
37
- - **推导链**:工具参数 `trace: true`(面板与独立页对六爻 / 八字 / 紫微 / 奇门 / 大六壬默认开启)返回每一层的 `{field, rule, inputs, result, source}`——六爻是纳甲 → 六亲 → 世应 → 伏神 → 旺衰,八字是旺衰分值与格局取用,紫微是格局命中条件,奇门是盘面事实 → 用神落宫 → 门/星/干旺衰 → 宫位生克,大六壬是天地盘 → 四课 → 三传。只读盘面,不重算、不改盘;面板用右侧抽屉逐层展开规则、结构化输入、结果与出处。六爻的询问方向参与起卦计算,改方向时只重算用神 / 旺衰 / 伏神三层,不重摇一卦;奇门改方向同样只重算用神落宫层,不重新起局
39
+ - **推导链**:工具参数 `trace: true`(面板与独立页对六爻 / 八字 / 紫微 / 奇门 / 大六壬默认开启)返回每一层的 `{field, rule, inputs, result, source}`——六爻是纳甲 → 六亲 → 世应 → 伏神 → 旺衰,八字是旺衰分值与格局取用,紫微是格局命中条件,奇门是盘面事实 → 用神落宫 → 门/星/干旺衰 → 宫位生克,大六壬是天地盘 → 四课 → 三传。只读盘面,不重算、不改盘;面板用右侧抽屉逐层展开规则、结构化输入、结果与出处。**每层出处分两类**(A1+):能对上已录入篇名的写「《书》卷·篇;实现:engine/…」,例如六爻伏神引《增删卜易》卷二·飛伏神章第二十八、六爻旺衰引卷一月將章与日辰章、八字格局引《子平真诠》八、论用神(调候参《穷通宝鉴》五行总论)、奇门引《奇门遁甲统宗》卷一/卷二/卷三/卷十一·玄机赋(中)、紫微引《紫微斗数全书》卷三;对不上的明写「规则表 / 非古籍定数 / 未录入古籍章页」——八字旺衰是本仓量化规则,奇门用神与十干克应、六爻纳甲与世应是本仓规则表,大六壬没有可稳定核验的公有领域章页,三层都只标「通行口诀,未标卷次」。书名只出已登记的五本,测试会拦下表外的书名。六爻的询问方向参与起卦计算,改方向时只重算用神 / 旺衰 / 伏神三层,不重摇一卦;奇门改方向同样只重算用神落宫层,不重新起局。开 `trace` 时结果同时带 `traceText`——同一份层的 Markdown,可直接贴进对话或文档;面板抽屉里也可一键复制
38
40
  - **验前事**:列出过去几年流年信号,自评准/不准/不确定后算贴合度;只读,不改盘
39
41
  - **生时校正**:给定过去 2–3 件大事,对候选时辰逐一排盘打分排序;只缩小范围,不替代出生记录
40
42
  - **导出**:`.md`(盘面 + 解析)与 PNG 摘要长图(Canvas 直出,零依赖);独立页支持打印/存 PDF
@@ -43,7 +45,7 @@ Chinese metaphysics (玄学 / xuanxue) for [DeepSeek Harness](https://github.com
43
45
  - **《穷通宝鉴》120 格**:十天干 × 十二月令逐格录入用神顺序与原文摘句(「十二月乙木,木寒宜丙」这类原句照录),调候卡里直接给出「这一格书上取什么」与出处章号
44
46
  - **方法与验证页**:独立页内置静态页,写明对拍数据、测试与闸门、口径与已知边界
45
47
  - **公开对拍报告**(0.54.0 起):[docs/verification.html](docs/verification.html) 汇总 128 条《卜筮正宗》卦例(成对 93 + 静卦 35;源 138 条中剔除 5 条并逐条给理由)、312 张紫微盘 × 34 条格局(10,608 条独立判定)、20 个奇门时辰 × 9 宫(180 个宫位)与 12 个交运案例。可按「一致 / 剔除 + 理由 / 不一致」和体系筛选,34 条格局的命中分布单独列出;README 顶部徽章由同一生成器写出,并披露「5 剔除」。报告、徽章与 `test/verification.test.mjs` 共用 `tools/verification.mjs`,判定变了或报告没重建,CI 就红
46
- - **引文索引**(B6):[docs/citations.html](docs/citations.html) 把每张知识卡指到书名、卷章、原文与链接;已定位原文的(八字三书 + 紫微斗数全书)由 `test/citations.test.mjs` 逐条核验「原文子串确实出现在来源正文里」,通行说与待补条目单独标出,不冒充原文。原文快照在 `test/fixtures/citation-sources.json`,由 `tools/sync-citation-sources.mjs` 抓取公共领域古籍生成
48
+ - **引文索引**(B6):[docs/citations.html](docs/citations.html) 把每张知识卡指到书名、卷章、原文与链接;引文库 94 条(八字经典 41 + 引文索引 53:紫微 23、三命通会 6、增删卜易 13、奇门 5、穷通宝鉴 1、梅花 1、大六壬 3、滴天髓 1),53 张卡里 46 张已定位到可核验原文,由 `test/citations.test.mjs` 逐条核验「原文子串确实出现在来源正文里」,其余 6 张通行说与 1 张待补单独标出,不冒充原文(大六壬已补《大六壬大全》四库本卷一·起例与卷二·神将释,加时布盘仍标通行口诀;《增删卜易》底本为繁体,原文照录)。原文快照在 `test/fixtures/citation-sources.json`(58 个章页),由 `tools/sync-citation-sources.mjs` 抓取公共领域古籍生成
47
49
  - **参考资料登记**:[docs/参考资料与对拍来源.md](docs/参考资料与对拍来源.md) 记下 ziwei.pub/bazi 的四宫公式与信息层次、tyme4ts 对拍证据、玄空 B5 的替卦与紫白底本,以及历法 / 卦例 / 紫微 / 八字 / 奇门的外部来源入口;新增参考先登记再改代码,采用范围必须能指向一条测试或对拍证据
48
50
  - **离线单文件页(随包分发)**:`命理排盘.html` 一份文件、零依赖、双击即开,十九个入口按用途分三组(也能一键切回平铺),断网可用;它随 npm 包发布,装完插件就有(路径见下)
49
51
 
@@ -124,7 +126,7 @@ Chinese metaphysics (玄学 / xuanxue) for [DeepSeek Harness](https://github.com
124
126
  速查结果用等宽文本卡渲染,不套命盘模板。**全部本地确定性计算**:同一天、同一输入永远同一结果。
125
127
 
126
128
  - **黄历 `almanac`**:农历、四柱干支(年柱按立春、月柱按节)、建除十二神、宜忌简表、冲煞、上一/下一节气、每日一卦,以及**值日十二神(黄道/黑道)、十二时辰吉凶(五鼠遁干支 + 时家十二神)、二十八宿、胎神、财神/喜神/福神/阳贵/阴贵方位、日柱纳音、六合三合吉配生肖**;值日神/二十八宿/胎神/吉神方位与 lunar-javascript 逐日对拍。`scope` 明写未收录逐日全量吉凶神煞与彭祖百忌
127
- - **择日 `zeri`**:27 类事项(婚嫁类领证/提亲/收送聘金/满月酒,生活类旅行/访亲友/入学,建造类动土/装修建造/试车买车,工商类交易/投资/签订合同/纳财/赴任等)按「常用 / 婚嫁 / 生活 / 建造 / 工商」五组归类 × 建除适配逐日打分,分「推荐 / 可用 / 回避」,当事人属相冲煞日直接排除且每条回避带理由;这是**排序引导**,不是吉凶断语
129
+ - **择日 `zeri`**:27 类事项(婚嫁类领证/提亲/收送聘金/满月酒,生活类旅行/访亲友/入学,建造类动土/装修建造/试车买车,工商类交易/投资/签订合同/纳财/赴任等)按「常用 / 婚嫁 / 生活 / 建造 / 工商」五组归类 × 建除适配逐日打分,分「推荐 / 可用 / 回避」,当事人属相冲煞日直接排除且每条回避带理由;这是**排序引导**,不是吉凶断语。**候选日比较**(C4-b):`candidates: ["2026-12-01","2026-12-08"]` 或用面板的「候选日」输入只比这几天,结果给逐日分数与 `compare.best`(这一组最优、同分者、分差),面板画成表并标「最优」;不换算成「好多少」,全部被冲属相排除时直说,不硬推
128
130
  - **公农历互转 `convert`**:公历 → 农历(农历年月日、是否闰月、干支四柱、生肖)与农历 → 公历(需显式指定闰月,小月无三十会报错),往返自洽;只知道农历生日时可先转公历再排盘
129
131
  - **称骨 `chenggu`**:年/月/日/时四项骨重求和,按总重查**通行本《称骨歌》原文**(二两一钱…七两二钱共 52 首),并给白话释义与分档批语(如 1990-08-15 巳时 = 五两六钱,歌诀「此格推来礼义通…」);骨重表对拍公开黄历页,不采信其他插件的表
130
132
  - **小六壬 `xiaoliuren`**:时间起课(农历月/日/时三掐)与报数起课(三个 1–99),六宫吉凶与白话断语;缺时辰会明确要求补,不默认某个时辰
@@ -152,6 +154,7 @@ Chinese metaphysics (玄学 / xuanxue) for [DeepSeek Harness](https://github.com
152
154
  - **方法与验证**:独立页内置同页「方法与验证」(体系、128 条卦例与 20 个奇门时辰对拍、测试文件与断言条数取自断言基线、七道闸、口径与已知边界),离线可开
153
155
  - **夏令时校正(0.18 新增)**:1986–1991 年中国夏令时期间的钟面时间在排盘前自动减 1 小时(跨日回退),八字/紫微/合盘/验前事/生时校正统一生效;出生证已是真实太阳口径时可用 `dst: false` 关闭
154
156
  - **合婚明细层(0.18 新增)**:合盘新增属相六合/三合/六冲/相害/相刑、天干五合、双向十神、跨盘地支、年命纳音与吉凶象计数分档;只作明细,不改原总分
157
+ - **三方合盘(C4-a)**:`partner2` 给第三个人(字段同 `partner`)→ 结果多一个 `triple`:三对分数与三维度并列,`best` / `hardest` / `focus`(三对分歧最大的一维)。**不合成「三人总分」**——和不同的人相处是不同的事;三对分差不足 3 分时不点名「最顺」,只说分数接近。八字与紫微两种合盘都支持;第三人进句柄与影子盘指纹,下一轮只传 `handle` 就能复现
155
158
  - **晚子时开关**:面板与独立页都能切「23:00 后算次日/当日」;奇门另可切「归当日/归次日」——这是排盘口径,不是结果重算
156
159
  - **验前事**:八字报告下方列出过去 6 年流年信号,用户自评「准/不准/不确定」,算一个贴合度提示;只读、不改盘
157
160
  - **生时校正**:输入过去 2–3 件大事(年份 + 类别),对候选时辰逐一排盘并按固定规则打分,返回候选排序——用于缩小时辰范围,不替代出生记录
@@ -217,7 +220,7 @@ dsh plugin install ./dsh-metaphysics-0.17.0.tgz
217
220
 
218
221
  结果卡下方的追问行里,输入问题后可以点「追问」(在本地按盘面字段直接答,不联网)或「问进对话」(把提问发进 DSH 对话窗,由模型接着答)。
219
222
 
220
- > 独立页(`命理排盘.html`)同样是这十九个 tab:速查 tab 在左侧展开对应小表单(择日的起算日/事项/天数/属相、农历的转换方向/农历日期/闰月、小六壬的时间或报数、风水的命卦/门主灶/玄空与坐向、运、兼向度数、飞星日期与时刻(结果都是方位网格:八向标吉凶、玄空九宫列运/山/向三数,替卦与年月日时另列事实行)、起名的评估或生成、十六型人格的分页问卷(4 题一页、1–5 打分,答满 12 题可先看结果));合盘要填双方出生信息、可选八字/紫微两种合盘;奇门用「换局规则」单选组(拆补/超神接气/置闰)与「询问方向」定用神。这份文件与侧栏面板是**各自生成**的两份产物(同一份 `engine/`),随包发布的是仓库根这一份;自己在桌面另存过的话,用 `npm run build:desktop` 一次刷新两处,别手工拷。
223
+ > 独立页(`命理排盘.html`)同样是这十九个 tab:速查 tab 在左侧展开对应小表单(择日的起算日/事项/天数/属相/候选日、农历的转换方向/农历日期/闰月、小六壬的时间或报数、风水的命卦/门主灶/玄空与坐向、运、兼向度数、飞星日期与时刻(结果都是方位网格:八向标吉凶、玄空九宫列运/山/向三数,替卦与年月日时另列事实行)、起名的评估或生成、十六型人格的分页问卷(4 题一页、1–5 打分,答满 12 题可先看结果));合盘要填双方出生信息、可选八字/紫微两种合盘,勾「三方合盘」再加第三人;奇门用「换局规则」单选组(拆补/超神接气/置闰)与「询问方向」定用神。这份文件与侧栏面板是**各自生成**的两份产物(同一份 `engine/`),随包发布的是仓库根这一份;自己在桌面另存过的话,用 `npm run build:desktop` 一次刷新两处,别手工拷。
221
224
 
222
225
  > 首屏默认按用途分三组:**问一件事**(六爻/梅花/塔罗/奇门/六壬/小六壬)、**看一个人**(八字/紫微/合盘/人格/称骨/数字/人生K)、**查日子**(黄历/择日/农历/星座/风水/起名),每项带一句白话(如「摇六次,问一件事」);用过的入口会进「最近用过」,最多 3 条。19 个平铺 tab 仍保留,右上角「分组 / 平铺」随时切换,选择记在本机;手机端每组先露 4 项,其余点「还有 N 个」展开。这份分组数据只有一份(`src/groups.mjs`),独立页与宿主侧栏面板在构建时各自取用;侧栏宽度不等同窗口宽度,收纳按容器查询生效。
223
226
 
@@ -233,14 +236,14 @@ dsh plugin install ./dsh-metaphysics-0.17.0.tgz
233
236
  - **农历**:定朔(Meeus 第 49 章,误差约 1 分钟)+ 冬至所在月为十一月 + 无中气置闰
234
237
  - **真太阳时**:经度差 + 均时差;内置 34 个省会 + 200 个地级市坐标(±0.2°),地址更细时可开「联网精确到区县」(Nominatim)。**单盘与合盘用的是同一套修正**(合盘双方各按自己出生地算)。只按经度修正,**未含历史时区与夏令时**:海外出生请先把当地钟表时间换算成东八区标准时再输入;没给经度时摘要首行会出 ⚠
235
238
  - **晚子时**:八字/大六壬默认 23:00 后换日,奇门默认归当日;`lateZi` 与 `lateZiHourMode` 是同一个开关的两个名字。各体系摘要都会写明本次采用的口径,不改默认值、不偷偷改盘
236
- - **口径对照**:`caliberCompare` 只做「当前口径 → 另一档」的逐字段比对,根因按柱 / 命宫 / 局数 / 起运归类,`total` 是变化字段数、不是分数;没有根因时写明「无单一根因」(如真太阳时只改起运时刻)。紫微的 12 组含十类流派开关(亮度 / 庚干四化 / 天马 / 天空 / 截空旬空 / 魁钺 / 天伤天使 / 长生 / 晚子时 / 身主),平铺参数与 `schools` 嵌套都能读;取局流派、晚子时归日、闰月政策与流派回显属于口径回显,不计入差异;「其他」是尚未归类的派生字段,不隐藏也不折算。对照会按开关数多排盘(工具里由 `diff: true` 显式开启)
239
+ - **口径对照**:`caliberCompare` 只做「当前口径 → 另一档」的逐字段比对,根因按柱 / 命宫 / 局数 / 起运归类,`total` 是变化字段数、不是分数;没有根因时写明「无单一根因」(如真太阳时只改起运时刻)。紫微的 12 组含十类流派开关(亮度 / 庚干四化 / 天马 / 天空 / 截空旬空 / 魁钺 / 天伤天使 / 长生 / 晚子时 / 身主),平铺参数与 `schools` 嵌套都能读;取局流派、晚子时归日、闰月政策与流派回显属于口径回显,不计入差异;「其他」是尚未归类的派生字段,不隐藏也不折算。每行另给 `views`:八字(日柱 / 时柱 / 旺衰 / 格局 / 喜用 / 起运)、紫微(命宫 / 身宫支 / 五行局 / 身主 / 起大限)、奇门(日柱 / 局数 / 值符 / 值使)的两列并排,只列变化项,摘要里写成「并排:日柱 丙辰 → 乙卯」,面板与独立页画成表格。对照会按开关数多排盘(工具里由 `diff: true` 显式开启)
237
240
  - **八字五合**:干支关系只标「有合」,摘要写「戊癸合(化火待定)」;是否真化另看月令、化神与争合妒合,不在关系层直接断「合化火」
238
241
  - **可复现**:塔罗/六爻给 `seed` 即得同一次抽牌/摇卦;紫微流月流日流时、塔罗的抽牌时刻、八字的流年基准年都可传 `asOf` 钉死。**影子盘** `shadow: true` 另给一个短 ID:同参数同 ID、换版本 `id` 变而 `baseId` 不变;面板与独立页把快照存在本地,同盘重排自动做字段级 diff。未固定 `asOf` 时流年随「此刻」变化,卡片会提示先固定再比对;与 `seed` 一样,随机源不写进 ID 时无法复算,所以塔罗 / 六爻的实际牌面会算入指纹。**推导链** `trace: true` 则逐层给出规则、输入、结果与出处,只读结果,不改变盘面与 ID
239
242
  - **紫微四化**:中州派常用表(庚干作太阳禄、武曲权、太阴科、天同忌)
240
243
  - **问进对话**:只做文本组装,不改盘、不调模型——面板把 `Engine.askPrompt` 生成的一段话交给 DSH 客户端槽位 `conversation.input.right` 拿到的 `inputActions`,先 `setDraft` 再 `submit`(官方输入框的正常提交路径);桥不在时退回复制剪贴板并给出提示。提问里带的盘面摘要按 3000 字截断并标注「摘要已截断」;摘要之前先给「盘面层次」(按体系列 4–6 层阅读顺序,未知体系走通用兜底),再给摘要与回答骨架,让模型先复述事实、再讲结构与时间;面板已有解析时,模板在摘要之前插入「开场结论」小节(直答 + 说人话,原样取自面板结果),让对话开场与面板同一口径;固定骨架(抬头 + 层次 + 回答要求)约 700 字,不随 `maxChars` 变,`test/ask-prompt.test.mjs` 有断言盯它别长成小作文。这条链依赖 Harness 的客户端 slot API(`conversation.input.right` + `inputActions`),升级 Harness 后若槽位改名,按钮会静默退回「复制」而不是报错
241
244
  - **紫微飞星串连**:只认宫干四化表、星落哪宫就是哪宫之力,串连只跟**同一支化**逐宫跳(不混支、不借对宫),满 12 步或回到走过的宫即停;宫干四化在 12 宫上是「一个宫 → 一个宫」的函数映射,所以完整盘上每条链必然成环(实测 1/3/4/5/6 步),「断点」只可能来自星未上盘。这一层只描方向与牵引,不断吉凶,也不叠大限流年算力重
242
245
  - **八字 × 紫微交叉验证**:五项只并列、不合并成总分。任一侧当前阶段取不到时(八字尚未起运、紫微大限不在范围内),该项标「互补」并写明缺的是哪一边,不把「没取到」当成「没有问题」;节奏一项的说明按实情分档——八字顺而紫微煞星多、八字偏紧而紫微平静、八字为平而紫微煞星多,三种说法各写各的,不共用一句「一边顺、一边压」
243
- - **日主旺衰**:量化算法,非唯一流派。合会折根的折算比例与 0.3 的虚透门槛是本仓取值,不是古籍定数;五行喜忌只分喜、忌两档,没有「中性」档,接近零分的那一行要结合盘面另看
246
+ - **日主旺衰**:量化算法,非唯一流派。合会折根的折算比例与 0.3 的虚透门槛是本仓取值,不是古籍定数;五行喜忌分喜、忌两档,忌神里全局分量不足 0.5 的另列「中性偏忌」——只是展示分档,`avoid` 不变,大运/流年遇之仍按忌计
244
247
  - **奇门宫位条件**:门迫只认同宫内「门五行克宫五行」,宫克门是「宫制门」不为迫;六仪击刑按月支相刑定宫(甲子戊震三、甲戌己坤二、甲申庚艮八、甲午辛离九、甲辰壬巽四、甲寅癸巽四),三奇入墓按五行墓库定宫(乙木墓未→坤二、丙丁火墓戌→乾六),六仪入墓按同一墓库(戊墓戌→乾六、己庚墓丑→艮八、辛壬墓辰→巽四、癸墓未→坤二)。这四项只判**天盘**、只作宫位条件,不自动断用神受制,也不打分排序
245
248
  - **奇门旺衰**:八门、九星与天盘干(三奇六仪)按月支五行判旺相休囚死(同气旺、月令所生相、生月令休、克月令囚、被月令克死),只报力量强弱不折吉凶;门旺而宫克门仍受宫制。
246
249
  - **六爻用神旺衰**:月建按月支五行定五态(同气旺、月令所生相、生月令休、克月令囚、被月令克死),日辰定五关系(日生/日克/比和/泄/耗),月建冲爻标月破、日辰冲静爻标暗动、冲旬空标冲空;只报状态标签,不折成分数
@@ -281,7 +284,7 @@ npm run check:patterns # 单独跑工程约定检查
281
284
  npm run release # 测试 → 构建 → 校验产物 → 发 npm → 核对附件(token 从 NPM_TOKEN 读)
282
285
  ```
283
286
 
284
- 也可以直接调脚本:`node tools/build-client.mjs`、`node tools/build-html.mjs`、`node tools/verification.mjs`、`node tools/caliber-diff.mjs`(同盘换口径的逐字段对照)、`node tools/check-bundle.mjs`、`node tools/test-all.mjs`、`node tools/check-assertions.mjs`、`node tools/verify-tests-can-fail.mjs`、`node tools/check-html-sinks.mjs`、`node tools/check-patterns.mjs`、`node tools/release.mjs`、`node tools/verify-publish.mjs`(被 release 调用,也可单独用来核对某个版本)。
287
+ 也可以直接调脚本:`node tools/build-client.mjs`、`node tools/build-html.mjs`、`node tools/verification.mjs`、`node tools/caliber-diff.mjs`(同盘换口径的逐字段对照)、`node tools/check-bundle.mjs`、`node tools/test-all.mjs`、`node tools/check-assertions.mjs`、`node tools/verify-tests-can-fail.mjs`、`node tools/check-html-sinks.mjs`、`node tools/check-patterns.mjs`、`node tools/check-perf.mjs`、`node tools/bench.mjs`(只测不判)、`node tools/release.mjs`、`node tools/verify-publish.mjs`(被 release 调用,也可单独用来核对某个版本)。
285
288
 
286
289
  **测试的七道闸**:
287
290
 
@@ -293,6 +296,10 @@ npm run release # 测试 → 构建 → 校验产物 → 发 npm → 核对
293
296
  6. `test/fuzz.test.mjs`——固定种子的随机生日扫射八个排盘体系,覆盖边界日期、参数矩阵与"同参数必得同结果"
294
297
  7. `tools/check-bundle.mjs`——产物必须在**宿主形态**下能编译能跑:读 `client.js` 与每个 `client.<name>.js` 原文逐模块编译、模拟 `__ModuleLoader__` 执行 factory、校验分块注册名 / 返回 `Engine` / 自包含、IIFE 收口与不可见分隔符,并要求所有产物与源码重构建逐字节一致;入口 gzip 必须 < 100KB(2026-10-25 的启动崩溃就是 Node 侧全绿、Chromium 侧语法错,这道闸专门守这个缝)
295
298
 
299
+ 另有一道**性能门槛** `tools/check-perf.mjs`(D3):跑 `tools/bench.mjs` 的八体系样本,对首次 150ms / p50 10ms / p95 25ms / 带解析 250ms / 1000 盘 4000ms / RSS 800MB 判超限,CI 同样执行。阈值按文档目标留 5–10 倍余量,拦的是数量级回退而非毫秒级抖动;慢机用 `DSH_PERF_SCALE=3` 按倍数放大上限。`npm run bench` 只测量不判错,用来做改动前后的 A/B 对比。
300
+
301
+ 结果卡顶部还有一行**首屏耗时**(D1+):`首屏 42ms|引擎 18ms(首次加载)· 排盘 9ms`。数字是这一次在本机的实测——面板从点击到两帧后计时,独立页量「组 HTML + 写 DOM」的同步时间(不含浏览器真正绘制的那一帧);引擎那段的「首次加载 / 已缓存」来自分块缓存状态。只在本机显示,不上报、不发网络请求;缺哪段省略哪段。
302
+
296
303
  `client.js` 与 `client.<name>.js` 都是构建产物,不要手改。入口只带界面;面板按当前 tab 用 `require.async` 取引擎分块,首次打开不再下载整套引擎。改动记录见 [CHANGELOG.md](CHANGELOG.md)。
297
304
 
298
305
  ### 发版
@@ -307,6 +314,15 @@ node tools/release.mjs --verify-only # 只核对 registry 上当前版
307
314
 
308
315
  脚本会拦下:工作区不干净、`client.js` 未随源码重建、registry 上已有同版本;发布后自动核对新版本与 `dist-tags`,并提示补 `git tag`。
309
316
 
317
+ **发失败 / 核对失败怎么办**:`release.mjs` 在这两条失败路径上会打印回滚步骤(把 `latest` 指回上一版、`deprecate` 问题版本、网页 2FA 删包、升补丁号、CHANGELOG 改回未发布段;打过 tag 时另有删 tag 两步),但**不自动执行**。同样的步骤可以单独取:
318
+
319
+ ```bash
320
+ node tools/release-rollback.mjs --version 0.57.1 --previous 0.57.0 --reason verify-failed
321
+ NPM_TOKEN=... node tools/release-rollback.mjs --version 0.57.1 --previous 0.57.0 --apply dist-tag
322
+ ```
323
+
324
+ `--apply` 只支持 `dist-tag`(把 `latest` 指回上一版);`unpublish` / `deprecate` / 删远程 tag 属于共享状态变更,脚本只打印命令,由人确认后执行。
325
+
310
326
  **发布后为什么要看附件,而不是只看 `npm publish` 的输出**:npm 的发布是异步的,版本条目会先出现在 packument 里(连 shasum、签名、`latest` 都齐),tarball 附件却可能晚几分钟才落盘。这中间别人 `npm i` 会撞 404,而 `npm publish` 早就打印了成功。所以 `tools/verify-publish.mjs` 的判据是四条:tarball 返回 200、下载到的字节 sha1 与 registry 记的 `shasum` 一致、`fileCount` 对得上、包里该有的文件(`package.json`/`client.js`/`命理排盘.html`)确实在。15 分钟内一直对不上就判定失败并给出处置路径。
311
327
 
312
328
  另外记一条实操限制:`unpublish`/`deprecate` 属于「绕过 2FA 的破坏性动作」,granular token 会被 403 拒绝(`Granular access tokens that bypass two-factor authentication may not perform this action`),这类动作只能在 npm 网页上用 2FA 做;真要撤版,把版本号升一个补丁号重发通常更快。
@@ -343,6 +359,7 @@ node tools/release.mjs --verify-only # 只核对 registry 上当前版
343
359
 
344
360
  - **对玄学命理本身有想法**:某个神煞该不该这么取、某条断法是不是牵强、某段解析是不是话说太重了,欢迎进群友好讨论。我不认为自己的口径就是对的,能把分歧讲清楚,比谁赢更有意思。
345
361
  - **盘排错了、页面出 bug**:请把输入(时间、地点、性别、体系、所问之事)和当时的输出一起带上,我照着复现;能修就修,修不了会写进「已知边界」。
362
+ - 邮件联系:1129440028@qq.com(我的 QQ 邮箱)。谢谢!
346
363
 
347
364
  微信群:**dsh-metaphysics**
348
365