Гайд

Как составлять карточки — гайд RepeatMe

Хорошая карточка — половина запоминания. Этот гайд объясняет, как устроены карточки RepeatMe, когда какой режим уместен и как не наступить на типичные грабли: синонимы, словарная и контекстная формы, разрывные выражения. Он же — спецификация для ИИ: машинную версию формата можно отдать любой модели по ссылке /prompts/v1/card-format.

Как устроена карточка

Карточка — единица знания. У неё один или несколько кейсов (cases) и для каждого кейса — набор режимов (modes), в которых это знание проверяется.

  • Кейс (case) = пара front / back. Один кейс = обычная карточка. Несколько кейсов = «карточка-правило» (например, спряжение to be): при показе берётся случайный кейс, а расписание повторений — одно на всю карточку.
  • Режим (mode) = форма подачи: переворот, выбор варианта, ввод ответа, заполнение пропуска, подбор пар.

Профиль — пресет набора режимов, отражает намерение (intent):

Профиль Режимы Для чего
Факт Flip, ReverseFlip, Choice, ReverseChoice, Type, Match факты, формулы, определения — самооценка + авто-проверка дискретного ответа
Лексика / перевод весь набор слова, выражения, грамматика — дистракторы, синонимы, предложения

Профиль — лишь предзаполнение набора режимов; автор может менять режимы вручную. Профиль не ограничивает доступные режимы: факты спокойно используют Choice/Type/Match, если есть дистракторы или точный ответ. Правила генерации для лексики языко-независимы — отдельного подтипа «английский / французский» не нужно.

«Что показываем» ≠ «что принимаем»

  • back / frontканоническая форма: то, что показывается при раскрытии ответа.
  • Принимаемые ответы — множество форм, которые засчитываются как верные (синонимы, варианты рода/числа, орфографические варианты). Любая из них = верно; каноническая форма принимается всегда.

Принимаемые ответы живут в данных режима (answers), а не в кейсе: у Flip их быть не должно, а кейс держит только общие для всех режимов поля.

context и explanation — две разные подсказки; их легко перепутать:

  • context — показывается вместе с вопросом, до ответа. Его единственная задача — снять реальную неоднозначность: ставь его, когда по одному front правильных ответов больше одного, чтобы выбрать нужное прочтение. Омоним: front: "язык"context: "орган" ⇒ просят tongue, а не language. Кейс про артикль: front: "Я вижу птицу.", back: "I see a bird." — перевод the bird так же верен, поэтому context: "какую-то, не конкретную" выбирает a. Лакмус: был бы без подсказки правильным и другой ответ? Если нет — context ОБЯЗАН остаться null, null — поведение по умолчанию.
  • context уточняет, что front значит, и никогда — как устроен ответ: он НЕ должен содержать ответ или его часть и НЕ должен намекать на проверяемое правило. На карточке про a/an подсказка "university начинается с согласного звука [j]" пересказывает само проверяемое правило и превращает вспоминание в чтение — этой фразе место в explanation. Ученик, не знающий правила, не должен узнать из context ничего.
  • context показывается только когда промпт — сторона front (прямые режимы: Flip, Type, Choice, ClozeType, ClozeChoice); в обратных режимах и в Match не выводится. Уточнение держи только в context, не вписывай его в сам front (front: "высокий", context: "о росте" — а не front: "высокий (о росте)"): всё, что внутри front, становится частью термина — попадёт в варианты выбора, в правильный ответ обратных режимов, в поле ввода и в списки терминов. В front — только чистый термин.
  • explanation — показывается после ответа (кнопка-лампочка): разбор, правило или мнемоника; может ссылаться на ответ и правило.

context живёт на кейсе (у каждого кейса карточки-правила может быть свой), а explanation и title — у карточки целиком. Ставь их только когда они реально помогают: пустые значения — норма. Сомневаешься — опусти.

title: ставь только когда он добавляет сведения, которых нет ни в front, ни в context — грамматическая пометка («Phrasal verb»), категория, регистр. Никогда не копируй front в title: это дублирует то, что ученик и так видит. В большинстве карточек title = null.

