# Structured Tips Daily

> 自动化生成"结构化答题技巧·每日一练"小红书爆款图文帖子 docx。围绕公考结构化面试的答题技巧和思路，用上岸过来人+考官视角，按小红书爆款节奏（标题钩子/短句/emoji/普通vs高分对照/避坑提醒/话题标签）产出。基于固定 docx 模板（18 段）+ python-docx 引擎原子替换，从题库索引选题防重复，答题须经 human-writing 去 AI 味儿。触发词：出一期答题技巧、技巧每日一练、答题思路、结构化答题技巧。

- Skill: `rshawn0307-maker/structured-tips-daily` (Agent Skill, multi-file: 11 files)
- Install (CLI): `npx skillmds@latest add rshawn0307-maker/structured-tips-daily`
- Raw SKILL.md: https://api.skillmd.com/api/skills/rshawn0307-maker/structured-tips-daily/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: rshawn0307-maker (https://skillmd.com/u/rshawn0307-maker)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/rshawn0307-maker/structured-tips-daily

---


# 结构化答题技巧·每日一练

## 适用场景

用户做"公务员结构化面试·答题技巧"系列小红书爆款图文帖子（如"应急应变别平均用力""综合分析别停在现象层"），需要：

1. **出一个答题技巧**（上岸过来人 + 考官视角，有观点、可操作、接地气）
2. **按小红书节奏打磨**（标题钩子/短句/emoji/普通 vs 高分对照/避坑提醒/话题标签）
3. **自动套入固定 docx 模板**（18 段，含配图 + 引流段）
4. **保留模板所有版式**（封面文本框、蓝色标题、引用块、尾注样式、引流段样式）
5. **从题库索引选题**，已完成技巧不重复推

## 内容骨架（每期固定 14 字段）

内容顺序（样式细节以「模板铁律」段位表为唯一契约，不在此重复）：

```
封面钩子标题（≤20 字）-> 适用题型 -> 技巧一句话（破题）-> 思路 3 步
-> "怎么答？"-> 普通答法 vs 高分答法（同题对照）+ 各自点评
-> 避坑提醒 -> 一句话总结 -> 话题标签
-> [固定引流段：模板自带，引擎不动]
```

### 字段职责（内容层，2026-09-06 修订）

14 个字段、18 段结构、字体、配图、引流段等**模板契约一律不动**，只调整各字段的内容职责。面向"懂框架但答得空"的读者，每期交付一个能马上练、能迁移到其他题目的小技巧：

| 字段 | 内容职责 |
|------|----------|
| tip_title | **候选句式（2026-09-08 起）**：内部产出痛点式/具体改法式/原栏目式（`考官想听的：xxx`）3 个候选，比较后只输出 1 个（候选记入 draft_meta.title_candidates）；≤20 字（引擎硬上限），点出具体卡点或收益；**正文必须兑现标题承诺** |
| question_type + tip_intro | 交代什么题境下会遇到这个问题，直接点出本期方法 |
| step1-3 | 把方法教清楚，每步含一个判断、动作或检查方法；**步数服从原方法，不为凑三步硬造** |
| case_normal / case_high | 同题、同身份、同条件（共同题境记入 draft_meta.shared_context），聚焦**一个关键改动**；改进版不偷加题干事实、不靠堆字取胜（去前缀后 ≤1.5 倍，程序按 1.5 拦） |
| case_normal_note / case_high_note | 指出哪个动作、判断或表达变了、为什么有效；**每条批评对应普通版一句原话**：区分"没有说明X"与"说错了X"，原话没承诺就不能批"随口保证"；不写"考官内心"式推测、不做绝对化断言 |
| pitfalls | 写**适用边界、常见误用和纠正动作**，不只列禁句 |
| tip_takeaway | 一道**新场景微练习**（正文没出现过的场景 + 2-3 个自检要素，含一个适用判断）；"自检上次的答案"类回顾式和纯反问不合格 |
| hashtags | 数量契约不变（5-8 个），只用与本期内容相关的标签 |

### 一期一技巧（硬规则，含试点修订 2026-09-06）

