nickg-anthropic
Joined 23 days ago
Joined 23 days ago
This system was actually built incrementally over several months and did not start out as a full VCS -- it started as a read-only service that ingested data from our Git repo to take pressure off of CI and other tools needing to materialize checkouts for certain types of repo/graph questions. Even when we did decide to go all the way, we were operating in a hybrid Git/Scion world for months during the migration and the path to get there made the system and code very unique to our infrastructure.
We credited Sapling because that's how Meta itself externally refers to the entire system, including the Mononoke server, and we wanted to follow that convention. We will add an additional footnote to clarify this. [edit: this is done]
We were inspired by many things while building Scion, such as the great ideas in Mononoke's Bonsai data model, and didn't intend to obfuscate that in any way. We were also inspired heavily by https://martin.kleppmann.com/2015/03/04/turning-the-database..., for example, which also describes the "derived data" concept using the same words.
We also did not just tell Claude to build us a version control system; we did a lot of research on what would work and not work for our use case and coming from an existing large Git repo (rather than Mercurial, as Mononoke did) required many novelties beyond some of these data structures.
The intent was to give credit to Mononoke without getting too deep in the weeds of comparing and contrasting each point of the data model where we diverged. There are many ex-Meta employees at Anthropic who were inspired by how joyful using source control was because of Mononoke, which deserves a lot of credit to you and the source control team there. We had that experience as a north star from the beginning while making decisions that map to our (different) needs.
We never allow textual conflicts, but semantic conflicts (for example, if someone adds changes the logic of a function and cleans up all affected callsites concurrently with a new call being added) are an unavoidable fact of very large repos unless you completely serialize merging with running extensive validation at the proposed batch tip, which isn't practical at a certain commit rate.
As for cross-repo changes, not exactly, but there are ways we could allow such a thing if we wanted. We're thinking about it.
Good call about us not defining it, I can fix that! And this blog post was 100% human-written.
We do discourage (but not block) some trickier DAG things you could have done in git and are probably moving towards squashing and rebasing for landing since many things become simpler without merges, but we simply had to deal with merges (and handle git compatibility while migrating) to pull this off. Particularly, full DAG merge bases add a lot of complexity and it gave us some concrete ideas on how to improve git's commit graph data structures by an order of magnitude or more.