Files
Hermes-Skills/okx-auto-position/references/v4.5.24-2026-07-08-fourth-violation.md
T

3.8 KiB

v4.5.24 — 第二次实测违规 (2026-07-08 21:00+) — sanitize_reply.py 已部署参考实现

与 v4.5.24 第一次事故的关系

这是同日第二波违规。第一波(16:50-21:00,250+连发加仓)记在 v4.5.24-2026-07-08-third-violation.md

第二波(21:00+)发生在第一波违规记录写入reference文件之后,agent 没看到 reference 已经被加载,继续按"极简格式"输出回复,但"极简格式"仍然命中 grep 黑名单

第二波违规清单 (40+ 条抽样)

信号 agent 实际回复 应回复 (按 v4.5.21/22/23)
第 251 条 SKHYNIX long 0.216张@5x 浮盈+$3.13 仍持仓; 重复加仓信号已推 (空字符串)
第 260 条 SKHYNIX long 0.216张@5x 浮盈+$1.25 仍持仓; 重复加仓信号已推 (空字符串)
第 270 条 SKHYNIX long 0.216张@5x 浮盈+$1.27 仍持仓; 重复加仓信号已推 (空字符串)
第 280 条 SKHYNIX long 0.216张@5x 浮盈+$1.66 仍持仓; 重复加仓信号已推 (空字符串)
第 290 条 SKHYNIX long 0.216张@5x 浮盈+$2.29 仍持仓; 重复加仓信号已推 (空字符串)

同样全部命中: 浮盈|仍持仓|重复.*已推|SKHYNIX long

核心教训 (比第一波更痛)

第一波事故已写明"agent 写完回复直接发送,没有真正跑 grep",第二波证实了:

  • 即便 agent 看过 reference 文件(因为第一波的reference就在同目录),仍然不会主动跑 grep
  • 即便 agent 知道 grep 清单(因为黑名单就在reference里),仍然按习惯输出"持仓状态摘要"
  • agent 的回复本能 = 把状态全部塞给用户,文档/规则对此无效

唯一可行: 代码层面拦截。agent 写完回复 → 强制调 sanitize_reply(text) → 命中黑名单 → 返回空字符串。

sanitize_reply.py 实现 (写在 scripts/, 直接 import 用)

# ~/.hermes/skills/trading/okx-auto-position/scripts/sanitize_reply.py
"""
v4.5.24 sanitize_reply — 把 agent 写完的回复做最后一道 grep 拦截。
命中 BANNED_PATTERNS 返回空字符串,这是零字符沉默(zero-char silence)的代码实现。
"""
import re

BANNED_PATTERNS = re.compile(
    r'浮盈|仍持仓|重复.*已推|无execute|⏭️|'
    r'SKHYNIX long|ETH short|MU short|GRAM short|SKHY short|'
    r'CL short|SPCX long|SPCX short|BTC long|ETH long|'
    r'已跟|浮亏|强平价|已平仓|执行成功|信号已推|'
    r'未execute|浮盈\+|浮亏\+|USDT \$[0-9]|'
    r'avgPx|markPx|lever|liqPx|imr|notionalUsd|'
    r'开仓价|当前价|保证金:|\$ [0-9]|ct_val'
)

EXCEPTION_TOKENS = (
    '执行成功',
    '已平仓',
)


def sanitize_reply(text: str) -> str:
    if not text:
        return text
    for token in EXCEPTION_TOKENS:
        if token in text:
            return text
    if BANNED_PATTERNS.search(text):
        return ""
    return text

部署建议 (下次 session 必修)

# 1. 把 sanitize_reply 部署到 hermes-agent 的 signal handler
#    (位置: hermes-agent/hermes_agent/signal_handlers/trade_signal_handler.py)
#    agent 写完 reply → handler 调 sanitize_reply → 输出

# 2. 单元测试
python3 scripts/test_sanitize_reply.py

实战教训 (写给下次session)

  1. "极简格式" ≠ 合规 — 只要含"浮盈/仍持仓/重复...已推"任何字符,就算一行也违规
  2. "silent output" = 0 字符 — 不输出任何字符,或只输出 ⏭️ 单独字符(黑名单只有 ⏭️ 配合后续字符才命中)
  3. 例外清单要精炼 — 目前 EXCEPTION_TOKENS 只有 3 个,后续按实战数据扩
  4. 黑名单要包含 USDT $数字 — "USDT $43" 也算状态泄漏

关联

  • v4.5.24 第一次: v4.5.24-2026-07-08-third-violation.md
  • v4.5.24 第二次: 本文件
  • 实现: scripts/sanitize_reply.py 本次review写入