- 每期只教**一个主要技巧**：标题、破题、对照、练习都围绕它。原方法里的其余知识点最多一句带过作背景。
- **聚焦必须带边界声明**：破题点明"这期只教X"；与所教技巧同题的题骨前提（如应急的"安全永远第一步"、调研的"先摸底数"）保留一句作背景，防止读者学到残缺答题骨架。
- **忠实度口径**：本期所教技巧在其边界内不丢关键条件（含教师注的适用条件，如"是否处理由分管领导决定"）；未覆盖的要点宁可一句点名不展开，也不得教错。
- **三个段位不等于三步方法**：原方法只有两点时，step1/step2 讲这两点，step3 用于应用或检查，不得凭空造第三点；原方法有四点及以上时，按原逻辑分组呈现进三步，不得删掉关键条件。
- 吸睛来自具体问题（疑问、痛点、明确收益，画面感强的比喻同样可用），不强制反转句式、数字和金句；金句不做绝对化断言（"第一句话定成败"类全称判断不写）；不写无依据的提分承诺。
- 模拟例子标为示范，不冒充作者经历或真实考场反馈。

## 触发条件

用户说"出一期答题技巧" / "技巧每日一练" / "答题思路" / "结构化答题技巧"或类似表述。

## Pre-flight 检查（缺一不开工）

### ① 项目根核实

**项目根** = `<项目根>` 占位符，指 Obsidian vault `AI工作区` 下的 `01-Projects/自媒体内容库-持续项目/结构化`（本机实际路径以用户环境为准，运行前替换）。

核实项目根存在模板与索引：

```bash
ls "<项目根>/desktop-attachments/3 结构化答题技巧-帖子内容编辑模板.docx" \
   "<项目根>/scripts/tips_index.json" && echo "✅ 路径正确" || echo "❌ 路径错，先确认"
```

> 引擎不依赖 cwd，一律用 `--project-root "<项目根>"` 显式传入；项目根只读数据与模板，执行引擎永远是 skill 内脚本。

### ② 双脚本分流

工作区里如果同时有 `fill_structured_post.py`（答一道 17 段）和 `fill_zhankai_post.py`（展开说说 48 段），**那是其他独立脚本，别混用**。本 skill 只用自己目录下的 `fill_tips_post.py` + 18 段模板。字段映射不同，强混用会炸段位。

### ③ Python 环境核实

```bash
python3 -c "import docx; print('docx', docx.__version__)"   # 期望 1.2.0
```

**【命令陷阱】**：本机默认 `python` 命令不存在，一律用 `python3` / `pip3`（含所有文档示例与手工操作）。

**【包名陷阱】**：`pip install docx` 会装同名垃圾包。必须 `pip install python-docx`。

## 文件清单

| 位置 | 文件 | 用途 |
|------|------|------|
| skill | `scripts/fill_tips_post.py` | 唯一执行引擎（原子替换） |
| skill | `scripts/upload_to_ima.js` | IMA 上传（可选，用户明确要求才跑） |
| skill | `scripts/test_fill_tips_post.py` | 回归测试（改引擎/模板后必跑，冻结） |
| skill | `scripts/content_rules.py` | 内容自检器（进 pending 前必跑，**--meta 必填**；错链/标题兑现/对照条件/点评有据/步数/边界/审稿结论门禁） |
| skill | `scripts/test_content_rules.py` | 内容自检器自测（改检查器后必跑，33 用例含 7 类审计反例） |
| skill | `scripts/test-prompts.json` | 冻结测试 prompt（3 个场景） |
| skill | `references/content-strategy.md` | 内容策略（步骤 2/2.5 读取） |
| 项目根 | `desktop-attachments/3 结构化答题技巧-帖子内容编辑模板.docx` | 模板（覆盖目标） |
| 项目根 | `scripts/tips_index.json` | 技巧索引（38 条，选题池） |
| 项目根 | `scripts/progress_tips.json` | 已完成记录（选题过滤，跑完更新） |
| 项目根 | `scripts/pending_tips.json` | 中间文件（成功后引擎自动删除） |
| 项目根 | `模板文件/3 结构化答题技巧-帖子内容编辑模板.docx` | 源模板副本（基线备份） |
| 项目根 | `scripts/_snapshots_tips/` | 自动快照（最多 10 个） |

**事实源约定**：选题与进度一律读**项目根** `scripts/` 下的 `tips_index.json` 与 `progress_tips.json`；skill 内同名文件仅为出厂参考，不作为事实源。

## 工作流（6 步）

### 步骤 1：查索引选题（一次给 2-3 个候选）

从**项目根** `scripts/tips_index.json` 的 tips 里挑**未出现在 `progress_tips.json` done_ids** 的技巧：