Формат answers (важно): массив слотов — по одному слоту на каждый пропуск {{answer}} (для Type/ReverseType слот ровно один). Слот — массив принимаемых форм, контекстная форма первой. Число {{answer}} в sentence обязано равняться числу слотов.

Два разных смысла «нескольких ответов» — не путать:

  • Синонимы / альтернативы — подходит любой из вариантов (till / until; оба / обе) → кладём в один слот: [["оба","обе"]].
  • Последовательность / разные пропуски — нужны все части, каждая на своём месте (3 формы неправильного глагола; разрывное from … till …) → по слоту на часть: [["from"],["till","until"]].

Слот существует только для пропуска {{answer}} — не добавляй слот для слов, которые остаются видимыми в предложении. Для "Our team {{answer}} new features." правильно [["develops","builds"]], а не [["develops","builds"],["new features"]] (1 пропуск против 2 слотов — импорт это отклонит).

Когда правильный ответ — отсутствие слова (нулевой артикль, нулевой предлог), принимаемая форма — пустая строка, и back тоже пустой. Не выдумывай символ-заменитель (, 0, нет артикля): приложение само подписывает пустой ответ, поэтому в режимах с вводом ученик оставляет поле пустым, а в режимах с выбором выбирает вариант «ничего».

{ "front": "article with most country names (France, Russia)", "back": "",
  "modes": [
    { "type": "Flip" },
    { "type": "Choice", "data": { "distractors": ["a", "an", "the"] } },
    { "type": "ClozeType", "data": { "sentence": "She lives in {{answer}} France.", "answers": [[""]] } },
    { "type": "ClozeChoice", "data": { "sentence": "She lives in {{answer}} France.", "answers": [[""]], "distractors": ["a", "an", "the"] } }
  ] }

В текстах ответов не должно быть символа | (он служебный — разделяет варианты в передаче).

Ловушка словарной формы (citation vs in-context)

Слово в словарной форме несёт служебные элементы, которых в предложении быть не должно:

  • инфинитивное to: to go for a walk → в предложении «we often go for a walk»;
  • артикль: an apple → «I ate the apple»;
  • связку: be keen on → «he is keen on …»;
  • спряжение: wait for → «I'm waiting for …».

Правило: в предложении/ответе используем форму, в какой слово реально стоит в контексте. Если она отличается от канонической — кладём обе в слот, контекстную первой: [["go for a walk","to go for a walk"]].

Рецепты по типу данных

Ниже data показан как объект — так его принимают вкладка JSON формы карточки и импорт колоды. (В сыром API POST /api/cards data — это JSON-строка: тот же объект, сериализованный в строку.)

Факт / формула / определение → профиль Факт

{ "front": "Площадь круга", "back": "πr²",
  "modes": [ { "type": "Flip" }, { "type": "ReverseFlip" } ] }

Минимально — только самооценка. Если есть правдоподобные неверные значения того же типа, добавь Choice с дистракторами (факты тоже авто-проверяются — это не делает их «лексикой»).

Слово → перевод → профиль Лексика / перевод

{ "front": "яблоко", "back": "apple",
  "modes": [
    { "type": "Flip" }, { "type": "ReverseFlip" },
    { "type": "Type" },
    { "type": "Choice",  "data": { "distractors": ["banana","orange","grape"] } },
    { "type": "ClozeType", "data": { "sentence": "I eat an {{answer}} every day.", "answers": [["apple"]] } }
  ] }

Синонимы / варианты рода → один слот answers

Хранить front: "оба, обе" нельзя (придётся вводить буквально, с запятой). Вместо этого — канон + принимаемые варианты на стороне ответа:

{ "front": "оба", "back": "both",
  "modes": [
    { "type": "ReverseType", "data": { "answers": [["оба","обе"]] } },
    { "type": "Type" }
  ] }

Теперь при ReverseType засчитывается и оба, и обе.

