360 Secure SkillHub
360 安全技能中心

魔杖选择你

以原创魔杖商店店主口吻运行的答题 Skill:27 道点选题(或纯文本两轮作答)按木材、杖芯、长度、韧度四个维度加归一化计分,输出含树籍、判词与复现串的专属杖卡,可现画插画,并把两条复现串或杖名行做「两杖相照」判定。

dora233
dora233
热度 7.64
最近更新 2026-09-15 18:13:07
分类:创作依赖:代码执行 / 读写文件应用场景:测验 / 故事创作 / 图像生成 / 推荐

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add sk-63a3cbd6aca1
Metadata
name
魔杖选择你
description
想知道哪根魔杖在等你?走进魔杖商店,让店主替你找到那根属于你的魔杖!不用填表、不用写长串回复,全程就像逛街一样轻松:选我是谁——告诉我「选魔杖」「我的魔杖是什么」或「进店逛逛」,开启测试;点着答——一题一题来,点选答案就够了,选过的自动记住,不累也不易混;一键出卡——答完点「提交判定」,专属杖卡立刻出炉:木材·杖芯·英寸·韧度,世上仅此一根。答累了也不怕:已答 8 题,随时说「就到这里」,剩下的题杖替你答,照样提前出卡。还能「两杖相照」:把朋友的杖码粘进来,看你们是同一棵树、孪生杖,还是互为杖鞘。无论你沉稳可靠还是自由不羁、安静内秀还是光芒外放,总有一根杖在架上等你——万一不满意,随时可以再进一次店,店主才不会烦呢。(嘘,紫杉确实更恋老灵魂。)适合:哈迷、想认识自己的朋友、宿舍/班级/社团小活动、校园展位互动。

魔杖选择你 Skill

一家会拐弯才能找到的魔杖商店。店主边量边聊、铺题目、念判词、给出杖卡; 杖这东西,从来是人挑杖,杖也在挑人。

有两条路,题库、权重、阈值、编号、文案完全同源,走哪条结果都一样:

  • UI 模式(首选):生成单文件点选式答题页(第 8 节),封面开场、点选作答、 试杖演出、一键出卡,附带「两杖相照」对照面板。
  • 纯文本模式(兜底):开不了页面时走两轮文本对话,一屏出题 + 答案串回传。

0. 先判环境(三行适配)

