···77The proposed syntax is *mostly* compatible with Constellation's `source` record field locator syntax.
88Constellation uses a `<collection nsid>:<path>` format for its `source` parameter; *RecordPath* will replace the `<path>` part.
991010-While the driving motivation for this spec is lexicon-agnostic backlink indexing, it being able to canonically reference field locations in records is broadly useful.
1010+While the driving motivation for this spec is lexicon-agnostic backlink indexing, being able to canonically reference field locations in records is broadly useful.
11111212> [!TIP]
1313> For example: [Graze Turbostream](https://help.graze.social/en/article/graze-turbostream-1cmhebt/) resolves references from Bluesky posts into a richly-hydrated firehose, an incredibly useful enhancement.
···7070The RecordPaths are:
71717272```
7373-$type -- selects: "app.bsky.fee.like"
7373+$type -- selects: "app.bsky.feed.like"
7474createdAt -- "2026-04-15T00:00:00.000Z"
7575subject -- the entire { uri: .., cid: ..} sub-object
7676subject.uri -- "at://did:plc:pxa3amkp7jhfclaads3zud7q/app.bsky.feed.post/3mjkx2hpvqc2t"
···209209## 3. Data-model assumptions
210210211211RecordPath depends on several properties of the atproto [data model](https://atproto.com/specs/data-model) and [lexicon](https://atproto.com/specs/lexicon) system.
212212+213213+### `$type` is on unions (and blobs), not on plain object refs
214214+215215+- **Records** include `$type` at the top level (not included in RecordPaths)
216216+- **Union variants** MUST include `$type` (consistent with lexicon spec)
217217+- **Plain (non-union) object refs**: Lexicon states `$type` *"should not be included in encoded data as a discriminator."*
218218+ Since this is only a "should-not" and not a "must-not", valid records are technically allowed to have a `$type` where they shouldn't, and we aren't guaranteed to have a canonical RecordPath for every valid atproto record field.
219219+ Hopefully record serializers are following this SHOULD :/
220220+221221+### Forward-compatibility
222222+223223+Lexicon evolution rules forbid **type changes** across schema revisions, so a plain object ref cannot be converted to a union in a lexicon-forward-compatibility-compliant revision under the same NSID, so RecordPath canonicalization is hopefully safe from forward-compatible lexicon changes.
224224+225225+226226+todo:
227227+228228+- api recommendations for scalar vs vector queries
229229+230230+ > A RecordPath is *scalar* if it contains no `[]` qualifiers, otherwise *vector*. Implementations that evaluate RecordPaths against records typically expose apis for blah blah
231231+232232+ - maybe compare to DOM `querySelector` / `querySelectorAll`