ARTICLE · 1112973
90天玩转AI第16期,参考答案:3个文件跑通周报生成器,数字终于对得上
第 15 期留的那道题——把提交记录变成两份报告。
这一周收到最多的一句话是:数字对不上。今天把参考答案给出来。
整套东西就 3 个文件 + 1 个状态文件 + 1 行 crontab:
weekly/ 目录——→ collect.py:多仓库采集,统一输出 JSONL→ render.py:聚类 + 套两版模板 + 渲染 Markdown→ template.md:给 Leader 版 / 给自己版→ state.json:记已处理的 commit sha,保证幂等→ 1 行 crontab:每周一 08:00
下面按你自己跑的时候最容易卡死的顺序讲:数据源 → 数字对不上 → 模板 → 定时 → 反过来喂述职。

这道题的难点从来不在模型,在口径
一、多仓库不是一个 for 循环
先把身份收干净。一个人往往有好几个邮箱,漏一个,你的提交就少一半:
git shortlog -sne --all | sort -rn# 把变体写进 .mailmap,再重跑一次核对总数
遍历多个仓库时用 git -C 仓库路径,不要 cd 来 cd 去——工作目录一变,相对路径和钩子全乱。每个仓库输出成同一种 JSONL,最后统一合并。
跨仓库的同一条工作怎么办?按 ticket 号或分支名前缀合并成一条主题,别让「同一个需求在 3 个仓库的提交」在报告里出现 3 次。
git -C $repo log --since=$START --until=$END --author=你 --no-merges \ --pretty=%H|%ad|%cd|%s --date=iso --numstat
二、数字对不上,按这个顺序排
九成是口径问题,不是代码问题
排查顺序——① 时区:服务器是 UTC,「上周」的边界会差 8 小时 → 边界一律按本地时区的 ISO 周算② 日期字段:rebase / cherry-pick 会改 committer date → 统计一律用 author date,同时把两个都打印出来核对③ 多邮箱身份:漏提交,见上面的 .mailmap④ merge commit:不加 --no-merges,合进来的提交会被算两遍⑤ 生成文件:lock / dist / min.js / 快照会淹没真实改动,先按路径过滤⑥ numstat 里的 “-”:二进制文件不等于 0 行,直接当 0 会把总量算低
这六条其实是一句话:先对齐口径,再写代码。口径没对齐,跑出来的数字只是「看起来像真的」。
三、模板:两份报告,各自只回答一个问题
给 Leader 版只有三块:三行结论、关键数字、风险卡点。每条结论后面必须挂得住一个 commit hash。
给自己版是另一回事:卡点、被否掉的方案、文档链接、能进季度述职的素材。
然后是最重要的一条分工:数字由脚本算,模型只负责写话。输出固定成 JSON,prompt 里写死一句「没有依据的主题不许出现,凑不出来就写无」。
{"主题": "...", "依据": ["commit hash"], "结果": "...", "风险": "...", "下周": "..."}

模板不是格式问题,是「谁能改这份报告」的问题
四、定时触发,只做对两件事
第一件,按 ISO 周算,不是「最近 7 天」。cron 放周一 08:00,窗口是上周一 00:00 到上周日 23:59:59。
第二件,幂等。state.json 里记已处理的 commit sha;同一批提交按集合 hash 缓存聚类结果。重跑不该重调模型,也不该产出第二份文件。
再加一条:跑挂了要能吼你一声。定时任务最大的坑不是失败,是失败了没人知道。
五、进阶:把周报反过来喂给述职
多数教程不会讲到这一层
大多数人止步于「报告生成了」。这一步才是收益最大的:
① 13 份周报抽成「主题—结果—数字」三元组,季度总结的骨架就出来了,数字还是脚本算的,能追到 commit。
② 在周报里固定写一个「下周」字段,下一周生成时自动拿上周的计划跟实际完成对比,输出一张 计划-实际偏差表。
这张表能让你在述职里说出这句话:「我计划的事,完成率多少,没完成的卡在哪。」

周报的终点不是报告,是证据
我踩过的三个坑
坑一,第一次跑通后连跑三次,收到三份文件。修法是幂等 + 在模板里标出人工编辑区(我用一对 HTML 注释标记),重渲染时跳过这段,别把你自己手写的话覆盖掉。
坑二,两次周报数字不一样,本地复现不出来。因为服务器是 UTC,cron 在周一早上跑出来的「上周」少了一天。这条坑只在生产环境出现,本地永远是好的。
坑三,模型编了一个漂亮的「主题」。数字有依据,主题没有。修法是把「依据」做成必填字段:每条主题必须引用 commit hash,引用不到就不许出现。
3 天排期
Day 1:多仓库采集跑通(mailmap + 口径 + JSONL)Day 2:聚类 + 两版模板 + 幂等Day 3:cron + 缓存 + 偏差表 + 述职导出
做完你手上应该有一个能跑的 weekly/ 目录:一条命令产出带周次的 Markdown(比如 weekly-2026-W39.md),每条结论能追到 commit,同一天重复跑结果一样。
总结——→ 3 个文件 + 1 个 state.json + 1 行 crontab→ 数字对不上九成是口径:时区、author date、多邮箱、merge、生成文件→ 数字脚本算,模型只写话;每条结论必须能追到 commit→ 进阶那一步是偏差表,它把周报从「记录」变成了「证据」
💬 你的周报卡在第几步?多仓库还是数字对不上?📂 更多同类内容,点击合集「90天玩转AI」如果觉得有用,点个「在看」↘