Skip to content

AI Weekly Optimization Plan v3

Elisabeth15501 edited this page Sep 10, 2026 · 1 revision

AI Weekly Skill · v3.4.1 → v3.4.5 优化方案 v3

评估周期:2026-09-08 ~ 2026-09-10 数据来源:SkillHub 评测报告 4.3 项(可信任度·国内适配性)+ 用户报「GitHub Pages 周报无中文」实测 + gh-pages 部署事故回滚 目标:把「能用」变「可信」,让国内用户在「不翻墙、不依赖本地模型」的前提下也能拿到完整可信的 AI 周报 最新迭代:v3.4.6(中文翻译回填 + 译文源,已合并本文 §5)


一、本周期的核心决策(一句话)

不要让用户为「看不到」「看不懂」「抓不到」三个问题承担任何一项。 把每一项都从「运行时运气」改成「数据资产 / 可拉取服务 / 显式口径」。

痛点 性质 旧做法 新做法(v3.4.x)
看不到:周报无中文 数据层 翻译是生成时刻的「运行时」调用,失败静默 三级取值(缓存 → 远程译文源 → Ollama),译文固化进 news.json / 发布可拉取译文源
看不懂:信通院数字 vs GVR 数字谁信谁 可信度层 两套数字并列,等同可靠 口径路由条(国内优先 / 海外作对照)+ 图注可核实性标记
抓不到:翻墙才能拿海外新闻 网络层 假镜像(HTTP 200 但内容无关)混在 URL_REWRITES 逐镜像 curl 验 body,假镜像全删;RSS 侧 14/14 全通、真正卡的是排行榜
刷新漂移:每日刷新把历史周报改写成当期 部署层 generate_site.py --date 不传时默认「当天-7~当天」 refresh_deploy.py 显式传 --date(优先 news.json.date_end,兜底文件名日期)

二、本周期 5 个版本的逐项改动

v3.4.2 — P0 修复 + 8/31 周报回滚(commit fbd1ee8,2026-09-08)

触发:用户报「AI_News_2026-08-31.html 被每日刷新改成 9/1-9/8 + W37 的 115 条」

改动(4 files, 56+/6-)

文件 改动
scripts/refresh_deploy.py _report_date():优先 news.json.date_end,兜底文件名日期;显式传 --dategenerate_site.py;日期与文件名不一致时改写输出名
SKILL.md frontmatter version 3.4.1 → 3.4.2
manifest.json version 3.4.1 → 3.4.2
CHANGELOG.md 新增 3.4.2 条目
gh-pages 从 commit 4f84eeb 取回真版 AI_News_2026-08-31.html(112 条)重新部署

根因(必须记住)generate_site.py 的报告周期默认「当天-7~当天」,--date 视为必填。任何「重生成历史周报」场景都必须显式指定 --date,否则每日刷新会把历史周报逐步改写成当期内容。

回滚历史周报的标准动作

git show <commit>:AI_News_YYYY-MM-DD.html > delivery/<date>.html
python scripts/deploy_ghpages.py --html delivery/<date>.html

W36 真版在 commit 4f84eeb(112 条);真 W37 = 115 条,可用「共 N 条」快速辨真伪。


v3.4.3 — 对标 SkillHub 评测(commit 3b1392c,2026-09-09)

触发:SkillHub 评测报告 4.3 项(可信任度·国内适配性)三项子项

改动(8 files, 351+/32-)

子项 改动 文件
触发方式(boundary 4.3) SKILL.md §1.1 加「真实对话级使用示例」+ references/FAQ.md(16 行新增 9 节) SKILL.md, references/FAQ.md
可信任度·国内适配性 A 清除假镜像lmarena.org.cn(域名不存在)、aa-cn.mirror.xyz(返回 mirror.xyz 博客平台)、hf-mirror.com/datasets-server(401)全删;修复 ModelScope:旧实现抓 HTML 页面 0%,改官方 openapi/v1/models 后 OK(/api/v1/models 是 404) scripts/aiweekly/leaderboard_sources.py, scripts/aiweekly/leaderboard_fetch.py
告警人话翻译(D) scripts/aiweekly/diagnostics.py(95 行)build_user_hints / print_user_hints;规则表驱动;原报错 ble001 noqa → 用户能懂的「这一项榜单抓失败了,已自动回退到上周快照」 scripts/aiweekly/diagnostics.py(NEW), scripts/generate_site.py
SKILL.md 加 §1.1 真实对话 + FAQ + §8.3 路由表 SKILL.md(120 行)
manifest.json version 3.4.2 → 3.4.3 manifest.json

