Plugin shape after layering route-level overrides on top of the
global declaration. This is what invokers should consume — calling
EffectivePlugin::resolve (rather than reading the global directly)
ensures future override enforcement lands without re-walking the
dispatch sites.
One entry from the root plugins: block. The minimal shape apl-core
needs to make routing + dispatch decisions; richer CPEX fields
(source, priority, mode, transport blocks, description,
version) are captured opaquely under extra so the round-trip
preserves them without us modeling every variant for v0.
Per-route override block — only the spec-overridable keys. Bare
key-value pairs are NOT merged into config implicitly (spec line
399): “The override object always uses the same keys as a plugin
declaration (config:, capabilities:, on_error:); bare
key-value pairs are not merged into config implicitly.”
Registry of plugin declarations, keyed by name. Built by the parser
from the root plugins: block. Type alias — no methods — so callers
can wrap it in Arc<_> or borrow it directly without ceremony.