# 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` 用) ```python # ~/.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 必修) ```bash # 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写入**