Словарная форма с to / артиклем → контекстная форма + принимаемый вариант

{ "front": "идти на прогулку", "back": "to go for a walk",
  "modes": [
    { "type": "Type", "data": { "answers": [["to go for a walk","go for a walk"]] } },
    { "type": "ClozeType", "data": {
        "sentence": "After dinner we often {{answer}} in the park.",
        "answers": [["go for a walk","to go for a walk"]] } }
  ] }

В предложении — go for a walk (контекстная форма первой), словарная — как принимаемый вариант.

Разрывное выражение from … till … → слот на часть

{ "front": "с … до …", "back": "from … till …",
  "modes": [
    { "type": "ClozeType", "data": {
        "sentence": "The shop is open {{answer}} 9 a.m. {{answer}} 6 p.m.",
        "answers": [["from"],["till","until"]] } },
    { "type": "ClozeChoice", "data": {
        "sentence": "The shop is open {{answer}} 9 a.m. {{answer}} 6 p.m.",
        "answers": [["from"],["till","until"]],
        "distractors": ["at","on","in"] } }
  ] }

Два пропуска {{answer}} ↔ два слота. В ClozeChoice кнопка показывает канонический вариант (from / till); until не предлагается как (неверная) кнопка.

Неправильный глагол (3 формы) → 3 пропуска

{ "front": "идти", "back": "go, went, gone",
  "modes": [
    { "type": "ClozeType", "data": {
        "sentence": "{{answer}}, {{answer}}, {{answer}}",
        "answers": [["go"],["went"],["gone"]] } }
  ] }

Так проверяется каждая форма, а не «угадай пунктуацию» одной длинной строки.

Грамматическое правило → одна карточка, много кейсов, пропуск в точке решения

Ученик путает do/does. Неправильно: карточка на каждое исправленное предложение — заучится предложение, а не правило. Правильно: одна карточка-правило, где каждый кейс — новое предложение, пропуск стоит ровно в точке принятия решения, а дистракторы — именно те формы, которые путаются:

{ "title": "Present Simple questions: do or does?",
  "explanation": "he/she/it → does; I/you/we/they → do. After does the main verb returns to its base form.",
  "cases": [
    { "front": "Она живёт в Польше?", "back": "Does she live in Poland?",
      "modes": [
        { "type": "ClozeChoice", "data": { "sentence": "{{answer}} she live in Poland?", "answers": [["Does"]], "distractors": ["Do", "Did", "Is"] } },
        { "type": "ClozeType", "data": { "sentence": "{{answer}} she live in Poland?", "answers": [["Does"]] } },
        { "type": "Flip" }
      ] },
    { "front": "Ты работаешь по выходным?", "back": "Do you work on weekends?",
      "modes": [
        { "type": "ClozeChoice", "data": { "sentence": "{{answer}} you work on weekends?", "answers": [["Do"]], "distractors": ["Does", "Did", "Are"] } },
        { "type": "ClozeType", "data": { "sentence": "{{answer}} you work on weekends?", "answers": [["Do"]] } },
        { "type": "Flip" }
      ] },
    { "front": "Почему он изучает английский?", "back": "Why does he study English?",
      "modes": [
        { "type": "ClozeChoice", "data": { "sentence": "Why {{answer}} he study English?", "answers": [["does"]], "distractors": ["do", "did", "is"] } },
        { "type": "ClozeType", "data": { "sentence": "Why {{answer}} he study English?", "answers": [["does"]] } },
        { "type": "Flip" }
      ] }
  ] }

Настоящая карточка продолжается до 6–12 кейсов: меняй подлежащие, глаголы и темы и придумывай новые предложения сверх тех, что ученик уже видел. При каждом показе берётся случайный кейс, поэтому расписание отслеживает правило, а не какое-то одно предложение. Все кейсы и все режимы держатся одного решения, о котором карточка, — здесь пропуск всегда на do/does. Режим, прячущий другое слово (например, смысловой глагол), проверяет другое знание и относится к другой карточке.

