模块 I——清点与发现
模块 I 是 estate 的目录:一份被动的、由总线驱动的清单,涵盖所有存在的事物——agent、 会话、Claude Code 实例、MCP 服务器、skill、工具、资源、模型、提供方以及非人类身份。它通过 监听来发现,从不通过探测,且只记录关系、标识符和存活性——从不记录载荷。本页是关于目录所 持有内容、以及它刻意不持有内容的参考。
连接器(connector)发出的是观测,而非实体。它们将规范化的
edge.observed 和 cost.sampled 事实发布到
事件总线上;它们所隐含的实体从不被发送。模块 I 从每条观测的自然引用中物化出它所命名的
核心实体:一个发起方 session/agent/identity、一个 MCP 服务器、一个工具、一个资源、
一个 skill,以及——从成本采样中——一个提供方和一个模型(被发现,不含定价;定价归
FinOps 所有)。物化在至少一次(at-least-once)投递下是幂等的:按自然键执行
find-or-create,因此同一条观测被看到两次也绝不会重复出一个实体。
它的契约与实体
Section titled “它的契约与实体”本模块注册了它自己的一个实体,inventory.catalog_entry——一个附加到每个被物化核心实体上的
发现叠加层。它记录一个事物是如何被发现的,而非它做了什么:一组信号来源、它被观测到所在的
主机、首次与最后一次出现的时间戳、一个出现计数,以及一个值为 active 或 stale 的存活性
status。一个周期性的**陈旧性扫描(staleness sweep)**会在某条目在所配置窗口内未被看到时
将其标记为 stale,并在它一重新出现时立即翻回 active;该扫描只覆盖模块实际观测过的租户
(它无法、也不会枚举租户)。读取面很小且为只读:一个按 kind 和 source 计数的 summary、
一个可按 kind 和 status 过滤的分页 entities 列表,以及单实体详情视图。每次读取都需要一个
按租户限定、带命名空间的读取权限(最低的查看者层级即足够);摄取是高频的,且不按写入逐条审计。
完整形状见事件总线参考以及产品的类型化接口。
它消费什么、产出什么
Section titled “它消费什么、产出什么”模块 I 是一个纯粹的消费方。它订阅 edge.observed、cost.sampled 和
finding.reported,且只写入它自己的目录叠加层及它所派生的核心实体。它不发出任何自己的事件,
也不暴露任何执行(actuation)面——发现按其本质就是观测并编目。它所持久化的引用从连接器到达时
已经过脱敏;模块逐字存储它们,且不添加任何自己的原始细节,因此最小数据特性是传输协议(wire)的
特性,端到端地得以维持。
- 模块目录——模块 I 所处的位置以及诚实的 Actuate 划分。
- 模块 III——访问映射——R/RW 图与漂移的唯一所有者。
- 事件总线参考——它所消费的
edge.observed、cost.sampled和finding.reported事件。 - 从零到图——在演示 estate 上填充目录和映射。
- 架构概览——引擎、各层以及总线。