At Meta, many teams make contract changes, and those changes can infect many downstream systems. GraphQL allows us to build up type safe communication protocols, but the choices made in the system's design Over time, we've got a lot of things right and made many mistakes, and learned that some of our best practices, for example whether to build clients against a super schema or a composition of schemas, can dramatically alter your teams' ability to make changes. Some specific design decisions we've learned from: - On the client, breaking away from response-centric types - Preventing full rebuilds for small changes via an Incremental Build System - The effects of having a single, company-wide shared schema, and ways of imposing modularity on top