# Structured Post

> 自动化生成"结构化每日一练"小红书/公众号帖子 docx。基于固定 docx 模板 + python-docx 脚本，自动替换题目文本框、正文段落、分页符，并保留配图/引流段样式。出题 + 审题读方法论 + 答题 + 套版式一气呵成，答题须经 human-writing 去 AI 味儿并做改写后内容复核。触发词：答一道、出题、做一篇结构化帖子、每日一练。

- Skill: `rshawn0307-maker/structured-post` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add rshawn0307-maker/structured-post`
- Raw SKILL.md: https://api.skillmd.com/api/skills/rshawn0307-maker/structured-post/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-post

---


# 结构化每日一练·自动化帖子生成

## 适用场景

用户要做"公务员结构化面试·每日一练"系列小红书/公众号帖子，需要：
1. 出题 + 审题 + 答题（结构化面试，总分总，正文 800—1000 字，去 AI 味儿后）
2. 自动套入固定 docx 模板（含配图 + 引流文案）
3. 保留模板所有版式（封面文本框、分页符、引流段样式）

## 触发条件

用户说以下任意一种：
- "答一道"
- "出题"
- "做一篇结构化帖子"
- "每日一练"
- 类似表述

## 必看·Pre-flight 检查（🔴 STOP — 开干前 60 秒必跑，缺一不开工）

**3 件事不验证就动手 → 必踩坑**：

### ① 项目路径核实

**项目根**（本 skill 的「工作区根」）= `<项目根>\01-Projects\自媒体内容库-持续项目\结构化`
（Obsidian vault `AI工作区` 下；自媒体库已作为长期项目归档于此。下文 `<项目根>` 均指此目录；`<项目根>` 为占位符，原为旧 Windows 路径 `C:\Users\keira\Desktop\AI工作区`，使用前替换为本机实际路径）

`<项目根>` 下应有 `scripts/fill_structured_post.py` + `desktop-attachments/1 结构化每日一练-帖子内容编辑模板.docx`。

```bash
ls "<项目根>/scripts/fill_structured_post.py" \
  && echo "✅ 路径正确" \
  || echo "❌ 路径错，找老板确认"