- 用户指定题型 -> 过滤该题型；未指定 -> 按题型轮转（综合分析->应急应变->人际关系->组织计划->自我认知->言语表达->通用）
- 一次选出 **2-3 个候选**，用弹窗选择题让用户挑（选项即候选 + "都不要，换一批"），**不要让用户打字**
- 索引外补充热点技巧时须在 JSON 里 `added:true` 标记
- 候选必须能说清三件事：**读者卡在哪里、这期教会什么、本地依据是什么**（src 文件 + 方法论）；说不清的不进候选
- 检查索引 `_meta.dedup_notes`：换标题重复讲同一技巧的条目按记录的分工出题，不重复已发布角度
- 找不到支持原文的条目（src 错链/原文已更新未同步）不进候选，先修索引

### 步骤 1.5：写前读源（必做，缺此不动笔）

定题后、写稿前，**必须回读原文**，不能仅凭索引摘要写稿（索引只用于选题定位，摘要可能滞后于原文更新）：

1. **方法论**：读 `02-Areas/公考面试结构化培训/02_答题方法与框架/各题型方法论/<题型>_方法论提炼.md`（按 tips[].types[0] 映射）
2. **课堂讲义**：读讲义 `公考面试结构化备考讲义.md` 中该题型章节的对应小节（方法论要点 + 例题）
3. **题库案例**：读 src 指向的题库原文全文（题干、思路大纲、答题逐字稿）
4. **教师注**：题库原文末尾的教师注是适用条件，保留进本期"避坑/边界"，不得省略

内部记录四要素（写进草稿工作区，不进模板）：**原方法是什么、适用条件、关键动作、出处**（文件+小节）。资料有冲突时回查具体原文裁决，不自行拼出新口诀；不修改本地教学原文。

**读源与审稿记录必填（2026-09-08 起）**：四要素连同来源摘录（quote_excerpts）、共同题境（shared_context）、关键改动（key_change）、可照做示范（actionable_demo）、练习判据（exercise_criteria）、标题候选（title_candidates）写入 `<项目根>/scripts/_draft_tips/draft_meta.json`，并记录 `skill_version`。字段表见 `references/content-strategy.md`「读源与审稿记录」。缺这份记录，content_rules.py 拒绝放行（R0/R14）。

### 步骤 2：写技巧内容（14 个字段）

内容规范（详见 `references/content-strategy.md`，以 2026-09-06 修订版为准）：

- **标题 ≤20 字**（引擎硬上限），从痛点式/具体改法式/原栏目式 3 个候选中比较选出 1 个（候选与理由记入 draft_meta.title_candidates）；正文必须兑现标题承诺
- **一期只教一个主要技巧**，其余知识最多一句背景带过
- **单段 ≤4 行，行内 ≤30 字**，短句 8-20 字为主
- **emoji 每段 ≤2 个**，限调色板 `❗️ 🙅 ❌ ✅ 📌 💡 ⏰ 🗣`
- **普通 vs 高分对照**：同题、同身份、同条件（共同题境写入 shared_context），聚焦一个关键改动；普通版是可信的常见答法，改进版不偷加题干事实、不靠堆字取胜（去前缀后 ≤1.5 倍）
- **点评必须有据**：每条批评对应普通版一句原话；区分"没有说明X"与"说错了X"；点评不引入普通版没有的指控；绝对化断言（"群众等的不是电"类）改机制解释
- **方法教到能照做**：每期至少一个抽象要点展开为能直接问出口的具体问句，并说明答案如何影响下一步；案例中的推测标"待核实方向"
- **避坑提醒**写适用边界、常见误用和纠正动作（教师注里的权限/安全提示必须吸收进来）
- **一句话总结**是一道新场景微练习（正文没出现过的场景 + 2-3 个自检要素，含一个适用判断）
- **话题标签 5-8 个**，固定 `#公考面试 #结构化面试 #上岸`，其余按题型补，只用相关标签
- 数字必须可核验或有出处，无出处的统计一律不写；"某调查/某报告"式模糊归因不写；模拟例子标"示范"，不写"考官内心""听了就加分"等推测；真实不确定处保留条件词（"可能""若"），推测说成确定事实才是 AI 味

### 步骤 2.5：去 AI 味儿（必跑）

写完初稿 -> **必跑 human-writing** -> 才能进 pending_tips.json。硬步骤，不可跳过。

重点扫：公考 AI 高危词（体现/彰显/凸显/深入推进/全面落实）、三段式凑数、破折号清零、否定式排比最多 1 处、模糊归因、万能收束。

