brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
zhililong直隶按察使公众号长文输出技能。基于素材(视频/音频/文字稿)产出 4000-5500 字的中文公众号长文。 触发:用户说"写一篇公众号长文"/"写一篇 4000-5000 字"、粘贴视频链接+"写长文"、已有 transcript_clean.txt+"扩写"。 不适用:短评(zhilicomments)、教程(khazix-writer)、GitHub 项目介绍(zhiligithub)。
Independent GitHub snapshot · Automated classification · Original documentation governs
| 输入 | 字数 |
|---|---|
| < 30 分钟视频 | 4000-5000 字 |
| 30-60 分钟视频 | 4500-5500 字 |
| 用户指定 | 以用户为准(低于 4000 字建议不写) |
中文字符计数:re.findall(r'[\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]', text) 含 CJK 标点。
⚠️ CSS / stop-slop / renwei / pre-submit 清单 →
zhili-shared/references/zhili-style.md。
本技能写作基于 human-writing 活人感写作体系,核心是"材料→推进→中文"三关。
⚠️ 硬性前置要求:每次写作前必须先
skill_view(name='human-writing')加载写作体系,用它的框架指导写作,而不是凭感觉下笔后依赖 renwei 查漏。 renwei 是中文关的自动化检查器,不是写作工具。
材料关:zhililong 篇幅长(4000-5500字),材料是唯一支撑。Step 1 的真实性核对是材料关的核心——不是改错字,是确认每段背后都有可查证的具体素材。用户给素材才能写,用户只给方向就要先研究再下笔。没有材料的段落,宁可砍掉也不能用想象补。
推进关:5节结构是骨架,每个论点的段落内部才是真正的推进。每个新段落必须带来新事实、新动作、新例子或新后果。5个论点之间要层层递进或互为补充,不能是同一个观点换5种说法。反转段要真的反转——颠覆读者预期,不是换个角度重述。
中文关:白话打底。让主语和动作先出现,再接时间、原因、条件。判断可以偏,把依据放在附近。不要用"更深一层""真正的问题"当路标,靠事情自身的逻辑推进。句尾的"呢""吧""了"是手迹,不要全删掉。
zhililong 现有规则(renwei 三原则、5节骨架)是三关在长文语境下的具体落地。
0. 写作前:skill_view(name='human-writing') 加载写作体系,用其三关框架指导写作
Step 1:素材接收 + 真实性核对
Step 2:列 5 节骨架(先列骨架再写内容)
Step 3:renwei 改稿(zhili-style.md 第3节)
Step 4:markdown 落稿(**默认无 `##` 章节标记**,用行内小标题 + 空行分隔)
Step 5:HTML 转码(scripts/markdown_to_html.py)
Step 6:renwei 自检全文(zhili-style.md 第4节)
Step 7:配图(zhili-illustration)
Step 8:一键推送草稿(scripts/publish_lanlong.py)
必做:
transcript_clean.txt(或视频链接的转写)反模式:用"古人说"/"有研究表明"等泛指。每段至少 1 个可查证的具体素材。
⚠️ 先找说话位置,再列骨架。human-writing 要求在内部回答5件事:谁在说、他凭什么知道、手里有什么材料、他对哪点有判断、读者会追问什么。这5个答案决定了骨架怎么列,不是先有骨架再往里填内容。
先列骨架,再写内容。每节预估字数,控制篇幅:
一、[论点 1 — 反常识切入,300-500 字]
二、[论点 2 — 具体方法论 1,800-1000 字]
三、[论点 3 — 具体方法论 2,800-1000 字]
四、[论点 4 — 具体方法论 3,800-1000 字]
五、[论点 5 — 具体方法论 4 或整合,800-1000 字]
[反转段 — 颠覆前面某个认知,300-500 字]
[行动段 — 给读者一个今天就能做的事,200-300 字]
结构硬约束:
⚠️ renwei 是 human-writing"中文关"的自动化检查。没有内化就下笔,5000 字长文一定掉进 AI 套话陷阱。
三原则(human-writing 三关的自检映射):
五问自检(写每段前心里过一遍):
完整套话清单(11 项,≥3 项命中 → 打回重写)→ zhili-shared/references/zhili-style.md 第 3 节。
作者个人覆盖层(刘生主笔时叠加)→ references/zhililong-voice-overrides.md。
##(下游依赖),最终人工改稿按作者偏好删写作时:## [论点]、## 反转、## 行动——这是 markdown_to_html → publish_lanlong 的硬依赖(extract_shot_list() 找 <h2> 注入配图)。
最终人工改稿时(推送前用户在微信草稿箱里二次编辑):按 references/zhililong-voice-overrides.md 偏好删 ##,合并反转段到正文,只留行内小标题。
✅ 基础输出:## 一、xxx、## 二、xxx、## 反转、xxx、## 行动、xxx
❌ 不要在基础输出里直接用行内小标题——会导致配图注入 0 张。
# [标题]## [论点]> [原话](作者偏好不用)⚠️
markdown_to_html.py会把所有##都当 H2 处理——包括大纲和参考资料。
拆分两份 markdown:
公众号-[标题]-body.md:仅含 7 节正文(转 HTML 用)公众号-[标题].md:body.md + 头部元信息 + 大纲 + 尾部参考资料(用户审稿用)import re
md = open(full_md, encoding="utf-8").read()
body = re.sub(r"## 大纲\n[\s\S]*?(?=## 一、)", "", md) # 删大纲
body = re.sub(r"\n## 参考资料[\s\S]*quot;, "", body) # 删参考资料
open(body_md, "w", encoding="utf-8").write(body)
只对 body 跑转码:python3 scripts/markdown_to_html.py body.md out.html
转换规则:
| markdown | HTML |
|---|---|
# 标题 | (不写入 HTML,标题传给 draft/add 的 title 字段) |
## 章节 | <h2 style="...">(样式A H2 规范,见 zhili-style.md) |
**重点** | <strong style="color:#e63946;">重点</strong> |
> 引用 | <blockquote style="..."> |
| 普通段落 | <p style="margin:0 0 16px 0;line-height:1.6;"> |
HTML 拼接规范:
blocks = [
'<p style="...">第一段</p>',
'<p style="...">第二段</p>',
]
html_content = ''.join(blocks) # 零分隔符
验证:
grep -c '^#x27; /tmp/article.html # 应为 0
grep -n '\*\*' /tmp/article.html # 应为空
⚠️ 从零写 5000 字 vs 用户给原文让 AI 改:前者清单扫全文,后者只扫动过的句子。
必跑:python3 scripts/post_edit_check.py /tmp/article-body.md
检查项(详见 references/post-edit-checklist.md):
——:0 处命中率 ≥ 3 → 先打回重写,不要一边改一边扫。
封面图(zhili-illustration):
zhililong/scripts/cover_pil.py 或 xiaohu-ip-studio 生成底图正文配图(zhili-illustration):
## H2 章节提取 shot list(最多 5 张)xiaohu-ip-studio + mmx-cli 生成图片zhili-illustration/references/html-image-injection.md 规范注入 HTMLpython3 scripts/publish_lanlong.py \
--title "文章标题" \
--author "刘生" \
--digest "文章摘要(≤54字节)" \
--html /tmp/article.html \
--cover /tmp/cover.png
# 快速重推
python3 scripts/publish_lanlong.py ... --skip-illustration --skip-cover
# 重推(先删旧草稿)
python3 scripts/publish_lanlong.py ... --delete-first <old_draft_id>
全流程 5 步:配图生成 → 配图上传 mmbiz → 注入 HTML → 封面上传 → 创建草稿
| 症状 | 根因 | 解决 |
|---|---|---|
errcode 40007 + invalid media_id | thumb_media_id 来自 media/upload(临时素材) | 改用 material/add_material?type=image |
| 草稿图片显示 400 | mmbiz URL 截断,缺 ?from=appmsg 后缀 | 用完整 mmbiz URL(157-163字符) |
errcode 40007 + media_id missing | ensure_ascii=True 导致中文被 \uXXXX 转义 | json.dumps(payload, ensure_ascii=False).encode("utf-8") |
每次产出必须给:
# [文章标题]
**字数**:[N] 中文字符(含标点 [M])
**结构**:[5 节 + 1 反转 + 1 行动]
**自检**:✅ [通过项]
## 大纲
1. ...
**markdown 路径**:`/path/to/公众号-[标题].md`
**HTML 路径**:`/tmp/[标题].html`
**草稿 media_id**:(仅当 Step 8 执行后出现)
凭证在 references/config.md,不输出到对话。
| 功能 | 状态 | 解决 |
|---|---|---|
| execute_code sandbox 破坏含中文 URL 的 HTML | sandbox 替换含敏感词的整行字符串 | 用 terminal Python 而非 execute_code |
publish_lanlong.py 内置所有 WeChat API 细节 | — | 优先用脚本,不要手搓 inline Python |