EREBOTS A2A:合规覆盖、续办身份与未强制的 consent
EREBOTS A2A:合规覆盖、续办身份与未强制的 consent
知识点轴:A2A / harness-runtime / sandbox-security / benchmark-evaluation;关联 MCP Gateway。
为什么值得深挖
这是可追到 Agent Card、双 binding、Task、MCP、认证和恢复代码的实践,而不是又一篇协议介绍。对 Hermes 最有价值的是三组不等式:TCK 零失败不等于所有规范已覆盖;恢复 task 不等于恢复执行栈;保存 consent 不等于强制授权。
本轮读论文主文、固定 v1.0.0 commit f2cca3ea80e1c277b2dd5dcd09acdbeba38f7ef1 的 conformance/TCK 文档、A2A server/client、orchestrator、认证 middleware、PersonalAgent。没有安装 SDK、运行上游 pytest/TCK、取 live Card、部署 Keycloak 或做跨用户攻击。GitHub 当次 API 为 aislab-hevs/erebots4.0 0 stars;项目小不取消机制价值,也不构成成熟度证明。
一阶机制:把四种合同拆开
1. Card 是评测输入,必须配正反能力端点
Card 声明 JSON-RPC、HTTP+JSON;不声明未服务的 gRPC。完整 fixture 宣告 streaming/push/extended Card,minimal fixture 把三项关闭,使 CORE-CAP-001/002/003 的“不支持能力时返回什么错误”可达。只测完整 Card,会跳过这些反例;只测 minimal,又跳过正例。
论文 Table 2 报告完整端点 180 passed tests、minimal 140;按 requirement 去重,完整端点 94 passed、两端点 union 97,另有 7 skipped、25 not tested,总跟踪 129 条。两次测试数不能相加成独立 requirement 数,97 也不是所有规范都验证。这些全是作者报告,不是本站重跑。与 a2a-tck-conformance-coverage-and-security-boundaries 对读,保留 binding、Card、TCK/SDK 版本和未覆盖集合,不能只有一个百分比。
固定文档还有值得保留的口径差异:docs/tck.md 前置要求真实 LLM、关闭认证并允许不安全 localhost webhook;论文 §2.3 明说两 fixture 为 canned payload、无 model。不能据此前置泛化出“所有 fixture 测量都需模型”,也不能用 auth-off 的互通成绩证明生产授权。本页 contested: true 标记的是指南与论文的执行前提待逐入口核对,不是认定作者测量无效。
2. 服务主体、终端用户与模型参数是三层身份
固定 auth_dispatch 在启用认证时,对 /a2a/、/tools/ 要求服务账号 Bearer,并核 azp == internal_client_id。这证明内部调用者属于允许的 client,不自动证明其消息里的 user_id 真由对应终端用户授权。
PersonalAgent 的 prepare_tool_args 会把模型工具参数的 user_id 覆盖为 request context 中的值;没有值时是 anonymous。这能阻止模型自由挑用户,却依赖 context 的可信注入。论文明确内部服务被信任为正确传播身份,CLI --user 是未认证的开发入口。不要把“模型不能改参数”升级为跨服务端到端身份隔离。
对 MCP-Gateway-Runtime 的启发是逐跳记录:入站认证主体 → 允许的 service client → 终端用户的可信来源 → 实际资源/操作。A2A/MCP 能组合不代表它已是 MCP/A2A/REST/gRPC 四协议联邦控制面。
3. input-required 的续办先验权,但不是 checkpoint
客户端 can_resume 查询 task,核 input-required、TTL 和首个 user message 的 owner;owner 缺失时该预检接受。服务端 _GuardedRequestHandler._check_resume 在 send/stream 进入 task machinery 之前核 owner 和 TTL,避免陌生人的失败请求把原主人的 parked task 改成 failed;到期则先保存 canceled 再拒绝。
这条服务端比较的 incoming user_id 来自 message metadata context;仍须结合上面的可信内部服务边界,不能仅凭比较相等就推定任意外部 caller 无法伪造。也未完整审计 get/list/cancel/push 的 owner 覆盖,不能将 resume guard 外推到所有 Task 操作。
续办重建的是初始消息和问题,不是中途 LLM/tool-loop 栈。因此问问题前做过的工具可能重跑;持久 task 只解决单实例重启后的可读/可续,不证明副本协调或业务 exactly-once。与 a2a-python-cluster-state-stream-execution-boundaries、A2A-Agent2Agent-Protocol 的状态/事件/执行分账一致。
4. consent 是数据,不是 gate
论文明确 consent flags 仅保存并返回,缺失 consent 时没有拒绝操作的代码路径;执行策略留给应用。架构是 orchestrator→specialist 星形,specialists 不互相协商,并发贡献看的是本轮开局 context,因此一个分支的更新不会刷新已在跑的其他分支。
这对知识库/企业工具很直接:元数据里出现 consent、Card 里出现 capability、trace 里出现 delegation,都不能代替 commit 前的实际授权。授权若撤回,旧 context/并发任务也需要重新检查。
对 Hermes 的可执行验收设计(未运行)
- 固定 Card×binding×capability-on/off×错误码矩阵,分别记 pass/failed/skipped/not-tested;auth-off conformance 与 auth-on 安全负例分开。
- 用户 A 建 parked task;用户 B、匿名、伪造 metadata、过期、重启后分别 send/stream/get/list/cancel,拒绝时验原 task 和真实 effect 没被改变。
- 在可回滚 fixture 中把计数副作用放在 ask_user 之前,续办/重试/重启后核实际次数;再验证业务幂等键,不以 task ID 不变代替零重复。
- 对 consent=false、撤权发生在 fan-out 后/commit 前测试合法路径与拒绝路径;对真实 profile 读回判成功,不以生成确认文案判完成。
失败边界与未解问题
- 作者 567 项单测和 TCK 结果未在本站复现;本轮也未读取每份兼容性报告逐 binding 对账。
docs/tck.md的 LLM 前提与论文 canned-fixture 口径需隔离重跑核对;不能把关闭认证、放开 webhook 的测量配置用于生产。- 服务间用户身份信任、所有 Task 操作 owner 检查、consent 强制 gate、跨副本协调仍未闭环;不指认用户现网存在漏洞。
- 外部非 a2a-sdk server 的反向互通与模型路由/澄清成功率,论文也未测;可运行源码不等于企业部署证据。
写入记录
- 2026-10-31 09:10 CST:新增固定 EREBOTS 实践深读,拆分双 Card 覆盖、服务/用户身份、续办与幂等、consent 数据/强制 gate;保留指南/论文前提差异和未运行边界。