**边界（冲突处理）**：human-writing 的"正文严禁冒号"等通用红线**不适用于本 skill 的固定格式**。各字段前缀（"适用题型：""第一步：""普通答法：""点评：""避坑提醒："）是模板契约的一部分，human-writing 只改**冒号后的正文措辞**；不得动前缀、不得删改 hashtag 内容与数量、不得给标签行加标点、不得动 emoji 摆位。

**优先路径**：触发 human-writing skill 对 14 个字段逐个/合并重写。**降级**：调用失败时按 content-strategy.md「去 AI 化红线」手动改写，并在工作目录写 `human-writing_fallback.txt` 标注。

**去 AI 味后回核原方法（必做）**：改写完成后对照步骤 1.5 的读源记录再过一遍——术语、条件和方法含义不能在改写中丢失或走样；纠正空泛表达，但不把正常公考用语一律当禁词误杀；关键条件缺失就补回，宁可少"顺"一点也要保方法完整。

**内容自检（进 pending 前必跑，--meta 必填）**：

```bash
python3 <本skill目录>/scripts/content_rules.py --pending <pending路径> --meta <draft_meta路径>
```

退出码 0 才进独立审稿；非 0 按报错改内容。覆盖：标题兑现、对照条件一致、点评有据、偷加事实、两点/多点方法、适用边界、模糊归因、无虚构推测、总结是新场景练习、读源与审稿记录完整性。

**独立审稿（程序自检之外，必做，2026-09-08 起）**：content_rules.py 认词语线索，**不能替代语义审查**。换一个不带写稿记忆的视角（或评审代理）核五项：①标题兑现 ②点评依据（批评对应普通版原话、无偷换身份/条件）③方法含义（边界内关键条件未丢、抽象要点至少一个能照做）④边界（适用/不适用/教师注齐）⑤练习可作答（新场景所需知识正文已讲清）。审稿结论写入 draft_meta 的 `review_conclusion`；**没有"通过"不得标记内容合格**，发现问题回改重审。

**🔴 CHECKPOINT · STOP** -> 把前后对比关键改写点（3-5 处）展示给用户，弹窗确认（"够自然，继续" / "还是像AI，再调"）。

### 步骤 3：写 pending_tips.json（恰好 14 个顶层 key）

写入 `<项目根>/scripts/pending_tips.json`（UTF-8 无 BOM）。schema（全部非空字符串，缺一/多一都会被引擎拒绝）：

```json
{
  "tip_title": "应急应变别再平均用力，先排序再出招",
  "question_type": "适用题型：应急应变题",
  "tip_intro": "破题角度：考官看的是轻重缓急的排序能力，不是面面俱到。",
  "step1": "第一步：先定优先级，把最紧急、最伤人的事排第一。",
  "step2": "第二步：止损优先，先把事态控制住，再谈调查和追责。",
  "step3": "第三步：处置加善后闭环，给结果也给交代。",
  "case_normal": "普通答法：遇到这种情况，我会第一时间安抚群众情绪，请大家耐心等待，同时上报领导，争取尽快处理好。",
  "case_normal_note": "点评：全程只有\"耐心等待\"和\"尽快处理\"两句空话。没有说哪些信息已确认、下一次什么时候有消息，群众只能一直等。",
  "case_high": "高分答法：示范。同样的事，我会广播三句：已确认的是大厅暂停办理、抢修已在进行；原因和恢复时间尚未查明；比如 30 分钟后再通报一次进展。",
  "case_high_note": "点评：改动只有一处：把话拆成已确认、未知、下一次通报节点三段。从\"等消息\"变成\"到点有消息\"，信任有了抓手。",
  "pitfalls_lead": "避坑提醒：",
  "pitfalls": "别把\"不承诺\"做成\"不回应\"，已确认信息一句不能少；安全风险没排完先排险，再谈广播；若供电部门已确认恢复时间，就直接告知，不必故意含糊。",
  "tip_takeaway": "练习：换成汛期断网场景，写出你广播的第一段话，自查三样：已确认、未知、通报节点是不是各说各的、没混在一起？",
  "hashtags": "#公考面试 #结构化面试 #应急应变 #答题技巧 #上岸"
}
```

示例已经按 v2.2.0 规则写：点评批评的是普通版原话里真实缺失的东西（"没有说…"，不是"说错了"）；高分版的"30 分钟"带"比如"示例标记；总结是新场景练习；避坑保留条件词"若"。**draft_meta 里 review_conclusion 未写"通过"前，这份 JSON 不许进步骤 4。**

