The single-JSON source adapter: raw lesson JSON text + set context →
canonical ContentLesson.
A lesson file does not carry the language pair / domain — the parent set is
authoritative — so those are injected from context when absent (a lesson
that declares its own, e.g. an exported standalone, keeps it).
Only the language pair + domain are re-mapped here; every other field
(steps, cards, and the v1.5 examples carried on theory steps and
exercises) passes through the spread unchanged, so 1.4 and 1.5 lessons are
both accepted and the optional examples reaches the canonical object.
The single-JSON source adapter: raw lesson JSON text + set context → canonical ContentLesson.
A lesson file does not carry the language pair / domain — the parent set is authoritative — so those are injected from
contextwhen absent (a lesson that declares its own, e.g. an exported standalone, keeps it).Only the language pair + domain are re-mapped here; every other field (
steps,cards, and the v1.5examplescarried on theory steps and exercises) passes through the spread unchanged, so 1.4 and 1.5 lessons are both accepted and the optionalexamplesreaches the canonical object.