MCQ
1. What is an MCQ?
The MCQ (Multiple Choice Question) is Keystone’s atomic assessment unit. One question, up to four options, exactly one correct answer, one rich-text solution.
Everything testable in the product is built on top of MCQs — daily practice, past-year drills, custom tests, streak/stars, accuracy analytics, docket-embedded check-ins.
Three flavors by source:
- PYQ — Past Year Question (tagged with year)
- DQ — Daily Question (curated daily set)
- EQ — Extra Question (bank/filler)
Two content formats:
- Simple MCQ — plain text
- Advanced MCQ — rich PlateJS JSON (images, math, formatting)
2. Core MCQ Structure
┌─────────────────────────────────────────────────────────────┐
│ MCQ │
├─────────────────────────────────────────────────────────────┤
│ short_uid unique ID (course-scoped) │
│ question the question content │
│ option_1..4 up to four answer options │
│ correct_option which option is correct │
│ solution_client rendered explanation (encrypted as sole) │
│ question_type PYQ | DQ | EQ │
│ taxonomy_ids L1 → L2 → L3 placement │
│ l4_docket_id optional primary docket binding │
│ tag_ids up to 5 tags │
│ status Draft | Published | Archive │
└─────────────────────────────────────────────────────────────┘
3. Connection With Other Entities
┌────────────┐ ┌──────────┐ ┌────────────┐
│ Taxonomy │ ──────▶ │ Docket │ ──────▶ │ MCQ │
│ L1→L2→L3 │ groups │ (study │ tests │ │
│ │ │ unit) │ │ │
└────────────┘ └──────────┘ └─────┬──────┘
│
attaches to
│
▼
┌────────────┐
│ Block │
│ (content │
│ inside a │
│ docket) │
└────────────┘
In plain English: a Taxonomy organizes the syllabus. Dockets are the study units inside a taxonomy node. An MCQ lives inside a taxonomy path and tests against a docket. Blocks are the content units inside a docket — any block can be attached to an MCQ as primary or secondary reference.
4. Parameters of an MCQ
_id— unique IDshort_uid— auto-generated unique ID likeMCQ1A2B3C4D; course-scoped; used for cross-references from dockets, blocks, bookmarks, custom tests, and deep-linkinginternal_display_uid— editable display label authors use in workflows; defaults toshort_uidcourse_id— the course this MCQ belongs to (NEET, UPSC, etc.); used for scoping and access controlquestion— question content (plaintext or PlateJS payload); requiredquestion_preview— auto-derived plaintext preview for list viewsquestion_format—SIMPLE_MCQorADVANCED_MCQoption_1/option_2/option_3/option_4— answer options (up to 4)correct_option— which option key is the correct answer (option_1…option_4)selected_option_1_count…selected_option_4_count— denormalised counters of how many users picked each option (option-quality signal)solution_admin— rich-text solution in author RTE formatsolution_client— solution in client renderer block formatsole— encrypted ciphertext ofsolution_clientfor secure mobile deliveryquestion_type—PYQ|DQ|EQyear— past-year reference (required whenquestion_type = PYQ)year_set— year-variant number, when the same year has multiple setsroot_taxonomy_id— L1 taxonomy reference (subject root)taxonomy_ids— full L1 → L2 → L3 path the MCQ belongs tol4_docket_id— optional primary docket binding (the docket this MCQ “comes from”)tag_ids— categorisation tags, max 5sort_order— manual position within the taxonomystatus—DRAFT|PUBLISHED|ARCHIVEmcq_docket_link— denormalised list of all docket/block links for fast readpri_block_ids— block short UIDs where this MCQ is the primary link (from the MCQ’s own L4 docket)sec_block_ids— block short UIDs where this MCQ is a secondary link (from other dockets)block_order— ordering of attached blocks for displaylike_count/dislike_count/bookmark_count— denormalised engagement countersis_deleted— soft-delete flagcreated_at/updated_atcreated_by/updated_by
5. Functionality
- MCQ Practice — student picks an option (or skips) and gets instant feedback with the solution other than exam mode. First attempt locks in for first-attempt accuracy; re-attempts roll a last-three-attempts window.
- Mark as guessed — student can self-flag their latest answer as a guess; captured on the user’s MCQ attribute record and surfaces in personal review / accuracy analytics.
- Bookmark / Unbookmark — save an MCQ for later review; updates the MCQ’s bookmark counter and the user’s attribute record.
- Adding to collection — group bookmarked MCQs into user-owned buckets (e.g. “Revise before exam”);
- Like / Dislike — quality feedback on the question itself; aggregated into
like_count/dislike_counton the MCQ.
6. Lifecycle
┌──────────┐ publish ┌────────────┐ archive ┌──────────┐
create │ DRAFT │ ─────────▶ │ PUBLISHED │ ─────────▶ │ ARCHIVE │
─────▶ │ │ ◀───────── │ │ ◀───────── │ │
└──────────┘ unpublish └────────────┘ restore └──────────┘
│ │
└──────────────── soft delete ───────────────────┘
(is_deleted=true; reversible)
| State | Who sees it | Notes |
|---|---|---|
| Draft | Admin only | Default on create. Not served to students. |
| Published | Students (mobile, web, dockets, custom test) | Live content. |
| Archive | Admin only | Withdrawn from student surfaces; kept for history. |
| Soft-deleted | No-one | Orthogonal to status. Recoverable by admin. |
Side effects on every status change (background jobs):
- Refresh taxonomy MCQ counts
- Refresh year-bucket MCQ counts
- Rebuild MCQ↔docket link denormalization