Routing envelope for both invoke paths: projected out of an
Unvalidated<T> body by RoutingEnvelope, and built directly from the
GET query string by web-api’s split_get_envelope
(crates/ui/web-api/src/routes/surfaces.rs) — one type, so the two paths
cannot drift apart.
Declared beside RoutingEnvelope so the carve-out’s breadth is fixed
here: widening what pre-validation code can see means adding a field to
THIS struct — a reviewed change at the trait’s own home, never a per-impl
decision.
Routing metadata a dispatcher may read from a body before validation.
Sealed: implementable only inside web-api-types, so declaring a type’s
envelope is a reviewed change in the crate that owns the request types —
a doc-comment convention alone would be an ungated escape hatch from the
Unvalidated<T> type-state guarantee. Envelope fields are pure routing
inputs (they select a target; they are never business payload). No
associated type: an unconstrained type Envelope would let a future impl
return Self and hand the whole pre-validation body out — the concrete
return type bounds the projection at the trait, not per impl.