运行多个代理的第一个问题是它们会忘记。每个会话都以空白开始。一种工具的上下文不会转移到另一种工具。昨天做出的决定今天就看不见了。你最终会重新解释同样的事情，或者更糟糕的是，代理人相互矛盾，因为双方都无法访问对方所写的内容。

这就是存储问题，首先要解决这个问题。您需要一个状态层，每个代理都可以在其中写入观察结果，并且每个代理都可以查询上下文。事实必须跨会话、工具和机器持续存在。无论哪个代理或何时写入数据，检索都必须正常进行。 [Neotoma](/posts/truth-layer-agent-memory) 的存在就是为了解决这个问题：一个与模式无关的底层，可以存储、服务并让您在整个代理堆栈中查询真相。

但一旦存储发挥作用，你就会遇到第二堵墙。当一个智能体写下一个新的观察结果时，其他智能体在检查之前并不知道。 “检查”意味着轮询：按时间间隔、在会话开始时或手动触发时重新查询。大多数民意调查没有返回任何结果。重要的人迟到了几分钟或几小时。 “状态改变”和“代理通知”之间的差距是停滞时间，它为代理可以一起做的事情设置了上限。

这不是一个检索问题。数据就在那里。这是基础设施层的协调问题，我见过的每个自制内存系统都以相同的方式处理它：事实并非如此。

## 协调上限

基于轮询的协调会产生三种成本，这些成本随着规模的扩大而增加。

**延迟。** 状态更改和代理意识到状态更改之间的时间间隔受轮询频率的限制。如果代理每五分钟检查一次，则关键观察结果可能会在四分五十九秒内未被注意到。对于协调时间敏感状态的代理来说，例如刚刚提交的错误报告或需要协调的财务交易，延迟是瓶颈。

**浪费计算。**大多数民意调查没有返回任何变化。一个工作日每三十秒检查一次的代理会发出近千次查询，其中绝大多数确认没有发生任何事情。这对于一名特工来说是可以忍受的。十个代理，这是一个税。在 100 处，基础设施开销呈线性扩展，没有任何价值。

**协调上限。** 延迟和浪费的结合对协作代理行为造成了实际限制。具有事件驱动意识的自然模式，例如“代理 B 在几秒钟内对代理 A 的写入做出反应”，需要自定义粘合：计时器、Webhook 黑客、手动触发器或本身需要维护的专用轮询守护进程。您想要的协调模式很简单。让它们与轮询一起工作的管道却不是。

如果您已经构建了多代理堆栈，那么您就遇到了困难。状态层可靠地存储真相。它对这一事实的改变保持沉默。

## 信令意味着什么

该修复在概念上很简单。每次写入后，状态层都会发出一个结构化事件来描述发生了什么变化。注册的消费者、代理、守护进程、对等实例接收事件并决定如何处理它。状态层传递信号。消费者决定响应。

这是大规模处理状态的系统中的标准原语。 PostgreSQL 发出 WAL 条目并支持 LISTEN/NOTIFY。没有人声称 PostgreSQL 这样做是在“表演”。它提供了对其自身状态转换的可观察性。像 Kafka 这样的消息代理以不同的规模做同样的事情。国家系统报告发生的情况。下游消费者进行过滤、优先排序并采取行动。报告层不会对事件进行推理。它会燃烧并忘记。

生物学的类比在这里很有用。神经系统既储存又发出信号。大脑拥有记忆。感觉神经元传递对变化的认识。两人都没有决定动一动肌肉。电机系统起作用。存储真相和信号变化的状态层是大脑和感觉神经。决定如何处理这些信号的代理是运动系统。

## 必须保留的线

发出信号的状态层很容易成为协调器、工作流引擎或本身的代理。诱惑是真实的。一旦您可以发出事件，您需要过滤它们，确定它们的优先级，路由它们，添加重试逻辑，构建条件传递。孤立地看，每一步听起来都很合理。他们共同将基材变成可以决定什么重要、什么不重要的东西。

这条线必须保留。

什么信号是：

- **关于状态变化的观察，而不是对状态的操作。** 基底报告发生了什么变化。它不会评估更改是否重要。
- **即发即忘交付。** 如果消费者不可用，则基板会记录故障。它不会升级重试、退回到替代操作或改变自己的行为。
- **写入管道的派生输出。**现有管道是写入、快照重新计算、时间线更新插入。事件发射是该序列中的又一个条目，就像快照从观察中导出数据一样。它在写事务提交之后运行，而不是在提交期间运行。如果写入失败，则不会触发任何事件。如果交付失败，写入仍然有效。信号落后于事实；它永远不会门它。