为什么这件事单独成版本:评测「可信任度·国内适配性」是用户最急切的痛点(用户原话:「我翻不了墙」),三项子项(A 假镜像、B 假新闻、C 数据口径、D 告警)本版本闭环 A 和 D,B/C 在 3.4.4/3.4.5 闭环。


v3.4.4 — RSS 源可达性体检(commit 0f001fd,2026-09-10)

触发:3.4.3 闭环 A/D 后,对 B 项「翻墙能否拿到国外新闻」给出明确答案——能,RSS 侧 14/14 全通;真正卡国内用户的是排行榜(3.4.3 §8.1 已诚实说明)。

改动(5 files, 166+/51-)

真失效源 根因 修复
36氪 0 条 URL 缺 www36kr.com/feed 返回反爬 HTML(HTTP 200 但 0 条目) www.36kr.com/feed(实测 30 条,application/rss+xml
机器之心 0 条 RSS 已下线,返回「机器之心·数据服务」落地页(3KB HTML) 替换为雷峰网 AI 科技评论 www.leiphone.com/feed(20 条)
VentureBeat 429 对自报爬虫 UA compatible; AIWeeklyReport/4.0 限流,3 次稳定 429 统一常量 FEED_UA(浏览器 UA),即时 200

结构改动

  • RSS_FEEDS 3 元组 → 4 元组加 region(cn/global)
  • --check-feedsfetch_all 均分区统计
  • 新增 FEED_MIRRORS:HF Blog 主源失败回退 hf-mirror.com/blog/feed.xml
  • 新增 fetch_feed_with_mirror();国内源全挂时显式告警「中文地板失效」
  • references/data_sources.md 源表补 region 列 + 「抓取要点」三条

效果:源健康 12/14 → 14/14(国内 5/7 → 7/7);端到端抓取 119 条;校验 25/25。

踩过的坑(防止重犯)

  1. references/data_sources.md 此前已写「机器之心已失效、已从列表移除」,但代码 RSS_FEEDS 里还留着它——文档与代码不一致。改源时两边都要同步。
  2. 源返回 200 但 0 条目时,一定要 print(r.text[:400]) 看 body;光看状态码判断不了(与 3.4.3 假镜像教训同源)。
  3. 自报爬虫身份的 UA 会被部分站点限流;RSS 阅读器用常规浏览器 UA 是通行做法。

v3.4.5 — 市场数据口径路由(commit a141c3a,2026-09-10)

触发:B 项闭环后,对 C 项「国内用户该信国内源还是海外源」给出明确答案——国内优先,海外作对照,且必须显式标注(不要让用户猜)。

关键认知:市场数据是静态快照注入(WebSearch 核实后 --market-data/--cn-market-data 注入),所以国内适配的关键不是「能不能抓到」,而是两套数字该信哪个——不能把信通院数字和 GVR/Crunchbase 标成同等可靠。

改动(8 files, 135+/13-)

改动
市场口径路由条 aiweekly/market.py::build_market_routing_note(region):cn → 「当前口径:国内优先,中国口径(信通院/新浪创投Plus/IT桔子)为主;全球口径属海外机构静态快照,仅作趋势对照,国内无法一手核实」;global → 全球为主;未判定 → 两套并列
图注可核实性标记 6 张市场图注:国内源「✅ 国内公开数据,可自行核对」/ 海外源「🌍 海外机构静态快照 · 作对照」(hover 有说明)
region 取值复用 region 一律复用 leaderboard_data["meta"]["region"](排行榜已解析的实际值),不自做第二次网络探测
模板 [MARKET_ROUTING_NOTE] 占位 + .market-routing CSS(服务端预渲染,禁 JS 可见)
SKILL.md §8.3 新增口径路由表 + 国内源 vs 国外源对照说明
releases/v3.4.5.md GitHub Release notes body(NEW)

坑(防止重犯)generate_site.py 里 161 行的 region = _detect_region()_health_check() 函数内,main() 里没有该变量 → 直接写 region=region 报 NameError。改用排行榜 meta.region 一行解决(且不增行数,守住 500 行上限:最终 497 行)。


v3.4.6 — 周报中文翻译回填 + 译文源(commit 181945c,2026-09-10)

触发:用户报「GitHub Pages 版周报没有中文翻译」。实测推翻"全都没有"的认知——curl 线上 4 期逐个解析 NEWS_DATA

总条 英文条 有中文摘要
9/07(最新) 115 47 47
8/31(回滚版) 112 46 0
8/24 91 40 0
8/17 108 42 42

根因:翻译是运行时 best-effort,调本地 Ollama qwen2.5:7b19.1s/条,CPU 推理),失败路径 except: return None 静默 → 报告照出但英文原文。且不可补救:本地无 8/24、8/31 的 news.json 快照,RSS 仅留 1 周无法回抓重生成。