**【JSON 引号陷阱】**：字符串内部只用中文双引号""或转义符 \\"，不要 ASCII 双引号嵌套。推荐用 Python `json.dump` 生成。

### 步骤 4：跑引擎（唯一执行入口）

```bash
python3 <本skill目录>/scripts/fill_tips_post.py --project-root "<项目根>"
```

退出码契约：

| 退出码 | 含义 | 处理 |
|--------|------|------|
| 0 | 成功，模板已原子替换，pending 已清理 | 进步骤 5 |
| 1 | 环境错误（pending 缺失 / 模板缺失或损坏） | 修环境后重跑，模板未被动过 |
| 2 | pending JSON 无效（语法 / UTF-8 / 缺字段 / 多字段 / 标题超 20 字） | 按报错改 JSON 后重跑 |
| 3 | 写入后验证失败（结构 / 内容 / **样式指纹漂移**） | 模板字节不变，按 errors 改内容后重跑 |
| 4 | 模板已替换但 pending 清理失败 | 模板已**自动回滚**为写入前字节，pending 保留；修 scripts 目录权限后重跑即可 |

**安全保证**：引擎先写临时文件、验证（结构 + 内容 + 逐段样式指纹 pPr/rPr 零漂移）通过后才原子替换模板；任何失败（含退出码 4 的清理失败，自动回滚）模板字节不变，pending 保留排查。写入前自动生成快照。

### 步骤 5：更新完成记录 + 渲染检查 + 报告

1. 把本次技巧 id 追加进**项目根** `scripts/progress_tips.json` 的 done_ids
2. **渲染检查**：按约 375 像素手机宽度检查无截断/重叠、对照与点评关系清楚。本机无 Word/WPS 时 textutil + 无头 Chrome 属**近似渲染**，只能查内容顺序与溢出，结论如实记入 draft_meta 的 `render_check`（"近似通过"或"发布端通过"）；只有近似结果时，发布前在发布端复核才算闭环。过密时删重复解释，不删关键条件
3. 报告：技巧标题 + 题型 / docx 路径 / 引擎验证结果（exit 0 = 段数 18 / 图 4 / 样式 / 14 字段全命中）/ 去 AI 味儿自评 / 审稿结论与渲染结论
4. **发布后第 7 天**：把阅读数、收藏数记入**项目根** `scripts/tips_metrics.json`（口径：收藏率 = 收藏 ÷ 阅读，同时看阅读量；先积累同版本基线再比较，模板见该文件）

### 步骤 6：上传 IMA（可选，仅用户明确要求时执行）

**默认不做**。只有用户明确说"同步/上传 IMA"才执行：

1. 构造标题 `{技巧关键词}_{YYYYMMDD_HHMMSS}`，把步骤 3 内容格式化为 Markdown（H1 为标题）
2. 写临时 md 到系统临时目录，调用：

```bash
node <本skill目录>/scripts/upload_to_ima.js "<临时md路径>" "<笔记标题>" [--fresh]
```

3. 退出码：0 = 笔记 + 知识库同步成功（含幂等复用；文件夹缺失降级库根目录仍为 0）；1 = 用法/文件错；2 = 依赖缺失或笔记创建失败；3 = 笔记成功但知识库同步失败（note_id 已给出，报告中如实标注）
4. **幂等保证（防重复建笔记）**：脚本在 md 同目录维护 `.ima_upload_state.json`。笔记创建成功立即落盘，此后任何失败重试都**复用 note_id 续做，绝不重复创建**；已完全成功的同 md 同标题重跑 = 零 API 调用直接成功（JSON 含 `"reused": true`）。确要重建新笔记时加 `--fresh`。失败重试无需等待，直接重跑同一条命令即可。

## 模板铁律（唯一结构契约）

**字体铁律**：模板字体已统一为通用字体，不要引入云字体或内嵌字体文件。段位/样式/脚本行为全部以此表为准：

