"Compose what's declared. Overlay what's observed. Keep the two layers from ever pretending to be each other."
Two Layers, Two Jobs
With one owner per fact, Firelink needs a clean way to assemble those owners into something usable. It uses two layers with two distinct jobs. The FamilyRegistry composes declared truth: it takes the direct-project scope, the roster, the network ledger, and the operation-policy file, and produces the managed family model — who exists and what they're declared to be. The FamilyReconciler then overlays observed truth: it takes that declared model plus live disk, Git, GitHub, and runtime probes, and produces a census snapshot plus a drift report — what's actually true right now, and where reality disagrees with the declaration.
The composed FamilyRegistry is the one typed object everything else consumes: census, the APIs, the WebUI, the launcher's catalog export, and operation policy all read the same model. There is no second assembly, no parallel list for the frontend, no separate catalog for the launcher.
Drift Is an Explicit, Typed List
Because declared and observed are separate layers, the gaps between them become first-class data. Drift is not a vibe; it's an enumerated set: a managed repo missing from the roster; a network declaration absent or contradictory; an operational manifest missing or invalid; a declared service not installed; a GitHub repo absent; a version unknown; a launch target unavailable on the current client. Each drift is a named condition the hub can show, not a mystery you debug by hand.
The Reconciler Never Repairs on Its Own
This is the discipline that keeps the shrine from becoming the flame: the census never scans nested project trees, auto-deletes, retires, rewrites, or guesses product intent. It reports drift; it does not silently fix it. Repair is either an explicit, Add-owned step (birth flow) or a normal Dad-and-Pippa change made outside Firelink entirely. Observing and reconciling is the hub's job; deciding and repairing is a deliberate act, never an automatic one.