The app shipped with its content baked in. That made every corpus change a full release, and it tied the content licensing to the app’s.
This work split content out: bundled packages, runtime delivery from a CDN, and a consent-gated dictionary. On top of that, ADR-0012 added a fourth content source, an in-house level-appropriate gloss corpus, authored by us, so a note that has no dictionary gloss still shows a sensible default instead of nothing.
The runtime resolver falls back in a fixed order across the sources, and the glosses union across the packages the learner has started. A word that isn’t in the installed deck still gets a gloss when one of the in-house sources has one.
The part that bit me: the resolver’s fallback order is the whole feature. Get one priority backwards and the learner silently sees a worse gloss.