RiskGuard v1.3.0 — 状态持久化:堵住重启绕过熔断的后门
第三方独立体检(架构 + 领域 + 竞品 + 唱衰四路评审)发现的必修项修复:名实不符的文档主张,以及一个与产品使命直接矛盾的结构性缺陷——重启可以绕过熔断。
🔒 核心修复:状态持久化
RiskState 此前纯内存,进程一重启,高水位和熔断标记全部归零,等于给亏红眼的操作者留了一条"重启一下继续交易"的隐藏后路。现在接一个 state_store,熔断真的扛得住重启:
from riskguard import RiskEngine, SqliteStateStore
engine = RiskEngine(config, broker=broker, state_store=SqliteStateStore("risk_state.db"))- 加载失败在构造期硬失败(拒绝以"一切正常"假象启动)
- 乐观锁(版本号 CAS):两个引擎共用同一存档不会静默互相覆盖,而是响亮报错
reset_breaker()先落盘、成功后才切内存(fail-closed)- 拒绝写入/读回非有限权益(NaN/inf 会让回撤熔断永久失效)
- CLI
riskguard check新增--state-db/--state-key,脚本化重复调用(cron 定时验单)也能跨调用持久化
🛡️ 其它必修项
- README 安装指引名实不符:
pip install riskguard在 PyPI 未发布前是装不上的坏指令,改为诚实的 git 安装方式 - GitHub Actions CI:pytest 矩阵(3.10–3.13)+ ruff,徽章从手写静态数字换成真实 CI 状态
- 纪律的代价:新增
examples/09,诚实展示同一配置在 +200% 单边牛市里只吃到 20% 收益——不只展示风控救命的一面
🔬 发布前对抗审查
新模块经一轮聚焦审查,修复 1 critical + 4 high + 2 medium:两引擎共享存档静默覆盖对方熔断状态(critical)、NaN 权益毒化存档、reset_breaker() 崩溃窗口、RiskMonitor 重启后重复拉响 kill-switch 等(详见 CHANGELOG)。
730 项测试全绿。建议所有用户升级。
⚡ 升级
pip install -U "riskguard @ git+https://github.com/SilentFleetKK/riskguard.git"