Quellcode durchsuchen

docs(claude): 补充容器接入三条硬约定(结束信号/长任务状态/能力边界)

依据 2026-11-11 实测:
- 结束信号用 ✅ reaction,不用 typing(typing 早于正文 0.6 秒)
- 验证必须用 /sync,m.typing 是 ephemeral 不进 timeline
- 长任务有步骤+无信号 = 一直输出中,超时只弹提示不改状态
- /opt/hermes 无写权限(root 属主,非只读挂载),/opt/data 可写

Co-Authored-By: Claude Code <noreply@anthropic.com>
Huccct vor 1 Stunde
Ursprung
Commit
aaadbb9255
1 geänderte Dateien mit 9 neuen und 0 gelöschten Zeilen
  1. 9 0
      CLAUDE.md

+ 9 - 0
CLAUDE.md

@@ -24,6 +24,15 @@
   - 不得使用 `agent-node-app-lj-test-v1`(`@axmojmfphr:fmode.cn`)—— 它是**另一个容器**,成果表/文件目录互不相通。
   - 历史踩坑:2026-11-10 做成果上云验证时误用 v1,导致「容器说上传成功、App 成果端为空」的假象,排查耗时。
   - 新容器接入、成果上云、会话收发、群聊协作等一切实测,以该容器为唯一被测对象。
+- **🔴 容器结束信号 = ✅ reaction,不是 typing**(用户实测定稿 2026-11-11,详见 `docs/03-interface/容器接入完整指南-v2-20261111.md`):
+  - 容器每轮结束在 Matrix 打 `✅`(失败打 `❌`),由 Hermes `on_processing_complete()` 在**消息发送之后**发,时序天然正确。
+  - **不要用 `m.typing=false`**:它在消息发送**之前**由 `finally` 发出,实测早于正文 0.6 秒,会导致「还没回就说完了」。
+  - App 侧 `core/matrix-client.service.ts::onTurnReaction()` 消费,**按消息 id 认领 + 校验 sender**(群聊多容器时各自打各自的 ✅)。
+  - **验证方式**:必须用 `/sync` 监听。`m.typing` 是 ephemeral 事件,**不进 timeline**,用 `/messages` 读永远是 0 条(踩过坑,误判过两次)。
+- **🔴 长任务状态口径**:有过程步骤 + 未收到结束信号 = **一直显示「输出中」**,不用时间猜结束。
+  超时(`TURN_TIMEOUT_MS` 5 分钟)只用来**弹提示**,**不改写状态**。用户裁决原话:「应该保持到会话结束」。
+- **🔴 容器能力边界**:`/opt/hermes` 是 **root 属主 + 无写权限**(不是只读挂载,overlayfs 是 rw,但 `hermes` 用户写不进去);
+  `/opt/data` 可写,插件放这里。改配置用 `hermes plugins enable/disable`,重启用 `s6-svc -r /run/s6/services/main-hermes`。
 - 应用类型与规模:**单前端 Angular SPA**(无自建后端);双端路由 `/desktop/**` + `/mobile/**`,约 20 条路由;不做响应式布局切换——入口页 `replaceUrl` 按 UA/视口一次性判定跳端,之后各端布局固定;两端共享 `core/` 服务与 `components/` 组件
 - **fmode-ng 依赖版本与初始化 config 实例名**:`fmode-ng ^0.0.246`,`FmodeParse.with('nova')` → appId `ncloudmaster` / `serverURL https://server.fmode.cn/parse`
 - 目录布局:**单 Angular workspace(非 monorepo)**,根目录即应用;`src/app/` 下计划 `core/`(共享服务)· `components/`(业务外壳组件)· `ui/`(ui-kit 官方底座,整目录接入,禁改)· `desktop/` · `mobile/` · `pages/`