ScopedIds
The ids the view store derives from what an aggregate is for, so a route finds the aggregate without a lookup: the same parts always give the same id. They are derived exactly as the 9.x view store derived them (ViewPreferencesIds, DatasetWordingIds): the tenant first, then the parts, joined by NUL, the first 32 hex digits of their SHA-256. So the preferences and the wordings migrate-data imports from 9.x keep their ids, and a route finds them after the cut-over (found by the 8c.1 rehearsal). The tenant is redundant in 10.x, whose ids are unique per tenant (axiom A6), and no part names the aggregate type, since each type has its own streams; both stay for this compatibility.
Functions
The id of ownerId's preferences for definitionId in appId, in tenantId; an owner-less caller's are its tenant's.