Repository navigation
v0.33.0
Schema 1.18, a description-only change (what bridge lifts; two line breaks
restored). New checks: language tags as E-LANG-TAG (0 hits across the ten
content repositories) and four warnings for language pairs, set titles and
card-back scripts; isSlugId counts characters like the schema.
isSlugId counts characters, as the schema does (engine#205)
isSlugId (the /rules entry) checked the 120 limit with String.length,
which counts UTF-16 code units, while the schema's SlugId counts characters
(code points, as JSON Schema's maxLength does). An id of 61 to 120 letters
outside the Basic Multilingual Plane passed the schema and failed isSlugId.
Decided in engine#205: 120 means characters; isSlugId now counts code
points. No content is affected (the longest lesson id is 69 bytes, Latin).
The byte limit of a file name (ids become lessons/<id>.json) is documented
as a known limit under slug ids.
Language tags and set metadata are engine rules (engine#190)
The language-pair and set-metadata checks move from the content template's
validator into the engine, in the version decided on 2026-09-25:
E-LANG-TAG: atarget_languageorsource_language, on a set or a
lesson, is not a well-formed BCP 47 tag (en_US). Checked with
Intl.getCanonicalLocales, no table and no new dependency.W-LANG-TAG-CANONICAL: well-formed but not canonical (deu,EN,iw);
the message names the canonical form. Three-letter primary subtags without a
two-letter code (gsw,yue,fil) are valid, which the template's
two-letter rule rejected.W-LANG-PAIR-SAME: alanguageset whose source and target are one
language (the template: an error).W-SET-TITLE-NATIVE: alanguageset withouttitle_native(the
template: an error).W-CARD-BACK-SCRIPT: card backs with letters but none in the script of a
non-Latin source language, one warning per lesson. The script comes from
CLDR likely subtags, so every language is covered, not the template's six.
validateLessonandvalidateLessonRulestake the set's source language as
options.sourceLanguage; a lesson's ownsource_languagewins.
See language tags. Measured with this
build over the 53 sets and 631 lessons of the ten content repositories: 0
findings for every rule; seeded faults in a real lesson and a real manifest
are found.
A bridge lesson has no exercise-type minimum either (engine#185, schema 1.18)
purpose: "bridge" lifted only the exercise minimum, so a bridge lesson of
theory alone, or with exercises of one type, still fell short on
E-QUALITY-TYPES. Decided (owner, 2026-09-25): a lesson without an
assessment intent needs neither count nor variety, so bridge now lifts both.
The theory minimum and the per-exercise minimums still apply. This only
relaxes: nothing that passed before falls short now.
Schema 1.18 changes no field: the description of purpose says what bridge
lifts, and two descriptions get back the line breaks the em dash rewrite of
1.16 had swallowed (the root Lesson and InlineExample, engine#182). The
manifest schema, quality-rules.json and grading-presets.json move their
version in lockstep.