This document defines the contract when Bifrost Type-1 does not own any Type-2 catalog or inventory metadata.
In this model:
- Type-1 is only the raft group for the Type-1 plane.
- Type-1 does not store which Type-2 planes should exist.
- Type-2 planes are materialized only when a caller explicitly addresses a
plane_id. - Persisted Type-2 state is recovered locally from each host's per-plane storage directory.
RaftService::plane(plane_id)andRaftService::ensure_plane(plane_id)can lazily materialize a persisted or explicitly created Type-2 runtime.- A missing Type-2 plane does not fall back to Type-1 handlers.
RaftService::loaded_type2_planes()reports only the Type-2 runtimes currently materialized in memory on the local host.
- Bifrost cannot enumerate the authoritative set of Type-2 planes for a cluster.
- Bifrost cannot derive the logical mapping from database, tenant, shard, or partition to
plane_id. - Bifrost cannot infer the desired Type-2 member set unless that information is supplied during bootstrap or recovered from that plane's own persisted state.
If Type-1 owns no Type-2 metadata, the upper layer must provide all of the following:
- A stable
plane_idfor every logical Type-2 plane. - The logical mapping from upper-layer objects to
plane_id. - The initial Type-2 member addresses when a plane is first created.
- The decision of when a plane should be opened, created, retried, or forgotten.
- Any lifecycle versioning or generation rules if a logical plane can be recreated.
Nebuchadnezzar or Morpheus must act as the control plane for Type-2 discovery. In practice, that means they must:
- Resolve the correct
plane_idbefore calling Bifrost. - Provide the intended Type-2 member set during first-plane bootstrap.
- Re-open Type-2 planes by
plane_idduring restart or recovery. - Treat
loaded_type2_planes()as a local observability API, not as cluster inventory.
If authoritative Type-2 discovery is needed inside Bifrost, that is a different design: it requires a Type-1 plane catalog. Without that catalog, lazy loading is valid, but discovery must remain outside Type-1.