DirectiveRegistry
An immutable marker → Directive table — the resolver's only extension point.
Every mutation returns a new registry; Default is never touched by extension. Registration mistakes (bad marker, duplicate, overriding a missing marker) are programmer errors and throw IllegalArgumentException — they are not part of the resolve error contract.
val registry = DirectiveRegistry.Default + ("\$feature" to gate) + vendorPackProperties
Functions
register as an operator: DirectiveRegistry.Default + ("${'$'}feature" to gate). Strict like register — a duplicate marker throws; use override to replace.
merge under MergePolicy.ERROR as an operator: base + extras. Strict for the same reason plus is — silently picking a side would make which pack won depend on argument order. Call merge directly to choose another policy.
register for several directives at once, left to right.