context у кейса карточки-правила уместен только когда у front больше одного правильного ответа. Канонический пример — артикли: в русском их нет, поэтому для front: "Я вижу птицу." верны и I see a bird, и I see the birdcontext: "какую-то, не конкретную" выбирает нужный смысл, а без этой подсказки дистрактор the был бы вторым правильным вариантом (некорректный режим выбора). Никогда не пересказывай в context триггер правила — context: "university начинается с согласного звука [j]" на карточке про a/an выдаёт ответ до вспоминания. Если у кейса один правильный ответ — context = null; пересказ правила живёт в explanation карточки и показывается после ответа.

У карточки про артикли есть и кейсы, где правильный ответ — отсутствие артикля. Пиши его пустой строкой — и в back, и в слоте ответа — и оставляй полный набор режимов: нулевой артикль и есть то решение, которое ученик должен уметь воспроизвести, поэтому его нельзя проверять только выбором из списка.

{ "front": "артикль с большинством стран (Франция, Россия)", "back": "",
  "modes": [
    { "type": "Flip" },
    { "type": "Choice", "data": { "distractors": ["a", "an", "the"] } },
    { "type": "ClozeType", "data": { "sentence": "She lives in {{answer}} France.", "answers": [[""]] } },
    { "type": "ClozeChoice", "data": { "sentence": "She lives in {{answer}} France.", "answers": [[""]], "distractors": ["a", "an", "the"] } }
  ] }

Соседние кейсы ("back": "the" для the UK, "back": "a" для a doctor) по той же причине несут "" среди своих distractors: «без артикля» должен оставаться живым вариантом везде, иначе ученик выберет нужный артикль методом исключения.

Путающиеся слова → одна карточка-различение, кейсы чередуют верный член

Ученик путает speak (уметь говорить на языке) и learn (процесс изучения). Одна карточка на один набор путающихся слов; дистракторы — остальные члены набора, а кейсы чередуют, какой член верный, — тогда ученику приходится различать, а не заучивать один фиксированный ответ:

{ "title": "speak vs learn",
  "explanation": "speak = уметь говорить на языке; learn = учить, осваивать (процесс).",
  "cases": [
    { "front": "говорить (на языке)", "back": "speak",
      "modes": [
        { "type": "Flip" }, { "type": "Match" },
        { "type": "ClozeChoice", "data": { "sentence": "Do you {{answer}} Polish?", "answers": [["speak"]], "distractors": ["learn", "study", "talk"] } },
        { "type": "ClozeType", "data": { "sentence": "Do you {{answer}} Polish?", "answers": [["speak"]] } }
      ] },
    { "front": "учить, осваивать (язык)", "back": "learn",
      "modes": [
        { "type": "Flip" }, { "type": "Match" },
        { "type": "ClozeChoice", "data": { "sentence": "I {{answer}} Polish and English.", "answers": [["learn", "study"]], "distractors": ["speak", "talk"] } },
        { "type": "ClozeType", "data": { "sentence": "I {{answer}} Polish and English.", "answers": [["learn", "study"]] } }
      ] }
  ] }

Это карточка слова, поэтому во front/back — только слово и его значение; предложения с контекстом живут внутри data cloze-режимов. Так Flip остаётся чистым (слово ↔ значение, а не пара предложений) и открывается Match — самый быстрый режим, чтобы прогнать много карточек-слов за раз. Если в предложение честно подходят несколько членов набора — принимай их все одним слотом answers (как learn / study выше): дистрактор никогда не должен совпадать с принимаемым вариантом. Если предложение само по себе не задаёт единственное прочтение — добавь кейсу подсказку context, а не искажай предложение.

Одно слово, несколько контекстов → одна карточка, кейс на контекст

Ученик неверно употребил конкретное слово (make a service → нужно develop a service). Сфокусируй карточку на этом слове и покажи его работу в разных предложениях — при каждом показе случайный кейс:

