One blank inside a cloze exercise's sentence (Phase 52D /
v1.35.0 / P-127).
Marker-based convention: the sentence carries visible ___
tokens; blanks[i] provides the metadata for the i-th
marker (left-to-right). The validator enforces
sentence.count("___") == len(blanks) so the i↔i mapping
is unambiguous at render time.
accept carries the per-blank canonical + acceptable
variants — the renderer reuses FreeText's isFreeTextCorrect
matcher (NFC-normalised + Levenshtein <= 1) so authors only
need to enumerate semantic variants (gendered article,
capitalisation, et cetera), not typos.
One blank inside a cloze exercise's
sentence(Phase 52D / v1.35.0 / P-127).Marker-based convention: the sentence carries visible
___tokens;blanks[i]provides the metadata for the i-th marker (left-to-right). The validator enforcessentence.count("___") == len(blanks)so the i↔i mapping is unambiguous at render time.acceptcarries the per-blank canonical + acceptable variants — the renderer reuses FreeText'sisFreeTextCorrectmatcher (NFC-normalised + Levenshtein <= 1) so authors only need to enumerate semantic variants (gendered article, capitalisation, et cetera), not typos.