详细方案见本文 §五(周报中文翻译方案)

改动(8 files, 537+/31-)

改动
三级取值(治本) 本地缓存 .translate_cache.json → 远程译文源 --translations-url → 本地 Ollama。前两级不依赖本地模型
backfill_translations.py(治标) 外科手术式回填——直接从已发布 HTML 提取 NEWS_DATA,补译后原样写回。不需要 news.json。支持 --check / --dry-run / --no-ollama / --emit-source
patch_signal_cards() 回填数据 ≠ 回填页面——只改 NEWS_DATA 后「本周市场信号」卡仍是英文(.ms-card 是渲染时生成的静态 HTML);补 .ms-cn 注解同步
RemoteTranslationSource aiweekly/translate.py 新增;按 URL 匹配 + title_key 标题指纹轻量校验
MIN_CJK_TITLE=1 修「短标题被误杀」——"Mother tongue"→"母语" (2 字) 阈值从 3 汉字降到 1
译文源 translations.json 175 条 73KB,按 URL 索引 + title_key 校验;发布到 gh-pages https://elisabeth15501.github.io/ai-weekly/translations.json
修 3 个真 bug translate_items 缓存全命中 return 0(日志误导)→ 返回复用条数;stats["translated"] 从不更新;回填不补 .ms-cn
deploy_ghpages.py --extra 随周报一并发布附加文件(如译文源)
SKILL.md §8.4 新增翻译机制、译文源用法、历史回填命令

回填结果(线上已生效)

英条 回填前 回填后 校验
8/31 46 0/0 46/46 25/25
8/24 40 0/0 40/40 25/25
9/07 47 47/46 47/47 25/25
8/17 42 42/41 42/41(模型回显英文) 23/25

诚实保留

  • 8/17 排行榜为空(23/25):该期榜单抓取失败。榜单是实时数据,无法忠实重建历史快照——拿今天的榜冒充 8/17 会误导读者,故不回填,如实保留。
  • 8/17 缺 1 个中文标题:qwen2.5:7b 对该条直接回显英文原文(汉字数 0),判失败是正确行为,非 bug。

三、本周期的工程债与硬守护(必须保持)