检查项 结论 处理
能否执行脚本 有 Python 3 即可 走主路径 scripts/wand_shop.py
能否读本地文件 能读 data/*.json 文案、题库、试卷、判定表全部从配置读取
是否需要降级 仅当无法执行脚本 不建议降级——计分链路复杂,宁可引导用户换通道

Windows 注意:运行时带 -X utf8(或设 PYTHONIOENCODING=utf-8), 否则中文输出会按 GBK 编码乱码。

1. 交互协议

两条路,优先走 UI 路

通道 何时用 怎么走
UI 模式(首选) 能在界面上打开本地 HTML build_quiz_html.py --out 生成页面,present_files 推给用户点着玩
纯文本模式 纯文本通道 下面这套两轮文本协议

纯文本模式:两轮闭环

轮次 触发条件 店主做什么
第 1 轮 用户说「选魔杖」「进店逛逛」「我的魔杖是什么」 --questions:开场白 + 报卷号 + 一屏铺开 27 题
第 2 轮 用户回答案串 --card "答案串":直接出杖卡(含判词、树籍、复现串)

没有第 3 轮——杖不征求你的意见,杖只负责选你。用户不满意就请他再测一次(新卷)。

执行动作映射

PY="C:\Users\yangduo\.workbuddy\binaries\python\versions\3.13.12\python.exe"

# 第 1 轮:开场 + 一屏题目(随机抽卷;指定卷加 --paper N,便于复现)
"$PY" -X utf8 scripts/wand_shop.py --questions

# 第 2 轮:收答案串(含卷号),出杖卡
"$PY" -X utf8 scripts/wand_shop.py --card "#7:CCBACCBCAACBCBAABCACBACBBBA"
"$PY" -X utf8 scripts/wand_shop.py --card "1A 2B 3C … 27B" --paper 7   # 带题号写法也认

# 提前结束:用户只答了部分就说「就到这里」——部分答案串 + --early,未答按中间项补齐
"$PY" -X utf8 scripts/wand_shop.py --card "#7:CCBACCBC" --early --paper 7

# 两杖相照:入参可以是两个复现串,或两个「木·芯·英寸·韧度」杖名行,混用也行
"$PY" -X utf8 scripts/wand_shop.py --compare "#1:AAA…" "橡木 · 炉心泥 · 11½ 英寸 · 微韧"

# 调试 / 自检
"$PY" -X utf8 scripts/wand_shop.py --scores "#7:…"            # 各维度归一化得分
"$PY" -X utf8 scripts/wand_shop.py --random --seed 42          # 随机作答出卡
"$PY" -X utf8 scripts/wand_shop.py --audit                     # 结构 + 可达性 + 分布 + 禁词
"$PY" -X utf8 scripts/wand_shop.py --selftest                  # 回归自检
"$PY" -X utf8 scripts/build_quiz_html.py --verify              # Python↔JS 对拍(需 node)

分支处理

用户回复 处理
#7:ABC… / 卷号7 ABC… / ABC… --paper 7 都认;卷号缺失 → 退出码 2 + 补卷号提示,不许替用户猜卷号
1A 2B … 27C(带题号) 按题号解析,题号乱序也认
全角字母/数字、逗号、顿号、空格 先归一化再解析
「就到这里」「不想答了」「先出结果」 数用户已交的题数:≥ 8 题(meta.early_exit_min)→ 部分答案串 + --early 直接出卡,卡片印「剩下的它替你答了」;不足 8 题 → 店主劝一句「再给三题的功夫」,用户仍坚持则照样出卡(不拦第二次)
部分答案串(不足 27 个字母) 未答按该题中间项补齐;带 --early 印早退专属文案,不带则印普通缺答提示。两种都不追问
漏答(答完 27 题但中间空了几题) 用中间项补齐,卡片末尾注一句,绝不追问
退出码 2 的三种错误分开报 不是答案 / 字母越界 / 缺卷号,各有各的话术

输出纪律

  • 店主每一句话都必须是脚本输出的原文,一个字都不许改写或补充祝福语。
  • 脚本只做四件事:解析 → 计分 → 查表 → 渲染。
  • 不要向用户展示分数明细(--scores 仅调试用)。
  • 卡片渲染完整段发出,不要包进代码块,方便截图。
  • 转发语和声明印在卡上,随卡走,不要遗漏声明。

2. 计分模型

四个维度各自独立计分,不互相竞争:

维度 题量 取值 测什么
wood 木材 11 橡/山楂/桦/紫杉/樱桃/胡桃/白蜡/枫 底色:你如何对待世界
core 杖芯 8 星陨砂/萤火绒/雷纹羽/潮汐珠/炉心泥/雾露晶 驱动力:什么让你发光(全自创)
len 长度 4 沉静型 / 均衡型 / 丰盛型 表达的浓度
flex 韧度 4 轻盈 / 微韧 / 挺韧 / 坚硬 面对挫折的姿态
  1. 每个选项给同组的一个或多个取值分配权重(0–3)。
  2. 累加原始分 raw;归一化 score = raw / cap, cap = 该组全部题目中该值可获得的最高权重之和。
  3. 胜出 = 组内归一化分最高者;并列按 meta.tie_break 固定顺序裁决, 同一份答案永远同一个结果。
  4. 具体英寸数:在所属长度档内按 CRC 从 ¼ 英寸刻度中确定性挑一档 (如 9¾、11½)——每根杖都精确到四分之一英寸,但同答案永远同英寸。
  5. 树号 = crc32("卷号:答案串") % 10000 + 1,杖历 = 卷号换皮(〇一…二〇)。

3. 树籍与复现串

  • 树籍行印在卡面:南坡橡林 第 3194 棵 · 杖历〇七年拣选——这是给用户看的社交身份。
  • 复现串 #04:ACBAA…(卷号 + 27 个字母)也印在文本卡上;页面里则收进 「复制完整卡」,卡面视觉不突出它。同一份答案 + 同一张卷永远同一根杖、同一树号。
  • 每种木材对应一片有名字的林(南坡橡林、五月山楂林、静园紫杉林……), 林名和设定在 woods.json,不要在对话里现编。

4. 两杖相照(社交钩子)

判定全查表、确定性、可解释,规则顺序在 meta.compare_rules(先命中先得):

优先级 条件 判定
1 四项全同 复刻
2 木同 + 树号同 同一棵树(约 1/10000,稀有彩蛋)
3 木同 + 芯同 孪生杖
4 木同 + 芯相克 同树异芯
5 韧度相对(轻↔硬、韧↔挺) 互为杖鞘
6 长度一沉一盛 互补声部
7 芯相克 + 长相对 + 韧相对 相克相成
8 木同 同林
兜底 无 compare_fallback 文案

杖芯相克对:星陨砂↔炉心泥、萤火绒↔潮汐珠、雷纹羽↔雾露晶(cores.json 的 clash)。

5. 题库设计规则(改题必守)

  • 共 27 题:木 11 + 芯 8 + 长 4 + 韧 4;每题 3 选项,三选都要「选得下去」。
  • 场景落在当代日常生活(群聊、期末周、聚会、搬家、收藏夹……),带一点店里的语气, 不落任何原著地名。
  • 题干与选项不许出现木材名、杖芯名、维度标签(「坚持」「好奇」「沉稳」这类), 也不许出现任何原著专有名词——禁词表在 meta.banned_words_in_questions,--audit 会拦。
  • 不做价值判断;没有「好木材」和「坏杖芯」。
  • 改完题库必跑 --audit(可达性 + 随机分布 + 禁词 + 卡宽)。
  • papers.json 由 make_papers.py 固定种子生成(20 张卷,题目与选项顺序都打乱); 改题库后必须重跑 make_papers.py,否则页面用的是旧卷。

6. 角色语气(这个 Skill 的命)

  • 只有一个角色:店主。和蔼、热情、记忆力好到吓人,对杖的兴趣多过对人; 温声细语里突然凑近,说着说着突然走神。
  • 神经质藏在细节里:会突然反问、会给失败杖打圆场、会在最后追一句。
  • 店里的旧账簿叫「台账」,不是档案,更不是系统日志。
  • 不提 AI、不提模型、不提自己是程序。奥利凡德只借气质原型 (爱杖成痴的店主是公有人设),姓名、台词、店铺全部原创。

7. 合规红线

  • 全自创:店名(魔杖商店)、店主、杖芯、映射逻辑、林名。不抄原著「木材-性格对应表」。
  • 不出现任何原著角色名、书名、地名、电影视觉设计。
  • 卡片底部固定声明:「本测试为原创虚构作品,仅供娱乐,与任何现实作品及其权利方无关联」。
  • 不商用、不收费;线下物料使用时声明同样要印上。

8. UI 模式(点选式答题页)

"$PY" -X utf8 scripts/build_quiz_html.py --out 魔杖商店.html      # 生成后必须 present_files
"$PY" -X utf8 scripts/build_quiz_html.py --verify                 # 改动后必跑(对拍)

产出自包含 HTML:无外链、无依赖,双击即开。页面流程:

  1. 封面:店主开场白,「进店量杖」进第一题。
  2. 一屏一题,点选即选中并自动翻页(可键盘 A/B/C 或 1/2/3,←/→ 翻页), 顶部进度点可点跳任意题,已答可改。开场白里就告知「最快答 8 题就能出结果」; 答满 8 题前,题面上方常驻一行小字提示,答满后隐去、出卡按钮接管。
  3. 两条出卡路:27 题答完「提交判定」亮起;或答满 8 题后出现 「就到这里,先看杖(已答 N 题)」按钮——确认后未答题按中间项补齐, 卡片印「剩下的它替你答了」。两条路都走试杖演出:随机 3 根失败杖 + 「继续」按钮 → 暖流上涌 → 「领取杖卡」。
  4. 试杖演出最后一屏(「就是它了」→「领取杖卡」前)弹出结果样式二选一: 形象版(每根杖现画一张专属插画:木色、杖芯色、缠绕纹密度、星点位置都由 杖特 + seed 决定,同杖必同图、不同杖必不同图;图面直接印杖名、树籍与 木/芯/长/韧特性)或简洁版(同版式不带图,出得更快——不是 markdown 纯文本)。 选择器只在准备领卡这一刻出现,封面与答题过程中都不展示,不打断进店节奏。 插画由页内 canvas 实时绘制(ART 模块,与 scripts/make_wand_art.py 同视觉口径), 无 canvas 环境回退 assets/wand_hero.png 静态图;结果页还可用「换个样式看」随时互换。 说明:页内现画不消耗图片生成额度;纯文本模式下若用户想要图,用图片生成工具 (或本地跑 make_wand_art.py --wood … --core …,不耗额度)出图随卡发出。
  5. 结果页:排版视觉卡(羊皮纸渐变底、四角星饰、金分隔线、居中判词、 转发语胶囊、底部声明)+ 按钮(复制完整卡 / 只复制树籍一行 / 再测一次 / 换个样式看)。 纯文本杖卡仍完整生成但隐藏,专供「复制完整卡 / 复制树籍」—— 对外分享链路一律走纯文本,不依赖图。
  6. 「两杖相照」面板:粘两个复现串或杖名行 → 本地出合照卡(保留等宽文字版,判定可读性优先)。 纯文本模式下,用户在出卡前问一次样式:形象版优先本地跑 make_wand_art.py 现画(不耗额度), 无法执行脚本再用图片生成工具(提醒消耗额度);简洁版只发排版文字卡。 问一次即可,不反复追问。

9. 文件清单

魔杖选择你/
├── SKILL.md
├── assets/
│   └── wand_hero.png    # 静态兜底插画(canvas 不可用时回退;替换后重跑 --out)
├── data/
│   ├── questions.json   # 题库 27 题(题干 + 选项 + 权重 + 默认项)
│   ├── woods.json       # 8 种木材:树语、判词、画像、林名
│   ├── cores.json       # 6 种杖芯:来历、判词、陪伴语、相克对
│   ├── meta.json        # 开场白、失败剧本池、长度/韧度档、相照规则、禁词、声明
│   └── papers.json      # 试卷库 20 张(make_papers.py 生成,勿手改)
└── scripts/
    ├── wand_shop.py     # --card / --questions / --compare / --audit / --selftest …
    ├── make_papers.py   # 构建期:生成 / 校验 papers.json(固定种子)
    ├── make_wand_art.py # 离线插画:按杖特画魔杖图(Pillow;纯文本模式出图用)
    └── build_quiz_html.py  # UI 模式:生成单文件答题页(--out / --verify;页内 canvas 现画专属图)

10. 最容易翻车的五处

  1. 改题库后必须重跑 make_papers.py + --audit + --verify——三件套缺一不可, 否则页面用旧卷、分布失衡或 JS 分叉。
  2. JS 引擎与 Python 引擎是两份实现——树号、英寸、判词全靠 CRC 对齐; 改任何一边的引擎逻辑,--verify 不过就不许发布。
  3. JS 的 crc32 必须带最后的 ^ 0xffffffff——少一个异或,对拍全部翻车(发生过)。
  4. Windows 控制台中文乱码——所有 python 调用带 -X utf8。
  5. 树籍是社交身份,复现串是复现钥匙——前者印卡面,后者别弄丢; 用户只拿到树籍时无法还原完整卡,相照时走「杖名行」兜底解析。