{ "title": "Collocation: develop (software)",
  "explanation": "develop / build a service, an app — not \"make a service\".",
  "cases": [
    { "front": "разрабатывать (сервис, приложение)", "back": "develop",
      "modes": [
        { "type": "Flip" }, { "type": "ReverseFlip" }, { "type": "Type" },
        { "type": "ClozeType", "data": { "sentence": "I {{answer}} a spaced repetition service.", "answers": [["develop", "build"]] } }
      ] },
    { "front": "разрабатывать (сервис, приложение)", "back": "develop",
      "modes": [
        { "type": "ClozeChoice", "data": { "sentence": "We {{answer}} mobile apps for banks.", "answers": [["develop", "build"]], "distractors": ["make", "do", "invent"] } },
        { "type": "ClozeType", "data": { "sentence": "Our team {{answer}} new features every month.", "answers": [["develops", "builds"]] } }
      ] }
  ] }

Вводимый ответ — всегда слово, никогда не целое предложение. Обрати внимание на ClozeType второго кейса: контекстная форма (develops) стоит в слоте первой — по правилам слотов ответов.

Факт с дистракторами (ПДД-стиль, родной язык)

{ "front": "Что означает сплошная линия разметки?", "back": "Пересекать запрещено",
  "modes": [
    { "type": "Flip" },
    { "type": "Choice", "data": {
        "distractors": ["Можно перестраиваться","Только для автобусов","Парковка разрешена"] } }
  ] }

Дистракторы — правдоподобные, но неверные факты. (Фрейминг «перевод» здесь неуместен — это колода с намерением fact.)

Формат JSON (машинный контракт)

Полный контракт колоды ниже — то, что принимает диалог «Импорт колоды». Этот же формат отдаётся машине по ссылке /prompts/v1/card-format.

Deck JSON contract. The complete deck object — what the "Import deck" dialog and POST /api/decks/import-json accept. Cards carry no deckIds: the deck itself is created by the import.

{
  "title": "string",                  // deck name (required)
  "description": "string | null",
  "frontLanguage": "ru",              // language of the question side (front) — the learner's native language (optional)
  "backLanguage": "en",               // language of the studied side (back) — drives pronunciation (optional; null when not applicable)
  "isPublic": false,
  "cards": [
    {
      "title": "string | null",       // optional label; never copy the front — set it only when it adds information (see the hint rules)
      "explanation": "string | null", // post-answer note (rule recap / mnemonic); MAY reference the answer
      "contentFormat": "PlainText",   // or "Markdown"
      "cases": [
        {
          "front": "string",          // question side (usually the native language)
          "back": "string",           // answer side (usually the studied language)
          "context": "string | null", // cue shown WITH the question; set ONLY when several answers would be correct without it; never hints the answer or the tested rule
          "backAudio": null,          // pronunciation mp3 URL for the back word — ALWAYS null (see the backAudio rule)
          "modes": [
            { "type": "Flip", "data": null }   // "type": a mode name; "data": object or null per the mode table below
          ]
        }
      ]
    }
  ]
}

type is one of: Flip, ReverseFlip, Choice, ReverseChoice, Match, ClozeType, ClozeChoice, Type, ReverseType.

The import dialog also accepts a bare array of cards ([ { "cases": … }, … ]) — the deck title is then taken from the dialog's name field. A single card (with deckIds) can be pasted into the JSON tab of the card form.

data по режимам:

Режим data Смысл
Flip, ReverseFlip, Match null данных нет
Type { "answers": [[ ... ]] } (опц.) один слот — принимаемые формы back
ReverseType { "answers": [[ ... ]] } (опц.) один слот — принимаемые формы front
Choice { "distractors": [ 3 items ] } неверные варианты на языке back
ReverseChoice { "distractors": [ 3 items ] } неверные варианты на языке front
ClozeType { "sentence": "... {{answer}} ...", "answers": [[ ... ]] } пропуски + слоты ответов
ClozeChoice { "sentence": "...", "answers": [[ ... ]], "distractors": [ ... ] } пропуски + слоты + неверные

