计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
zhiligeoreport【效率与协作】端到端生产并发布 GEO 周报到「直隶按察使」公众号草稿箱:从抓信源 → 强 GEO 筛选 → 通读原文中文总结 → 双语翻译 → 5 角色章节分类 → 4 项验证门禁 → 渲染 HTML → 样式 A inline 化 → 按字节拆篇 → 推 WeChat 草稿箱。Auto-loaded when user mentions 跑周报 / 写周报 / 生成 GEO 周报 / 本周 GEO 资讯 / 出周报 / 推草稿箱 / publish weekly / geo-report run. Do not use for 单条 GEO 资讯查询(直接查 DB)or 正式发布公众号(仅做草稿,正式发布由用户在微信公众平台后台完成)。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
v1.25。覆盖写作(fetch → render)+ 发布(inline → split → push)端到端。5 章节分类(GEO 服务商动态 / 品牌方实战 / 工具平台更新 / 行业研究与数据 / 国际市场)。草稿标题统一为
YYYY-MM-DD 刘生 GEO 资讯;obsidian 只读raw/wechat;正文只保留基础标题、摘要、阅读原文;封面与配图统一走 zhili-illustration 规范链路。 v1.21 关键变更:
- 标题前 label 动态提取:
extract_title_label(title, max_n=2)从标题抽品牌名/行业词(如「阿里·搜索」「腾讯·阿里」「医药·医疗」「报告·趋势」),不再直接显示章节名Item.label字段新增,模板{{ it.label or it.category }}兜底
v1.20 关键变更:
- 单篇发布模式(默认):
--parts 1把所有板块拼成一篇公众号文章,单篇 bytes ≤64KB--per-section-cap默认 8(更精)- 仍保留
--parts 2 / 3多篇模式用于备选
v1.19 关键变更:
- obsidian 内参只允许
raw/wechat,禁止读取wiki/*、raw/Clippings、books、papers、law等其他 obsidian 内容- 搜索引擎内容降权(
source_weight = 1.0,板块上限 12),只作为补充- 生产级质量门槛:标题 ≥ 10 字、正文 ≥ 300 字、中文占比 ≥ 30%;不达标直接剔除
- obsidian 转载首行 URL 自动跳过,向下取
#标题
无前置输入。直接跑端到端命令即可。
如用户指定:
cd /Users/apple/Downloads/User/geo-report
uv run python3 -m geo_report.cli publish-weekly \
--parts 1 --per-section-cap 12 --cover /tmp/zhili_cover.png
这条命令完成 7 步:
Step 1 — 抓信源(fetch-all)
enabled = false + 写 errors 表 + 告警Step 2 — 渲染 HTML(scripts/13_render_only.py)
data/reports/liusheng_geo_<YYYY-MM-DD>.html(北京时间文件名)Step 3 — 样式 A inline 化(scripts/16_inline_css.py)
<style> 块 + 类选择器,必须 inline 到 style="..."data/reports/liusheng_geo_<DATE>_inline.htmlStep 4 — 按字节拆篇(scripts/15_split_zhili.py)
href="#sec-*"),否则 WeChat draft/add 可能报 45166 invalid contentre.finditer 自然顺序,不再用 200 字节窗口查 class=(inline 后超窗口)Step 5 — 推 WeChat 草稿箱(push.py)
push.py --html <part> --cover /tmp/zhili_cover.png;不传 --skip-illustration / --skip-cover,封面和配图统一走 zhili-illustration 规范链路Step 6 — 产物自检(可选,scripts/validate-weekly.js)
node ~/.minimax/skills/zhiligeoreport/scripts/validate-weekly.js data/reports/liusheng_geo_<DATE>_inline.htmlStep 7 — 草稿箱验证(用户在微信公众平台后台)
data/publish/liusheng_geo_<DATE>_zhili_part1.html 单篇文件存在draft/add 返回 media_id| 文件 | 来源 | 大小(实测) |
|---|---|---|
data/reports/liusheng_geo_<DATE>.html | Step 2 | ~93KB(含完整样式 A) |
data/reports/liusheng_geo_<DATE>_inline.html | Step 3 | ~120KB(inline +30%) |
data/reports/liusheng_geo_<DATE>_inline_part1.html | Step 4 | ~25KB |
data/reports/liusheng_geo_<DATE>_inline_part2a.html | Step 4 | ~35KB |
data/reports/liusheng_geo_<DATE>_inline_part2b.html | Step 4 | ~59KB |
<YYYY-MM-DD> 刘生 GEO 资讯(单篇默认;多篇备选才加上/中/下后缀)/tmp/zhili_cover.png(900×383,由 zhili-illustration 规范链路生成)完整表见 references/troubleshooting.md。关键 5 条:
re.finditer 自然顺序修复。症状:曾误把"处方药 1 条"算成 112KB。draft/get API 限制,draft/add 成功但 get 查不到是正常现象。用微信公众平台后台验证。translate_zh_batch 已自动回退 minimax;若仍违规,给标题加 min() 处理。<style> 块残留。重跑 scripts/16_inline_css.py 后再推。title_zh/summary_zh 留空,由验证门禁剔除media_id 为空,整批中断;用户需要看 stdout 错误collector/obsidian_vault.py:只扫描 raw/wechat,禁止读取其他 obsidian 内容scripts/13_render_only.py:render SQL 二次防护,只允许 obsidian-raw-wechat + meta_json.subdir = raw/wechat + created_at >= cutoffweekly.html.j2:正文只保留基础标题、摘要、阅读原文;删除 TOC、来源栏、intro、标签、日期、内参标注、辣评、CTA、hashtags、footerpublish-weekly:推送不再默认跳过配图/封面;统一调用 zhili-illustration 规范链路push.py:封面生成失败中断,避免上传不存在或旧封面scripts/15_split_zhili.py:拆篇输出保留正文头部 kicker、H1,单篇正文 H1 与 HTML <title> 一致scripts/15_split_zhili.py:推送版移除本地锚点 TOC,避免 WeChat draft/add 报 45166 invalid contentsrc/geo_report/report/html.py:新增 build_report_title(date_label),统一生成 <YYYY-MM-DD> 刘生 GEO 资讯scripts/13_render_only.py / src/geo_report/cli.py:HTML <title>、正文 H1、WeChat 草稿标题来源统一为报告日期标题scripts/15_split_zhili.py:保留基础标题,多篇模式只追加 (上)/(中)/(下)scripts/13_render_only.py:所有源必须 published_at IS NOT NULL AND published_at >= cutoff,删除 fetched_at 兜底scripts/13_render_only.py:obsidian 额外要求 meta_json.created_at >= cutoff,缺 created_at 的旧行不可渲染collector/obsidian_vault.py:按创建时间扫描,优先 st_birthtime,再 frontmatter created|date,再文件名日期;mtime 只入审计元数据collector/industry_search.py:搜索结果必须抓原文发布时间,7 天内才写库,无发布时间/过期计入 stale_or_undatedpublish-weekly:渲染前刷新普通信源、行业搜索、obsidianclassify.classify_industry 改成 5 角色章节(替换 v1.17 旧章节链)weekly.html.j2 支持 5 章节渲染并过滤空章节classify.SECTION_KEYWORDS 维护 5 个章节关键词表SPEC_ITEM_PIPELINE.md §1.22 / §1.61 约束总结失败行为classify.has_geo_vendor_marketing 剔除 GEO 厂商营销稿(榜单/推荐/排名/选型/报价/获客/方案/自夸)scripts/13_render_only.py 门禁剔除空摘要、非中文摘要、疑似原文截断摘要、含 U+FFFD 编码失败字符、GEO 厂商营销稿摘要obsidian_vault.SUBDIRS["raw/wechat"] 标记 internal_brief=True,元数据写 meta_json.internal_brief=truescripts/13_render_only.py 计算 source_weight:internal_brief 3.0 / obsidian 2.0 / wechat_oa 1.5 / 其余 1.0;geo_score *= source_weight 后按降序截断跑完 publish-weekly 后若 ✅ 强 GEO 相关: N 条(N<v1.18.2 上限),正常。说明搜索引擎本周质量不达标,obsidian 内参数就是本周可发条数。不要手动放宽门禁去填充;那会拉低周报整体质量。
详细见 references/sections.md + references/constraints.md。
$ cd /Users/apple/Downloads/User/geo-report
$ uv run python3 -m geo_report.cli publish-weekly --parts 1 --per-section-cap 12
📰 渲染 weekly.html (2026-09-19)
✂️ 拆分 (1 篇,每板块 ≤ 12 条)
📤 推送草稿箱
✅ part1: draft_id=kiuyle4KZHC7JKxpTQssM...
$ uv run python3 -m geo_report.cli publish-weekly --skip-push --parts 1
输出 data/publish/liusheng_geo_<DATE>_zhili_part1.html,不调 push.py。
$ node ~/.minimax/skills/zhiligeoreport/scripts/validate-weekly.js \
data/reports/liusheng_geo_2026-09-19_inline.html
=== 校验 .../liusheng_geo_2026-09-19_inline.html ===
[OK] 字节 120006 ≤ 65536
[OK] 中文字 18055 ≥ 18000
[OK] 无 <style> 块
[OK] 板块数 5 合理
[OK] 条目数 59