Post

If you make the lexicon more restrictive (making something that was allowed before not allowed now), you invalidate some existing records, and records still be posted in the future by not updated clients. E.g. you make post language required, but someone running bsky 1.0.0 still makes posts w/o it.

Only if it's in a way that doesn't break the expectation of some other party, i.e. a new previously unknown field is fine, but "all profiles previously had a display name but now you can get accounts without a display name" can break some apps

If you make something previously not allowed to be allowed now, older clients may be rejecting new content. E.g. currently existing & installed apps may not expect to get posts/profiles with this field missing and may either crash or have broken layout.

Basically you can't change it in a way that either an old app version will be rejecting something that new version makes, or the other way around. (It's somewhat analogous to the soft fork / hard fork problem in crypto ;) except you can't really force either side to the other direction here)

maybe you could briefly mention something about (or link to) how the bluesky code "runs" lexicon schemas. As I understand it they are compiled into a large bunch of functions that run on both the server and client ends.

i love nearly all of this but even the mention of optional separate social graphs makes my head hurt a little i just finished telling 200 people “and the coolest thing is that your friends list keeps working between apps”, imo it’s the atproto killer feature