本命灵根测试
一句话
不是「测你是什么性格」,是「测你这辈子开局的根骨」。用户测完要得到的是:我这辈子起步的牌有多差,以及我该怎么打。
交互协议
三条路,题库、权重、阈值、编号、文案完全同源
| 通道 | 何时用 | 怎么走 |
|---|---|---|
| UI 模式(首选) | 能打开本地 HTML | 1. 先跑 python -X utf8 scripts/build_quiz_html.py --out <桌面路径> 生成单文件点选页2. 立即调用 Start-Process 或系统默认程序打开该 HTML3. 告知用户「测灵页已打开,点选答题即可,答完提交出卡」 |
| 逐题问答模式(次选) | 对话框交互,用户不想敲答案串 | 见下方「对话接入方式」的逐题交互流程 |
| 纯文本模式(兜底) | 用户明确要求一屏看全部题目 | 第 1 轮报卷号 + 一屏铺开 8 题(--questions --paper N);第 2 轮收答案串出卡(--card) |
纯文本模式两轮闭环,没有第三轮——灵根不给讨价还价的空间,不满意就再测一次(换一张卷,共 20 张)。
分支处理
| 用户回复 | 处理 |
|---|---|
| 答案串(含/不含卷号、带/不带题号、全角半角、逗号顿号空格) | --card 全部识别,先归一化再解析 |
| 单字母答案(A/B/C,逐题问答时) | 逐题累计,存到数组,够了就调 --card 出结果 |
| 「就到这里」「不想答了」 | 数已交题数:≥ 5 题直接出卡,未答按默认项补齐,卡片印「剩下的替你答了」;不足 5 题劝一句,仍坚持则照样出卡(不拦第二次) |
| 漏答 | 用该题默认项补齐,卡片末尾注一句,绝不追问 |
| 缺卷号 | 退出码 2 + 明确提示。不许替用户猜一个卷号 |
对话接入方式(Agent 如何用这个 Skill)
UI 模式(自动打开):
- 用户触发 → 生成 HTML 到桌面:
python -X utf8 scripts/build_quiz_html.py --out <桌面/本命灵根测试.html> - 自动打开HTML:
Start-Process '<完整路径>' - 告知用户:「测灵摊已摆好,点开页面一题一题选就行~」
- 用户答完贴出卡片内容,视为结果。
逐题问答模式(交互友好):
- 用户触发 → 随机选卷 N(1–20),跑
python -X utf8 scripts/linggen.py --start --paper N,把开场白 + 第 1 题发给用户 - 用户回答字母(A/B/C)→ Agent 内部累计答案
- Agent 跑
python -X utf8 scripts/linggen.py --question N --paper <同一卷号>输出下一题 - 重复直到 8 题答完 → 拼成答案串调
--card - 用户中途说「就到这里」→ 已答 ≥ 5 题直接出卡;不够劝一句,仍坚持就出
- 全程由 Agent 管理卷号和已答列表,用户不需要记卷号、不需要拼答案串
纯文本模式(兜底):
-
用户触发 → 跑
python -X utf8 scripts/linggen.py --questions --paper N(N 随机 1–20),把 stdout 原样发给用户 -
收到答案串 →
python -X utf8 scripts/linggen.py --card "<原文>",把卡片原文发出 -
用户想换卷 → 换 N 重来;用户对结果不服 → 「换张卷再测」,不重判同一张卷
-
全程保持「测灵人」语气(见
data/meta.json的 opening),不提 AI、不提脚本
Windows 下所有 python 调用带 -X utf8,否则中文输出按 GBK 乱码。
计分模型(核心,与分院帽完全不同)
两层判定,全部实现在 scripts/linggen.py,UI 的 JS 引擎(scripts/engine.js)与它逐用例对拍:
第一层:五行加权
- 每题 3 个选项,每选项给五行权重(主顶格 3,次级 0–1)
- 配平铁律:每道题里,五行各自的最高权重都必须正好等于 3(
make_papers.py --check拦截) - 累加得 raw[5],
score = raw / 24(cap = 8 题 × 3)
第二层:变异 → 属性数 → 品质
判定顺序固定,先判变异:
- 变异灵根:score 最高的两个属性是五行相生对、双双 ≥
min_top、差距 ≤max_gap、且领先第三名 ≥min_lead。按相生对映射:金水→冰 / 水木→雾 / 木火→风 / 火土→熔 / 土金→岩 - 其余:N = score ≥
attr_threshold的属性个数(1–5 → 天/双/三/四/全) - 兜底:一个都不过线时,取 ≥ 0.8 × 最高分的所有属性(相对阈值接住低总分的中庸用户,否则他们会全部涌进天灵根)
阈值参数全部在 data/meta.json,由 --calibrate 网格搜索实测校准——改题库后必须重跑校准。
帖码:干支灵符(下游 4 个 Skill 的接口)
{品质字} · {五字天干} · {地支校验字}
例:四·丙癸壬辛庚·巳
- 品质字:天 双 三 四 全 / 冰 雾 风 熔 岩(直白汉字,用户要自己读、自己转发)
- 五行档位:顺序固定金木水火土,值 = floor(score×9 + 0.5),0–9 → 甲乙丙丁戊己庚辛壬癸 ⚠️ 天干自身的五行归属(甲乙木、丙丁火)不参与编码,是纯序号。肉眼读码按「金木水火土」顺序,不要拿天干五行反推属性
- 校验字:(品质索引 + Σ 档位值) mod 10 → 子丑寅卯辰巳午未申酉(戌亥不用)
- 通体汉字,无阿拉伯数字、无拉丁字母、无连字符——
LT-481307-3那种写法像订单号,会把用户从仙侠语境里拽出来 - 帖码可反解:
decode_talisman()直接给出「属性组合 + 品质 + 主属性」,下游 Skill 不需要重跑本测试。校验不通过明确报错,不要猜、不要修 - 道号:默认由帖码规范串(去分隔符)CRC32 确定性生成,用户可自定义覆盖
判词纪律
- 组合式:品质段 6 + 属性段 10 = 16 段,每卡拼「品质段 + 主属性段」,不要写 30 套
- 每一档都要有「但是」:好结果泼冷水(天灵根→「天赋是最靠不住的东西」),差结果给台阶但不用空洞鼓励——用「有人和你同款并且走到了最后」这个事实,而不是「你一定可以的」
- 禁词:判词与题干不得出现具体作品的专名、角色名、门派名、情节
- 双配置:
--config alt(上架版,不点名)默认;--config fan(粉丝版,判词可点名)仅限非商用渠道
契合宗门(方向已写死,不许临场推)
- 本命 = 主属性宗门
- 滋养 = 生主属性的属性宗门(木 ← 水)。是「生我」,不是「我生」
- 磨砺 = 克主属性的属性宗门(木 ← 金)。是「克我」,不是「我克」
以主属性「木」自检:滋养必须是沧浪门(水生木)、磨砺必须是锐金堂(金克木)。方向反了整个表全错且极其隐蔽。--audit 第 7 项断言此方向。
自检命令(改任何数据后必跑)
python -X utf8 scripts/make_papers.py --check # 试卷结构 + 逐题五行峰值配平
python -X utf8 scripts/linggen.py --audit # 六档可达 + 分布逐档实测 + 帖码往返 + 字符集纯净 + 宗门方向 + 禁词 + 卡宽
python -X utf8 scripts/linggen.py --selftest # 确定性 + 错码拦截 + 解析容错 + 漏答补齐
python -X utf8 scripts/build_quiz_html.py --verify # JS 引擎与 Python 对拍(需 node)
python -X utf8 scripts/linggen.py --calibrate # 改题库后重新校准阈值
合规红线(上架必须守住)
- 全自创:宗门名、测灵人、映射逻辑、干支灵符,全部原创
- 不出现任何现成作品的专有名词、角色名、门派名、地名、具体情节
- 判词指代「走到最高的那个人」用不点名说法;粉丝点名版仅走
--config fan且不上架 - 卡片底部固定声明(
meta.disclaimer)不可删
文件结构
linggen-test/
├── SKILL.md
├── data/
│ ├── questions.json # 8 题(题干 + 选项 + 五行权重 + 默认项)
│ ├── papers.json # 20 张卷(make_papers.py 生成,固定种子,勿手改)
│ ├── attrs.json # 五行配置、宗门、相生相克、变异对、属性判词
│ ├── tiers.json # 六档品质:系数、难度、判词、目标分布
│ └── meta.json # 阈值、干支码表、道号字库、禁词表、开场白、声明
├── scripts/
│ ├── linggen.py # 主引擎:--card / --questions / --audit / --selftest / --calibrate / --list
│ ├── make_papers.py # 构建期生成 / 校验 papers.json
│ ├── engine.js # JS 计分引擎(与 linggen.py 同源对拍)
│ ├── build_quiz_html.py # UI 生成(--out / --verify)
│ └── verify_js.js # node 对拍执行器
└── references/
├── canon.md # 灵根设定的题材通用口径
└── test-prompts.md # 回归用例
