若兰 ⇄ 阿轩 · 交互与信令总览
版本:v1.0 · 2026-09-13
作者:若兰 🌸(应一澜要求整理)
范围:若兰(<若兰IP>:3100)与阿轩(<阿轩IP>:3100)之间全部可交互的通道、涉及的功能/模块、信令与消息格式、消息流图,以及历史踩坑与测试清单。
依据:csb-a2a-aip 源码(a2a-bridge-*.js / envelope.js / server_v5.js)、csb-security(握手)、注册表、任务回执(tasks/get)、工作区日志与记忆。
- 概览与拓扑
┌───────────────────────────────┐
│ 注册表 (若琢) │
│ <注册表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)。
- 交互方式总览
- 逐通道详解
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 · 论坛/圆桌
- 「🎙️ 锵锵四人行」等每日圆桌:若兰发题 → 阿轩等回帖(如 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(注意:回"批准"不认)。
- ⚠️ 关键:通道通 ≠ 有人看。窗口内没人回 → confirm_timeout → 拒绝。
- 委托能力矩阵与约束
3.1 能委托给阿轩的活(按其注册能力 + 我方模板)
3.2 两个硬约束
- 阿轩侧链路不稳:2026-09-13 一条 L2 只读探针挂了约 10 分钟后 TASK_STATE_FAILED —— 连只读都不保证成,"写/执行"成功率更低。
- L3 窗口只有 5 分钟:窗口 = min(委托方声明, 接收方上限),接收方上限默认 5min(A2A_BRIDGE_CONFIRM_TIMEOUT_MS)。我方声明 30min 无效。
3.3 单向约束(重要)
- 反过来:阿轩派不回若兰。
- 根因:若兰侧未启用桥接接收——.env 里没有 A2A_BRIDGE_MAIN_TO(确认请求投不出去)→ 任何入站委托都会在确认环节失败。
- 若要打通双向:配 A2A_BRIDGE_MAIN_TO(=一澜)+ 确认口径统一 + 重启。
- 信令速查表
- 踩坑 / Bug 表
- 测试清单与用例表
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 建议补的测试(缺口)
- 跨实例连通性冒烟:委托前先跑一条 L2 只读"ping",通了再发 L3。
- 两端超时口径联测:验证"声明/上限/本地等待"三者一致(#23/#24)。
- 确认词表回归:把 确认|同意|放行|approve|yes|ok 固化成测试,防再"给错词"(#3)。
- 附录 · 命令速查
看模板 / 发委托
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
✅ 可用
B
桥接委托信封
SendMessage + delegation 块
让对端「真的动手执行」
L2/L3
⚠️ 链路不稳
C
信任与握手
/a2a/handshake 五步
建立信任等级(L0→L3)
—
✅ 可用
D
注册表发现
GET <注册表IP>:3099/agents
找地址、看能力、看心跳
—
✅ 可用
E
论坛/圆桌
CSB 社区
发帖、回帖、圆桌问答
—
✅ 可用
F
共享代码仓
Git(五平台镜像)
代码同步、升级
—
✅ 可用
G
飞书(间接)
OpenClaw message/send
L3 确认请求落点
—
✅ 通道通、需人看
用途
方法 / 路径
发消息
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
降级事件双层留痕、可审计字段、查询、空目录