Правила генерации (Lexical):

  • L1. Ставь каждый пропуск/ответ в форме, в какой он стоит в предложении (убери словарное to, проспрягай под подлежащее, убери уже имеющийся артикль) — по грамматике соответствующего языка. Если форма в предложении — отсутствие слова (нулевой артикль, нулевой предлог), пиши пустую строку, а не символ-заменитель.
  • L2. Если контекстная форма ≠ исходному слову — укажи обе, контекстную первой.
  • L3. Синонимы/варианты — отдельные элементы слота, не объединяй запятыми внутри одного элемента.
  • L4. Разрывное выражение — по пропуску/слоту на часть.
  • L5. Дистракторы — правдоподобные, но неверные, того же типа, что и ответ; не дублируй принимаемые варианты.
  • L6. Предложение — естественное и грамматичное.

backAudio (произношение). Аудио озвучивает слово-ответ (back) и показывается кнопкой ▶ рядом с ним во всех режимах. Не придумывай ссылку: URL словарей (напр. api.dictionaryapi.dev) непредсказуем по шаблону, выдуманная ссылка почти всегда битая. Всегда ставь backAudio: null (или опускай поле) — реальную ссылку подставляет сервер, запрашивая словарный API. Аудио осмысленно только для одиночных слов изучаемого языка; для словосочетаний и предложений его нет.

Намерение (intent) — определяет фрейминг:

intent Когда front / back Профиль
translation изучение слов/выражений/грамматики другого языка родной ↔ изучаемый Лексика / перевод
definition термин ↔ значение на одном языке (биология, право, словарь терминов) термин ↔ определение Лексика / перевод
fact вопрос ↔ факт (ПДД, история, формулы) вопрос/понятие ↔ факт/значение Факт (+ Choice/Match, если есть правдоподобные дистракторы)

Типы знания → форма карточки (определи ДО написания карточек):

Карточка — единица знания, а не один вопрос. Сначала классифицируй, что именно учится, затем выводи форму карточки из типа. Никогда не делай карточку на каждое предложение-пример: сгруппируй материал по стоящему за ним правилу / слову / контрасту и положи примеры в cases одной карточки — при каждом показе берётся случайный кейс, поэтому усваивается паттерн, а не одна заученная строка.

Тип знания Пример Форма карточки Ядро режимов Дистракторы
Правило / паттерн — выбор формы (do/does, артикль, форма глагола, окончание) вопросы с does 1 правило = 1 карточка, 6–12 кейсов: разные предложения на одно правило ClozeChoice + ClozeType, пропуск в точке решения; опционально Flip минимальные пары: do/does/did, work/works
Порядок слов / позиция usually перед смысловым глаголом 1 паттерн = 1 карточка, 5–8 кейсов Choice (целые предложения, отличающиеся только порядком), Flip те же слова, неверный порядок
Контраст-набор (интерференция) speak vs learn vs study 1 набор = 1 карточка; front/back = член набора + его значение; кейсы чередуют, какой член верный ClozeChoice с остальными членами как дистракторами, ClozeType, Flip/Match; подсказка context, когда предложение само по себе неоднозначно остальные члены набора — в этом смысл карточки
Слово / коллокация develop a service 1 слово = 1 карточка, 2–5 кейсов: одно слово в разных предложениях Flip/ReverseFlip/Type/Match (только слово), ClozeType на каждый контекст близкие по смыслу, но неверные здесь
Орфография study, а не stady 1 слово = 1 карточка Type/ClozeType — ввод слова И ЕСТЬ проверка не нужны
Факт / определение столица X; термин ↔ значение 1 факт = 1 карточка, 1 кейс Flip/ReverseFlip; Choice/Match только при правдоподобных неверных фактах того же рода; Cloze/Type обычно не нужны правдоподобные факты того же рода
  • Один вопрос — одно решение. Ввод целого предложения проверяет пять вещей сразу и размывает сигнал ошибки; cloze-пропуск ровно в точке решения изолирует то, что тренируем.
  • Все кейсы и все режимы проверяют одно решение карточки. Карточка про do/does никогда не прячет смысловой глагол в одном из режимов — другое решение живёт на другой карточке.
  • У карточек-слов во front/back — само слово (слово ↔ значение), не предложение; предложения с контекстом живут в data режимов ClozeChoice/ClozeType. Так Flip остаётся чистым и открывается Match — самый быстрый режим, чтобы прогнать много карточек-слов за раз.
  • Регистр букв проверяется только выбором. Вводимые ответы оцениваются без учёта регистра, поэтому правило про заглавную букву (English, а не english) требует Choice/ClozeChoice с дистракторами, отличающимися регистром (English vs english) — проверка через Type/ClozeType молча примет строчный вариант.
  • Воспроизведение сильнее узнавания. Choice/ClozeChoice — ступеньки; всегда добавляй к ним вводимую форму (ClozeType/Type), чтобы знание в итоге воспроизводилось, а не узнавалось.
  • Карточке-правилу нужны свежие примеры. Меняй подлежащие, глаголы и темы за пределами предложений, которые ученик уже видел, — иначе карточка проверяет память об уроке, а не правило.
  • Обычная лексика (intent translation) сохраняет классический базовый набор: Flip, ReverseFlip, Type, Choice, ClozeType (опционально ReverseChoice, ClozeChoice, ReverseType, Match).
  • Упрощай по умолчанию. Не добавляй тяжёлую разметку без пользы: для 3-форменных неправильных глаголов достаточно back: "go, went, gone" + Flip/ReverseFlip/Type.

