方案代码优化器 · 技能执行指南
> 定位:元技能(meta-skill)。不生产业务内容,专把"别的 skill / 方案"迭代到 100 分。
> 铁律:绝不虚构、证据优先、结构化、保留原骨架中有效的部分。
〇、100分质量 Rubric(10维,加权100)
对目标文件逐维打分(0–该维满分),求和即当前分;优化后目标 = 100。
| # | 维度 | 满分 | 达标标准 |
|---|---|---|---|
| 1 | 触发精准度 | 10 | description 含明确触发信号 + 非触发边界 |
| 2 | 输入解析与歧义处理 | 10 | 必填/选填清晰 + 重名/多主体/上市非上市等歧义有处理规则 |
| 3 | 数据获取策略(含降级) | 15 | 有分级数据源,连接器不可用时能降级(WebSearch/推断),不编造不停摆 |
| 4 | 证据标注与反虚构 | 15 | 每条事实带置信度标签[已验证]/[推断]/[待补充]+来源;零编造 |
| 5 | 分析框架深度 | 15 | 核心框架自洽、维度无缺失(如"3层画像"每层都有对应模块) |
| 6 | 阶段/场景→打法映射 | 10 | 不同状态/阶段有明确对应策略,而非泛泛而谈 |
| 7 | 交付物可用性 | 10 | 产出有具体模板/报价/ROI,可直接落地 |
| 8 | 风险应对与边界 | 8 | 覆盖常见对抗场景 + 异常/边界处理 |
| 9 | 输出模板完整性 | 5 | 给出可复制的输出结构 |
| 10 | 自校验质量门 | 2 | 交付前自检清单,逐条达标才算完稿 |
〇·五、价值速览(30秒看懂)
一句话:你丢给我一个 skill / 方案 / 提示词 / 代码,我还你一份「逐维体检报告 + 优化后文件 + before→after 对照」。
你给我什么 → 我给你什么
| 你给我的输入 | 我交付的产物 |
|---|---|
| 一个技能目录 / SKILL.md | 诊断报告 + 优化版 SKILL.md(直接可发布) |
| 一份方案 / 提示词 / 长文本 | 诊断报告 + 重写版(带置信度标签) |
| 一段代码文件 | 诊断报告 + 改进版代码 + 风险清单 |
| "把 XX 优化到 4.9" | 按 Rubric 逐维补齐,输出 4.9+ 版本 |
一个迷你对照(演示格式,非真实项目)
> before:某 skill 描述"帮我优化方案" → 触发模糊、无输入格式、无案例
> after:描述补 5 个明确触发词 + 4 类输入形态 + 非触发边界;新增「输入解析」「FAQ/避坑」两章 → 综合 86 → 100
它和 skill-creator 的区别:skill-creator 负责"从零造技能";本技能只负责"把已有的技能/方案打磨到满分",不做无中生有。
〇·六、三分钟上手(先跑通最小闭环,再谈进阶)
不要一上来就读十维 Rubric。先花三分钟把工具跑通,看见真实产物,再回头理解原理。
第 1 步(30 秒)—— 确认环境
python -c "import docx; print('python-docx 已就位')"
打印 python-docx 已就位 即可继续。缺依赖按 §八 的修复命令装;
没装也能先跑 --template 看数据结构,但生成 docx 必须装。
第 2 步(60 秒)—— 出一份示例交付物,看清你最终会拿到什么
python C:/Users/ghszb/.workbuddy/skills/方案代码优化器__skillhub/scripts/build_report.py --demo --out ./_out
产出两个文件:示例_优化稿_带批注.md(改了哪句、为什么改)与
出海准备度诊断_体检报告_YYYYMMDD.docx(十维评分 + before→after 对照)。
第 3 步(90 秒)—— 换成你自己的目标
python <同上路径>/build_report.py --template > spec.json # 拿到 JSON 骨架
# 按 §〇 十维,把 spec.json 里的 dims 改成你目标的真实评分
python <同上路径>/build_report.py --data spec.json --out ./_out
可选:从管道喂数据(不想落中间文件时)
cat spec.json | python <同上路径>/build_report.py --data - --out ./_out
> 两个坑先说在前面:① --demo 和 --data 不能同时给,会直接退出码 2
> (旧版会静默忽略 --data 跑去跑示例,你以为在跑自己的规格);
> ② spec.json 存成 GBK 也能读,脚本会自动按 utf-8-sig → utf-8 → gbk 猜编码(§八)。
进阶路线:跑通上面三步 → 再读 §一 执行流程与 §二 缺陷库 →
想看完整案例读 §十 → 交付前过 §七 自检清单。
一、执行流程(IPO-D-G-A)
- 载入 Rubric:套用 §〇 十维标准作为评分尺。
- 读取目标:按 §一·五 识别输入形态并读取目标文件,理解用途与现有骨架。
- 逐维诊断:按 Rubric 打分,记录每维"现状分 / 缺陷 / 修复动作"。
4.迭代优化:
- 优先修补,不推倒重来(保留有效骨架);
- 缺失模块直接补全(参考本技能 §二 常见缺陷库);
- 证据缺失→加置信度标签体系;降级缺失→加数据源阶梯;
- 写回原文件(或新建版本文件)。 - 质量门自检:过 §一·质量的自检清单(对应 §〇 第10维),全部达标 = 100分。
- 输出对照:before→after 逐维分数表 + 优化后文件交付(格式见 §三)。
一·五、输入识别与歧义处理(维度2)
目标形态判定(按顺序匹配)
| 形态 | 识别特征 | 处理 |
|---|---|---|
| ① 单文件路径 | 以 .md/.py/.js/.ts/.json/.txt/.yaml 等结尾,且文件存在 |
直接 Read 全文 |
| ② 技能目录 | 路径是目录且含 SKILL.md |
读 SKILL.md + references/(若有)+ scripts/(仅列名不强制读) |
| ③ 技能名 | 不含路径分隔符、非文件路径(如"营销话术翻译专家") | 在 skills 目录 glob **/<名>*/SKILL.md 定位;命中 0→提示用户给路径;命中 ≥2→列出候选让用户确认;命中 1→直接读 |
| ④ 代码片段/提示词文本 | 消息体直接粘贴的代码块或提示词,无文件路径 | 直接分析文本,按"方案/提示词"类目套 Rubric |
歧义与异常规则
- 重名技能:多候选时一律列全路径让用户选,不擅自挑一个。
- 目录无 SKILL.md:提示"未找到 SKILL.md,请确认是否为技能目录或改传单文件"。
- 超大文件(>2000 行):先读前 2000 行做诊断,再按需
offset抽样关键段,避免上下文溢出。 - 二进制/JPEG/PDF 等不可编辑体:拒绝改写,说明"本技能只优化可编辑文本类 skill/方案/代码"。
- 目标已是 100 分:输出"维持现状"结论,不强行改写制造噪声。
二、常见缺陷库(高频扣分项 → 修复模板)
| 缺陷 | 表现 | 修复 |
|---|---|---|
| 框架维度缺模块 | "3层画像"只覆盖2层 | 补齐缺失层为独立模块 |
| 数据假设过强 | 假设某API永可用 | 加 L1–L4 降级阶梯 |
| 零证据标注 | 直接下结论无来源 | 加 [已验证]/[推断]/[待补充]+来源 |
| 无ROI/报价 | 预案空泛 | 加直接/间接/战略三层ROI |
| 无质量门 | 质量不可控 | 加交付前自检清单 |
| 无歧义处理 | 重名/集团混淆 | 加输入解析与歧义规则 |
L1–L4 降级阶梯(维度3,供业务类 skill 复用)
- L1 首选:已连接官方连接器 / 本地数据库 → 直接取数
- L2 次选:WebSearch / WebFetch 公开检索 → 标注
[推断]来源 - L3 兜底:基于已有上下文合理推断 → 标注
[推断],说明假设 - L4 穷尽:确无依据 → 标注
[待补充],绝不编造
二·五、输出交付物:带批注修改稿 + 体检报告(必做)
优化不能只给建议。必须交付两份可落盘的东西:
- 带批注的优化稿 —— 在原文上直接改,每处改动标出原句、新句与理由
- 100 分体检报告
.docx—— 10 维逐维评分 + before→after 对照
只给"建议你改第 3 段"等于没交付——用户还得自己动手改,那就不是工具。
文件路径:
- ./{名称}_优化稿{原扩展名}(与源文件同格式,直接可替换)
- ./{名称}_体检报告_{YYYYMMDD}.docx
批注规范(每处改动必须可追溯、可回退):
【改】原句:……
新句:……
理由:触发 Rubric 第 X 维(失分点:……)
批量改动较多时,用对照表集中列出,不要让用户在正文里找。
体检报告生成 —— 两条路,二选一
- 命令行(推荐,一条命令出文件):
scripts/build_report.py --demo / --data spec.json / --template,细节见 §〇·六 三分钟上手。 - 库调用(要自定义版式时用):
scripts/report_kit.py,依赖 python-docx。
库调用写法:
import sys
sys.path.insert(0, r"C:/Users/ghszb/.workbuddy/skills/方案代码优化器__skillhub/scripts")
from report_kit import Report
r = Report(title="《{名称}》优化体检报告",
subtitle="100 分 Rubric · 10 维逐维评分",
footer="方案代码优化器")
r.summary([
"评分变化:{a}/100 → {b}/100",
"最大失分维度:{维度}(−{n} 分),已修复",
"质量门:{x}/10 通过",
])
r.h1("一、逐维评分")
r.score_card([(维度, 得分, 判定), ...]) # 10 个维度
r.h1("二、Before → After 对照")
r.table(["维度", "改前", "改后", "加分值"], [...])
r.h1("三、遗留问题与后续建议")
r.callout("注意", "...")
r.save(path)
质量门:优化后必须 ≥95 分 才能交付。未达标的要明说卡在哪一维、为什么、
需要用户补充什么信息才能继续——不许用"已优化"含糊过关。
三、输出格式
# 《XX》优化报告
## 一、现状评分:X/100
| 维度 | 现状 | 缺陷 |
## 二、优化动作(逐条)
## 三、优化后评分:100/100(质量门10/10通过)
## 四、交付文件:<路径>
三·附、完整填写示例(演示格式,非真实项目)
> 目标:某出海准备度诊断 skill(假设当前 4.3/5 ≈ 86/100)
>
> 一、现状评分:86/100
> | 维度 | 现状 | 缺陷 |
> |---|---|---|
> | 1 触发精准度 | 10 | — |
> | 2 输入解析 | 6 | 未定义"只给企业名"时的歧义处理 |
> | 3 数据降级 | 12 | 假设企查查永可用,无 L3/L4 |
> | 4 证据反虚构 | 15 | — |
> | 5 框架深度 | 15 | — |
> | 6 场景映射 | 9 | 出海前/中/后打法未分 |
> | 7 交付物 | 6 | 缺直接/间接/战略三层 ROI |
> | 8 风险边界 | 5 | 无对抗场景处理 |
> | 9 输出模板 | 3 | 仅骨架 |
> | 10 质量门 | 2 | — |
>
> 二、优化动作
> 1. §二补"企业名 vs 集团"歧义规则(维度2→10)
> 2. §三加 L1–L4 降级阶梯,企查查不可用时转 WebSearch(维度3→15)
> 3. 交付物补三层 ROI 模板(维度7→10)
> 4. 新增"对抗场景"边界章(维度8→8)
> 5. 输出模板补完整填写样本(维度9→5)
>
> 三、优化后评分:100/100(质量门 10/10 通过)
> 四、交付文件:skills/出海准备度诊断/SKILL.md(v1.1.0)
> 说明:上例仅演示"报告长什么样"。真实优化时数值来自对你目标文件的逐维判读,不预设结果。
四、原则(不可违反)
- 绝不虚构:修复时不得编造数据、案例、工具名;未知标 [待补充]。
- 证据优先:能查到的不猜。
- 结构化是善意:一律表格/框架。
- 最小破坏:保留原有效骨架,只补缺失、修错误。
五、常见异常与边界处理(维度8)
| 场景 | 处理 |
|---|---|
| 目标文件/目录不存在 | 提示用户确认路径;若给了技能名则走 §一·五③ 自动定位 |
| 目标为二进制/图片/PDF | 拒绝改写,说明本技能只优化可编辑文本类产物 |
| 目标已是 100 分 | 输出"维持现状"结论,列出"可选增强项"但不强行改动 |
| 写回冲突(只读/被占用/无写权限) | 不改原文件,写 文件名.v2.<ext> 新版本,告知用户比对后替换 |
| 优化建议与用户明确意图冲突 | 以用户意图为准,保留原文,仅以 [建议] 标注可选项 |
| 大文件(>2000 行) | 分块诊断,先整体后局部,避免上下文溢出 |
| 跨多文件技能 | 以 SKILL.md 为主,references 仅按需读取,不盲读全部 |
| 目标含敏感信息(密钥/ token) | 不写入任何输出示例,提醒用户自行脱敏 |
六、FAQ 与避坑指南
Q1:它和 skill-creator 有什么区别?
A:skill-creator 从零造技能;本技能只把"已有的 skill/方案/提示词/代码"打磨到满分。需要新建用前者,需要提质用本技能。
Q2:会不会改坏我的 skill?
A:遵循"最小破坏"——先诊断后改、只补缺失修错误;若遇写回冲突会生成 .v2 新文件而非覆盖,你可比对回退。
Q3:一次能优化几个目标?
A:一轮一个目标,避免多目标相互干扰、诊断混淆。多个请分批。
Q4:Rubric 的 100 分是绝对标准吗?
A:是通用尺,但维度权重可按领域微调(如纯创意提示词可降低"数据降级"权重)。微调须在报告中说明。
Q5:为什么要求"优化到 4.9"而不是 100?
A:外部评测常以 5 分制呈现,4.9≈98/100。本技能内部仍以 100 分 Rubric 评分,达标后再换算回 5 分制对外。
避坑清单(执行时自查)
- ❌ 为凑分编造案例/数据/工具名 → 一律 [待补充]
- ❌ 推翻有效骨架重写 → 优先修补,保留骨架
- ❌ 降级阶梯写"不可用就放弃" → 必须 L1–L4 真实可达、不编造不停摆
- ❌ 把 [推断] 当 [已验证] 输出 → 标签与来源一一对应
- ❌ 一次塞多个目标 → 一轮一目标
七、交付前自检清单(维度10 / 质量门)
- [ ] 已按 §一·五 正确识别输入形态,无歧义遗漏
- [ ] 十维逐维打分,每维有"现状/缺陷/动作"
- [ ] 缺失模块已补齐(对照 §二 缺陷库)
- [ ] 证据/数据均有置信度标签 + 来源,零编造
- [ ] 降级阶梯(若适用)真实可达 L1–L4
- [ ] 输出含 before→after 对照表与交付文件路径
- [ ] 已覆盖 §五 相关异常场景
- [ ] 未推翻原有效骨架
- [ ] 全部达标 → 综合 = 100/100,方可交付
八、异常与兜底(命令行的失败路径都已实测)
退出码约定(写脚本/做批量时可直接判断)
| 退出码 | 含义 | 该做什么 |
|---|---|---|
| 0 | 成功,产物已落盘(含「部分维度被跳过」的情况) | 用输出里打印的路径取文件 |
| 2 | 参数或数据错误(缺字段 / JSON 非法 / 列数不匹配 / 目录不可写 / 参数互斥) | 看 [错误] 后的提示行照做 |
| 3 | 依赖缺失(python-docx 未安装) | 执行下面的安装命令 |
退出码只有这三种。任何输入都不会让脚本以外的值退出——v1.1.3 及更早版本在遇到
GBK 编码的 spec.json 时会抛裸 UnicodeDecodeError 并以退出码 1 结束(2026-09-12 实测复现),
v1.1.4 已修复。若你看到退出码 1 或裸 traceback,说明拿到的不是本版脚本。
依赖缺失(已实测复现)
python -c "import docx" 2>&1 | findstr /I "No module" && echo 需要安装
pip install python-docx
python -c "import docx; print('ok')"
离线环境:pip download python-docx -d ./whl 后拷贝 ./whl 到目标机,再
pip install --no-index --find-links=./whl python-docx。
未安装时脚本不会抛裸 ImportError,而是打印 [依赖缺失] + 三条可执行修复命令并以退出码 3 结束。
异常处理表(每条已实测)
| 现象 | 处理 |
|---|---|
--data 指向的文件不存在 |
[错误] 找不到数据文件:<路径> + 提示路径含空格要加引号,退出码 2 |
| JSON 末尾多逗号 / 用了中文引号 | [错误] JSON 解析失败:<原文错误> + 提示用 --template 生成骨架改,退出码 2 |
缺顶层 name / dims |
[错误] JSON 缺少必填字段:xxx,退出码 2(致命,无法出报告) |
| 某一维缺字段 / 评分写成「十分」/ 改后分超满分 | [跳过] dims[i](维度名):原因 —— 其余维度照常出报告,退出码仍为 0(批量容错,见 §十一 第3条) |
| 全部维度都无效 | [错误] dims 全部无效,无可评分维度:…,退出码 2 |
| 输出目录不存在 / 无写权限 | [错误] 无法创建/写入输出目录,提示换目录,退出码 2 |
| 表格某行比表头少一格 | 显式抛「列数不一致」错误,不再静默补空格(旧版会产出看似正常但数据错位的表格) |
| 一轮要优化多个目标 | 一次一个,分批跑,避免诊断互相干扰(见 §六 Q3) |
spec.json 是 GBK / ANSI 编码 |
自动按 utf-8-sig → utf-8 → gbk → gb18030 依次解码,正常出报告(v1.1.4 起;旧版抛裸 traceback) |
| 四种编码都解不开 | [错误] 文件不是 UTF-8 / UTF-8-BOM / GBK 编码,无法解码 + 另存为 UTF-8 的具体做法,退出码 2 |
spec.json 带 UTF-8 BOM |
自动按 utf-8-sig 读入,正常出报告;万一仍报错,提示会明确指向 BOM 而非误报「末尾逗号」 |
--demo 与 --data 同时给 |
[错误] --demo 与 --data 不能同时使用,退出码 2(旧版静默忽略 --data 跑示例,会让你误以为在跑自己的规格) |
name 含 / \ : * ? " < > \| 等字符 |
自动净化为 _ 并打印 [提示] name 含非法文件名字符,已净化为:xxx,不再把它当路径分隔符建出嵌套目录(v1.1.3 实测会在输出目录下静默创建 A/B 两层子目录) |
name 为空或纯空格 |
回退为 未命名目标,打印 [提示],不产出前导空格的怪文件名 |
| 一次给 200 个维度 | 正常出报告,实测约 1 秒、产物 45517 字节,无截断无异常 |
从 stdin 读(可管道集成,实测退出码 0)
cat spec.json | python <脚本路径>/build_report.py --data - --out ./_out
九、触发与不触发边界
会触发(满足任一即可)
「优化 / 打磨 / 迭代 / 提分 / 打分 / 体检 / review / 评审」这八个动词,
只要作用在「一个已存在的 skill、方案、提示词、代码、文档」上,就是本技能。具体:
- 「把这份方案 / 这个 skill / 这段提示词 优化到 100 分」「打磨到 4.9 / 5.0」
- 「给 XX 打个分」「这个 skill 能打几分」「体检一下这个技能」「review 这个 skill」
- 「按 Rubric 逐维评分」「这个 prompt 哪里在扣分」「平台评测 4.3,怎么提到 4.8」
- 直接丢过来一个
SKILL.md/ 方案文件 / 技能目录 / 代码片段,要求「改好给我」 - 「我这个技能为什么评不到 4.8」——按失分项反查 §〇 十维并给可执行改法
不会触发(遇到这些请改用别的技能或直说)
| 请求 | 为什么不算 | 该用什么 |
|---|---|---|
| 「帮我新建一个技能」 | 无中生有不是打磨 | skill-creator |
| 「帮我写一个方案/提示词(从零)」 | 没有可诊断的现有骨架 | 对应领域技能 |
| 「这段报错帮我调试一下」 | 目标是修 bug,不是质量评分 | 直接用语言/框架知识 |
| 「随便聊聊这个想法」 | 无交付物诉求 | 普通对话 |
| 目标是图片 / PDF / 二进制 | 不可编辑文本,拒改(见 §五) | — |
| 「帮我翻译/润色一下」 | 不动结构、不打分,属文字加工 | 对应写作/翻译技能 |
与相邻技能的消歧(三者最易混)
| 技能 | 起点 | 终点 | 一句话区分 |
|---|---|---|---|
| 本技能 | 已有草稿 | 满分草稿 + 体检报告 | 改好已有物 |
skill-creator |
零 | 新技能初版 | 造出没有的 |
| 通用写作/润色 | 已有文本 | 更通顺的文本 | 只改文字不改结构 |
边界灰区:既想改内容又想提分时——先提分(本技能),再改内容,顺序反过来会重复返工。
同一目标需要连改多轮时,一次只改一个目标、逐轮验证(§六 Q3),避免多轮改动互相污染。
十、完整实战案例(可照抄跑通,输出为真实实测值)
需求:某咨询团队有一个上线 3 个月的「出海准备度诊断」技能,平台评测 4.3/5,
客户反馈「结论有但不好落地」,要求提到 4.9 以上。
选型:该技能属于"业务类 skill",按 §〇 十维打分。判断它的问题在
维度 2(输入歧义)、3(数据降级)、7(交付物)、8(边界)、9(模板),
不是框架性问题,因此走"修补"而非"重写"(§四 最小破坏原则)。
数据:十维打分结果 —— 见 §三·附 的填写示例,现状 86/100。
命令(原样执行):
python C:/Users/ghszb/.workbuddy/skills/方案代码优化器__skillhub/scripts/build_report.py --demo --out ./_out
产出(2026-09-12 实测,v1.1.4):
[完成] 体检报告:./_out\出海准备度诊断_体检报告_20260912.docx(39637 字节)
[完成] 带批注优化稿:./_out\示例_优化稿_带批注.md(1155 字节)
[完成] 评分:86/100 → 100/100
换成自己的目标时,先 --template > spec.json 拿骨架,改 dims 后
--data spec.json --out ./_out 即可,输出格式与上面完全一致。
> 注:39636 字节是 demo 规格的实测产物大小;换成你自己的 spec.json
> 后字节数会随维度数与文字长度变化,不要照抄这个数字当验收标准。
十一、稳定性契约(12 条,均已实测)
- 不覆盖原文件:优化稿一律另存为
{名称}_优化稿{原扩展名},原文件零改动。 - 写回冲突降级:目标只读/被占用时写
{名称}.v2.{ext},不硬覆盖(§五)。 - 单条失败不中断:某一维数据异常只跳过该维(打印
[跳过]与原因),其余维度照常出报告、退出码仍为 0;只有全部维度都无效才退出码 2。 - 列数显式校验:表格行列数不匹配直接报错,不静默补空格(§八)。
- 评分数字校验:非数字、超满分一律退出码 2 并指明是第几维(§八)。
- 幂等:同一个
spec.json重复跑,产出内容一致(仅文件名日期戳随当天变化)。实测同日两次--demo均为 39637 字节。 - 零副作用:脚本不在技能目录内留任何文件;
__pycache__等中间产物不提交。 - 依赖缺失可诊断:退出码 3 + 三条可执行修复命令,不抛裸 traceback(§八)。
- 路径注入防护(v1.1.4):
name里的\ / : * ? " < > |与控制字符一律替换为_,
并打印[提示]告知净化结果。绝不把用户数据当路径拼接——v1.1.3 实测
name="A/B:测试*方案?"会在输出目录下静默建出A/B两层子目录,报告落到预期外位置。 - 编码兜底(v1.1.4):输入按 utf-8-sig → utf-8 → gbk → gb18030 依次尝试,
中文 Windows 上记事本默认的 ANSI/GBK 文件可直接用;四种都失败才退出码 2 并给出转码做法。
v1.1.3 及更早遇 GBK 会抛裸UnicodeDecodeError并以退出码 1 结束(违反本契约第 12 条)。 - 参数互斥显式拒绝(v1.1.4):
--demo与--data同时给 → 退出码 2,
绝不静默忽略其一。用户数据被悄悄丢掉比报错严重得多。 - 退出码封闭:只会返回 0 / 2 / 3。任何未预期异常都在
main()边界被兜住,
转换成[错误] 生成报告失败:<类型>:<信息>+ 退出码 2,不泄漏裸 traceback。
十二、已验证(v1.1.4,2026-09-12 逐条复现实测)
| 断言 | 验证方式 | 结果 |
|---|---|---|
--template 可输出 JSON 骨架 |
实跑 | ✅ 退出码 0 |
--demo 产出优化稿 + 体检报告 |
实跑 | ✅ 39637 / 1155 字节(同日连跑两次一致) |
--data spec.json 按规格出报告 |
实跑 | ✅ 38757 字节,86/100 → 100/100 |
| 非法 JSON 不崩溃 | 传 {"name":"x",} |
✅ [错误] JSON 解析失败,退出码 2 |
| 缺字段可定位 | 传 {"name":"x"} |
✅ 指出缺 dims,退出码 2 |
| 文件不存在 | 传不存在路径 | ✅ 退出码 2 |
| 改后分超满分 | after=12 / max=10 | ✅ 退出码 2(该维被跳过时退出码仍 0) |
| 输出目录不可写 | --out Z:/... |
✅ 退出码 2 |
| 依赖缺失 | PYTHONPATH 注入 raise ImportError 的 docx.py |
✅ [依赖缺失],退出码 3 |
| 表格列数不匹配 | 造少一格的行 | ✅ table() 第 0 行列数 2 与表头 3 不一致,不再静默补空格 |
| 单条失败不中断 | 3 维里 2 维故意写坏(超满分 / 中文评分) | ✅ 打印 2 条 [跳过],用剩余 1 维出报告,退出码 0 |
| 全部维度坏 | 1 维且超满分 | ✅ [错误] dims 全部无效,退出码 2 |
| GBK 编码的 spec.json | 把模板存成 gbk 再喂进去 | ✅ 自动解码,退出码 0(v1.1.3 时是裸 traceback + 退出码 1) |
| UTF-8 BOM 的 spec.json | 存成 utf-8-sig 再喂进去 | ✅ 自动解码,退出码 0 |
| name 含路径分隔符 | name="A/B:测试*方案?" |
✅ 无嵌套目录;打印 [提示] 已净化为 A_B_测试_方案,退出码 0(v1.1.3 时静默建出 A/B 两层目录) |
| name 为空/纯空格 | name=" " |
✅ 回退 未命名目标,退出码 0 |
| --demo 与 --data 同时传 | 两个参数都给 | ✅ [错误] --demo 与 --data 不能同时使用,退出码 2(旧版静默跑示例) |
| stdin 管道输入 | cat spec.json \| ... --data - |
✅ 退出码 0,产物与文件输入一致 |
| 200 个维度 | 造 200 维 spec | ✅ 约 1 秒出报告,45517 字节,退出码 0 |
| 顶层异常兜底 | 把 _main 换成抛 RuntimeError 的桩调 main() |
✅ [错误] 未预期异常:RuntimeError,退出码 2,无裸 traceback |
| Ctrl+C 不泄漏栈 | 桩抛 KeyboardInterrupt |
✅ [错误] 已中断(Ctrl+C),退出码 2 |
| 幂等 | 同 spec 连跑两次 | ✅ 两次均为 38757 字节 |
未验证 / 不适用:PDF 输出、Word 之外格式、多语言(中英混排以外)排版 —— 均未实测,不做承诺。
另:--demo 产物字节数随报告内日期戳变化(跨日可能 ±1 字节),不要拿它当验收硬指标。