Corpus

Accepted cards live in data/<category>/<difficulty>.jsonl. Each non-blank line is one public JSON object; stage-only claims, self-checks, and source evidence do not enter that object.

Card anatomy

FieldMeaning
idStable card identifier, derived from category, difficulty, and question fingerprint.
catOne of the twelve taxonomy category slugs.
diffDifficulty: easy, normal, or hard.
qNon-empty question stem.
aThe single correct answer.
wExactly three non-empty wrong choices.
xShort answer explainer.
cConfidence marker; the public schema requires the constant high.
fpFirst ten hexadecimal characters of the normalized question’s SHA-1 digest.

Identity

Question normalization applies Unicode NFC, strips leading and trailing whitespace, collapses all Unicode whitespace runs to one ASCII space, and lowercases the result.

fp = sha1(norm_question(q))[:10]
id = <cat>-<diff>-<fp>

The fingerprint makes exact normalized-question duplicates mechanically detectable. The category and difficulty remain visible in the identifier, for example physical-sciences-easy-ff851de475.

Content gates

A card must satisfy all of these executable rules:

  • The normalized answer must not occur as a substring of the normalized question stem.
  • The answer plus three distractors must be four case-insensitively distinct choices.
  • Every pair of normalized choices must have Levenshtein distance greater than 2.
  • The explainer must contain 1–20 whitespace-delimited words.
  • The unstable terms current, currently, latest, today, this year, reigning, living, and ongoing are rejected from questions and explainers by corpus validation.
  • Within a category, question token sets with Jaccard similarity greater than or equal to 0.85 are near-duplicates.

See Pipeline for verification and acceptance failure codes.

Accepted cards by bucket

Corpus run as-of date: 2026-07-22. Counted directly from data/**/*.jsonl on 2026-08-31; total accepted cards: 26.

CategoryEasyNormalHard
history000
geography000
life-sciences000
physical-sciences2600
astronomy000
math-computing000
literature000
visual-arts000
music000
film-tv000
sports-games000
food-drink000

Each bucket target is 50, so the complete matrix is 36 buckets and 1,800 cards.