# v4.5.15 — Silent-repeat reply template ban (2026-07-08) **Captured from**: 2026-07-08 Telegram session, ~30 consecutive SKHYNIX long add-signals from 熬鹰资本 (3.06 → 400+ 张, 1% < change per signal). User observed agent producing the exact same one-liner ~30 times. ## The exact anti-template (DO NOT WRITE) ```text SKHYNIX long 0.216张@5x 浮盈+$X 仍持仓; 重复加仓信号已推 ``` Variants observed in this session (all banned): - `SKHYNIX long 0.216张@5x 浮盈+$0.32 仍持仓; 重复加仓信号已推` - `SKHYNIX long 0.216张@5x 浮盈+$0.12 仍持仓; 重复加仓信号已推` - `SKHYNIX long 0.216张@5x 浮盈+$4.18 仍持仓; 重复加仓信号已推` The pattern: any reply that only re-states the current holding + floats + adds "重复信号已推" / "重复加仓信号已推" is forbidden when `process_signal.py` returned one of: - `⏭️ 重复信号,跳过` - `⏭️ 噪声信号(<1%变化),跳过` - `⏭️ 平仓信号完全重复跳过` - `✅ 已推送 | X X x | N张 | 性价比XX` AND no actual position change ## Why it kept happening 1. `process_signal.py` returned the dedup string → agent thought "I should still report something" → wrote the holding state. 2. `position not changed` was treated as worth reporting (it isn't — QQ already has the latest state). 3. No hard rule said "if dedup hit, output ≤ 5 chars or nothing". ## Hard rule (v4.5.15) When `process_signal.py` returns `⏭️` or `✅ 已推送` AND no new position was opened AND no position was closed: - **Reply ≤ 1 line, ≤ 30 chars** - Preferred: `⏭️` (literally one emoji, or two: `⏭️ dedup`) - Acceptable: `⏭️ SKHYNIX 仍持仓` (no floats, no USDT) - **Forbidden**: re-stating floats (`+$0.32`), USDT balance, or "重复加仓信号已推" - **Forbidden**: writing a NEW line of analysis ("熬鹰持续加仓中, 等平仓信号") When `process_signal.py` returns `⚠️ advisor错误: ...` (SSL/timeout/raw REST also failed): - Reply: `⚠️ {SYMBOL} advisor失败,无execute,USDT $X` (1 line, the USDT is allowed because user needs to know if balance changed) - Do NOT spam this for every consecutive signal — after the first occurrence, switch to `⏭️ 仍SSL抽风` ## Session-timeline reference | Signal # | process_signal result | Reply agent gave | Reply should have been | |----------|----------------------|------------------|------------------------| | 1 | `✅ 已推送 SKHYNIX long 5x 0.216张` | `SKHYNIX long 0.216张@5x 已跟, 浮盈+$0.30, USDT $39` | (correct — first execution) | | 2 | `⏭️ 重复信号跳过` | `SKHYNIX long 0.216张@5x 浮盈+$0.32 仍持仓; 重复加仓信号已推` | `⏭️` (or `⏭️ SKHYNIX 仍持仓`) | | 3-30 | `⏭️ 重复信号跳过` | (same 1-line re-state) | `⏭️` every time | | ~10 | `⚠️ advisor错误: SSL` | `⚠️ advisor SSL报错无execute` | `⚠️ SKHYNIX advisor失败,无execute,USDT $39` | | ~15-30 | same `⚠️` | repeated | `⏭️ 仍SSL抽风` | ## Why this complements v4.5.10/13 - v4.5.10 banned "三选一/Y持/Y减/Y加" — these are decision-tree replies, not status replies. - v4.5.13 banned repeated state replies — but the agent kept producing a "soft" version (one line, status only, no decisions). - **v4.5.15 closes the gap**: even a 1-line state re-state is forbidden when nothing changed. ## Concrete grep self-check Before sending any reply for a repeat signal, agent must run: ```bash DRAFT='{reply_to_send}' echo "$DRAFT" | grep -qE '浮盈|仍持仓|重复.*已推|无execute' && echo 'STOP: this is a status re-state' ``` If `STOP` line prints → replace reply with single `⏭️` or omit entirely (return no message). ## Verified clean example (signal 80 in this session) When the SKHYNIX add-storm finally hit a `🚨 已平仓提醒`, reply was: ```text SKHYNIX long 已自动平仓 ``` That's 1 line, ≤ 20 chars, factual, no state restate — exactly the shape v4.5.15 mandates.