| 段位 | 内容 | 引擎行为 |
|------|------|----------|
| 段[0] | 封面文本框（"结构化答题技巧："前缀 + 大标题，2 镜像） | 替换标题，前缀 2 处同步 |
| 段[1] | "答题思路"蓝色标题（Heading 2） | 不动 |
| 段[2] | 适用题型（无项目符号） | 替换 |
| 段[3] | 技巧一句话（破题，无项目符号，首行缩进 2 字符，#85120F） | 替换 |
| 段[4-6] | 思路步骤 3 步（圆点项目符号） | 替换 |
| 段[7] | "怎么答？"蓝色标题（Heading 2，无 pageBreakBefore） | 不动 |
| 段[8] | 普通答法 | 替换 + 段首自动 🙅♂️ |
| 段[9] | 普通答法点评（Markdown 引用块 + 浅灰底 #F2F2F2） | 替换 |
| 段[10] | 高分答法 | 替换 + 段首自动 👍 |
| 段[11] | 高分答法点评（同段[9]） | 替换 |
| 段[12] | "避坑提醒："蓝色标题 | 替换 |
| 段[13] | 避坑内容（加粗下划线） | 替换 |
| 段[14] | 一句话总结（加粗下划线） | 替换 |
| 段[15] | 话题标签（endnote text，12pt 小字） | 替换 |
| 段[16] | 引流段（endnote text + 橙色加粗居中） | **不动**（保留原文） |
| 段[17] | 末尾装饰图 | 不动 |

## 失败处理

1. **不要慌**：引擎任何失败都不会写坏模板（原子替换 + 失败字节不变）
2. 看退出码和 `[ERROR]` / `[FAIL]` 信息定位（字段名、上限、段位都点名）
3. pending 在失败时保留，改完直接重跑
4. 需要人工回退时：从 `<项目根>/scripts/_snapshots_tips/` 复制最新 snapshot 覆盖回模板路径

## 回归测试（改引擎/模板/测试后必跑）

```bash
python3 <本skill目录>/scripts/test_fill_tips_post.py
```

- 测 skill 内引擎，真实项目通过 `TIPS_TEST_PROJECT_ROOT` 环境变量注入（默认为 Pre-flight ① 的路径），**全程只写临时副本**，结束校验真实模板 sha256 不变
- 18 个用例：黄金路径全契约+样式指纹零漂移 / 缺字段 / 多字段 / 超长标题 / 坏 JSON / 模板损坏 / 无 pending / 模板缺失 / env 传根 / **样式损坏拦截** / **pending 清理失败回滚（exit 4）** / IMA 用法错误 / IMA 文件缺失 / IMA 依赖缺失 / **IMA 笔记失败** / **IMA KB 失败重试不重复建笔记** / **IMA 成功幂等复用** / **IMA --fresh 强制重建**
- **沙箱纪律**：所有 IMA 用例强制 `IMA_API_PATH` 指向本地 fake stub（`_fake_ima_api.cjs`），**绝无真实网络调用、绝不创建真实笔记**；筛选 0 用例即失败退出（exit 1），不允许假绿

内容自检器另有一套独立自测（与引擎测试互补，冻结测试不受影响）：

```bash
python3 <本skill目录>/scripts/test_content_rules.py
```

- 33 个用例：索引错链 / 来源缺失 / 标题未兑现 / 对照堆字 / **1.5× 边界** / 对照偷换条件 / **点评凭空指控（停电反例）** / **"没说明 vs 说错"正例** / **点评无锚点** / **偷加数字事实** / 两点方法造第三步 / 四点方法丢关键条件 / **五点方法漏教** / 遗漏适用边界 / 虚构推测与无出处统计 / **模糊归因（某调查）** / **来源不符** / 总结不是练习 / **空洞反问** / **回顾式练习** / 正常公考用语与条件词不误杀 / **读源记录缺失（R0）** / **审稿记录不全与审稿未通过（R14）** / 标题候选句式放行
- `test-prompts.json` 已冻结（TP1 指定题型 / TP2 轮转 / TP3 失败边界），修改需开新版本

## 脚本行为要点（避坑）

1. **不预设 run[0] 是文本 run**：找"第一个纯文本 run"写入，图片 run 完全不动
2. **封面改 2 处**：drawing 镜像 + VML fallback 都要同步
3. **emoji 由引擎自动加**：段[8] 🙅♂️、段[10] 👍 写在 EMOJI_PREFIX 里，别写进 JSON
4. **段[3] 首行缩进 2 字符**（firstLineChars=200），段[9]/[11] 浅灰底色不动 shd
5. **看 docx 段数**：`python3 -c "from docx import Document; print(len(Document('路径').paragraphs))"`
6. **看文本框/图片/分页**：分别搜 `<w:txbxContent>` / `<w:drawing>` / `<w:pageBreakBefore>`
7. **写 json 用 Python `json.dump`**，避免手写引号嵌套错
8. **样式指纹零漂移**：引擎写入前后逐段对比 pPr/rPr XML（含封面文本框内段落），任何字体/字号/颜色/对齐变化即验证失败（exit 3），杜绝"文本对了样式坏了"的假绿

