Registry of grant handlers, keyed by grant_type URN.
Per A6+A7 §2.1–§2.3 (v0.5.0 unified contract):
register(name, handler) throws on duplicate (no silent overwrite).
replace(name, handler) is the explicit override path.
freeze() is the activation boundary — after freeze, mutation throws.
The boot planner (Phase 4 / A2-β) is the only intended caller of
register / replace / freeze in the v0.5.0 architecture, driving
them from each module's contributes.grants and overrides.grants
declarations. Phase 9 (A2-γ caller migration) internalises the registry
and removes it from the public API. Phase 3 establishes the contract.
Public-export removal status (AS-8): the public re-export of
GrantRegistry / GrantRegistryError from @o3co/auth-provider-core
was removed per A2-γ §3.3. Both classes remain as internal
implementation detail of the boot planner; external consumers wire
grants through module-based contributes.grants declarations.
Seal the registry. Idempotent: calling freeze() on an already-frozen
registry is a no-op. After freeze, register and replace throw with
reason "frozen"; get continues to work.
Registry of grant handlers, keyed by grant_type URN.
Per A6+A7 §2.1–§2.3 (v0.5.0 unified contract):
register(name, handler)throws on duplicate (no silent overwrite).replace(name, handler)is the explicit override path.freeze()is the activation boundary — after freeze, mutation throws.The boot planner (Phase 4 / A2-β) is the only intended caller of
register/replace/freezein the v0.5.0 architecture, driving them from each module'scontributes.grantsandoverrides.grantsdeclarations. Phase 9 (A2-γ caller migration) internalises the registry and removes it from the public API. Phase 3 establishes the contract.Public-export removal status (AS-8): the public re-export of
GrantRegistry/GrantRegistryErrorfrom@o3co/auth-provider-corewas removed per A2-γ §3.3. Both classes remain as internal implementation detail of the boot planner; external consumers wire grants through module-basedcontributes.grantsdeclarations.