守护 阈值 当前值 触发动作
generate_site.py 主入口 ≤500 行 498 加代码前先 wc -l,告警规则表已拆 aiweekly/diagnostics.py
aiweekly/*.py 模块 ≤800 行 leaderboard=727 / market=683 / translate=476 加代码优先拆模块,勿内联
validate_report.py 24/24 全量 4 期均通过(23~25/25 仅历史数据限制) 改任何代码或 insights.json 都重跑
insights.json keywords[].note ≥60% 含「本周」周相关锚点 通用 note 会被判失败
裸 except / XSS 0 0 写 try/except 必须有具体异常类型

拆模块的坑(防止重犯):把函数迁到新模块并 from new import f 后,必须删原文件里的 def f 旧定义;否则本地定义阴影 import,旧定义若引用已随迁走的模块级常量会 NameError——被 best-effort except 吞成 warning 静默失效(难察觉)。

国内网络可达性(2026-09-02 实测反转):LMArena / Artificial Analysis / LLM-Stats / HuggingFace 现均可实时直连(fetch_all_leaderboards 默认 live fetch)。旧结论「LMArena/HF 地理不可达 / SPA 解析器永远 0 行」已过时——现 generate_site.py 不传 --ranking-json 即出实时榜。

排行榜实时化机制(2026-09-02 落地)scripts/refresh_deploy.py(live fetch → deploy_ghpages → git-credential-wincred 取 PAT 推 gh-pages)+ 每日 09:00 自动化 b318cad6。固定 W36 新闻不变、仅榜随 live fetch 刷新。


四、本周期发现并修掉的真 bug(按发现时间)

# Bug 触发 修复
1 refresh_deploy.py 未传 --date 导致历史周报被改写 9/8 用户报「8/31 周报内容变了」 fbd1ee8_report_date() 显式传参
2 URL_REWRITESlmarena.org.cn(域名不存在)+ aa-cn.mirror.xyz(返 mirror.xyz 博客平台) 3.4.3 假镜像清理 3b1392c 全删;hf-mirror.com/datasets-server(401)亦删
3 36氪 36kr.com/feed 返反爬页(200 但 0 条目) 3.4.4 RSS 体检 0f001fdwww
4 机器之心 RSS 已下线 3.4.4 RSS 体检 0f001fd 换雷峰网
5 VentureBeat 对自报爬虫 UA 返 429 3.4.4 RSS 体检 0f001fd 统一浏览器 UA FEED_UA
6 ModelScope 旧实现(抓 HTML 页)返 0% 3.4.3 国内榜源修复 3b1392copenapi/v1/models
7 _ollama_translate 短标题阈值 3 汉字误杀「"Mother tongue"→"母语"」 3.4.6 翻译回填 181945cMIN_CJK_TITLE=1
8 translate_items 缓存全命中 return 0(日志误导) 3.4.6 翻译回填 181945c 改返回复用条数
9 Translator.stats["translated"] 从不更新 3.4.6 翻译回填 181945cn_done += 1
10 回填不补 .ms-cn 信号卡 → 校验失败 3.4.6 翻译回填 181945cpatch_signal_cards()
11 译文源 src_hash 基于已归一化 summary,命中率仅 32% 3.4.6 翻译回填 181945c 改 URL + title_key 校验 → 100%

五、周报中文翻译方案(治本 + 治标 + 兜底)

本节是 v3.4.6 的核心设计文档,原本是单独方案 周报中文翻译方案.md,本次合并到 v3 wiki。

5.1 问题:不是「Pages 版都没中文」

把线上 4 期全部拉下来逐条解析 NEWS_DATA

期次 总条 英文条 有中文摘要 有中文标题 状态
9/07(最新) 115 47 47 46 ✅ 完整
8/31 112 46 0 0 ❌ 全无
8/24 91 40 0 0 ❌ 全无
8/17 108 42 42 41 ✅ 完整

9/07 和 8/17 是完整的,8/31 和 8/24 全裸。

而且 9/07 的中文在页面上是正常渲染的——英文条目 lang='en' 时,中文译文作主标题、英文原文作小字副标题,摘要前还有「中文」徽章。所以不是前端 bug,是数据层那两期根本没翻译

8/31 特别说明:它是 9/8 那次事故回滚回来的版本(从 commit 4f84eeb 取回)。原始那期生成时就没翻上译文,回滚把"没译文"这个状态也一起带回来了。

5.2 根因:翻译是「运行时运气」,不是「数据资产」

翻译链路本身是好的,问题在它太依赖生成那一刻的现场条件

生成报告 → 调本地 Ollama(qwen2.5:7b) 逐条翻译 → 写入 cn_summary/cn_title
                    ↑
            这一步失败 = 静默跳过,报告保留英文,不留痕

实测关键数据:

  • 单条翻译 19.1 秒(CPU 推理,无独显),每条目要翻 summary + title 两次
  • 47 条 × 2 次 ÷ 3 并发 ≈ 10 分钟;新条目多时更久
  • 失败路径 except: return None —— 静默,报告照样生成,看不出少了什么

三种情况下会掉中文:

场景 后果
生成时 Ollama 没运行(电脑刚开机/服务挂了) 全部英文
Ollama 在但单条超时(45s 上限,CPU 忙时很常见) 部分英文
缓存未命中 + Ollama 不可用 全部英文

并且不可补救:历史期一旦生成时没翻上,就永久是英文——因为 RSS 只保留约 1 周,本地没有 8/24、8/31 的 news.json 快照(只有 w30/w31/w32),无法重新生成。

5.3 还有一个裸奔的资产:189 条译文没入库

.translate_cache.json 里躺着 189 条已翻译的高质量译文,但这个文件没有提交进 git.gitignore 没排除它,只是从来没 add 过)。

意味着:换台机器 / 重装系统 / 清理工作区 → 189 条译文全部蒸发,全部要重跑 Ollama(189 × 19s ÷ 3 ≈ 20 分钟)。

5.4 方案(三层)

第 1 层:治本 —— 把译文从「运行时运气」变成「数据资产」

# 动作 改什么 收益
1.1 译文缓存入库 .translate_cache.json 提交进 git 189 条译文变版本资产,换机不丢,新机器开箱即有中文
1.2 译文固化进 news.json fetch_ai_news.py --translate-en 时把 cn_summary/cn_title 写进 news.json 落盘 生成阶段变只读不译,彻底不依赖 Ollama;一次翻译永久有效
1.3 翻译前置到周一生成 翻译是慢活(10~30 分钟),放在周一生成时做一次;每日刷新只读缓存不重译 每日刷新从 10 分钟降到几秒,且不会因为刷新时 Ollama 不在而丢中文

1.2 是关键:现在译文只活在"生成那一刻的内存里",news.json 里完全没有中文字段(字段只有 title/summary/url/source/publishedAt/category/score)。写进 news.json 后,译文就跟着数据走,还能随 Pages 的"往周数据源"一起发布出去。

v3.4.6 已落地 1.1(部分)+ 远程译文源 1.4

  • translations.json 远程译文源(175 条 73KB)发布到 gh-pages,按 URL + title_key 索引
  • 翻译三级取值:本地缓存 → 远程译文源 → Ollama(前两级不依赖本地模型
  • 没本地模型的用户用 --translations-url https://elisabeth15501.github.io/ai-weekly/translations.json 即可拿到中文,实测命中率 100%
  • 1.2 / 1.3 待下个周期(v3.5.x)治理

第 2 层:治标 —— backfill_translations.py

新增 scripts/backfill_translations.py直接从 HTML 提取 NEWS_DATA → 补译 → 写回 HTML → 重新部署

不需要 news.json(本来就没有),属于外科手术式回填。

风险可控:只改 NEWS_DATA 这一个 JSON 块,不动其他结构,回填前后跑 validate_report.py 对比(目标 25/25)。

坑 1:回填数据 ≠ 回填页面 只改 NEWS_DATA 后,「本周市场信号」卡(.ms-card,渲染时生成的静态 HTML)仍是英文 → validate_report.pysignals_cn 检查失败(8/31 掉到 24/25)。补 patch_signal_cards()ms-title</a> 后插 .ms-cn 才回到 25/25。

坑 2:译文源 src_hash 对不上(命中率仅 32%) 译文源的 src_hash 基于 HTML 里已归一化的 summary(去掉 "New York Times:" 前缀等),而生成时查缓存用的是 news.json 的原始 summary —— 两者几乎必然不等。远程源改用 URL 匹配 + title_key 标题指纹轻量校验 → 命中率 32% → 100%。 (本地缓存仍用严格 src_hash,本机正确性与远程宽松匹配分开处理)

第 3 层:兜底 —— 让失败可见,而不是静默

# 动作 说明 状态
3.1 修日志误导 translate_items 缓存全命中时 return 0,导致"明明翻了 47 条却打印 0" ✅ v3.4.6 修复
3.2 漏翻告警 生成结束时若"英文条目无中文"占比超阈值,明确打印告警 🟡 待做
3.3 前端诚实标注 未翻译的英文条目显示"未翻译"标记 🟡 可选
3.4 修复短标题误杀 _ollama_translate 固定阈值 3 汉字,"Mother tongue"→"母语"(2字) 判失败 ✅ v3.4.6 加 MIN_CJK_TITLE=1

5.5 推荐执行顺序(已落地)

第 2 层(回填两期)  →  立刻可见,17 分钟   ✅ v3.4.6
远程译文源            →  无本地模型用户也能拿中文 ✅ v3.4.6
第 3.1 修日志误导     →  一行代码,立刻止血   ✅ v3.4.6
第 3.4 短标题误杀     →  MIN_CJK_TITLE=1     ✅ v3.4.6
第 1.1(缓存入库)   →  189 条译文变版本资产  🟡 v3.5.x
第 1.2 + 1.3         →  治本,下次生成起永久免疫  🟡 v3.5.x
第 3.2(漏翻告警)   →  收尾                🟡 待评估

5.6 明确不建议的方案

方案 为什么不推荐
换云端翻译 API 违背"自治优先、可选增强"原则;涉及第三方 API 合规(要注明、要授权);你本身成本敏感、已部署本地 Ollama
在 CI 里翻译 GitHub Actions 是 Linux runner,装不了你本地的 Ollama 模型;且 CI 路径(mirror.yml)目前已停用(if: false
重抓历史新闻重新生成 RSS 只保留约 1 周,8/24、8/31 抓不回来,做不到
等待本地模型稳定 qwen2.5:7b 在 CPU 推理下 19s/条,且历史期数据已经回不来——任何"等模型快了"都是伪解

5.7 核心事实速查

翻译模型 本地 Ollama qwen2.5:7b(已部署,当前在线)
单条耗时 19.1s(CPU 推理,无独显)
译文缓存 189 条(.translate_cache.json,未入库,1.5.x 待治本)
远程译文源 175 条 73KB(translations.json on gh-pages,URL + title_key 索引)
翻译三级取值 1) 本地缓存 → 2) 远程译文源 → 3) Ollama
每日刷新 refresh_deploy.py走默认开启翻译(但三级取值先查远程译文源)
CI 路径 build_pages_site.py 明写不翻译,但 mirror.yml 已停用,不影响 Pages
Pages 来源 本地 deploy_ghpages.py 推 gh-pages 分支(不是 CI)

六、验证与回滚

6.1 验证清单(每次发布前必须跑)

命令 / 验证 通过标准
模块行数硬守护 wc -l scripts/*.py scripts/aiweekly/*.py generate_site.py ≤500;其余模块 ≤800
校验器全量 python scripts/validate_report.py --html delivery/AI_News_YYYY-MM-DD.html 24/24(或 25/25,回填期允许 23/25 因历史数据限制)
GitHub Release gh release list --repo Elisabeth15501/ai-weekly --limit 5 新版本标 Latest
SkillHub skillhub skill ai-weekly 最新版本号一致
gh-pages artifacts curl -sI https://elisabeth15501.github.io/ai-weekly/... HTTP 200
译文源命中率 python scripts/backfill_translations.py --check --html <file> 0 untranslated

6.2 回滚标准动作

回滚历史周报(某期生成时出问题):

# 1. 找真版 commit
git log --oneline --all -- AI_News_YYYY-MM-DD.html
# 2. 取回真版
git show <commit>:AI_News_YYYY-MM-DD.html > delivery/<date>.html
# 3. 重新部署
python scripts/deploy_ghpages.py --html delivery/<date>.html

回滚 GitHub Release(不要删除,改 yank + 标 pre-release):

gh release edit vX.Y.Z --repo Elisabeth15501/ai-weekly --prerelease
gh release create vX.Y.Z-fix --target <prev-commit> --notes "..."

回滚 SkillHub 版本:SkillHub 不支持版本回退,只能发新版覆盖。建议新版 changelog 开头明示「回滚 vX.Y.Z,原因:...」。

6.3 P0 事故 checklist(如未来再发生类似 9/8 周报改写事故)

  • 立即停止 refresh_deploy.py 自动化
  • git log --oneline --all -- AI_News_<date>.html 找真版
  • git show <commit>:AI_News_<date>.html > delivery/<date>.html 取回
  • python scripts/deploy_ghpages.py --html delivery/<date>.html --extra delivery/translations.json
  • curl -sI 验证线上
  • 修复 _report_date() 之类的根因
  • 新版本(commit + tag + Release + SkillHub publish)走完整发布链路

七、本周期经验沉淀(给下个周期的自己)

7.1 评测驱动开发的有效性

SkillHub 评测报告 4.3 项(可信任度·国内适配性)三个子项在 3 个版本里闭环——3.4.3 (A/D)、3.4.4 (B)、3.4.5 (C)。每项都是用户最急切的痛点,且每项都给出了诚实答案(不是粉饰):

  • 假镜像:HTTP 200 不够,必须 curl body 验证
  • 国内榜源:旧判断过时,实测 33 次才能给真实命中率
  • 市场数据:不是「能不能抓」而是「该信哪套」

经验:每个评测项要给出三层答案——发生了什么(事实)、为什么(根因)、接下来怎么办(治本 vs 治标 vs 兜底)。粉饰评测项会让用户在真实场景里失望。

7.2 「数据资产 vs 运行时运气」的二分

本周期最重要的认知升级:把 运行时调用 升级为 数据资产

  • 周报中文:运行时翻译 → 译文固化进 news.json + 远程译文源
  • 市场数据:运行时 WebSearch → 静态快照 + 口径路由
  • 排行榜:运行时抓取 → live fetch + 快照兜底 + 显式 region

经验:任何「慢 / 贵 / 不可重」的操作都应当问一句「这次结果是数据还是缓存」——是数据就入库,是缓存就显式区分。

7.3 「回填数据 ≠ 回填页面」的教训

只改 NEWS_DATA 后,「本周市场信号」卡仍是英文——因为该卡是渲染时生成的静态 HTML,不在 NEWS_DATA 这个 JSON 块里。任何服务端预渲染的区块都要单独 patch

经验:外科手术式回填时,先 grep HTML 看哪些区块是「数据 JSON」哪些是「预渲染 HTML」,对每个区块单独处理;不要假设「改了 JSON 就完事」。

7.4 「远程宽松匹配 vs 本地严格匹配」的区分

译文源的 src_hash 用 HTML 里已归一化的 summary 计算,与 news.json 原始 summary 不等——远程源命中仅 32%。改用 URL + title_key 轻量校验后 100%。但本地缓存仍用严格 src_hash。

经验:跨机器/跨时间的数据校验,永远会有归一化差异。策略是「本地严格、远程宽松」——本机正确性优先(避免错译),远程命中率优先(避免漏译)。两者不混用。

7.5 「发布闭环不能被截断」的工程化

9/8 的 429 限流就是因为我 commit + push 了 v3.4.6,但没打 tag / Release / SkillHub publish。本次已把完整发布链路沉淀到 skillhub-publish skill:

git tag -a vX.Y.Z && git push origin vX.Y.Z       # 1. tag
gh release create vX.Y.Z --notes-file ...          # 2. GitHub Release
skillhub publish $TMP --version X.Y.Z              # 3. SkillHub

经验:把发布步骤顺序化 + 脚本化,让任何截断(429/超时/session 中断)都能从最近一步续上,而不是重新发明轮子。


八、给下个周期(v3.5.x)的待办

按 P0/P1/P2 排序:

优先级 来源
P0 译文固化进 news.json(治本) §5.4 #1.2
P0 译文缓存 .translate_cache.json 入库 §5.4 #1.1
P0 翻译前置到周一生成 §5.4 #1.3
P1 M3:YoY / 预测诚实度 / 市场数据校验 旧优化方案第九章
P1 钉钉 Webhook 推送(加签) 旧优化方案
P2 漏翻告警(前端可见) §5.4 #3.2
P2 排行榜开放权重 / 学术榜单 旧优化方案

附 A:版本索引

版本 日期 commit 主题
v3.4.2 2026-09-08 fbd1ee8 P0:修复 refresh_deploy 周次漂移 + 回滚 8/31 周报
v3.4.3 2026-09-09 3b1392c 评测对标:触发方式 / 假镜像 / 告警
v3.4.4 2026-09-10 0f001fd RSS 源可达性体检(修 36氪/机器之心/VentureBeat)
v3.4.5 2026-09-10 a141c3a 市场数据口径路由(国内优先)
v3.4.6 2026-09-10 181945c 周报中文翻译回填 + 远程译文源

总改动(v3.4.1 → v3.4.5,含 v3.4.6):33 files, 1245 insertions, 133 deletions(合并各 commit 统计去重后)

附 B:参考文档

Clone this wiki locally