信号不是什么：

- **不是决策。** 基质不会过滤哪些事件值得发送。它发射所有这些。消费者过滤。
- **不是代理行为。** 基底不订阅它自己的事件。它不运行循环。这没有道理。
- **不是编排。** 没有优先级，没有调度，没有条件路由。处理事件并采取行动的守护进程是操作层消费者，而不是底层的一部分。

测试是干净的。如果删除事件发射意味着基底对其自身状态转换的可观察性较低，那么它就是基底基元。如果删除它意味着用户错过提醒或代理错过最后期限，那么这就是策略。

## 细化边界

旧边界：底层存储并服务真理。

新的边界：底层存储、服务并发出真理信号。当真相发生变化时，基质会报告变化。接下来发生的事情是消费者的责任。

这是一种延伸，而不是矛盾。现有的写入管道已经在每次写入后执行派生工作：快照重新计算、时间线事件创建、嵌入生成、自动链接。事件发射是列表中的又一个条目。它不需要新的数据模型。它不会改变存储的内容或查询的解析方式。它增加了一个用于状态变化感知的出站通道。

术语很重要。 “信号”和“发出”而不是“通知”或“警报”。通知意味着对重要性的判断。警报意味着紧急评估。信号是中性的。底物信号。消费者解读。

值得明确的是战略在这张图中的位置。计划、长期规则、偏好和先前的决定本身都是陈述的。它们像其他实体一样存储在底层中，以相同的方式查询、减少和发出信号。它们没有在某个单独的层中运行。边界不在“战略存在于另一个系统中”和“国家存在于底层”之间。它介于“基质存储和信号”和“消费者根据他们所读到的内容做出决定并采取行动”之间。这使得策略工件可检查、可重播，并在每个阅读它们的消费者之间共享，而无需拖拉底线来做出决定。

## 从记忆到神经系统

大多数构建多智能体系统的人仍然将共享底层描述为“内存”。就目前而言，这个框架是准确的。记忆是存储和检索：系统记录发生的事情，代理在需要上下文时查询它。这是基础，它必须发挥作用才重要。

但记忆是被动的。它蕴藏着真理。它不会将事实变化的意识传递给系统中需要做出反应的部分。存储新金融交易的内存层不会告诉调节代理该交易已到达。记录新错误报告的内存层不会告诉分类守护进程需要注意某些事情。数据就在那里。意识则不然。

神经系统增加了传输层。它涵盖了内存所做的一切，存储和检索停留，但它扩展了基板的职责以包括信号传递。状态层不仅仅保存真相。它将事实的变化实时传播给注册消费者。

判断这一点的正确标准是状态完整性，而不是检索质量。内存是根据是否可以查询回来来判断的。判断神经系统的标准是系统的其余部分是否可以在变化持久时对变化采取行动，而不是在几分钟后当事情发生时要求。这些是具有不同故障模式的不同问题。

生物框架是精确的，而不是装饰性的。没有感觉神经的大脑可以完美地存储记忆，但仍然无法对环境做出反应。缺少的部分不是存储。它是发生变化的内容和需要了解的内容之间的信号通路。这就是您最终手工构建的部分，一次一个轮询循环，直到很明显它属于基材为止。

## 这会解锁什么

如果您正在针对共享状态运行多代理堆栈，请考虑当状态层发出写入信号时可能发生的情况。

**在提交后几秒内处理传入工作的守护程序。** 用户或外部代理提交错误报告、功能请求或结构化反馈。状态层存储实体并发出事件。长时间运行的守护进程接收 Webhook、创建工作树、针对相关代码库运行代理会话、打开 PR 并更新实体状态。没有轮询循环。没有 cron 计时器每五分钟检查一次。守护进程订阅一次并在工作到达时做出反应。

**跨工具协调，无需粘合代码。** 财务对账代理订阅交易观察。内容管道代理订阅草稿状态更改。问题分类代理订阅按类型过滤的实体创建事件。每个消费者注册对范围、所有事件、特定实体类型的事件、特定实体的事件的兴趣，并提供传递端点。基材提供。消费者维护逻辑。每个代理对没有自定义集成。

**可以通过底层相互通信的代理。** 代理之间的通信已经通过状态层进行：会话线程、发送者身份、多方线程语义。缺少的是推动力。当代理 A 写入要发送给代理 B 的消息时，代理 B 不必通过轮询来发现它。基底应在写入时发出信号，以便对话以处理速度而不是轮询速度进行。