Чек-лист валидности:

  • E1. У каждого кейса есть front и хотя бы один режим (back может быть пустым — см. E16).
  • E2. Число {{answer}} в sentence равно числу слотов в answers.
  • E3. Каждый слот — непустой массив строк, контекстная форма первой. Сама строка в нём может быть пустой — это ответ «слово не нужно» (E16).
  • E4. Синонимы — отдельные элементы слота, не "a, b" одной строкой.
  • E5. Контекстная форма грамматична в своём предложении (нет «we often to go», «is be keen on»).
  • E6. Дистракторы неверны и не совпадают ни с одним принимаемым вариантом.
  • E7. Карточки с самооценкой (только Flip/ReverseFlip) — без дистракторов/предложений в data.
  • E8. В текстах ответов нет символа | (он служебный).
  • E9. Вводимые ответы (Type/ReverseType, слоты cloze) — слово или короткая фраза, никогда не целое предложение. Чтобы проверить решение внутри предложения — ClozeType/ClozeChoice с пропуском ровно в этой точке.
  • E10. Карточка-правило несёт несколько cases (ориентир — 6+), каждый — новое предложение-пример; одно правило никогда не режется на карточку-на-предложение.
  • E11. Дистракторы Choice/ClozeChoice — минимальные пары проверяемого решения (do/does/did): неверные здесь, но правдоподобно путающиеся; никогда не случайные слова.
  • E12. Различие, живущее только в регистре букв (English vs english), проверяется через Choice/ClozeChoice и никогда через Type/ClozeType: ввод оценивается без учёта регистра, и неверный регистр был бы засчитан.
  • E13. Все кейсы и все режимы карточки проверяют одно её решение. Карточка про do/does никогда не прячет смысловой глагол в одном из режимов — другое решение = другая карточка.
  • E14. У карточек-слов во front/back — само слово (слово ↔ значение), никогда не целое предложение; предложения с контекстом уходят в data cloze-режимов. Так Flip остаётся чистым и открывается Match.
  • E15. context ставится только когда у front больше одного правильного ответа; он выбирает нужное прочтение и никогда не намекает на ответ или проверяемое правило (пересказ правила — в explanation).
  • E16. Когда правильный ответ — отсутствие слова (нулевой артикль, нулевой предлог), он пишется пустой строкой — и в back, и в слоте ответа, одинаково во всех режимах кейса. Никаких символов-заменителей (, 0, нет артикля): приложение подписывает пустой ответ само.

