A2A Python 1.2:跨副本可观察性不等于执行接管
A2A Python 1.2:跨副本可观察性不等于执行接管
知识点轴:A2A / harness-runtime / benchmark-evaluation / sandbox-security。 固定对象为 a2a-python v1.2.0(2026-09-29),非10月7日新发布,也不是 Hermes 本地集群实测。选段归档:raw/articles/a2a-python-cluster-v120-selected-2026-10-07.md。
为什么值得用户深挖
当 Hermes 将长任务委派给 A2A 服务后,SSE 断流、HITL 续写、负载均衡或取消请求可落在另一副本。单纯共享 task DB 不足以解决旧快照覆盖、事件续订、并发写和取消语义;这篇 已合并的 #1281 给出了版本化状态 + 共享事件 + 请求边界刷新的可迁移机制,优于只读 Card/能力声明。它与 a2a-jakarta-cross-node-state-and-effective-security 的状态/广播分层构成对照;不同 SDK 不能互相当修复证明。
一阶机制:状态、事件、运行者分别记账
- 状态竞争:
VersionedTaskStore以StoredTask(task, version)读快照,普通save(...prev_version=...)校验当前修订,拒绝旧写;SQLAlchemy 实现新增task_versions与原tasks协作。取消特例可将非终态改为 CANCELED,终态/缺失拒绝。固定task_store.py还明确LegacyTaskStoreAdapter忽略版本参数:旧 store 被适配后不拥有 CAS 保障。详情与代码固定 URL 见 raw。 - 事件连续性:
task_events按版本保存事件,DatabaseTaskEventStream默认轮询间隔0.5秒;非执行副本重订阅先发存储快照,再订阅after=snapshot_version之后的事件并滤旧版本。先快照后事件仍须在隔离环境测事件顺序、覆盖空窗、重复与删表/清理时行为;代码机制不是延迟SLA。固定 handler 中只配版本 store、未配 event_stream 会警告跨副本 streaming 关闭。 - 任务运行者/取消:另一副本接取消会先 owner-scoped 读取,再写共享 CANCELED;实际执行副本要在下次保存时感知版本变化并停止。已回成功不等于正在执行的外部副作用已经停止;执行者崩溃接管和业务 exactly-once 未由共享事件/版本表自动保证。
- 请求边界旧快照:旧 #1188 的 A→B→A 多轮续写示例会丢失 B 写入的产物/历史;维护者10月1日说明 #1281 在持锁完成上次请求后 invalidate 快照,并关闭 issue。另一 #1227 是未合并、被 #1281 取代的提案,不应误记为双修复。^[raw/articles/a2a-python-cluster-v120-selected-2026-10-07.md]
与权限边界及已有页面的关系
octagon-a2a-live-card-owner-boundary 讨论入站 caller 与付费转发 bearer 不等同任务 owner;本案例 owner-scoped 读取是 handler/store 代码层证据,不是这位用户的部署已验证认证或跨租户隔离。同版 #1270 将 contextId/taskId 不一致拒绝前移到执行者启动前:旧测试只断言报错却可能在执行后才报错,新的「executor未调用」断言更贴近拒绝后零 effect。contextId 相等不是 owner 认证。另 #1271 增加 webhook Authorization 的构造,但接收方验签/认证、URL 出站策略需分验;固定 handler 无 push_url_validator 时该检查函数直接返回,不能据此认为所有回调地址都已安全筛选。^[raw/articles/a2a-python-cluster-v120-selected-2026-10-07.md]
a2a-redis-owner-dispatch-and-test-boundaries 的后台广播权限与本例跨副本事件不是同一证据;共享事件不得绕过订阅前任务 owner 核验。A2A-Agent2Agent-Protocol 的发现/Card/绑定层也不能证明实际 handler 使用 versioned store、event stream 或有效身份配置。
可执行验收矩阵(隔离副本,未运行)
| 场景 | 必须读回的独立证据 |
| A 发任务→B 重订阅→C 取消 | 快照/事件版本连续、合法owner可订阅,异owner拒绝且无事件泄漏;取消后存储态与外部副作用计数并列 |
A input_required→B 续写→A 再续写 | B 的历史/产物不丢;同一已授权身份、相同任务ID,重启后重复 |
| A/B 并发续写同任务 | 冲突被显式拒绝或安全重试;无旧版本覆盖、无双执行;不要把状态CAS当成业务幂等 |
| A 崩溃、B 仅可观察 | 区分B读/订阅成功和B真正恢复执行;重试按业务幂等键及独立服务状态核对 |
| 未启用 event_stream 或 legacy store | 观察功能降级/冲突风险,而非只验证初始化成功 |
按 Agent-Benchmarks 的方法记录 SDK tag、DB 类型、迁移版本、有效 auth/owner resolver、执行前后 trace、合法成功率与拒绝零effect。上游 PR 描述声明 Postgres/MySQL 双副本集成测试;本轮仅读 PR/release 与固定 v1.2.0 部分源码,未安装运行 SDK、DB 或验证作者测试回执。未知具体部署的 owner/认证、失败注入和恢复策略,置信度仅 medium。
写入记录
- 2026-10-07 09:02 CST:深读固定 v1.2.0 的跨副本 store/event/handler 与已合并 PR、旧故障及替代关系,编译状态/事件/执行/身份四类边界和隔离验收矩阵;未作本机E2E断言。