fix: v5 恢复 v2 骨架,修正 v4 误拦

v4(stable = balance - BUFFER)把「剩余余额」当「从 0 累计的上限」,
U>0 时低估初始池:15:09:51 实测 Bal=596,869(剩 59.7 万)却被
usage 1,696,135 >= 296,869 全拦。守恒反推(U+B=2,293,004)证明
v2 公式数学正确——B 滞后收敛后满足 B = B0 - U,今日消耗 1.696M <
B0 2.293M 无扣费(此前「超余额 13.8 万扣费」基于滞后快照的推断
不成立)。v5 = 恢复 v2(stable = usage + balance - BUFFER),
残留风险仅同步时点 B 滞后(13:36 高估 ~50 万),由 BUFFER + 低余额
加密同步覆盖。文档同步:volc-quota-notes §7.3/§7.5、merge-auto-consume §4.5。
This commit is contained in:
vibe-code
2026-08-12 07:21:13 +00:00
parent d9c7b1406d
commit 97484cb7f8
5 changed files with 100 additions and 67 deletions
+18 -11
View File
@@ -1473,19 +1473,26 @@ def active_monitor_loop():
dynamic_key = f"limit:dynamic:volcengine:remaining:{target}"
# ==========================================
# 📏 v4 冻结快照:stable_limit = max(0, balance − BUFFER)
# 📏 v5(恢复 v2 骨架):stable_limit = max(0, usage + balance − BUFFER)
# ==========================================
# v2 的 usage + balance − BUFFER 假设「消耗中池恒定」(usage ↑ /
# balance ↓ 同步),但余额 API 实测滞后(2026-08-12 观察:快照
# 1,558,307 在 usage 1.24M→1.70M 期间不动,滞后上限未知),
# balance 不随消耗实时递减 → 池随 usage 膨胀、限额虚高,
# 「余额耗尽 → 限额 0」防线失效 → 放行到扣费区(当日超余额 13.8 万)。
# v4:以最近同步快照的余额为「当日免费池上限」,本地 usage 实时
# 累计撞线即拦(等价于本地实时扣减余额),不随 usage 膨胀;
# 扣费判定 = 消耗 > 当下免费额度即扣费(与采集量/返还无关)。
# BUFFER 覆盖快照滞后窗口内的消耗。见 docs/volc-quota-notes.md §7.3。
# 论证(2026-08-12 实测修正):
# 1. 「usage + balance = 当日初始免费池」数学正确的前提是 balance 随
# 消耗实时递减 —— 实测(14:59:51 同步)U=1,696,135 + B=596,869
# = 2,293,004 ≈ 守恒初始池,B 在滞后收敛后确实等于 B0 − U,
# 与理论剩余 597,004 几乎一致 → v2 公式本身是对的。
# 2. v4 的 balance − BUFFER 是错误:把「剩余余额」当「从 0 累计的
# 上限」,同步时 U>0 则 stable 低估初始池 → 有真实剩余额度却误拦
# (15:09:51 实测:Bal=596,869 剩 59.7 万却被 usage≥296,869 全拦)。
# 3. v2 残留风险仅剩「同步时点 B 滞后」(13:36 快照 1,558,307 高估
# 真实剩余约 50 万,池虚高)→ 由 BUFFER + 低余额加密同步(600s)
# + burst 触发覆盖;滞后收敛后(1 小时内实测)池回到守恒值。
# 4. 扣费判定 = 消耗 > 当下免费额度即扣费;今日消耗 1,696,135 <
# 初始池 2,293,004 → 无扣费(此前"超余额 13.8 万已扣费"基于滞后
# 快照 1,558,307 的推断不成立)。
# 结论:stable = usage + balance − BUFFER(v2 原式),BUFFER 覆盖
# 同步窗口内的余额滞后。见 docs/volc-quota-notes.md §7.5。
stable_limit = int(max(0, balance - BUFFER))
stable_limit = int(max(0, current_usage + balance - BUFFER))
stable_limit_key = (
f"limit:dynamic:volcengine:stable_limit:{target}"