# 变更记录 — 安全教育培训成套材料生成器

| 日期 | 版本 | 改了什么 | 为什么改 |
|---|---|---|---|
| 2026-08-10 | v1.1 | `fill_forms.py` 增加 `inspect_template()` 模板体检：模板里没有任何 `{{}}` 占位符、或含单大括号说明文字时直接拒绝生成并报错 | 用户把带 `{我告诉你}` 单大括号的原始文件放进专用模板目录，正则匹配不到，脚本一处没填却报了 OK，交出两张空表。空表比报错更危险——文件生成了、不报错、打开才发现是空的 |
| 2026-08-10 | v1.0 | 初版。一次生成六份：培训通知单、培训记录+效果评估表、签到表（Word）、培训课件（PPT ≥10页）、培训试卷（Word，15题带答案）。三份制式表单取自项目部现有模板，转成 `{{}}` 占位符存入模板库。试卷内置 `check_answer_spread()` 强制校验答案分布。模板支持"专用优先、通用兜底"两级查找 | 原始需求 |

---

## 关键设计决定（改之前先看这里）

**1. 签到表时间栏必须留空**
用户明确要求：签到表只预填培训内容和培训地点，时间现场手填。`fill_forms.py` 里对签到表强制 `培训时间=""`，不要"优化"掉。

**2. 试卷格式固定**
单选6×5分 + 多选4×10分 + 判断5×6分 = 100分。用户确认过，不要自行调整题量或分值。

**3. 答案分布必须校验**
`check_answer_spread()` 三条规则：单选每个字母最多 2 次、判断√×数量差≤1、多选组合不重复。不通过就不出卷。
修正方式是**调换选项顺序**（把正确答案挪到别的字母），不是改题目。
首次测试就抓到了多选答案 ABC/ABCD/ABCD/ABC 重复，说明这个校验是必要的。

**4. 模板两级查找**
`templates\`（专用）优先于 `..\template\03-培训\`（通用）。基名必须一致，只有版本号可以不同。
用户要微调占位符时在专用目录改，通用库保持干净底本。

**5. 模板体检不能省**
`inspect_template()` 在填之前先检查模板：没有 `{{}}` 占位符 → 拒绝生成；发现 `{中文说明}` 单大括号 → 拒绝生成；模板有占位符但配置里没对应字段 → 报警（否则会被静默填成空白）。
v1.0 就是缺这一步，交出过两张空表。

**6. 成稿必须查 AI 痕迹**
项目部现有的《夏季防高温试卷.docx》第43行混进过 `</think>好的，这是一份专门为山地光伏施工项目设计的...`，夹在多选题和判断题之间一直没被发现。所以第六步的成稿检查不能跳过。

---

## 待办 / 已知问题

- [ ] `templates\` 专用目录目前是空的，三份表单全走通用库。用户说要微调占位符，改完后这里会有文件。
- [ ] PPT 目前是纯文字版式，没有配图。需要图示时得手工加。
- [ ] 试卷的"参考答案"另起一页。用户要求单文件，打印时记得只印第一页。