**具有访问控制的结构化来宾提交。**任何实体类型（不仅仅是特殊类型）都可以通过可配置的访问策略向外部提交开放。客户的代理提交结构化反馈。合作伙伴自动提交数据以进行对账。底层强制谁可以写什么，跟踪外部参与者的出处，并线程后续对话。提交是持久状态，而不是消失的消息。

## 超越你自己的代理

到目前为止，这看起来好像所有特工都属于你。它们位于你的编辑器、你的 cron 作业、你的笔记本电脑中。这是最简单的情况。这不是全部。

自然的进展是您的计算机上的中央实例加上其他基础设施上的卫星实例：客户端服务器、团队 VPS Droplet、您操作但不拥有的远程代理。一旦你到达那里，民意调查就不仅仅是浪费了。它在结构上是盲目的。您通过 SSH 登录，运行摘要，询问“这些日期之间发生了什么”，因为远程存储永远不会将意识推送回协调代理运行的位置。

这是跨信任边界的协调，而不仅仅是跨流程的协调。当作者是其他人的代理人时，“共享记忆”是不够的。您需要可以在事后进行归因、检查和验证的写入。这意味着每个表面（MCP、HTTP、签名请求）上都经过验证的编写者身份、区分经过加密验证的代理与匿名调用者的归因层以及包括代理到代理和多方线程的对话形状，因此跨界通信是结构化状态而不是临时消息。

信令使整个画面更加完整。在写入时发出事件的卫星实例为您的中央消费者提供了他们在本地已经依赖的相同原语。最终，两个实例可以双向同步：当实例 A 上的实体发生更改时，实例 B 会收到通知，并且可以在无需手动干预的情况下拉取更新。无需中央枢纽。任何实例都可以是对等点。

“开放”部分是在规则下的互操作性，而不是混战。开放表面加上显式身份和线程语义是让其他人的代理参与一个神经系统的方式，而无需假装每个调用者都同样受信任或同样清晰。内存框架低估了这一要求。神经系统框架则不然。

## 我正在构建什么

我将这些功能按顺序添加到 [Neotoma](/posts/truth-layer-agent-memory)，每个功能都建立在前一个功能的基础上。

**写入路径事件发射。** 每次成功写入、更正或创建关系后，发射一个结构化事件：实体类型、实体 ID、观察类型、时间戳和更改的字段。消费者获得足够的信息来决定是否采取行动，而无需重新查询状态层。这是传感层。如果没有它，每个下游功能都需要轮询。有了它，基材就会变得活跃。

**订阅和 Webhook 交付。** 代理注册对范围的兴趣并提供交付端点。底层维护注册表并通过 Webhook 回调和 SSE 传递事件。消费者维护逻辑。 Webhook 是第一位的，因为它们适用于 VPS 基础设施上的远程代理、笔记本电脑上的本地守护进程以及对等点之间的跨实例同步。 SSE 和 MCP 推送通知是附加的。

**通用实体提交。** 目前，存在结构化外部提交（来宾访问、访问策略、对话线程、外部参与者出处），但连接到单个实体类型。下一步是使这种实体类型不可知：任何实体类型都可以通过可配置的访问策略、可选的外部镜像和对话线程向来宾提交开放。客户代理提交结构化数据。合作伙伴的自动化提交反馈。基底处理访问控制和来源。操作员配置什么是开放的，什么是不开放的。

**双向跨实例同步。** 现有基础设施支持单向远程提交：一个实例推送到另一个实例。扩展是双向的。当实例 A 上的实体发生更改时，实例 B 会收到 Webhook 并可以拉取更新。没有中心枢纽。任何实例都可以与任何其他实例对等。这就是客户端基础设施上的一组卫星实例在没有 SSH 和 cron 的情况下与中央实例保持协调的方式。

这些都不是“神经系统”最雄心勃勃的版本。路由、过滤、转换、传递保证、死信队列：消息代理提供了所有这些。我故意不建造任何东西。基底的作用是发出信号，而不是进行编排。每一个跨越这条线的特征都会使基底作为状态转换的中立报告者变得不那么值得信赖。

约束就是特征。发出信号但不做出决定的状态层是您仍然可以推理的状态层。将操作层逻辑添加到信令路径中，您就会失去最初使底层有用的属性：底层的行为完全由写入决定，而不是由策略决定。