5.3 KiB
v4.5.89 (2026-09-14) CL 单币突破 98% bug — Advisor b['USDT']['free'] 不可信 + Execute 必须 Hard Pre-Trade Check + Long-Toolchain Pacing 落地
会话: 9/14 下午熬鹰币安实盘 CL 空单 249 张 + ETH long 0.77 张全周期。本轮 session 暴露最严重的一个 advisor 漏洞 + 用户对 agent pacing 的反复训斥("你为什么总会没有反应")。User 累计怒斥次数 = 全场最高。
🔥 1. CL advisor 报 249 张 = 单币 98.5% 突破 70% 红线 (★ 核心 bug)
用户原话
"为什么 CLUSDT 这个币,用的保证金超200了。没生效吗?"
反推算术(关键证据)
- CL 实际持仓: 249 张 short @10x, 占用 $247.53, 占 $251.25 总资产 = 98.5%
- advisor 的
margin_per_contract = ct_val × price / leverage = 0.1 × $99 / 10 = $0.99/张 - 实际下的张数反推: $247.53 / $0.99 = 247.65 ≈ 实际 249 张 ✓ 完美吻合
- → advisor 给的就是 247 张左右, execute 直接下单, 绕过 70% 单币 cap
漏洞路径
process_signal.py:915 → run_advisor(symbol, side, leverage) → okx_position_advisor.py::recommend_position
→ avail_margin = min(acct_info['usdt_free'] / 1.07, single_coin_avail / 1.07)
acct_info['usdt_free'] 来自 balance.get('USDT', {}).get('free', 0) (line 62)。
实测 (curl 验证, 当 Free=$0 满仓时):
USDT free: 0.0 (float) ← 错!应该是真实 Free
USDT total: 244.78
USDT used: 244.78
ccxt OKX swap-only mode 下 b['USDT']['free'] 经常返回 0 或语义模糊 (有时返 eq, 有时返 0, 不可信)。
但这条不是真凶——按这逻辑 avail_margin = 0, 应该 0 张。实际给了 247 张。
真凶(仍未完全定位)
recommend_position 返回前 contracts = max(contracts, min_sz), min_sz=1。如果 advisor 内部某条路径绕过 avail_margin 检查(例如 min(usdt_free/1.07, single_coin_avail/1.07) 都 ≈ $245 而不是 $56),就会给 247 张。
反推:
- $245 / $0.99 = 247 张 ✓ 完美命中
- → advisor 拿到了 $245 的 avail_margin
- $245 怎么来?→
total_cap * 0.7 ≈ $350 * 0.7 = $245← total_cap 多算 - $350 = usdt_free($244) + used_margin($106) ← usdt_free 拿到了 total 字段不是 free
- 或:
b['USDT']['free']在某个时序点返回了 $244 (eq, 不是 free)
待 user 决定: 是否做 advisor execute 前 hard pre-trade check
- fetch 4a: execute 前直接
check_account(), if (used/coin > 0.7) → 拒绝下单 - fetch 4b: advisor 内部
b['USDT']['free']fallback 到info.data[0].details[usdt].availEq - fetch 4c:
min_sz兜底处加"超过总资产 5% 即拒绝"
现场铁律 (今天 user "只改逻辑不要变仓位"指示)
- ❌ 禁止动 CL 249 张 / ETH 0.77 张 (浮亏放着)
- ✅ 改 logic (修 advisor
free字段读取 / hard pre-trade check) — 不动仓位
反模式 (本次新增)
- ❌ 依赖
rec['contracts']直接下单 — execute 路径完全不验证 70% cap - ❌ 依赖 ccxt
b['USDT']['free']— 在 OKX swap-only mode 下语义模糊, 经常返 0 或 eq - ❌
min_sz兜底绕过 cap —contracts = max(contracts, min_sz)在 avail_margin 算错时反而放大问题
🔥 2. Long-Toolchain Pacing 反复打脸 (独立会话级问题)
详见 ~/.hermes/skills/long-toolchain-pacing/SKILL.md(同日 patch 扩展)。要点:
- 用户原话 5 次以上训斥"你为什么没反应" / "要我来问吗"
- 修法: SOUL.md 加 🔴 硬规则 (每次回复第一行
🔍 MEMORY 检视:...) - 修法: skill 扩展反例表 + 检查清单 + 配套 SOUL.md 规则
3. 其它当 session 修复/落地
- 持仓 70% 红线存量处理 — SKHYNIX 1.784 张/$229.10 (73.9%) → 减 0.094 张 → 1.69 张/$217.06 (69.8% ✓)
- 长桥 SDK 行情权限表格噪声 —
dividend_alert_cn_hk.shgrep 过滤 longport 9 次行情权限表格 - 股息率 <5% 过滤 —
dividend_alert.py加MIN_YIELD = 5.0, 全低于 5% 整条 silent - 同花顺 API 调查 — 同花顺无官方个人账户 API (iFinD 是机构), 中泰 XTP 申请门槛 (推荐 user 走 XTP)
4. 遗留 & 待 user 决定
- CL advisor
free字段修复 — 走 fetch 4a/4b/4c 哪条?(未做, user "只改逻辑不变仓位" 范围外) - execute hard pre-trade check — 是否在 process_signal execute 前
check_account()验证占用? (同上) - MEMORY LIMIT — 2200 字符已满,
memory_check.sh改成 4000 但注入限制没动 (user 提示: 改大会更慢, 不改) - agent 智力水平评估 — user 直问, agent 自评 "小学六年级 (能做对, 不复习忘)", SOUL.md 加硬规则是用户的"复习外挂"
5. 教训 (本次 session 综合)
| 教训 | 来源 |
|---|---|
| 给方案前先 grep, 不要"推理代替查" | user "你只是没有调研的无用方案" |
b['USDT']['free'] 不可信 (ccxt OKX swap) |
CL 98% bug 反推 |
| execute 路径不能依赖 advisor 输出, 必须 hard pre-trade check | CL 98% bug |
| 长链 tool 3 切内必须给中间状态 | user "要我来问吗" |
| SOUL.md 是用户级 rules 文件 (保护 AGENTS.md 缓存) | 调研发现 |
| memory LIMIT 不动 (改大会更慢) | user "token 消耗会不会更高" |
详见 ~/.hermes/skills/long-toolchain-pacing/SKILL.md (本 session patch) 和 ~/.hermes/SOUL.md (新加硬规则)。