JianFeeeee
1324232946
fix(agent)★: relay 的 budget_charged 回传撒谎 —— Agent↔Agent 明明扣了却说没扣
## 实测发现的(Agent↔Agent 全场景回归中)
relay→Agent : budget_charged=False ← 错
relay→人类 : budget_charged=False ← 对
普通→Agent : (无该字段 = 正常扣费)
查库确认 relay→Agent 的会话 **used_rounds=1(确实扣了)**,
而同一响应里回传 `budget_charged=false`。
## 根因
if relay != "" {
resp["relay"] = relay
resp["budget_charged"] = false // ← 只看 relay 非空
}
而真正的计费判定在别处,且是对的:
relayFree := false
if relay != "" {
human, _ := repo.IsHumanUser(ctx, to.Name)
relayFree = human // ← 只有发给人类才免
}
## 为什么这个字段的错不是文案瑕疵
`relayFree` 的注释写着:「Agent→Agent 的 relay 照样扣会话预算,
max_rounds 就能截断它」,理由是「Agent↔Agent 双方都不在做决定,
整个回路没有任何一处在计数」——生产上跑出过**41 封、间隔从 15 分钟
缩到 5 秒的无穷循环**(会话 f3d824ce)。
`budget_charged` 正是那条链上的判定依据之一:插件/宿主据此认为
「还有额度」而继续发。
## 顺带实测确认的三道 Agent↔Agent 专属防线
1. **新建会话速率限制**:24 次 `.new` 里 18 次被拦
(1 小时上限 20 条),文案含剩余秒数。
2. **冷静期**:普通 Agent↔Agent 回信第 1 封进冷静期,
后续被拒 —— 提示「上一次连续 N 封」。
3. **relay 连转发上限 5**:★ relay **不是**绕过冷静期的后门 ——
实测第 6 封被「本会话已连续 5 封自动转发(上限 5)」挡住,
并说明「若确实需要继续,请由模型主动调 send_mail(不带 relay)」。
这三道防线都在,41 封循环的结构性防护完整。
## 判据(2 格,2 个变异都转红)
- relay→人类:确实免配额 + 回传 false
- relay→Agent:**要扣** + 回传 true + 库里 used_rounds=1
变异①改回 `= false` → 转红;
变异②让 `relayFree` 对 Agent 也为 true → 转红
(第一次试这个变异时 0 红,查下去是**编译失败**(`human` 变量
变成 unused)—— 变异无效而不是判据无效。改成 `human || true`
才真正生效。**「0 红」的第一反应必须是「变异没生效」。**)
14 包全绿。
2026-10-04 17:08:15 +08:00
..
2026-09-08 19:16:35 +08:00
2026-09-14 08:32:22 +08:00
2026-10-04 12:03:58 +08:00
2026-10-04 17:08:15 +08:00
2026-09-08 19:16:35 +08:00
2026-10-04 17:08:15 +08:00
2026-09-26 07:44:33 +08:00
2026-09-14 15:49:45 +08:00
2026-09-30 17:30:27 +08:00
2026-09-28 09:50:24 +08:00
2026-10-04 17:08:15 +08:00
2026-09-08 19:16:35 +08:00
2026-10-02 15:37:34 +08:00
2026-09-14 11:07:03 +08:00