3.8 KiB
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)
- "极简格式" ≠ 合规 — 只要含"浮盈/仍持仓/重复...已推"任何字符,就算一行也违规
- "silent output" = 0 字符 — 不输出任何字符,或只输出
⏭️单独字符(黑名单只有 ⏭️ 配合后续字符才命中) - 例外清单要精炼 — 目前 EXCEPTION_TOKENS 只有 3 个,后续按实战数据扩
- 黑名单要包含 USDT $数字 — "USDT $43" 也算状态泄漏
关联
- v4.5.24 第一次:
v4.5.24-2026-07-08-third-violation.md - v4.5.24 第二次: 本文件
- 实现:
scripts/sanitize_reply.py✅ 本次review写入