Prepared Family 到底共享什么
一句话
Prepared Family 先共享一份 Host 已验证的 NumPy 输入;只有 private-COW(写入时才复制内存页)进一步共享 sealed image/page lineage,private-copy 会为每个 fresh consumer 重新准备私有数组。
先看一个例子
四个分析 Agent 都要读取同一张 NumPy 矩阵,但执行不同代码。让每个 Agent 重新传输和构造矩阵会重复工作;让它们共用同一个 Python interpreter 和 ndarray,则一个 Agent 的 array[0] = 0 可能污染其他 Agent。
Prepared Family 把共享点放在更低一层。Host 先复制并验证矩阵,封存一份输入身份。每个 Agent 再获得自己的 fresh module 和私有数组。Linux worker 可以让这些 module 从同一个 sealed COW image 建立 MAP_PRIVATE mapping;其他平台走 private-copy,把同一份 Host-owned body 分别送入每个 fresh Guest。
真实机制
NewPreparedNumpyInput 接受 numpycodec descriptor 和 body,先验证 dtype、shape、C-order、长度与 digest,再复制 body 和 shape。调用者之后修改原 slice,不会改变 family 输入。Guest 或模型输出不能自行创建这个对象。
PrepareNumpyFamily 用一个不带 Broker、grant 或 workspace 的 ImageConfig 建立 family。pysolate.prepared-family-image.v1 identity 绑定 artifact、manifest、execution profile、qualified imports、deterministic profile、memory limit、Guest preparation ABI,以及 ndarray descriptor/body identity。Consumer 自己的 timeout、capability、workspace 与 Invocation 不属于 image。
Acceptance/control vocabulary 区分三种物理处置;family member 实际使用前两种:
private_cow:Experimental/Linux-only;exact artifact 通过 COW eligibility 时,多个 fresh module 从一个 sealed image 建私有 mapping;private_copy:Host 保留 immutable body,每个 fresh Guest 通过 binary preparation ABI 得到自己的 Python-ownedbytearray和 C-contiguous ndarray;ordinary_fresh:机制关闭时的对照路径,不附着 family,也不是 family 自动生成的 fallback member。
auto 只有在资格完整时选择 private-COW,否则选择 private-copy;显式要求 private_cow 而条件不满足时会失败,不会静默降级。两条 family lane 都执行受约束的 _initialize → runtime_init({}) → runtime_prepare_numpy_ndarray 准备关系,但 COW consumer 恢复 sealed memory 后不会再次注入 body。
共享对象不进入 RunRequest、Broker JSON、trusted Python source、日志或 evidence。Family 也不负责安排 child、重试、选择 workspace root 或发布结果;这些仍由 Host/Harness 或 subagent orchestrator 决定。
为什么重要
技术上: 多个 consumer 可以复用同一份受验证输入;Linux COW lane 还能复用 sealed image/page lineage,同时让 Python mutation、Host context 和执行失败保持隔离。Portable private-copy 与 Linux private-COW 使用同一套 family/member 合同,但复制行为不同。
产品和业务上: 这适合多个 Agent 针对同一 bounded dataset 做不同分析的场景。平台可以按 worker 能力选择物理实现,而不用把共享 mutable interpreter 作为 fan-out 前提。
不能推出什么
- Prepared Family v1 只接收 bounded
numpycodecndarray;不是任意 Python object、pandas、pickle 或 distributed dataset service。 private_cow仍是 Linux-only substrate,private_copy也不是 zero-copy。- Family 没有自动 scheduler、retry policy、winner selection 或 workspace publication。
- 当前证据证明 bounded correctness 与 isolation,不证明 fan-out 更快或更省钱。
术语卡
- Prepared Family:拥有一份 immutable prepared input/image,并创建有限个 single-use runner 的 Host 对象。
- PreparedNumpyInput:经过 descriptor/body 验证且已复制的 immutable NumPy 输入。
- Private copy:把 family 保留的 body 分别注入每个 fresh Guest。
- Private COW:从 sealed image 建立每个 consumer 的
MAP_PRIVATEmapping。 - Image identity:绑定 artifact/profile/ABI 与 prepared input 的 canonical family 身份。
- NumPy codec:描述 ndarray 的 dtype、shape、order、长度与 digest 的受限编码合同。
继续阅读
- 前置:Prepared runtime 与 private-COW
- 后续:为什么每个 family member 仍是独立 Run
- 说明文档:
implementation/09-prepared-family.md、evidence/current-runtime-94fab78.md - 源码 owner:
runtime/engine/wazero/prepared_input.go、runtime/engine/wazero/prepared_family.go、runtime/engine/wazero/prepared_guest_transfer.go、guest/bootstrap/agent_runtime/__init__.py