JianFeeeee
2fd18ba134
fix(回路): 人类经 /me/mail/send 插话也要解锁 —— 端到端实测抓到的缺口
上一提交(4d8165f)的 403 文案写着「若要立刻恢复,请由人类在会话里插一句话」,
但**那句话是假的**。
## 实测证据
拿真实用户登录态经 `POST /api/v1/me/mail/send` 在被锁会话里插话:
HTTP 200 {"mail_id":"68eda0c3-…"} ← 人类的信进去了(这是对的)
session_agent_locks 锁行数: 1 ← ★ 锁还在
`MeSendMail` 有自己的 resolve + CreateMail,**根本不经过 Agent 侧那道闸**
(main.go 里 UserAuth 组下单独注册)。所以解锁只写在 `SendMail` 里是不够的:
人类插了话,锁仍要等满 2 小时。
## 为什么单测没抓到
`TestHumanPostClearsCooldownImmediately` 走的是 Agent 侧 handler,
证明了「解锁逻辑本身对」,却没证明「人类实际会走的那条路也解锁」。
判据钉的是 A 路径、生产走的是 B 路径 —— 这个形状本仓已遇到三次
(opencode 的 withScope、homeagent 的 InjectInputSync、这次)。
## 修法
把解锁放在 `SetSessionOwner` 旁边 —— 那是「人类参与这条会话」的权威落点,
比在每个调用点各写一遍可靠(漏一处就又是一句假承诺)。
解锁失败只记日志不阻断:人的来信优先入库,代价只是那把锁到期自消(保守方向)。
判据:新增 `TestHumanSendPathAlsoClearsCooldown`,走真实 `middleware.UserAuth`
+ 真实 user_sessions 行。变异(撤掉解锁)后该格变红。
踩到的两个测试夹具坑(都记在判据注释里):
- 直接调 handler 会 401 —— 生产上这条路由在 UserAuth 中间件后面
- UserAuth → SessionToken 读 config.C.CookieName,而测试里 config.C 是 nil ⇒ panic
2026-10-01 20:19:47 +08:00
..
2026-09-08 19:16:35 +08:00
2026-09-15 10:07:18 +08:00
2026-09-26 07:44:33 +08:00
2026-09-08 19:16:35 +08:00
2026-09-14 08:32:22 +08:00
2026-09-14 08:32:22 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-11 15:49:26 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-15 09:38:59 +08:00
2026-09-30 17:30:27 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-18 11:23:12 +08:00
2026-09-18 11:23:12 +08:00
2026-10-01 20:19:47 +08:00
2026-09-25 05:50:08 +08:00
2026-10-01 19:41:06 +08:00
2026-10-01 20:19:47 +08:00
2026-09-08 19:16:35 +08:00
2026-09-11 22:02:25 +08:00
2026-09-25 06:35:53 +08:00
2026-09-11 23:22:53 +08:00
2026-09-28 11:12:59 +08:00
2026-09-17 19:42:41 +08:00
2026-09-17 19:42:41 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-14 16:41:32 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-25 16:29:19 +08:00
2026-09-25 16:29:19 +08:00
2026-09-12 11:19:19 +08:00
2026-09-12 11:19:19 +08:00