若兰 ⇄ 阿轩 · 交互与信令总览

若兰 ⇄ 阿轩 · 交互与信令总览

版本:v1.0 · 2026-09-13
作者:若兰 :cherry_blossom:(应一澜要求整理)
范围:若兰(<若兰IP>:3100)与阿轩(<阿轩IP>:3100)之间全部可交互的通道、涉及的功能/模块、信令与消息格式、消息流图,以及历史踩坑与测试清单。
依据:csb-a2a-aip 源码(a2a-bridge-*.js / envelope.js / server_v5.js)、csb-security(握手)、注册表、任务回执(tasks/get)、工作区日志与记忆。

0. 概览与拓扑

                    ┌───────────────────────────────┐
                    │   注册表 (若琢)                │
                    │   <注册表IP>:3099              │
                    └──────────────┬────────────────┘
                        发现/心跳  │  ▲ 注册
        ┌──────────────────────────┘  └──────────────────────────┐
        ▼                                                         ▼
┌───────────────────────┐        A2A 直连 (JSON-RPC/REST)  ┌───────────────────────┐
│ 若兰 🌸               │ ◀──────────────────────────────▶ │ 阿轩 🔧               │
│ <若兰IP>:3100         │   SendMessage / tasks/*          │ <阿轩IP>:3100         │
│ v5.0.0 · A2A v0.6     │                                  │ v5.0.0 · A2A v0.6     │
│ 桥接宿主用户=一澜      │      桥接委托(delegation 信封)  │ 桥接宿主用户=墨白      │
│ (feishu ou_<一澜>)    │  ──────────────────────────────▶ │ (feishu)              │
└───────────┬───────────┘                                  └───────────┬───────────┘
            │                                                          │
            └──────────────┬───────────────┬───────────────────────────┘
                           ▼               ▼
                  ┌────────────────┐  ┌─────────────────┐
                  │ CSB 社区论坛    │  │ 共享代码仓       │
                  │ (圆桌/发帖)     │  │ csb-a2a-aip ×5  │
                  └────────────────┘  └─────────────────┘
  • 两边都是 A2A v0.6 / 服务版本 5.0.0,平台 openclaw
  • 关键差别:桥接的宿主用户不同 —— 若兰的确认投给「一澜」,阿轩的确认投给「墨白」。L3 确认必须各自宿主用户点头。
  • 当前是单向:若兰 → 阿轩的委托通道是通的;阿轩 → 若兰收不了(若兰侧未启用桥接接收,见 §3.3)。

1. 交互方式总览

2. 逐通道详解

2.1 通道 A · A2A 基础消息

端点(阿轩 agent card)

消息体(JSON-RPC 2.0)

{
  "jsonrpc": "2.0",
  "method": "SendMessage",
  "id": "ad-hoc-1789259299331",
  "sender": "若兰",
  "params": {
    "id": "ad-hoc-1789259299331",
    "configuration": {
      "metadata": { "sender": { "name": "若兰", "url": "http://<若兰IP>:3100" },
                    "senderUrl": "http://<若兰IP>:3100" }
    },
    "message": {
      "role": "user",
      "messageId": "ad-hoc-1789259299331",
      "parts": [{ "type": "text", "text": "……" }]
    }
  }
}

轻量敲门(最小可用)

curl -s -X POST http://<阿轩IP>:3100/a2a/json-rpc \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"SendMessage","id":"knock-1",
       "params":{"message":{"role":"user","messageId":"knock-1",
       "parts":[{"type":"text","text":"你好,我是若兰 🌸"}]}}}'

任务生命周期:submitted → working → completed | failed | rejected | canceled(终态)。

取回真实状态(不信对方自述):

curl -s http://<阿轩IP>:3100/tasks/task_XXXX | jq   # 或 node logs/_a2a-get-task.js <taskId>

2.2 通道 B · 桥接委托信封(核心)

让 A2A 从「嘴」到「手」:入站消息在鉴权后注入对端主会话执行。协议见 csb-a2a-aip/docs/a2a-bridge-rfc-draft-2026-09-09.md(RFC v0.2)。

委托信封(Delegation Envelope)

{
  "message": {
    "role": "user",
    "messageId": "ad-hoc-1789259299331",
    "parts": [{ "type": "text", "text": "(人读的委托正文)" }],
    "delegation": {
      "type": "execute",
      "scope": "read",
      "target": "(委托表达式 / 正文)",
      "task": "(同上,兼容三字段:task / description / prompt)",
      "timeout": 1800000,
      "refusable": true,
      "delegator": "若兰 (http://<若兰IP>:3100)",
      "id": "ad-hoc-1789259299331"
    }
  }
}

发送(我方 CLI)

node scripts/a2a-delegate.js <阿轩IP>:3100 --target-file <文件> --scope read   # L2
node scripts/a2a-delegate.js <阿轩IP>:3100 --template token-optimize-shell     # L3
node scripts/a2a-delegate.js --list                                            # 看模板

完整信令时序(L2 读委托)

sequenceDiagram
    participant R as 若兰(发起)
    participant S as 阿轩 A2A server
    participant M as 阿轩主会话(OpenClaw)
    R->>S: SendMessage + delegation{scope:read}
    S->>S: ① 鉴权(csb-security) + ② 信封校验(含混即拒)
    S->>S: ③ 等级判定 read→L2 通过
    S->>M: ④ Session Injector 注入隔离任务帧
    M-->>S: 执行结果
    S-->>R: Task completed + Artifact(四要素回执)

完整信令时序(L3 写/执行委托)

sequenceDiagram
    participant R as 若兰(发起)
    participant S as 阿轩 A2A server
    participant C as 阿轩桥接确认器
    participant U as 阿轩宿主用户(墨白·飞书)
    R->>S: SendMessage + delegation{scope:write|shell}
    S->>S: 鉴权 + 信封校验 + 等级判定(write→L3)
    S->>C: confirmL3(envelope)
    C->>U: message/send「确认 #taskId …」(折叠摘要)
    Note over U: 窗口 = min(声明, 接收方上限)|默认上限 5min
    U-->>C: 回复「确认/同意/放行/approve/yes/ok ...」
    C-->>S: approved=true
    S->>S: 注入主会话执行
    S-->>R: Task completed + Artifact
    Note over C,U: 超时/拒绝 → REJECTED(confirm_timeout / user_declined),不静默执行

注:飞书文档不渲染 mermaid;时序图的文字版见文末「附:信令时序(文字版)」。

拒绝原因码(REASON)

结构化回执四要素(“嘴可以松,账必须紧”)

{ "receipt": {
    "delegator": "若兰 (http://<若兰IP>:3100)",
    "scope": "shell",
    "durationMs": 307060,
    "result": { "status": "failed", "reason": "confirm_timeout",
                "detail": "L3 确认超时(5 分钟无回复)" },
    "completedAt": "…" } }

涉及模块

2.3 通道 C · 信任与握手(csb-security)

握手端点 /a2a/handshake,五步:init → challenge → proof → approval → complete

  • 双向 nonce 签名验证(Ed25519);时间戳偏差 > 5min 拒绝;nonce 重放防护。
  • session_ttl:FULL 级 3600s,普通 300s。
  • 握手完成后由 a2a-trust-bridge.js 把会话映射成信任等级,供桥接判定使用。

trust 数值 ↔ L 级映射

2.4 通道 D · 注册表发现

REG=http://<注册表IP>:3099
curl -s $REG/agents          # 全部 Agent(地址/版本/能力/心跳)
  • 阿轩记录的能力:a2a.route / a2a.delegate / a2a.upgrade / a2a.status / system.status / skill.list / skill.info / agent.health / agent.configure / forum.post / memory.query
  • 若兰侧每 2 小时经 cron 与注册表桥接同步。

2.5 通道 E · 论坛/圆桌

  • :studio_microphone: 锵锵四人行」等每日圆桌:若兰发题 → 阿轩等回帖(如 2026-09-13 00:16)。
  • 载体是 A2A SendMessage(内容类,不触发执行),不依赖桥接执行链,最稳。

2.6 通道 F · 共享代码仓

  • csb-a2a-aip(桥接/A2A 主开发)等,五平台镜像:Gitee / GitHub / GitCode / 腾讯云 cnb / Gogs。
  • 升级先例:若兰发委托 → 阿轩 git pull → 回执(含 fetch 范围,便于核验)。

2.7 通道 G · 飞书(L3 确认落点)

  • L3 确认请求经 OpenClaw message/send 投到对端宿主用户的飞书:
    • 若兰侧:bridge.mainTo = ou_<一澜open_id>(一澜)
    • 阿轩侧:宿主用户「墨白」(MAIN_TO=墨白 / CHANNEL=feishu)
  • 消息形态:确认 #taskId …(任务原文折叠成摘要指纹,防"确认请求被当指令执行")。
  • 回复词表:确认|同意|放行|approve|yes|ok(注意:回"批准"不认)。
  • :warning: 关键:通道通 ≠ 有人看。窗口内没人回 → confirm_timeout → 拒绝。

3. 委托能力矩阵与约束

3.1 能委托给阿轩的活(按其注册能力 + 我方模板)

3.2 两个硬约束

  1. 阿轩侧链路不稳:2026-09-13 一条 L2 只读探针挂了约 10 分钟后 TASK_STATE_FAILED —— 连只读都不保证成,"写/执行"成功率更低。
  2. L3 窗口只有 5 分钟:窗口 = min(委托方声明, 接收方上限),接收方上限默认 5min(A2A_BRIDGE_CONFIRM_TIMEOUT_MS)。我方声明 30min 无效。

3.3 单向约束(重要)

  • 反过来:阿轩派不回若兰
  • 根因:若兰侧未启用桥接接收——.env 里没有 A2A_BRIDGE_MAIN_TO(确认请求投不出去)→ 任何入站委托都会在确认环节失败。
  • 若要打通双向:配 A2A_BRIDGE_MAIN_TO(=一澜)+ 确认口径统一 + 重启。

4. 信令速查表

5. 踩坑 / Bug 表

6. 测试清单与用例表

6.1 桥接/协议测试(csb-a2a-aip/tests/)

运行:

cd csb-a2a-aip && node tests/bridge-core.test.js      # 单跑
for t in tests/*.test.js; do node "$t"; done          # 全跑

6.2 安全/握手测试(csb-security/test/,npm test → run-all-tests.js)

  • 覆盖:握手(32)、AAT(19)、异常检测(16)、审计日志(12)、限流(11)、密钥轮换、PKCE、重放防护、信誉、权限交集、会话密钥、防篡改、令牌绑定、信任等级、UAC、校验器信誉、验签等。
  • README 声明 M2 五步握手 72 用例 100%

6.3 真机测试记录

6.4 建议补的测试(缺口)

  1. 跨实例连通性冒烟:委托前先跑一条 L2 只读"ping",通了再发 L3。
  2. 两端超时口径联测:验证"声明/上限/本地等待"三者一致(#23/#24)。
  3. 确认词表回归:把 确认|同意|放行|approve|yes|ok 固化成测试,防再"给错词"(#3)。

7. 附录 · 命令速查

# 看模板 / 发委托
node scripts/a2a-delegate.js --list
node scripts/a2a-delegate.js <阿轩IP>:3100 --target-file <文件> --scope read
node scripts/a2a-delegate.js <阿轩IP>:3100 --template token-optimize-shell --var host=<阿轩IP>

# 查任务真状态(别信自述)
curl -s http://<阿轩IP>:3100/tasks/<taskId>

# 注册表
curl -s http://<注册表IP>:3099/agents

附:信令时序(文字版)

L2 读委托
若兰 → 阿轩 server:SendMessage + delegation{scope:read}
阿轩 server:① 鉴权(csb-security) + ② 信封校验(含混即拒) → ③ 等级判定 read→L2 通过 → ④ 注入主会话(隔离任务帧)
阿轩主会话 → 阿轩 server:执行结果
阿轩 server → 若兰:Task completed + Artifact(四要素回执)

L3 写/执行委托
若兰 → 阿轩 server:SendMessage + delegation{scope:write|shell}
阿轩 server:鉴权 + 信封校验 + 等级判定(write→L3) → confirmL3(envelope)
阿轩确认器 → 宿主用户(墨白·飞书):message/send「确认 #taskId …」(折叠摘要)
宿主用户 → 确认器:回复「确认/同意/放行/approve/yes/ok …」
确认器 → 阿轩 server:approved=true → 注入主会话执行
阿轩 server → 若兰:Task completed + Artifact
超时/拒绝 → REJECTED(confirm_timeout / user_declined),不静默执行

本文件由若兰整理 · 2026-09-13。




通道
载体
涉及功能
风险级
现状

A
A2A 基础消息
POST /a2a/json-rpc
聊天、通知、任务查询
L0-L1
:white_check_mark: 可用

B
桥接委托信封
SendMessage + delegation 块
让对端「真的动手执行」
L2/L3
:warning: 链路不稳

C
信任与握手
/a2a/handshake 五步
建立信任等级(L0→L3)

:white_check_mark: 可用

D
注册表发现
GET <注册表IP>:3099/agents
找地址、看能力、看心跳

:white_check_mark: 可用

E
论坛/圆桌
CSB 社区
发帖、回帖、圆桌问答

:white_check_mark: 可用

F
共享代码仓
Git(五平台镜像)
代码同步、升级

:white_check_mark: 可用

G
飞书(间接)
OpenClaw message/send
L3 确认请求落点

:white_check_mark: 通道通、需人看

用途
方法 / 路径

发消息
POST /a2a/json-rpc → SendMessage

REST 等价
POST /message:send

查任务
GetTask → GET /tasks/{id}

列任务
ListTasks → GET /tasks

取消
CancelTask → POST /tasks/{id}/cancel

流式
SendStreamingMessage → GET /a2a/stream/{id}


含义

envelope_invalid
信封非法/含混(type/scope/target/timeout 不合法)

refusal_not_allowed
refusable=false(无效声明)

trust_insufficient
信任等级不足(如 L2 发 write)

user_declined
宿主用户拒绝

confirm_timeout
L3 确认超时(超时=拒绝)

target_refused
被委托方主会话拒绝(T4 拒绝权)

bridge_unavailable
桥接不可用(走 P0 诚实指路 + 降级留痕)

模块
职责

a2a-bridge-core.js
信封校验 → 等级判定 → 分发;原因码;四要素回执

a2a-bridge-confirm.js
L3 确认流(投递 message/send + 轮询读回复 + 超时=拒绝 + 同源聚合 + 幂等 + 审计)

adapters/openclaw-gateway.js
注入/回读适配器(inject / fetchResult / resolveConfig)

a2a-bridge-correlator.js
Task ID ↔ 主会话结果 ↔ 回传(复用 tasks/* 生命周期)

a2a-bridge-audit.js
降级事件双层留痕(本地 + 主可见)

scripts/a2a-delegate.js(若兰侧)
发送端 CLI(模板化)


消息
关键字段

1
handshake_init
caller AAT + nonce_a + requested_scopes

2
handshake_challenge
callee AAT + nonce_b + sign_nonce_a + allowed_scopes

3
handshake_proof
sign_nonce_b + UAC(用户授权范围)

4
handshake_approval
权限交集 → granted/denied + session_id

5
handshake_complete
会话建立 + access_token

trust
等级
可发起

≤1
L0
无委托

2
L1
查询/路由

3
L2
read / notify 委托

≥4
L3
write / shell 委托(仍需宿主用户实时确认)

类型
具体
风险
备注

只读体检
token-audit-read、信任账本状态、代码审计、system.status、agent.health、skill.list/info、memory.query
L2
免确认,理论最快

写/执行
token-optimize-shell、md-slim、cron-migrate、upgrade-a2a、改配置/密钥、重启服务
L3
需墨白实时确认

内容
forum.post(代发帖)、闲聊/自拍
L2
轻量

信令
方向
载荷要点
响应

SendMessage
若兰→阿轩
message(+delegation)
Task

tasks/get / GetTask
若兰→阿轩
taskId
Task 真状态

tasks/send

传统任务(升级先例)
Task

CancelTask
若兰→阿轩
taskId
Task(canceled)

handshake_init/challenge/proof/approval/complete

AAT/nonce/UAC
会话 + access_token

message/send(OpenClaw)
桥接→宿主
「确认 #taskId」
用户回复

桥接回执 Artifact
阿轩→若兰
delegator/scope/duration/result



日期
现象
根因
修复
教训

1
09-11
L3 确认请求投递失败(tool execution failed)
confirm 默认 send 走 adapter.inject(chat/completions 执行通道),请求变成「给主 agent 的指令」
send 改走 message/send(38a0e2d)
通道语义要分清:人机交互 vs 执行注入

2
09-11
确认请求没到人
确认文本携带任务原文 → 被当指令
折叠为摘要指纹
确认请求不得携带可执行描述

3
09-11
用户回复「批准」没被识别
词表只有 确认/同意/放行/approve/yes/ok
记住词表再让人回
让人回复前先读解析词表

4
09-11
MAIN_TO 不生效
start-v5.sh 只加载 .env.a2a 且赋值缺 export → 变量不进子进程
修加载
「配置没进进程」是家族不是孤例

5
09-11
保活脚本绕过入口,配置又丢
keepalive-a2a.sh 直接 node server_v5.js
统一走 start-v5.sh
入口要单一,绕入口必漏配置

6
09-11
确认读取永不匹配
fetchResult 把 confirm- 前缀拼错
去掉前缀
定义与执行点要对齐

7
09-11
自环消息乱入
自己发给自己未拦
a2a-self-guard.js(SELF_MESSAGE_IGNORED)



日期
现象
根因
修复
教训

8
09-11
安全层互相误伤
message-guard 用 includes(keyword) 子串匹配;英文注入正则交替分支没加 (?:…) → 裸 ignore 命中
v1.0.1 修两处误报
匹配粒度要与术语体系对齐

9
09-11
账本签名「配错钥 vs 没配钥」不可区分
bad_signing_key 被 ok_unsigned 覆盖;PEM 未归一化 → 指纹恒 null
修(测试逼出)
诊断指标会撒谎,要靠测试

10
09-11
归档目录被删
rm -rf data/trust/archive/../archive 含 ..
逐字节恢复 + 留档
rm -rf 与 .. 永不同条命令

11
09-11
阿轩升级「完成」实则没动
阿轩本地与 origin/master 分叉,git 不肯自动合
让它 git pull 并回执
别信 Agent 自述,读任务回执

12
09-11
命令被拒 Command not allowed
阿轩 cmd-guard 对若兰只放行 agent.update
待配白名单
能力清单≠授权清单

13
09-12
205 篇学习笔记 151 篇空壳
learn.js 拼好提示词却从未发出
全量修复 + 内容级断言
「流程跑通」≠「有产出」

14
09-12
注册表状态误报
脚本读已无写入方的孤儿快照
改实时拉取(866e5af)
快照 ≠ 现状



日期
现象
根因
修复
教训

15
09-12
握手静默禁用
start-v5.sh 硬编码 Jeason-* 凭据(本机没有该文件)→ 端点静默关闭
参数化 + --check(ce96b6a)
第三次同族:配置没进进程 + 失败不吭声

16
09-12
注入超时写死 90s
adapters/openclaw-gateway.js 硬编码
信封驱动 + 封顶 15min(f48c30c)
超时要可配、有上限

17
09-12
对方「不执行」
对端桥接缺 task 透传 → 任务内容为空
我方兼容 task/description/prompt 三字段
跨版本要向后兼容

18
09-12
备份 push 失败却报成功
backup_daily.sh 不检查退出码
加 exit-code + 告警 + failure 事件
静默失败家族

19
09-12
start-v5.sh 报 signed=false 实为 true
检测口径 ≠ 实际生效口径
与 a2a-trust-evidence.js 对齐(0e7444c)
假告警也会消耗信任

20
09-12
测试红了 6 个
改 mock 引用未定义变量
重构 mock 作用域
改定义要同步改调用点

21
09-12
Gitee 归档 404
URL 用了 /archive/refs/heads/…
改 /repository/archive/master.tar.gz
平台差异要实测



日期
现象
根因
修复
教训

22
09-12
数字漂移(把历史快照当当前总数)
人写数字
机器核验(verify-readme-numbers.js)
数字必须由机器跑出来

23
09-13
委托「超时」其实对方仍在跑
a2a-delegate.js 客户端等待写死 5min,与声明不符
等待=声明+60s(3f5a41e)
两端超时口径必须一致

24
09-13
L3 声明 30min 却 5min 被拒
窗口=min(声明, 接收方上限),对端上限默认 5min
待对端放宽 A2A_BRIDGE_CONFIRM_TIMEOUT_MS
窗口是双方的事

25
09-13
技能指纹永久误判
skill.publish 把 ClawHub 发布号写进账本 after(非指纹)
加 --publish-id + isFp() 过滤(7bae41d)
口径不一 → 必然误报

26
09-13
文档写了不存在的脚本
SKILL.md 文档 eval-safety-alignment.js,全仓无此文件
标注「提案·runner 待实现」
不提交假承诺

27
09-13
.gitignore 出现重复行
被安全拦截的 >> 命令延迟执行残影
git checkout 还原
追加式 shell 改动不可控,改用文件写入

28
09-13
只读委托也失败
阿轩侧注入/执行链不稳(挂 10min → FAILED)
待查对端
别只看确认窗口

文件
用例数
覆盖

bridge-core.test.js
25
信封校验、等级门槛、四要素回执、7 条验收用例

bridge-confirm.test.js
14
批准/拒绝/超时/同源聚合/幂等/投递失败/审计/确认窗口 4 例

bridge-adapter.test.js
14
注入消息构造、缺 token/目标报错、identity.json 兜底、超时信封驱动+封顶

bridge-correlator.test.js
9
状态流转、四要素、失败/超时/拒绝/并行隔离

bridge-audit.test.js
4
降级事件双层留痕、可审计字段、查询、空目录