# 🔴 STOP if ❌ — 路径不对不要开工
```

> **注**：脚本用 `__file__` 自定位（`WORKSPACE = SCRIPT_DIR.parent`），不依赖 cwd，cd 到哪都能跑；Pre-flight 只需确认脚本文件本身存在。

**方法论根**（步骤 1.5 审题要读取的本地方法论）= `<方法论根>` = `AI工作区/02-Areas/公考面试结构化培训/02_答题方法与框架`（与项目根同一个 vault，下文 `<方法论根>` 均指此目录）。

```bash
ls "<方法论根>/各题型方法论/" | grep 方法论提炼
# 期望 6 个文件（六大题型各一）
# 🟡 缺失时不中断生成：跳过读文件，改用本文"论证规则"内置要求写作，并在报告中标注"方法论未读取"
```

### ② 模板铁律

工作区里如果同时有 `2 展开说说-帖子内容编辑模板.docx` + `fill_zhankai_post.py`，那是另一套（"展开说说"系列），**别混用**。本 skill 只管"答一道"系列。
# 🔴 STOP if 混用 — 脚本不通用，跑错模板会破坏版式

### ③ Python 环境核实

```bash
python -c "import docx; from docx import Document; print('docx', docx.__version__)"
# 期望输出：docx 1.2.0（python-docx 包）
```

**【包名陷阱·重要】**：`pip install docx` 会装**同名垃圾包 0.2.4**（不支持 Python 3，会报 `ModuleNotFoundError: No module named 'exceptions'`）。**必须装 `python-docx`**：

```bash
pip install python-docx
# 验证：python -c "import docx; print(docx.__version__)"  → 1.2.0
# 🔴 STOP if ModuleNotFoundError — 装 python-docx（不是 docx）后重试，仍失败则换 workbuddy venv
```

## 文件清单

| 路径 | 用途 | 注意事项 |
|------|------|----------|
| `<项目根>/desktop-attachments/1 结构化每日一练-帖子内容编辑模板.docx` | 模板（覆盖写入目标） | **绝不能改文件名/移动位置** |
| `<项目根>/scripts/fill_structured_post.py` | 主脚本（"答一道"专用） | — |
| `<项目根>/scripts/pending_answer.json` | 中间文件 | 脚本读取后自动删除 |
| `<项目根>/模板文件/1 结构化每日一练-帖子内容编辑模板.docx` | 源模板副本（基线备份） | 脚本 `BACKUP_PATH` 另指 `scripts/_backup_template_原版.docx`，该文件当前缺失，"图片分布对比校验"自动跳过，不影响产出 |
| `<项目根>/scripts/_snapshots/` | 自动快照 | 保留最近 10 个，超出按修改时间倒序清理 |

**快照机制**：脚本每次跑前自动生成 `snapshot_YYYYMMDD_HHMMSS.docx`。**跑挂不要慌，snapshots 里一定有最新可回退版本**。

> Python 环境见 Pre-flight ③，不在此重复。
## 工作流（出题 → 审题 → 答题 → 去AI味儿 → 内容复核 → 套版式 → 上传，一步不跳）

### 步骤 1：自出题

要求：
- **题干必须 ≤80 字（硬上限）**——踩坑后立的规矩；超过 80 字阅读节奏断档、热点反差感丢失
- **选题优先从近期热点且适合结构化题目的话题着手**：先搜近期新闻/政策/社会现象，挑有矛盾张力、能多角度展开的题材；避免过于专业的岗位题
- 热点话题、政策类、社会现象为首选题材
- 避免过于专业的岗位题；用户指定岗位时按指定岗位出题
- **写完题干先 `len(question)` 自检**，**超就砍**，**别等用户指出**

**🔴 CHECKPOINT · STOP**：题干确认 → 用 `AskUserQuestion` 弹窗选项让用户确认（选项如："OK，继续"、"换一道"），**不要让用户打字**。用户选"换一道"→ 回到本步骤重出题。

### 步骤 1.5：审题 + 读方法论（写大纲前必做，🔴 本 skill 与"随手写一篇"的分水岭）

题目确认后**不要直接写大纲**。先做两件事，结论写给自己看（不进正文），但要落实到大纲和正文里。

**① 审题**——从题干逐项识别：

| 维度 | 要识别什么 |
|------|-----------|
| **设问** | 问的到底是什么（怎么看 / 怎么办 / 怎么组织 / 怎么沟通）？有没有"重点针对XX""你会怎么处理"这类限定？ |
| **身份** | 我在题里是谁（考生 / 事件当事人 / 某岗位工作人员）？权限边界在哪，哪些事不归我管？ |
| **对象** | 对谁说话、处理谁的什么诉求？多方诉求要逐一列出 |
| **限制条件** | 题干给定的事实与前提（资源、时间、已发生的事、矛盾现状）——正文不能丢、不能改、不能加 |
| **主要争点** | 这道题真正拉开差距的 1—2 个关键问题（如"程序正义 vs 名誉恢复""经营诉求 vs 居住安宁"）——正文优先答透的就是它们 |

**② 读对应方法论**——按题型读 `<方法论根>/各题型方法论/<题型>题_方法论提炼.md`（如综合分析读 `综合分析题_方法论提炼.md`），需要例题参照时再看 `<方法论根>/答题框架模板/答题框架模板_六大题型提炼.md` 和 `<方法论根>/讲义/` 对应章节。读完从中**选出本题适用的 3—5 项要求**带进写作，并想清楚每项为什么适用于这道题——不是证明"读过文件"。

**方法论取舍规则（重要，防止被带偏）**：
- 方法论是从样稿提炼的，里面的金句、排比、数字、场景是**可选技巧**：用不用、用几处，服从本题论证需要。文件里凡"每篇至少X个金句/排比/数字/场景"的频次要求，**一律不作硬性要求**
- 四项优先标准：**依据充分、推理成立、措施针对、表达清楚**——所有技巧服从这四项，冲突时砍技巧保论证
- 方法论里的示范句式、人物、数字在题干没有支持时，**不得当作事实材料或本人经历搬用**（"似真实"的引语也不能当事实写）

### 步骤 2：写大纲 + 答题初稿

把步骤 1.5 的审题结论落成大纲，再往正文承载块里装内容。**先组织逻辑，再写文字**。

#### 大纲要求（大纲是教学件，不是答案摘要）

- **破题角度**后用一句话说明**为什么从这个角度切入**：题干哪个信息、哪个争点决定的。让学员学到的是"换一道题怎么找角度"，不是背结论
- 三个核心观点要呈现**分析关系**（递进 / 并列 / 按时间轴），让读者看得出观点从哪来
- **不为凑三点灌水**：模板固定 3 个观点位，若素材只够两个实质角度，回步骤 1.5 换角度或换展开结构，而不是把第三个观点写成注水段
- 观点与正文三个 point 块一一对应；改稿先改大纲再改正文，两边保持一致

#### 正文承载与篇幅口径

- 正文承载块固定：opening → 第一/第二/第三（lead + body）→ closing
- **篇幅唯一口径：正文 = opening 至 closing 全部文字（含标点），不含题干与大纲，目标 800—1000 字**
- 低于 800 字先补论证和措施的适用条件，不是补套话；逼近 1000 字优先砍次要措施
- **不承诺口述时长**：没有录音实测就不报告"X 分钟内能答完"，最多按字数折算并注明是估算

#### 核心观点展开方式（按题型选择，写大纲时定）

| 展开方式 | 适用题型 | 结构 |
|----------|---------|------|
| **3 观点结构** | 综合分析/自我认知/言语表达 | 3 个并列观点，每个有论据+论点 |
| **时间线结构** | 组织计划/应急应变 | 事前准备 -> 事中执行 -> 事后复盘 |
| **多维分析结构** | 综合分析政策类 | 个人层面 -> 社会层面 -> 政府/制度层面 |

选题后根据题型自动匹配展开方式，不要所有题都套"3 观点"。

#### 论证规则（综合分析从严，其余五类保底）

**综合分析按子题型**：
- **社会现象题**：解释现象**怎么形成、靠什么持续**（从激励结构、成本收益、信息差、监管难度等机制里挑本题最相关的说透），不能停在"这种现象不好"
- **政策理解题**：解释政策**作用路径**（改变了谁的成本/收益/行为，怎么传导到目标问题）和**实施条件**（钱、人、权责、配套），不能从"方向正确"直接跳到"问题已经解决/历史任务完成"这类大结论
- **观点理解题**：先解释观点的**含义和适用边界**（什么条件下成立、何时失效），再表态；不做单因归因，不下比论证走得更远的断言

**综合分析通用**：
- 核心判断要有题干事实、公认事实或完整推理链支撑；单个间接证据（如一处交易量数据）推不出制度性结论时，补齐中间环节或收窄结论
- **每条关键措施要能回答"它解决前面分析的哪个问题"**——对不上的措施砍掉或降为补充
- 一段话删掉题干关键词后仍能原样套进大量同类题，说明是模板段，重写

**其余五类（最低要求，细则读各自方法论）**：

| 题型 | 最低要求 |
|------|---------|
| 组织计划 | 明确对象、实施难点、资源条件和效果判断 |
| 人际关系 | 区分事实与猜测，沟通服务于解决工作问题，保留原则边界 |
| 应急应变 | 按紧迫程度安排动作，明确条件分支和本人权限 |
| 自我认知 | 用真实经历体现个人选择、行动与改变；**没有用户提供的材料时不冒写亲历** |
| 言语表达 | 直接进入角色，回应对象顾虑，不写成"我将如何沟通"的说明稿 |

#### 内容风格铁律（必须满足）

答题不是写作文，是"考场口述"。要的是高分感，不是字数堆砌。**6 条不可妥协**：

1. **有观点**——敢说"我认为""本质是""核心矛盾是"，别用"客观来说""值得我们思考"这种和稀泥
2. **有逻辑**——每段要有"承上 → 启下 → 落到点"的内部节奏，别三段孤立
3. **有表达**——节奏有快有慢，长短句交替；避免每段都"第一""第二""第三"机械
4. **避免套路**——不写"领导让我干这个、领导让我想这个"那种万能套话
5. **拒绝假大空**——不写"体现了……彰显了……标志着……"那种注水标语
6. **有深度、可操作、接地气**——观点要落到具体抓手（数据、案例、动作），不说虚的

**白话原则**：写完大声读一遍——读起来像"人话"再继续，读起来像"作文"就重写。


### 分题型高分要素差异化

不同题型考官看的核心不同，逐字稿侧重点要跟着变：

| 题型 | 考官最看重的 | 逐字稿侧重点 | 常见失分点 |
|------|------------|-------------|-----------|
| **综合分析** | 分析深度，透过现象看本质 | 重"本质+机制+对策"递进，观点要有判断力 | 停在现象层，缺机制分析 |
| **组织计划** | 流程完整性 + 可落地性 | 按"事前准备/事中执行/事后复盘"时间线展开，对策要有具体抓手 | 万能模板"领导交给我"，缺细节 |
| **人际关系** | 情商 + 原则性平衡 | 重"情理法"平衡：先理解对方 -> 再分析矛盾点 -> 给出兼顾方案 | 一味忍让或一味对抗 |
| **应急应变** | 轻重缓急排序 + 快速反应 | 按"止损/调查/处置/善后"优先级展开，先解决最紧急的 | 平均用力，没排序 |
| **自我认知** | 真实性 + 岗位匹配度 | 用具体经历支撑观点，不说空话"我很努力" | 假大空自我表扬 |
| **言语表达** | 感染力 + 对象感 | 有"对人说话"的对象感，不是背稿，注意语气身份适配 | 背演讲稿腔调 |
#### 公考面试用语禁忌（避免踩雷）

公考面试是正式场合，**用语得体、政治正确、考官听得进**——是比"有观点"更基础的红线。**4 类不要写**：

1. **不要带贬义色彩的比喻词**：落水狗、狼狈、龟孙、痛打、狼狈为奸等
2. **慎用网络流行词**：韭菜、小白、键盘侠、内卷、摆烂、躺平、yyds、绝绝子等
3. **慎用情绪化表达**：气死、笑死、巨坑、血亏、无语、离谱等
4. **不要有政治风险**："上面""领导拍脑袋""上面不作为"等不指明的吐槽；涉及民族、宗教、性别等要中性得体

**白名单替换原则**：
- 想用比喻 → 改成中性描述（如"落水狗"→"整治覆盖得了的只是显性摊位"）
- 想用网络词 → 改成书面表达（如"内卷"→"过度竞争"、"躺平"→"消极应对"）
- 想吐槽 → 改成建言（"运动式执法难持续"已经是建言式吐槽，OK）

**自检**：写完最后一遍**"考官读出来不得罪人"**——能过即可继续；任何一句读出来让考官皱眉或"笑场"，重写。

### 步骤 2.5：去 AI 味儿（必跑，套用 human-writing）

**写完初稿 → 必跑 human-writing → 过步骤 2.6 内容复核 → 才能进 pending_answer.json**。这是硬步骤。

操作：
`
触发 human-writing skill，对 8 个答题字段逐个 / 合并重写
`

重点扫（以 human-writing 现行硬禁令为准，只处理禁令命中的句子）：
- "标志着""彰显了""体现了""不断演变的"等 AI 标志性短语
- 破折号清零（"——"一律改逗号或句号，human-writing 硬禁令）
- 中文/英文冒号清零（引出人物直接原话、网址、代码与机器字段除外）
- 模糊归因（"专家认为""业内人士表示"）
- 否定式排比与翻案腔（"这不仅仅是……而是……""不只……还……""表面……实际……""说到底"等，human-writing 已禁）

**两条防过度修改的纪律**：
- **正常的三项列举不改**。"A、B、C"是自然的中文列举，只有当全文段落节奏机械雷同（每段都是同构三连）时才调整节奏，且不许因此增删内容
- **不强制固定收尾词**：收尾如果只剩模板腔（"总之/综上所述"开头、后面没有新信息），重写成有内容的收束；收束用什么词由内容决定，不用"说到底"（禁）

**写完 human-writing 版后自检**：
- 总字数按步骤 2 唯一口径（opening 至 closing，含标点）仍在 **800—1000**
- 读起来像人话（用 human-writing 的 scripts/check_prose.py 检查，同仓库安装时位于 `../human-writing/scripts/check_prose.py`；冒号/破折号/翻案腔按 human-writing 最新版硬禁令，全部清零）

详细规则参见 human-writing skill 的 SKILL.md（同仓库安装时位于 `../human-writing/SKILL.md`；若在其他位置则以实际安装路径为准）。

**优先路径**：直接触发 human-writing skill 对 8 个答题字段逐个/合并重写。

**降级触发条件**（仅以下情况走降级）：
- skill 调用报错 / 输出为空 / 输出未包含任何改写
- 此时按以下 5 条内联规则手动检查并重写：
1. **删 AI 标志性短语**：搜索"标志着""彰显了""体现了""不断演变的""发挥了重要作用"→ 删除或改写为具体动作
2. **清破折号和冒号**：搜索"——""："与":" → 全部改逗号或句号（引出人物直接原话、网址、代码与机器字段除外）
3. **改模糊归因**：搜索"专家认为""业内人士表示""有观点认为"→ 改为具体来源或删除
4. **破否定式排比**：搜索"这不仅仅是……而是……""说到底"→ 改为直述句，判断从正面下
5. **重写空收束**：收尾只有"总之/综上所述"+空话时，改为有内容的收束（具体行动或价值落点），不强制固定开头词

**降级自检**：写完读一遍，读起来像"考场口述"而非"AI 生成文"——能过即可继续。
**降级标注**：在 pending_answer.json 同目录写一个 `human-writing_fallback.txt`，内容"human-writing unavailable, used inline rules"，让后续审阅者知道走的是降级路径。

### 步骤 2.6：改写后内容复核（必过，防"改写丢内容"）

去 AI 味儿是文字手术，可能顺手切掉论证。拿改写稿对照初稿逐项核对，**五项全过才进步骤 3**：

1. **事实与出处**：改写稿没有新增初稿没有的事实、数字、引语；引用性表述没有被升级为断言
2. **观点强度**：结论没有被放大——"有助于降低X"不能变成"X从此解决"，有条件的判断不能变成绝对断言
3. **因果链**：初稿的机制解释（为什么 → 怎么传导 → 所以）在改写稿里仍然完整，没有被压缩成口号
4. **动作与限制条件**：措施的适用范围、实施主体、"先A后B"的顺序没有被删改
5. **设问回应**：步骤 1.5 列出的每个主要设问/争点，在改写稿里仍有对应段落

任何一项不过：回到该句，先恢复它原本要表达的事实，再按 human-writing 规则重新表述——不是机械回滚，也不为凑禁令清零而牺牲内容。**改后只有换词变化、没有内容改善，不认定复核通过。**

**🔴 CHECKPOINT · STOP**：去AI味儿 + 内容复核确认 → 把 humanize 前后对比的关键改写点（3-5 处）和复核五项结论展示给用户，用 `AskUserQuestion` 弹窗选项让用户确认（选项如："够自然，继续"、"还是像AI，再调"），**不要让用户打字**。用户选"还是像AI"→ 重跑 human-writing 或手动调整，并重走步骤 2.6。

### 步骤 3：写 pending_answer.json

按以下 schema 严格填写（12 个顶层 key）：

```json
{
  "question": "题面文本（不带"结构化每日一练："前缀）",
  "break_angle": "破题角度：...（含一句切入理由：题干哪个信息/争点决定的）",
  "core_views_intro": "核心观点（3 个）：",
  "core_views": ["1. xxx", "2. xxx", "3. xxx"],
  "opening": "首段（破题后第一句）",
  "point1_lead": "第一，...",
  "point1_body": "展开论述...",
  "point2_lead": "第二，...",
  "point2_body": "展开论述...",
  "point3_lead": "第三，...",
  "point3_body": "展开论述...",
  "closing": "收束段（自然收口，不强制固定开头词）"
}
```

写入路径：`<项目根>/scripts/pending_answer.json`（**写之前先跑 Pre-flight #① 确认父目录**）

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

```python
import json
data = {"question": "题干...中文双引号直接用"}
with open('pending_answer.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
```

### 步骤 4：跑脚本

```bash
cd "<项目根>"
python scripts/fill_structured_post.py
```

期望输出：
```
[0/4] 快照备份: snapshot_YYYYMMDD_HHMMSS.docx
[1/4] 读取待写入内容: ...
[2/4] 写入 段[0] 文本框题目（修改了 2 个）
[2.5/4] 写入 13 个段位（正文）
[2.6/4] 锁定版式：段[7] 正文首段强制 pageBreakBefore
[3/4] 保存
[4/4] 自动验证 → ✅ 全部通过
```

### 步骤 5：向用户报告

报告内容：
1. 题目已生成（题干文本 + 字数）
2. 审题要点：设问 / 身份 / 主要争点（一两行；方法论未读取时在此标注）
3. 大纲已生成：破题角度 + 切入理由 + 3 个观点 + 采用的展开结构
4. .docx 已更新，路径在：
   ```
   <项目根>/desktop-attachments/1 结构化每日一练-帖子内容编辑模板.docx
   ```
5. 验证通过项：段数 17 / 5 张图保留 / 引流段样式保留 / 文本框 2 个镜像同步 / 段[7] pageBreakBefore
6. 内容复核：五项全过（有修复的注明修了什么）
7. **去 AI 味儿自评**（human-writing 硬禁令 + 读感）：冒号/破折号/翻案句/黑话/路标清零，读起来像人话

报告纪律：正文页数与字数按唯一口径报；**不报告口述时长实测**（无录音只有折算估算，注明即可）。

### 步骤 6：上传 IMA 笔记

脚本跑完、验证通过后，将答题内容上传到 IMA 笔记。**不存本地 md 文件**，直接上传。

**操作**：
1. 生成时间戳 `YYYYMMDD_HHMMSS`（如 `20260712_153000`）
2. 构造笔记标题：`{题目梗概}_{timestamp}`（从 question 字段提取关键词，如 `指尖形式主义_20260712_153000`）
3. 将步骤 3 中 `pending_answer.json` 的内容格式化为 Markdown（H1 标题为笔记标题，含题干、思路大纲、答题逐字稿各字段）

**Markdown 格式**：
````markdown
# {笔记标题}

## 题干
{question}

## 答题思路
**破题角度**：{break_angle}

**核心观点**：
{core_views 逐行}

## 答题逐字稿
{opening}

{point1_lead}
{point1_body}

{point2_lead}
{point2_body}

{point3_lead}
{point3_body}

{closing}
````

4. 写临时 Markdown 文件到工作区临时目录，然后调用本 skill 的 IMA 上传脚本（避免 PowerShell 引号问题）：

```bash
node <skill目录>/scripts/upload_to_ima.js "<临时md文件路径>" "<笔记标题>"
```

**IMA 上传失败重试**：如果 `upload_to_ima.js` 返回 `⚠️ IMA上传失败`，检查 `ima_api.cjs` 是否存在 + IMA 登录状态。重试 1 次；仍失败则跳过上传，本地已跑完脚本不受影响，在报告中标注"IMA 未同步"。

**IMA TLS 证书自愈（2026-08-22 固化，无需手动干预）**：`ima.qq.com` 服务器证书链不完整且其根证书不在 node 内置 CA 库中，node fetch 会报 `fetch failed`（根因 `unable to get local issuer certificate`）。已修复：`scripts/_ima_ca_bundle.pem`（中间证书 + 根证书）随 skill 分发，`upload_to_ima.js` 启动时自动检测并带 `NODE_EXTRA_CA_CERTS` 重启自身（输出 `♻️ 启用 TLS 证书包` 即生效）。若报 `⚠️ 未找到 _ima_ca_bundle.pem`，说明证书包被删，从 skill 源仓库（rshawn-skills）的 `skills/structured-post/scripts/` 重新同步即可；也可自行重建，从证书 AIA 地址（cacerts.digicert.cn）下载 DigiCert 中间证书与 Global Root G2 根证书，转成 PEM 拼接为同一文件。诊断要点：curl 能通不代表 node fetch 能通（macOS 会自动补证书链，node 不会）。

**注意**：`pending_answer.json` 已被脚本删除，使用步骤 3 写入时保留在上下文中的内容。笔记创建或知识库同步失败均不阻断主流程，在报告中标注即可。

## 模板铁律（绝对不能动）

**字体铁律**：模板字体已统一为通用字体（微软雅黑等），不依赖 WPS 云字体；不要重新引入 WPS 云字体（WPS灵秀黑、标准粗黑、方正粗圆简体）或内嵌字体文件。

| 段位 | 内容 | 脚本行为 |
|------|------|----------|
| 段[0] | 封面 + "结构化每日一练：" 文本框 | 替换题目正文，**保留前缀字体** |
| 段[1] | 标题 "答题思路" | 不动 |
| 段[2-6] | 大纲区（破题 + 3 个观点） | 替换 |
| 段[7] | 正文首段 | 替换 + 强制 pageBreakBefore |
| 段[8-14] | 正文 3 段 + 收束 | 替换 |
| 段[15] | 引流段（橙色加粗居中） | **不动**（保留原文） |
| 段[16] | 末尾装饰图 | 不动 |

## 关键修复历史（避坑）

1. **不要预设 run[0] 是文本 run**：段[6] 的 run[0] 实际是图文混合 run（含 w:drawing），必须找"第一个纯文本 run"
2. **图片 run 完全不动**：包括 `<w:drawing>` 元素和其 text（即使 text 是空的）
3. **文本框改 2 处**：drawing 镜像 + VML fallback，内容要同步
4. **pageBreakBefore 加在 pPr 里**：用 OxmlElement('w:pageBreakBefore') 干净插入，不要动 run
5. **段数恒定 17**：脚本里有校验，超出就报错（不会硬塞）
6. **JSON 引号嵌套**：用 ASCII 双引号嵌套会破坏 JSON 解析，必须用中文""或转义\"
7. **模板字体已去 WPS 化**：WPS灵秀黑、标准粗黑、方正粗圆简体已统一替换为微软雅黑等通用字体，内嵌 WPS 字体文件已删除；恢复旧模板或改样式时不要重新引入 WPS 云字体。
8. **内容工作流 v1.4（2026-09-07）**：审题+方法论接入前置为步骤 1.5；新增步骤 2.6 改写后内容复核；篇幅口径统一为"opening 至 closing 含标点，800—1000 字"，删除 800—900 旧口径与"3 分钟内"承诺；取消固定收尾词（不强制"总之"，不推荐"说到底"，human-writing 已禁）与"三项列举强制改两项/四项"；综合分析补论证规则（现象讲机制、政策讲路径与条件、观点讲边界），金句/排比/数字降为可选技巧。

## 验证清单（每次跑完必查）

```
□ 段数 = 17
□ 5 张图片全在
□ 引流段样式：加粗 + 颜色 #85120F + 居中
□ 段[0] 文本框：2 个镜像 + 前缀"结构化每日一练："完整
□ 段[7] 有 pageBreakBefore
□ 旧题关键词零残留
□ 新题关键词全命中
□ 正文 800—1000 字（唯一口径：opening 至 closing，含标点，不含题干与大纲）
□ 步骤 1.5 审题已做：设问/身份/对象/限制/争点识别过，每个主要设问在正文有回应
□ 步骤 2.6 内容复核五项通过（事实 / 观点强度 / 因果链 / 动作与限制 / 设问回应）
□ 报告无时长承诺；方法论未读取时已在报告标注
□ 去 AI 味儿标记：检查 pending_answer.json 同目录下无 human-writing_fallback.txt（有=走了降级，无=走了skill）
□ IMA 笔记已上传（note_id 已记录在报告中）
□ IMA 知识库已同步（笔记已关联到"总分总"知识库的"00_结构化每日一练"文件夹）
```

## 失败回退

如果脚本验证失败：
1. **不要慌**——snapshot 已经保存
2. 看 `[KEEP] pending_answer.json 保留` 的提示
3. 检查失败项（errors列表）
4. 回退方式：从 `<项目根>/scripts/_snapshots/` 复制最新的 snapshot 覆盖回模板路径

## 工具链速查

| 操作 | 命令/工具 |
|------|----------|
| 写 json | `write_file(path, json_string)` 或 Python json.dump |
| 跑脚本 | `terminal(command=...)` 用有 docx 的 python |
| 看 docx 段数 | `python -c "from docx import Document; print(len(Document('路径').paragraphs))"` |
| 看文本框 | 搜 `<w:txbxContent>`，找 `<w:t>` 子元素 |
| 看图片 | 搜 `<w:drawing>`，找段内分布 |
| 看 pageBreakBefore | 搜 `<w:pageBreakBefore>`，在 `<w:pPr>` 里 |

