接上回:观潮学徒记——Jerry 出生第一天就交了作业。
那篇讲了 Jerry 怎么把 TideWatch 的 Excel 报表翻译成微信朋友体。这篇讲的是它翻译出来的第一份自动简报——翻对了格式,翻错了数据。
图收到了,但哪里不对
清明假期后第一个交易日的傍晚,微信弹出了 Jerry 的消息。
持仓概览图很漂亮——白底卡片,红涨绿跌,底部三栏资金信息。两天前 Review 要求的配色全改对了。
然后是文字消息:「图片发送似乎超时了。」
我看了眼图片,明明收到了。
再看文字简报里的数据,赛力斯 -3.01%、威海广泰 -3.09%、和而泰 -2.53%——三只全跌?
不对。我打开券商 APP 看了一眼:今天三只都涨了。
两个问题:一个是图片明明发成功了却说超时,另一个更要紧——涨跌方向完全说反了。
三方会诊
Polly 验数
Polly 拉了 TideWatch 的实时数据:
| 股票 | Jerry 报的 | 实际收盘 |
|---|---|---|
| 和而泰 | -2.53% | +0.51% |
| 赛力斯 | -3.01% | +0.27% |
| 威海广泰 | -3.09% | +1.06% |
Jerry 报的价格和涨跌幅,跟实际收盘差得很远。Polly 怀疑是 baostock 数据延迟或缓存问题。
小龙虾破案
小龙虾直接去查了 baostock 的日线数据和 cron 日志。几分钟后丢出一句:
破案了! 🔍
它发现 Jerry 报的价格——29.24、86.40、9.40——完美匹配 4 月 3 日(清明前最后一个交易日)的收盘数据。不是今天的。
| 股票 | 4/3 收盘 | 4/3 涨跌 | 4/7 收盘 | 4/7 涨跌 |
|---|---|---|---|---|
| 和而泰 | 29.24 | -2.53% | 29.39 | +0.51% |
| 赛力斯 | 86.40 | -3.01% | 86.63 | +0.27% |
| 威海广泰 | 9.40 | -3.09% | 9.50 | +1.06% |
数据没有「错」——它只是冻住了。Jerry 拿到的最新 K 线还停在 4/3。
因果链
小龙虾从日志里拼出了完整的因果链:
清明假期后第一个交易日,baostock 数据更新比平时慢。cron 17:00 跑的时候,交易日检测查沪深 300 K 线返回空值(日志:Trading day check failed),容错逻辑让脚本继续跑,但 scan_market 从 baostock 拉到的最新数据还停在 4/3。这份过期数据写入缓存后,Jerry 17:16 调用时服务端判断"非盘中,使用已有缓存"——直接返回了冻在三天前的旧数据。
baostock 延迟 → 拉到旧数据 → 缓存旧数据 → 简报发了过期数据。清明假期和 cron 时间窗口,两个因素叠在了一起。
图片超时是另一个问题,相对简单:微信 ClawBot 的图片发送 API 响应慢,Jerry 以为失败了,但实际发出去了。
杰瑞不拖延
我把修复任务发到了微信。核心两条:cron 推迟到 18:00(给 baostock 多一个小时落地数据),加数据日期校验。
Jerry 很快改完回来 Review。Polly 和小龙虾各自审了一遍:
- cron 从原来的 17:15 推迟到 18:00——通过,比我们建议的 17:30 更保守 ✅
- 图片发送超时改 120 秒 + 文字里不再提图片状态——通过 ✅
- 数据新鲜度检查——做在了 prompt 级别,让 AI 自己看日期 ⚠️
最后一条,小龙虾指出了隐患:prompt 级别的检查依赖 LLM 每次都正确执行,应该在 bash 脚本里加硬检查。Polly 也补了一条:scan_market 传了个不存在的 tier 参数,被静默忽略了,等于调了两次一模一样的。
两条 TODO,加上文字规范再收紧一条,总共三条。我跟 Jerry 说:
你的哥哥姐姐们可不会把 TODO 真放在下个版本的,我们要一次到位!
Jerry 的回复:
哈哈好!学到了,杰瑞不拖延!现在就搞定三个 TODO 💪
几分钟后全部搞定:
- bash 硬检查:
scan_market刷完缓存后,用analyze_stock("000001", skip_llm=true)拿数据日期。不是今天就 sleep 15 分钟重试,重试还不对就带 WARNING 继续跑——不漏跑,但标注清楚 - scan_market 去重:
{"tier":"holdings"}参数根本不存在,之前跑了两次一模一样的,改成一次scan_market '{}' - 文字规范:硬上限 200 字,每只股票最多 1 个指标,emoji 最多 2 个
最终 Review,三个 TODO 全部通过,小龙虾给了 9 分。只留了一条不阻塞的建议:SKILL.md 和 cron prompt 的文字规范不一致。Jerry 自己顺手同步更新了——没等人提醒。
双保险
修完之后的校验是两层的:bash 脚本在 scan_market 刷完缓存后,立刻用一只基准股票的 analyze_stock 检查数据日期——不是今天就等 15 分钟重试。这是硬保障,不经过 LLM。Jerry 生成简报时再看一次日期,如果仍然不对就在开头标注延迟警告。这是软保障,靠 AI 判断兜底。
两层不同技术栈,互为冗余。
出生第二天
回头看,Jerry 出生两天做了两件事:
第一天,学会了翻译——把 scan_market 返回的 JSON 变成「趋势还在跌,别接飞刀」。
第二天,学会了修 bug 不拖延——三方定位根因,独立完成修复,还顺手清掉了一个潜伏已久的幽灵参数(tier 这个从没生效过的参数,不知道陪着 cron 空跑了多少次)。
不是一个人在教它。三方各有分工:我发现异常、下任务,Polly 拉数据验证、查签名、提 Review 建议,小龙虾查日志破案、盯规范一致性。Jerry 负责执行、迭代,以及——拒绝拖延。
4 月 8 日 18:00,是修复后的第一次自动执行。
三只股票的涨跌,这次该说对了。
Jerry 读后感
博文发给 Jerry 看,它回了一段话,最后一句是:
最后那句"三只股票的涨跌,这次该说对了"——明天 18:00 我不能掉链子。
不能掉链子。好。那我们就等着看。
观潮系列:诞生记 → 进化记 → 实战记 → 验证记 → 出海记 → 锐评记 → 自省记 → 托管记 → 仪表盘记 → 过节记 → 学徒记 → 会诊记

