博客

用混合同步保持 Topic 路由显式可审计

为什么 Eva-CLI 应以 config/routes/topics.yaml 作为生产路由事实源,同时用 agent.yaml 生成建议路由、校验报告和显式同步补丁。

发布: 分类: 运行时

Topic 路由是 Agent 运行时里最容易失去审计性的地方之一。如果每个 Agent manifest 都能静默改写全局投递表,一个看似普通的订阅变更就可能扩大事件投递面。反过来,如果所有路由都只能手写,新增 Agent、改名和订阅变更又很容易漏同步。

Eva-CLI 应采用混合方案:生产运行时继续以 config/routes/topics.yaml 作为路由事实源,同时允许工具读取 config/agents/**/agent.yaml,生成建议路由、一致性报告和显式写回补丁。

Topic 路由混合同步图,展示 Agent manifest、建议路由、校验门禁、显式写回、生产 topics.yaml、生成诊断产物和 Scheduler RouteTable。
关键边界是:运行时只读取和校验;只有显式工具操作可以写回生产路由文件。

两个文件承担不同职责

agent.yaml 仍然适合描述 Agent 自身:身份、父子管理意图、订阅、子路由提示和可发 Topic 权限。但这些声明不应自动变成 Scheduler 投递权力。Scheduler 应从经过校验的 config/routes/topics.yaml 构建 RouteTable。

文件 负责内容 运行时规则
config/agents/**/agent.yaml Agent 身份、subscriptionschildren、局部路由提示和 permissions.emit 作为 discovery、policy 校验、mailbox 注册和路由建议生成的输入。
config/routes/topics.yaml 全局 Topic pattern 匹配、delivery 模式、目标 Agent 和匹配顺序。 Scheduler 投递的生产事实源。
.eva/generated/routes/topics.generated.yaml 从 Agent manifest 推导出的建议路由。 只作为诊断产物,不作为生产路由表。
.eva/reports/config/routes-diff.json 冲突、缺失路由、孤儿目标和建议修复。 作为 review、CI 和 IDE 诊断证据。

命令入口必须让写入显式化

更安全的体验是让每一次写入都可见。校验和 diff 生成可以在 CI 或 IDE 中自动运行;更新 topics.yaml 必须通过用户明确触发的命令或 quick-fix。

命令 行为 是否写文件
eva config validate 校验 schema、Agent 引用、Topic pattern、权限和路由一致性。
eva config routes sync --check 从 Agent manifest 生成建议,并与 topics.yaml 对比。
eva config routes preview 在改动源文件前展示合并后的路由表和冲突说明。
eva config routes sync --write 将安全、可解释、无冲突的建议写回 topics.yaml
eva config routes dump-effective 展示 Scheduler 校验后实际使用的 RouteTable。

为什么不完全动态生成?

自动生成对简单 fanout 订阅很有吸引力,但生产路由不只是“谁订阅了这个字符串”。delivery 模式、优先级、通配符遮蔽、fallback 行为和 target override 都是全局运行时决策。这些决策应保留在可 review 的路由表中。

方案 擅长 薄弱点
完全手写路由 审计、回滚、复杂匹配规则和安全 review。 新增或重命名 Agent 时容易漏同步。
完全动态生成 快速 Agent 脚手架和简单订阅覆盖。 事实源不清晰,manifest 写错时可能不安全地扩大投递面。
混合同步 保留显式生产路由,同时用机器发现漂移。 需要良好的校验规则和谨慎的写回行为。

真正的产品是校验能力

混合方案成立的前提,是校验足够严格。一个有用的 validator 应发现不存在的路由目标、disabled Agent、delivery 冲突、永远收不到事件的订阅、投递给未声明订阅 Agent 的全局路由,以及超出 permissions.emit 的发射 Topic。

agent.yaml
  -> 扫描 manifest
  -> 构建建议路由
  -> 与 topics.yaml 对比
  -> 报告缺失、孤儿、冲突或不安全路由
  -> 只通过显式同步命令写回

这样可以让运行时启动路径保持简单:解析 topics.yaml,校验 schema 和 policy,然后构建新的 Scheduler RouteTable generation。启动时可以读取 Agent manifest 做交叉校验,但不得静默修改路由文件。

完整规格见 Topic 路由混合同步方案,相关配置背景见 项目配置方案