记录一次版本的收尾(2026-06-17)
记录一次版本的收尾(2026-06-17)
一个版本真正花时间的,从来不是写它的那部分
写新功能的时候人是兴奋的,收尾的时候不是。
v1.25 这天要做的,全是最不性感、也最容易漏掉的事:入库、冒烟、补文档、接线。一天下来三个任务,没有一个是"新功能",但没有一个可以跳过。
第一件事:让版本号在库里落地
一个版本如果只在代码里,就不算发布。
tuning_log 表 INSERT id=91 成功,SELECT ... WHERE version='v1.25' 返回 1 行。到这一步,v1.25 才算被系统"认领"。
这一步看起来只是插一行数据,意义却不小:这张调优日志表,是后面所有版本对比的索引。没有这一行,v1.25 的回测结果就是一份没有出处的数字。
冒烟测试:4/5 通过
cg_smoke_v125.py 跑了 5 项,结果如下:
| 检查项 | 结果 |
|---|---|
| ping | [OK] CG Demo 可正常访问 |
/global |
[OK] BTC dominance 56.25%,总市值 $2.325T |
/coins/markets |
[OK] 返回 10 条数据 |
compute_gainers_losers |
[OK] 4 个上涨标的 / 4 个下跌标的 |
fetch_news BTC |
[FAIL] 返回 404 |
5 项里 4 项 OK。冒烟测试的意义不在于全绿,而在于在正式跑起来之前,把能想到的连通性先摸一遍——ping 通不通、市场总量拿不拿得到、榜单返回几条、涨跌家数算不算得出来。这四条过了,说明数据面是活的。
唯一失败的是新闻接口。但这不是新问题——本机网络下 CryptoPanic 受 Clash DNS 限制,返回 404 属于已知限制。处理方式很明确:静默降级,不阻断流程。
一个已知的、有边界的失败,和一个未知的崩溃是两回事。前者写进"已知限制",后者才需要停下来查。
那个 404 值得单独记一条
顺着这个 404,当天还把 CryptoPanic 客户端单独验了一遍:cg_news_client.py 代码已完成且可用,429 限速时返回空列表 [],符合设计,不抛异常。
这点很重要。限速不是错误,是对方在说"慢点"。把限速当异常抛出来,整条采集链就会被一个本该被容忍的事件打断。返回空列表、让上游继续跑,才是对的选择。
同一天还确认了 /news 接口按 Pro-only 处理——也就是把它当成"有就用、没有也不影响主流程"的那类能力。这个决策也被写进了文档,而不是留在某个人的记忆里。
210 行文档,和 5 个 Section
页面这边,C:/Users/Administrator/Documents/craw_app1_wz/defi_dashboard/pages/13_market_mood.py 落盘,验证 render() → True,无 raw SQL,要求的 5 个 Section 全部存在。
配套的 v125-coingecko-market-mood.md 一共 210 行,把该交代的都交代了:
- 4 张表 schema——每张表存什么、字段怎么定义
- 9 个 helper 函数——采集和计算的分工
- 节流策略——额度有限,怎么排队、怎么错峰
- 异动 5 步处理流程——从筛出异常到落库的完整路径
- WAMP P0 问题修复——那个必须优先解决的点
/news接口 Pro-only 决策- 已知限制说明
文档和代码一起交付,是我给自己定的规矩——一个只有代码没有说明的模块,半年后对我就是黑盒。
而且这 210 行不是写给人看的"介绍",是给下一次改这个模块的人(大概率是我自己)看的说明书。schema 变了要同步、节流逻辑改了要同步、已知限制解决了要划掉——它是一份活的清单,不是一次性的总结。
接线,而不是重写
最后一件是 CryptoPanic 客户端和 paper_loop.py 的集成。
改动很小:_strategy_loop 里新增 3 个 last_cg_*_ts 变量,加一个 _cg_init_tables_once() 启动调用;3 个采集块紧跟在 last_cleanup_ts 块之后、except Exception 之前;语法检查无错误。
然后确认了一件反直觉的事:**不需要重启 sim_loop**。因为改的只是被 import 的源文件,运行时自动加载新代码。
位置也是刻意选的——采集块放在 last_cleanup_ts 之后、except Exception 之前,意思是它跟着既有的清理节奏走,而且整段都被同一个异常兜底包住。一个新加的采集任务,不该成为把整个循环拖垮的那个变量。
能接线解决的事,就不要重写。 一个已经在跑的循环,最贵的成本是它正在产生的数据连续性——为了一个新功能把它推倒重来,往往得不偿失。
最后
这一天的三层。
**表面是那个 id=91**——v1.25 在库里有了名字。
中间是 4/5 的冒烟结果:不合格的那一项,恰好是早就知道会不合格的那一项。**"已知"两个字,本身就是一份资产**——它让失败变得可预期、可解释、可降级。
最里面一层,是把"收尾"当成正经活来干。
新功能发布出去会有人夸,收尾不会。但版本能不能被人接手、三个月后还能不能被自己读懂,全看这些不起眼的动作。代码是写给机器跑的,那些 schema、文档、已知限制,是写给下一个读它的人看的——而那个人大概率就是几个月后的自己。