Ver código fonte

docs: 记录 LoopGuard 误判与遗留问题清单(2026-11-08 诊断)

诊断实验(真实账号,三方采样)结论:
- 容器有回复,thread 根正确 → 隔离机制没问题
- 回复延迟约 13 秒,期间界面只有「正在思考…」
- MATRIX_REQUIRE_MENTION=true 与私聊回复无关,此前判断已撤回
  (adapter 里该开关与 is_dm 是两个分支)

遗留问题(P0 两个):
- LoopGuard 误判:repeated 规则不要求连续、不区分会话,
  最近 3 条相似内容即暂停,把正常回复挡在界面外
- 新建会话内存残留多条「你好」,用户只发了一条

P1/P2:回复延迟期间缺反馈、容器状态上报硬编码、
belongsToSession 重复代码、另两个容器未检查、移动端缺 LoopGuard 提示

Co-Authored-By: Claude Code <noreply@anthropic.com>
Huccct 2 horas atrás
pai
commit
30247becb0
1 arquivos alterados com 94 adições e 0 exclusões
  1. 94 0
      docs/00-tracking/操作追踪.md

+ 94 - 0
docs/00-tracking/操作追踪.md

@@ -7097,3 +7097,97 @@ tr '\0' '\n' < /proc/$(pgrep -f 'hermes gateway run')/environ | grep REQUIRE_MEN
 | `tsc --noEmit`(app + spec) | ✅ |
 | `npm test` | ✅ **1339 SUCCESS** |
 | 容器 thread 隔离实测 | ✅ 回复挂同一 thread 根 |
+
+---
+
+## 2026-11-08 晚 · 诊断记录:回复其实有,被 LoopGuard 挡住了
+
+> 遗留问题清单,明天(2026-11-09)按此复测。
+
+### 一、诊断实验(真实账号 + 浏览器自动化,数据全部来自实测)
+
+新建会话 → 发「你好」→ 每 3/8/15/25/40 秒采样三方数据:
+① Matrix 服务端实际收到什么 ② App 内存里有什么 ③ 界面是否显示「自动对话循环」
+
+| 时刻 | `loopPaused` | App 内存条数 | Matrix 上的容器回复 |
+|---|---|---|---|
+| t≈3s | **true** | 3(全是 me:你好) | 还没有 |
+| t≈8s | **true** | 3(全是 me:你好) | 还没有 |
+| t≈15s | false | 4 | ✅ 出现「你好!我在。有什么需要我做的?」 |
+| 13s 左右 | — | — | Matrix 出现,thread 根 = 新会话根 |
+
+**结论 1:容器有回复,且 thread 根完全正确**
+(`thread: ...nuym1jt` 正是新会话 `$approot_mw7l1ezj_wnuym1jt`)。
+→ **thread 隔离机制没问题**,协议层没有问题。
+
+**结论 2:回复延迟约 13 秒**
+容器不是不回,是要跑一轮。这 13 秒里界面上只有「正在思考…」。
+
+**结论 3:`MATRIX_REQUIRE_MENTION=true` 不是原因 —— 此前的判断已撤回**
+`adapter.py` 里 `REQUIRE_MENTION` 与 `is_dm` 是**两个分支**,私聊走 `_dm_mention_threads`,
+与该开关无关。实测:配置仍为 `true`(进程未重启),容器照常回复。
+
+---
+
+### 二、遗留问题清单(明天处理)
+
+#### P0-1 · LoopGuard 误判,把正常回复挡在界面外
+
+**现象**:`loopPaused=true` 持续到 8 秒以上,界面上看不到容器回复;
+用户以为「发了没回」,实际 Matrix 上已经有了。
+
+**根因**(`src/app/core/loop-guard.ts:142-150` + `loop-guard.service.ts:86-100`):
+1. `repeated` 规则**不要求连续**、**不区分会话**:
+   `repeatWindow=3`,最近 3 条内容相似度 ≥0.8 即暂停
+2. `dismissedFor` 按 **agentId** 记而不是 sessionId → 切会话时暂停态残留
+3. `evaluate()` 的 effect 依赖整个 `chat.messages()`,**切换容器或回填时都会重判**
+
+**复现**:在 A、B、C 三个会话里各发一条「你好」(共 3 次相同内容)→ 触发。
+
+**修复方向**:按 sessionId 隔离 + 要求**连续**重复 + 新建会话在保护期内不判定。
+
+#### P0-2 · 新建会话内存里残留多条「你好」
+
+**现象**:新会话 `messages()` 返回 3 条 `me:你好`,但用户只发了一条。
+
+**推测**:`startBlank()` 清了 `_messages`,但乐观消息在发送流程中被重复插入,
+或上一个会话的本地消息未被清理。需要明天用同法采样 `_messages` 的每一次变化定位。
+
+#### P1-1 · 回复延迟 13 秒期间缺乏反馈
+
+界面上只有「正在思考…」,用户无法判断「发出去了没有」。
+考虑:发送成功后到首条回复到达之间,显示「已送达,等待回复」之类的明确状态。
+
+#### P1-2 · 容器状态「正在执行」不实
+
+容器 reporter 把 `status=running` 硬编码(`操作追踪.md:909-914`)。
+前端已加 `isReporterSelfTalk` 兜底(含 2026-11-08 加宽 currentTask 特征),
+**根治需容器整改**,属容器侧待办。
+
+#### P2-1 · `belongsToSession()` 有重复代码
+
+`chat.service.ts:1670-1693` 与 `:1716-1739` 内容完全重复,第二段永远进不去。
+待清理。
+
+#### P2-2 · 另两个容器未检查
+
+`app-lj-test-v1`、`lj` 的 `MATRIX_REQUIRE_MENTION` / `MATRIX_IGNORE_USER_PATTERNS` / reporter 版本
+均未核查,需逐一确认是否与 `lj-test` 一致。
+
+#### P2-3 · LoopGuard 移动端缺提示
+
+`desktop/pages/chat/chat.ts:323-330` 有「检测到自动对话循环」提示,
+移动端 `mobile/pages/chat/chat.ts` **没有** —— 手机上看不到为何没回复,只会一脸茫然。
+
+---
+
+### 三、容器配置现状(不用重启)
+
+| 项 | 值 | 说明 |
+|---|---|---|
+| `MATRIX_REQUIRE_MENTION` | 文件已是 `false`,进程仍是 `true` | 已改但未重启;**已证明与本问题无关** |
+| `MATRIX_IGNORE_USER_PATTERNS` | `@agent-node-lj-test:fmode\.cn` | 不含用户 mxId,正常 |
+| 值的注入方式 | `os.environ`,`adapter.__init__` 读一次(`adapter.py:861`) | 改文件不热生效,需重启进程 |
+| 容器内能否自助重启 | ❌ 无 docker.sock、无 s6 控制权 | 需宿主执行 `docker restart e14260fdce46` |
+
+**明天决定**:保持 `false` 不重启 / 改回 `true` / 重启让其生效 —— 三选一,建议保持不动。