结构化每日一练·自动化帖子生成
适用场景
用户要做"公务员结构化面试·每日一练"系列小红书/公众号帖子,需要:
- 出题 + 审题 + 答题(结构化面试,总分总,正文 800—1000 字,去 AI 味儿后)
- 自动套入固定 docx 模板(含配图 + 引流文案)
- 保留模板所有版式(封面文本框、分页符、引流段样式)
触发条件
用户说以下任意一种:
- "答一道"
- "出题"
- "做一篇结构化帖子"
- "每日一练"
- 类似表述
必看·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。
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,下文 <方法论根> 均指此目录)。
ls "<方法论根>/各题型方法论/" | grep 方法论提炼
# 期望 6 个文件(六大题型各一)
# 🟡 缺失时不中断生成:跳过读文件,改用本文"论证规则"内置要求写作,并在报告中标注"方法论未读取"
② 模板铁律
工作区里如果同时有 2 展开说说-帖子内容编辑模板.docx + fill_zhankai_post.py,那是另一套("展开说说"系列),别混用。本 skill 只管"答一道"系列。
🔴 STOP if 混用 — 脚本不通用,跑错模板会破坏版式
③ Python 环境核实
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:
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 条不可妥协:
- 有观点——敢说"我认为""本质是""核心矛盾是",别用"客观来说""值得我们思考"这种和稀泥
- 有逻辑——每段要有"承上 → 启下 → 落到点"的内部节奏,别三段孤立
- 有表达——节奏有快有慢,长短句交替;避免每段都"第一""第二""第三"机械
- 避免套路——不写"领导让我干这个、领导让我想这个"那种万能套话
- 拒绝假大空——不写"体现了……彰显了……标志着……"那种注水标语
- 有深度、可操作、接地气——观点要落到具体抓手(数据、案例、动作),不说虚的
白话原则:写完大声读一遍——读起来像"人话"再继续,读起来像"作文"就重写。
分题型高分要素差异化
不同题型考官看的核心不同,逐字稿侧重点要跟着变:
| 题型 | 考官最看重的 | 逐字稿侧重点 | 常见失分点 |
|---|---|---|---|
| 综合分析 | 分析深度,透过现象看本质 | 重"本质+机制+对策"递进,观点要有判断力 | 停在现象层,缺机制分析 |
| 组织计划 | 流程完整性 + 可落地性 | 按"事前准备/事中执行/事后复盘"时间线展开,对策要有具体抓手 | 万能模板"领导交给我",缺细节 |
| 人际关系 | 情商 + 原则性平衡 | 重"情理法"平衡:先理解对方 -> 再分析矛盾点 -> 给出兼顾方案 | 一味忍让或一味对抗 |
| 应急应变 | 轻重缓急排序 + 快速反应 | 按"止损/调查/处置/善后"优先级展开,先解决最紧急的 | 平均用力,没排序 |
| 自我认知 | 真实性 + 岗位匹配度 | 用具体经历支撑观点,不说空话"我很努力" | 假大空自我表扬 |
| 言语表达 | 感染力 + 对象感 | 有"对人说话"的对象感,不是背稿,注意语气身份适配 | 背演讲稿腔调 |
公考面试用语禁忌(避免踩雷)
公考面试是正式场合,用语得体、政治正确、考官听得进——是比"有观点"更基础的红线。4 类不要写:
- 不要带贬义色彩的比喻词:落水狗、狼狈、龟孙、痛打、狼狈为奸等
- 慎用网络流行词:韭菜、小白、键盘侠、内卷、摆烂、躺平、yyds、绝绝子等
- 慎用情绪化表达:气死、笑死、巨坑、血亏、无语、离谱等
- 不要有政治风险:"上面""领导拍脑袋""上面不作为"等不指明的吐槽;涉及民族、宗教、性别等要中性得体
白名单替换原则:
- 想用比喻 → 改成中性描述(如"落水狗"→"整治覆盖得了的只是显性摊位")
- 想用网络词 → 改成书面表达(如"内卷"→"过度竞争"、"躺平"→"消极应对")
- 想吐槽 → 改成建言("运动式执法难持续"已经是建言式吐槽,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 条内联规则手动检查并重写:
- 删 AI 标志性短语:搜索"标志着""彰显了""体现了""不断演变的""发挥了重要作用"→ 删除或改写为具体动作
- 清破折号和冒号:搜索"——"":"与":" → 全部改逗号或句号(引出人物直接原话、网址、代码与机器字段除外)
- 改模糊归因:搜索"专家认为""业内人士表示""有观点认为"→ 改为具体来源或删除
- 破否定式排比:搜索"这不仅仅是……而是……""说到底"→ 改为直述句,判断从正面下
- 重写空收束:收尾只有"总之/综上所述"+空话时,改为有内容的收束(具体行动或价值落点),不强制固定开头词
降级自检:写完读一遍,读起来像"考场口述"而非"AI 生成文"——能过即可继续。
降级标注:在 pending_answer.json 同目录写一个 human-writing_fallback.txt,内容"human-writing unavailable, used inline rules",让后续审阅者知道走的是降级路径。
步骤 2.6:改写后内容复核(必过,防"改写丢内容")
去 AI 味儿是文字手术,可能顺手切掉论证。拿改写稿对照初稿逐项核对,五项全过才进步骤 3:
- 事实与出处:改写稿没有新增初稿没有的事实、数字、引语;引用性表述没有被升级为断言
- 观点强度:结论没有被放大——"有助于降低X"不能变成"X从此解决",有条件的判断不能变成绝对断言
- 因果链:初稿的机制解释(为什么 → 怎么传导 → 所以)在改写稿里仍然完整,没有被压缩成口号
- 动作与限制条件:措施的适用范围、实施主体、"先A后B"的顺序没有被删改
- 设问回应:步骤 1.5 列出的每个主要设问/争点,在改写稿里仍有对应段落
任何一项不过:回到该句,先恢复它原本要表达的事实,再按 human-writing 规则重新表述——不是机械回滚,也不为凑禁令清零而牺牲内容。改后只有换词变化、没有内容改善,不认定复核通过。
🔴 CHECKPOINT · STOP:去AI味儿 + 内容复核确认 → 把 humanize 前后对比的关键改写点(3-5 处)和复核五项结论展示给用户,用 AskUserQuestion 弹窗选项让用户确认(选项如:"够自然,继续"、"还是像AI,再调"),不要让用户打字。用户选"还是像AI"→ 重跑 human-writing 或手动调整,并重走步骤 2.6。
步骤 3:写 pending_answer.json
按以下 schema 严格填写(12 个顶层 key):
{
"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 生成:
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:跑脚本
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:向用户报告
报告内容:
- 题目已生成(题干文本 + 字数)
- 审题要点:设问 / 身份 / 主要争点(一两行;方法论未读取时在此标注)
- 大纲已生成:破题角度 + 切入理由 + 3 个观点 + 采用的展开结构
- .docx 已更新,路径在:
<项目根>/desktop-attachments/1 结构化每日一练-帖子内容编辑模板.docx - 验证通过项:段数 17 / 5 张图保留 / 引流段样式保留 / 文本框 2 个镜像同步 / 段[7] pageBreakBefore
- 内容复核:五项全过(有修复的注明修了什么)
- 去 AI 味儿自评(human-writing 硬禁令 + 读感):冒号/破折号/翻案句/黑话/路标清零,读起来像人话
报告纪律:正文页数与字数按唯一口径报;不报告口述时长实测(无录音只有折算估算,注明即可)。
步骤 6:上传 IMA 笔记
脚本跑完、验证通过后,将答题内容上传到 IMA 笔记。不存本地 md 文件,直接上传。
操作:
- 生成时间戳
YYYYMMDD_HHMMSS(如20260712_153000) - 构造笔记标题:
{题目梗概}_{timestamp}(从 question 字段提取关键词,如指尖形式主义_20260712_153000) - 将步骤 3 中
pending_answer.json的内容格式化为 Markdown(H1 标题为笔记标题,含题干、思路大纲、答题逐字稿各字段)
Markdown 格式:
# {笔记标题}
## 题干
{question}
## 答题思路
**破题角度**:{break_angle}
**核心观点**:
{core_views 逐行}
## 答题逐字稿
{opening}
{point1_lead}
{point1_body}
{point2_lead}
{point2_body}
{point3_lead}
{point3_body}
{closing}
- 写临时 Markdown 文件到工作区临时目录,然后调用本 skill 的 IMA 上传脚本(避免 PowerShell 引号问题):
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] | 末尾装饰图 | 不动 |
关键修复历史(避坑)
- 不要预设 run[0] 是文本 run:段[6] 的 run[0] 实际是图文混合 run(含 w:drawing),必须找"第一个纯文本 run"
- 图片 run 完全不动:包括
<w:drawing>元素和其 text(即使 text 是空的) - 文本框改 2 处:drawing 镜像 + VML fallback,内容要同步
- pageBreakBefore 加在 pPr 里:用 OxmlElement('w:pageBreakBefore') 干净插入,不要动 run
- 段数恒定 17:脚本里有校验,超出就报错(不会硬塞)
- JSON 引号嵌套:用 ASCII 双引号嵌套会破坏 JSON 解析,必须用中文""或转义"
- 模板字体已去 WPS 化:WPS灵秀黑、标准粗黑、方正粗圆简体已统一替换为微软雅黑等通用字体,内嵌 WPS 字体文件已删除;恢复旧模板或改样式时不要重新引入 WPS 云字体。
- 内容工作流 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_结构化每日一练"文件夹)
失败回退
如果脚本验证失败:
- 不要慌——snapshot 已经保存
- 看
[KEEP] pending_answer.json 保留的提示 - 检查失败项(errors列表)
- 回退方式:从
<项目根>/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> 里 |