不调模型、不花额度:shuohao-skills 如何让 1017 项自测断言 1 秒跑完
【免费下载链接】shuohao-skillsAI 短剧制作的 skill 集合:拆角色、排大纲、出场景与道具设定、写剧本、切分镜 | Agent skills for AI short-drama production — character bibles, adaptation outlines, art bibles, screenplays, storyboards. Runs in Claude Code & codex.项目地址: https://gitcode.com/gh_mirrors/sh/shuohao-skills
shuohao-skills是一个开源的 AI 短剧制作 skill 集合:拆角色、排大纲、出美术设定、写剧本、切分镜。它有一条硬核约定——每个 skill 都自带scripts/selftest.mjs,不调用模型、不消耗任何 API 额度,全部 1017 项断言 1 秒跑完。这篇文章拆解这套"零模型自测"方法论,你可以直接搬进自己的项目。
为什么 AI 项目需要"零模型自测"
AI skill 的产出分两半:
| 由模型负责 | 由脚本负责 | |
|---|---|---|
| 内容 | 剧本台词、分镜描述、人物弧光 | 分卷切分、时长折算、质量门校验、HTML 报告渲染 |
| 可测性 | 输出开放,没法断言 | 输入 → 输出完全确定,天生适合断言 |
这套方法论的核心就一句话:创意留给模型,机械的部分全部交给断言锁死。模型写得再漂亮,只要时长算错了、质量门漏拦了,整条管线都是坏的——而这些"机械部分"恰好可以用传统断言 1 秒验证完。
下图是 shuohao-skills 的完整管线,5 个 skill 的确定性逻辑就是自测的全部覆盖对象:
一键运行自测:步骤与前置条件
前置条件极简:Node ≥ 18,零 npm 依赖,不需要 install(README.md 中明确:脚本只用标准库)。在仓库根目录执行一条命令,5 个 skill 的自测全部跑完:
for f in skills/*/scripts/selftest.mjs; do node "$f"; done实际输出(真实运行结果):
✓ 146 项自测全部通过 # novel-art ✓ 307 项自测全部通过 # novel-characters ✓ 220 项自测全部通过 # novel-outline ✓ 153 项自测全部通过 # novel-script ✓ 191 项自测全部通过 # novel-storyboard| Skill | 断言数 | 覆盖的确定性逻辑 |
|---|---|---|
| novel-art | 146 | 画风预设、outline 预填清单、11 道质量门 |
| novel-characters | 307 | 分块扫描、别名归并、角色关系图、风格预设 |
| novel-outline | 220 | 分卷切分、13 道质量门、MD/HTML 渲染、中英界面 |
| novel-script | 153 | 语速时长引擎、±15% 容差带、10 道质量门 |
| novel-storyboard | 191 | H3 提示词逐字对账、2–5 秒硬门、16 道质量门 |
| 合计 | 1017 | 1 秒内全部跑完 |
每个selftest.mjs的开头注释都写着它的定位,比如 skills/novel-outline/scripts/selftest.mjs 的前三行:
自测:覆盖 novel-outline.mjs 里所有确定性逻辑。 不调用任何模型,不花额度,跑一次 < 1 秒。
断言基础设施只有两个小函数,assert/strict全部来自 Node 标准库:
function ok(cond, msg) { assert.ok(cond, msg); passed++; } function eq(actual, expected, msg) { assert.strictEqual(actual, expected, `${msg} — 期望 ${expected},实际 ${actual}`); passed++; }失败信息自带"期望值 / 实际值",排错不用打开调试器。
断言夹具:自带样例同时当测试数据
examples/目录是双用途设计——给人看的是样例产出,给机器跑的是测试夹具。以 skills/novel-outline/examples/渡口-outline.json 为例:它把短篇故事《渡口》改编成 6 集 × 2 分钟的微型大纲,13 道质量门全部通过,既是质量基准,也是自测的唯一夹具。
更妙的是夹具本身也被断言:"自带样例通过 full 校验""样例全部质量门通过"——防止样例在后续改动中悄悄退化。
跨 skill 的样例还串成了测试链:novel-storyboard 的自测 同时读取上游 4 个 skill 的examples/夹具(剧本、大纲、角色表、美术设定),对账门一旦断链立刻报错。改上游样例 = 自动波及下游自测,联动回归不用额外配置。
质量门逐门击穿:每道门都要"真的会拦"
这是整套方法论里最独特的部分。每个 skill 的确定性逻辑核心是若干"质量门"(如:主角组 ≤ 5 人、爽点间隔 ≤ 3 集、分镜 2–5 秒硬门)。如果只断言"好样例全部门通过",那测的是假象——一道永远放行的门同样会让所有断言变绿。
所以自测的约定是(源码原注释):
每一道门都要证明它真的会拦——不然就是永远为真的假测试
击穿用例只有三步:克隆夹具 → 故意破坏一个字段 → 断言门被触发,且报错点名到具体对象:
{ const o = clone(); o.episodes[0].hook = ' '; // 把第 1 集钩子抹成空白 ok(!gate(o, 'ep1-hook').ok, '第 1 集没钩子被拦'); } { const o = clone(); delete o.scenes[2].reusePlan; // 删掉一次性场景的规避方案 ok(!gate(o, 'once-scene').ok, '一次性场景缺规避方案被拦'); ok(gate(o, 'once-scene').detail.includes('芦苇'), '报错点名是哪个场景'); }注意第二个断言:它不只检查"门拦住了",还检查报错信息里带上了具体场景名。对使用者来说,"第 4 集缺悬念栏"比"校验失败"有价值十倍。
连"检测器本身"也不放过——反向验证正则要能抓到东西:
ok(!/<script\s+src=/.test(html), '不引外部脚本'); ok(/<script\s+src=/.test('<script src="x.js">'), '外部脚本检测正则有效');只测"报告里没外部脚本"是不保险的:一个永远匹配不到的正则也能让断言变绿。
渲染层断言:连转义边界都测
报告是人看的,渲染错了人就会信。所以renderMarkdown/renderHtml的输出也是断言重灾区:
- 结构计数:KPI 带 6 张卡、分集卡 6 张、爽点时间轴 4 个节点、区块顺序正确
- 往返一致:报告内嵌的 JSON 解析后与原夹具逐字节一致,且能直接喂回
validate - 安全边界:往梗概里塞
<img onerror=alert(1)>,断言被转义;再塞</script,断言内嵌数据块不被截断 - 界面切换:
--lang en只翻译界面标签,数据(爽点类型、人名、门标签)原样保留;传fr要直接抛错,不静默回退
以 novel-storyboard 的报告 为例,断言甚至精确到"主分镜图钉 0.00 秒、子分镜图钉各自切点"的 H3 对齐句式逐字对账——这正是分镜投产前的关键一致性。
为什么可以不配 CI
README.md 里的原话:
没有配 CI——自测足够快(1 秒),本地跑一次比等 CI 更省事。
配套两条硬约定(仓库级规则,见 CLAUDE.md 与 README):
- 每个 skill必须有
scripts/selftest.mjs,不调用模型、不花额度,覆盖全部确定性逻辑 - 加新 skill 之前,先把全部自测跑一遍;改完脚本先跑自测
自测快到"比等 CI 还省事",CI 反而成了累赘。这也是"零模型自测"的最大红利:测试成本趋近于零时,测试频率可以趋近于无穷。
四步复用这套方法论
想把"零模型自测"搬进自己的项目(尤其是含 LLM 的项目),照这四步走:
- 切开"确定性逻辑"与"模型输出"——只有前者是自测对象,前者越纯,断言越好写
- 自带样例当夹具——
examples/一份两用,并断言"样例本身通过全部校验",防止基准退化 - 每条质量规则配一个击穿用例——克隆夹具、破坏一个字段、证明门会拦且报错点名对象
- 守住秒级——零依赖、单文件、只用标准库;自测一旦慢到分钟级,说明你开始测"该交给模型的开放内容"了
1017 项断言、1 秒、0 额度——这套方法论证明:AI 项目的质量下限,可以完全用不花一分钱的测试锁住。
【免费下载链接】shuohao-skillsAI 短剧制作的 skill 集合:拆角色、排大纲、出场景与道具设定、写剧本、切分镜 | Agent skills for AI short-drama production — character bibles, adaptation outlines, art bibles, screenplays, storyboards. Runs in Claude Code & codex.项目地址: https://gitcode.com/gh_mirrors/sh/shuohao-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考