Owner Nikunj

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 ID
  • short_uid — auto-generated unique ID like MCQ1A2B3C4D; course-scoped; used for cross-references from dockets, blocks, bookmarks, custom tests, and deep-linking
  • internal_display_uid — editable display label authors use in workflows; defaults to short_uid
  • course_id — the course this MCQ belongs to (NEET, UPSC, etc.); used for scoping and access control
  • question — question content (plaintext or PlateJS payload); required
  • question_preview — auto-derived plaintext preview for list views
  • question_formatSIMPLE_MCQ or ADVANCED_MCQ
  • option_1 / option_2 / option_3 / option_4 — answer options (up to 4)
  • correct_option — which option key is the correct answer (option_1option_4)
  • selected_option_1_countselected_option_4_count — denormalised counters of how many users picked each option (option-quality signal)
  • solution_admin — rich-text solution in author RTE format
  • solution_client — solution in client renderer block format
  • sole — encrypted ciphertext of solution_client for secure mobile delivery
  • question_typePYQ | DQ | EQ
  • year — past-year reference (required when question_type = PYQ)
  • year_set — year-variant number, when the same year has multiple sets
  • root_taxonomy_id — L1 taxonomy reference (subject root)
  • taxonomy_ids — full L1 → L2 → L3 path the MCQ belongs to
  • l4_docket_id — optional primary docket binding (the docket this MCQ “comes from”)
  • tag_ids — categorisation tags, max 5
  • sort_order — manual position within the taxonomy
  • statusDRAFT | PUBLISHED | ARCHIVE
  • mcq_docket_link — denormalised list of all docket/block links for fast read
  • pri_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 display
  • like_count / dislike_count / bookmark_count — denormalised engagement counters
  • is_deleted — soft-delete flag
  • created_at / updated_at
  • created_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_count on the MCQ.

6. Lifecycle

        ┌──────────┐  publish   ┌────────────┐  archive   ┌──────────┐
 create │  DRAFT   │ ─────────▶ │ PUBLISHED  │ ─────────▶ │ ARCHIVE  │
 ─────▶ │          │ ◀───────── │            │ ◀───────── │          │
        └──────────┘  unpublish └────────────┘  restore   └──────────┘
              │                                                │
              └──────────────── soft delete ───────────────────┘
                                  (is_deleted=true; reversible)
StateWho sees itNotes
DraftAdmin onlyDefault on create. Not served to students.
PublishedStudents (mobile, web, dockets, custom test)Live content.
ArchiveAdmin onlyWithdrawn from student surfaces; kept for history.
Soft-deletedNo-oneOrthogonal 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