···8989| `.` | `!.` | field separator |
9090| `[` | `![` | arrays |
9191| `]` | `!]` | arrays |
9292-| `{` | `!}` | union refs |
9292+| `{` | `!{` | union refs |
9393| `}` | `!}` | union refs |
9494| `!` | `!!` | escape |
9595···165165facets[].features[app.bsky.richtext.facet#mention].did
166166```
167167168168-So while arrays are unordered in RecordPath, their elements are always segmented by union-ref type when they contained unioned types.
168168+So while arrays are unordered in RecordPath, their elements are always segmented by union-ref type when they contain unioned types.
169169170170171171### 2.5 Scalar union fields
···202202203203The RecordPath `embed{app.bsky.embed.external}.uri` reaches the quoted post's external embed URI, "https://youtu.be/-pns419xAoc?si=K4XMQfFv-t4Q1cn0".
204204205205-- The NSID in the parens is the `$type` value verbatim, including any `#fragment` suffix if present. the `#main` suffix is never present per the lexicon spec so this is close-to-canonical, but i need to think more about relative `#fragments` (that omit the NSID part) and whether that introduces any non-canonical problem.
205205+- The NSID in the braces is the `$type` value verbatim, including any `#fragment` suffix if present. The `#main` suffix is never present per the lexicon spec (*"use of a `#main` suffix is invalid"* in `$type` values). Relative `#fragment` references (without NSID) only exist within lexicon definition files as shorthand; `$type` values in record data are always fully-qualified (`nsid` or `nsid#name`). So the data is already canonical and no normalization is needed.
206206- The top-level record `$type` is excluded from this rule.
207207208208