wechat-paper — AI 协作复盘成文
把一段真实的人机协作过程,变成一篇有借鉴意义、读起来不枯燥、且粘贴进公众号不会掉样式的技术文章。
三条铁律
- 不编。素材只来自真实会话记录或用户提供的材料。找不到原文就写"大意是",绝不伪造引号内的 prompt 和报错。
- 不写散文。每 300 字至少一个信息物(代码 / 对话原文 / 报错 / 表格 / 清单 / 具体数字)。删掉任何"换到别的文章里也成立"的句子。
- 样式只由脚本产出。模型只写
draft.json,不手写文章 HTML——手写必然踩公众号的坑且浪费 token。
工作流
阶段 1 · 取材
先判断上下文是否还完整。判据:能逐字回想起关键 prompt 原文和至少一条报错原文。
- 完整 → 直接用当前上下文。
- 被压缩过、或要总结另一个会话 → 跑
scripts/fetch_session.py --session-id ID -o /tmp/transcript.md --anchors还原记录,锚点速查会直接标出摩擦点、AI 自我纠正处、报错点。 - 用户另给了日志 / 截图 / diff → 一并纳入,截图走 media-read 提取文字。
按四类素材逐项采集,缺任一类就回源再找一轮:误判链(含"我当时为什么这么判断")、转折时刻(原文,必须有触发物)、可复用 prompt 片段、量化事实(≥4 个数字)。
方法与六个扫描锚点见 references/extraction-playbook.md。脱敏清单也在同一文件里,落盘前必须过一遍。
阶段 2 · 定位(需用户点头)
定三件事,用一句话向用户复述并确认后再往下写:
- 读者看完带走什么(一句可执行的东西,不是"获得启发")
- 不写给谁看(排除泛读者,标题和深度都据此校准)
- 骨架选型(见阶段 3)
同时给 3 个标题候选:≤22 字、含一个具体物(数字 / 工具名 / 报错 / 动作)、不做兑现不了的承诺。
用户对定位有异议时回到阶段 1 补素材,不要在错的定位上硬写。
阶段 3 · 选骨架
先选骨架再动笔。没有骨架必然写成流水账。
| 最有价值的东西 | 骨架 | |---|---| | 一条走过的弯路及其根因 | A 踩坑复盘型 | | 两种做法的真实优劣 | B 方案对决型 | | 做法变了,效率差一个量级 | C 前后对比型 | | 一套可照抄的步骤与 prompt | D 工作流拆解型 | | 一个推翻常识的结论 | E 反直觉型 |
兜底:有 ≥2 个真实失败点选 A;失败点少但产出是方法选 D;一次就成、亮点在结论选 E。一篇只用一个主骨架。
五种骨架的逐段结构、开头三种打法、结尾三种收法、标题写法,见 references/narration-structures.md。
阶段 4 · 成文
产出 draft.json(契约:assets/blocks-schema.json,完整示例:assets/example-draft.json — 拿不准字段嵌套时照它的结构写)。写作规则见 references/voice-charter.md,落笔前先扫一遍禁写清单。
要点:
- 段落 ≤3 句;开头 3 行给结果或反直觉事实,不铺垫背景
- 小标题能被单独读懂,串起来就是大纲;自动编号由脚本补
- 对话逐字引用,不改写成书面语;过长可截断,截断处写 …
- 幽默每 600 字 1 处封顶,拟人全篇 ≤3 处,emoji 一律不用
- 结尾给:可复用清单 / 未解问题 / 一句反推结论。不升华、不求订阅
区块类型够用就不要手写 HTML:title lede h2 h3 p dialog pitfall code callout list steps table compare bignum pullquote divider footer image。覆盖不到的样式从 assets/fragments.md 取片段(改 draft.json 永远优于改生成结果)。
阶段 5 · 渲染、校验、交付
python3 scripts/build_post.py draft.json -o output/ --theme ink
python3 scripts/validate_wechat.py output/draft.json output/wechat-snippet.html
--check 可只做合规自检不写文件;validate_wechat.py --fix 能自动剥离 class / script / flex 等违规内容(但正确做法是回到 draft 重跑)。
有 error 必须修完再交付。然后用 show() 展示 output/index.html(static=true),用户点「复制公众号格式」即可粘贴。
命令速查
# 生成(主题 ink|moss|amber|plum)
python3 scripts/build_post.py draft.json -o output/ --theme moss --tag "AI 协作实录"
# 需要保留正文链接(已认证号)
python3 scripts/build_post.py draft.json -o output/ --keep-links
# 需要配图位(发布前手工替换为素材库图片)
python3 scripts/build_post.py draft.json -o output/ --placeholder-images
# 合规 + 文风体检
python3 scripts/validate_wechat.py output/draft.json
# 还原被压缩的会话
python3 scripts/fetch_session.py --session-id ID -o /tmp/transcript.md --anchors
交付物
全部放在 output/:
| 文件 | 用途 |
|---|---|
| index.html | 手机宽度预览稿,带复制 / 下载按钮,展示给用户看的就是它 |
| wechat-snippet.html | 纯正文片段,剪贴板被浏览器拦截时的兜底 |
| meta.txt | 标题候选、摘要、关键词、统计、粘贴步骤、发布前检查表 |
| draft.json | 结构化源稿,后续改动的唯一真相 |
交付时说清三件事:选了哪个骨架和为什么、哪些内容做了脱敏替换(让用户决定是否回填)、字数与预计阅读时长。
不要向用户展示 qwenwork 命令、CLI 参数或原始事件流输出。
迭代修改
用户说"第三段太长""换个主题""结尾太干"→ 改 draft.json 重跑 build_post.py,不要手改生成的 HTML(会被下次重跑覆盖)。
只改配色时可加 --theme 覆盖,不必动 draft。改完必须重跑 validate。
参考文件导航
| 什么时候读 | 读哪个 |
|---|---|
| 阶段 1,挖素材 / 判断上下文够不够 / 脱敏 | references/extraction-playbook.md |
| 阶段 3、4,选骨架 / 写开头结尾 / 拟标题 | references/narration-structures.md |
| 阶段 4,动笔前与自检时 | references/voice-charter.md |
| 样式出问题 / 要手工微调片段 / 排查粘贴后掉样式 | references/wechat-html-spec.md + assets/fragments.md |
| 填 draft 时想不起字段名 | assets/blocks-schema.json + assets/example-draft.json |
| 换配色 | assets/themes.json |
Scan to join WeChat group