Создание карточек с ИИ

Составлять карточки вручную не обязательно — есть три пути:

  • Базовый ИИ — кнопка «Создать с ИИ» на странице колод: опишите колоду свободным текстом, отредактируйте план и получите готовые карточки.
  • Свой ИИ — тот же диалог собирает готовый промпт: скопируйте его в любой чат-бот (ChatGPT, Claude, Gemini), а JSON-ответ вставьте обратно. Так же работает обогащение полей в форме карточки и в массовом редактировании.
  • Внешний чат после занятия — если вы разбирали тему с ИИ-чатом, дайте ему ссылку /prompts/v1/deck-builder: он задаст пару уточняющих вопросов о ваших слабых местах, соберёт колоду и выдаст JSON для импорта.

Импорт JSON

  1. Откройте страницу колод и нажмите «Импорт колоды» (или перейдите по ссылке /decks?import=1 — диалог откроется сам).
  2. Вставьте JSON: диалог принимает и объект колоды { "title", …, "cards": [ … ] }, и просто массив карточек [ { "cases": … }, … ] — тогда название берётся из поля «Название» диалога.
  3. Подтвердите — колода и все карточки создадутся за один шаг.

Отдельную карточку можно вставить во вкладку JSON формы карточки.

Полный пример колоды

Валидная колода-образец, в которой каждый режим встречается хотя бы раз — можно вставить в диалог «Импорт колоды» как есть:

{
  "title": "English basics — sample",
  "description": "A tiny sample deck showing every mode and field.",
  "isPublic": false,
  "frontLanguage": "ru",
  "backLanguage": "en",
  "cards": [
    {
      "cases": [
        {
          "front": "яблоко",
          "back": "apple",
          "backAudio": null,
          "modes": [
            { "type": "Flip" },
            { "type": "ReverseFlip" },
            { "type": "Match" },
            { "type": "Type" },
            { "type": "Choice", "data": { "distractors": ["banana", "orange", "grape"] } },
            { "type": "ClozeType", "data": { "sentence": "I eat an {{answer}} every day.", "answers": [["apple"]] } }
          ]
        }
      ]
    },
    {
      "cases": [
        {
          "front": "язык",
          "back": "tongue",
          "context": "орган",
          "modes": [
            { "type": "Flip" },
            { "type": "Type" },
            { "type": "ReverseChoice", "data": { "distractors": ["зуб", "нос", "ухо"] } }
          ]
        }
      ]
    },
    {
      "title": "Phrasal verb",
      "cases": [
        {
          "front": "идти на прогулку",
          "back": "to go for a walk",
          "modes": [
            { "type": "Type", "data": { "answers": [["to go for a walk", "go for a walk"]] } },
            { "type": "ClozeType", "data": { "sentence": "After dinner we often {{answer}} in the park.", "answers": [["go for a walk", "to go for a walk"]] } }
          ]
        }
      ]
    },
    {
      "explanation": "till и until взаимозаменяемы; from задаёт начало интервала.",
      "cases": [
        {
          "front": "с … до …",
          "back": "from … till …",
          "modes": [
            { "type": "ClozeChoice", "data": { "sentence": "The shop is open {{answer}} 9 a.m. {{answer}} 6 p.m.", "answers": [["from"], ["till", "until"]], "distractors": ["at", "on", "in"] } }
          ]
        }
      ]
    },
    {
      "explanation": "be – was/were – been.",
      "cases": [
        {
          "front": "быть (3 формы)",
          "back": "be – was/were – been",
          "modes": [
            { "type": "Flip" },
            { "type": "ClozeType", "data": { "sentence": "{{answer}}, {{answer}}, {{answer}}", "answers": [["be"], ["was", "were"], ["been"]] } }
          ]
        },
        {
          "front": "он усталый (Present Simple, to be)",
          "back": "he is tired",
          "modes": [
            { "type": "ReverseType", "data": { "answers": [["он усталый", "он устал"]] } }
          ]
        }
      ]
    }
  ]
}