📚 Question corpus
The question corpus is the pool of questions a QuizWizz quiz can be built from. It reached 9,069 questions through four documented intakes between 2026-07-28 and 2026-08-19, each with its own accepted and rejected rows. Size is not the same as usefulness: a player is only offered a subject when that one subject, in the player’s own language, holds enough easy and harder questions to fill the quiz the page is about to request, so a corpus of 9,069 questions spread over 483 subject terms can still offer very few playable choices. Live counts belong on 📍 Now; this page holds the arithmetic of how the corpus got here and the route to every measurement behind it.
How the corpus grew
%%{init: {"flowchart": {"wrappingWidth": 470, "nodeSpacing": 30, "rankSpacing": 34}}}%% flowchart TB I1["2026-07-28 · World Quiz Dataset<br/>229 rows accepted from 58 origins"] --> T1(["269 questions"]) T1 --> I2["before 2026-08-19 · five curated English packs<br/>410 questions live"] I2 --> T2(["679 questions · 456 subject terms<br/>40 OpenTDB + 229 WQD + 410 pack"]) T2 --> I3["2026-08-19 · corpus import<br/>60 ledger candidates · 53 accepted<br/>7 rejected at the importer boundary"] I3 --> T3(["732 questions · 483 subject terms"]) T3 --> I4["2026-08-19 · legacy WXR import<br/>8,401 nodes · 8,337 accepted<br/>22 rejected · 42 deduplicated"] I4 --> T4(["9,069 questions · 483 subject terms"]) T4 --> C["2026-08-27 · quiz cleanup<br/>15 zero-question draft quizzes deleted<br/>quizzes 122 → 107"] C --> T5(["9,069 questions · question index unchanged"])
The chain closes without a gap: 269 + 410 = 679, 679 + 53 = 732, 732 + 8,337 = 9,069.
- 2026-07-28 World Quiz Dataset: 229 rows from 58 origins adapted into four language packs — 🌍 World Quiz Dataset import.
- The five curated English packs took the bench to 679 published and 679 indexed, reconciled as 40 OpenTDB + 229 WQD + 410 pack questions with 456 subject terms (
question-corpus-forensics.md:39-52). - 2026-08-19 corpus import: the dedupe ledger’s 60 candidates resolved to 53 accepted across five packs and 7 rejected as multi-answer rows the validator cannot render, subject terms 456 → 483 — 📦 2026-08-19 corpus import.
- 2026-08-19 legacy WXR import: an 8,401-node legacy WordPress export mined as data only, 22 rejected with named reasons, 42 dropped as already live by stem hash, 8,337 imported, subject terms unchanged at 483 — 🗄️ 2026-08-19 legacy WXR import.
- 2026-08-27 quiz cleanup: 15 zero-question draft quizzes deleted, quizzes 122 → 107,
wp_qwizz_question_indexunchanged at 9,069 (Changelog, entry 2026-08-27 “Zero-question draft cleanup, and the figure that was wrong”). Quizzes were removed, questions were not.
Current state
The live numbers live on one page
Published question count, subject-term count, sufficiency gate and the standing probe gate are measured on 📍 Now. This hub does not copy them. Every figure in the timeline above is intake arithmetic, fixed to its dated record and true for that date only.
Why 9,069 questions still yield few playable subject cards
Measured from the installed source, not inferred:
- Progressive difficulty capacity is
2 * min( easy, harder ) + ( easy > harder ? 1 : 0 ), whereharder = normal + hard(wp/wp-content/plugins/quizwizz/includes/QuestionSelector.php:175, reached only whendifficulty === 'prog'at:163). A subject holding sixteen questions with one easy question yields a capacity of two. - Capacity is asked per card.
SubjectTaxonomy::can_satisfy()clones the request the page renders with and requires the answer to cover it (wp/wp-content/plugins/quizwizz/includes/SubjectTaxonomy.php:429); theanycard and all three card loops are gated on it (:478,:493,:514,:537). Operator surfaces passnullcriteria and therefore still see everything (:430-432). - Last census, 2026-08-19 06:45 UTC, against the pre-import 679-question inventory: 2 of 456 specific subject terms satisfied the default English progressive request, 197 pools were non-empty but insufficient, 257 had zero capacity, and the synthetic
anycard satisfied it with capacity 438 (2026-08-19-question-corpus-audit.md:177-183). - Unverified: no sufficiency census has been run since the 2026-08-19 legacy WXR import. The 2-of-456 result predates 8,337 imported questions and must not be read as current. The cutover that introduced the gate is recorded in 🎚️ Subject sufficiency census.
Which page answers which question
- What each source bank actually holds, and how many rows survive the deployed validator floor → 🔬 Question-corpus forensics
- 11 banks over a 135-file / 6,520,043-byte walk, 12,271 rows holding 1,841 distinct normalised stems, stem-hash overlap, provenance verdicts, the canonical schema against the deployed validator, and the dedupe ledger that closed at 60 candidates.
- What a durable question record should look like, and what the plugin refuses to represent → 🧠 Question corpus strategy
- The canonical-record contract, the gold/usable/reject buckets, and the unsupported-consumer boundary: only
multipleandbooleanare deployable.
- The canonical-record contract, the gold/usable/reject buckets, and the unsupported-consumer boundary: only
- Why a subject with questions in it is still not offered to a player → 🎚️ Subject sufficiency census
- Every
pool_count()gate classified player or operator, thecan_satisfyresolver, and the eleven-cards-to-three cutover with its probe defence.
- Every
- How the first multilingual dataset became importable packs → 🌍 World Quiz Dataset import
- Adapter decisions for a one-row-per-language source model: subject prefixing, seeded correct-index shuffle, and
qw_wqd_idprovenance.
- Adapter decisions for a one-row-per-language source model: subject prefixing, seeded correct-index shuffle, and
- What the deployed importer accepted from the 60 candidates, and why 7 were refused → 📦 2026-08-19 corpus import
- Five packs, 53 questions, the named rejection ledger, and the
qw_question_storedefect any backslash triggered.
- Five packs, 53 questions, the named rejection ledger, and the
- How 8,337 questions were mined from a legacy WordPress export without running core’s WXR importer → 🗄️ 2026-08-19 legacy WXR import
- Source identity by sha256, meta-key mapping, four cleaning rules, the 22-row rejection ledger, and accepted rows per subject.
- Whether the corpus on the bench is healthy: drift, duplicates, validator violations, overlap with local datasets → 📚 2026-08-19 question-corpus audit
- 0 content-versus-index drift, 0 validator violations, one exact duplicate pair, 5,701 distinct local stems with 360 bench overlaps, and the sufficiency census above.
Counts that are not interchangeable
Name the population or the number is false
Four different measurements are routinely mistaken for “the corpus size”. They count different things and none of them substitutes for another.
- Live bench inventory: published
qw_questionposts and matchingwp_qwizz_question_indexrows, currently reported on 📍 Now.- Harvest inventory: 4,725 raw harvested rows, 1,432 unique after deduplication, 1,388 gold (
question-corpus-strategy.md:35-37).- Source-bank forensics: 12,271 rows across 11 banks, collapsing to 1,841 distinct normalised stems, including empty Runway slots that hold no question text (
question-corpus-forensics.md:21,:64).- Local fingerprint audit: 5,701 distinct local stems with 360 shared with the bench (
2026-08-19-question-corpus-audit.md:20).