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
| Field | Meaning |
|---|---|
id | Stable card identifier, derived from category, difficulty, and question fingerprint. |
cat | One of the twelve taxonomy category slugs. |
diff | Difficulty: easy, normal, or hard. |
q | Non-empty question stem. |
a | The single correct answer. |
w | Exactly three non-empty wrong choices. |
x | Short answer explainer. |
c | Confidence marker; the public schema requires the constant high. |
fp | First 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, andongoingare 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.
| Category | Easy | Normal | Hard |
|---|---|---|---|
| history | 0 | 0 | 0 |
| geography | 0 | 0 | 0 |
| life-sciences | 0 | 0 | 0 |
| physical-sciences | 26 | 0 | 0 |
| astronomy | 0 | 0 | 0 |
| math-computing | 0 | 0 | 0 |
| literature | 0 | 0 | 0 |
| visual-arts | 0 | 0 | 0 |
| music | 0 | 0 | 0 |
| film-tv | 0 | 0 | 0 |
| sports-games | 0 | 0 | 0 |
| food-drink | 0 | 0 | 0 |
Each bucket target is 50, so the complete matrix is 36 buckets and 1,800 cards.