Quiz & Assessment Platform
A standalone reference — no prior GB5 knowledge assumed. Covers what's live, what's designed but unbuilt, and a task-oriented guide for every role that touches this feature.
1. Executive Summary
GB5 is building a unified Quiz & Assessment platform so any module — Training (TMS), Work Instructions (WI), Enablement (in-app guidance), and eventually a Learning Management System (LMS) and Interactive Document Management (IDMS) — can attach a scored quiz or a "must-pass" gate to its own content, without every module reinventing question banks, scoring, or gating logic.
The core idea in one sentence: there is now one shared question bank, one quiz-taking/scoring engine (owned by TMS), one shared way to tag content with a Course/Subject/Topic, and one generic "you must pass X before doing Y" gating mechanism — every other module plugs into these instead of building its own.
A shared Course/Subject/Topic/Learning-Object taxonomy · a standalone Quiz engine in TMS · a generic Validation Criteria gate wired into Work Instructions · Enablement can attach a quiz to a Show · FLS no longer offers dead-end "Quiz"/"Test" survey types.
Delivering quizzes over chat/voice (EIP) working with a new AI module (EAI) · AI-generated and AI-graded questions · "dynamic" questions pulling a live business fact · adaptive next-step suggestions · wiring any of this into a future LMS or IDMS.
If you take away one thing: the foundation — taxonomy, quiz engine, gating — is real and working today; the AI/chat/voice/LMS layer is a designed-but-unbuilt roadmap.
2. Concepts & Glossary
Read this before anything else — every later section assumes these terms.
A shared pool of reusable questions (MCQ, True/False, Short Answer, Multi-Select, Matching, Ordering) with marks, difficulty, and a correct answer. Pre-existing; every quiz and assessment draws from this one pool.
TMS's original concept: a scored test tied to a specific training programme/session/topic. Always belongs to a training programme.
A standalone scored test, not tied to a training programme. Can attach to an Enablement Show, a Work Instruction step, or stand entirely alone.
Instant = one question, immediate grading, good for an in-the-flow check. Structured = multiple sections, each pulling several questions by filter, like a real exam paper.
One person's try at a Quiz or Assessment: what was answered, the score, pass/fail. Multiple attempts allowed up to a configured maximum.
A shared, three-level taxonomy for tagging content in any module (e.g. Course "Warehouse Safety" → Subject "Manual Handling" → Topic "Lifting Technique"). Lives in the shared framework layer, not owned by TMS.
A generic wrapper: "this Quiz / WI / Show / document is a piece of curriculum content, belonging to this Topic, taking about this long." A sequencing concept, deliberately separate from gating.
The generic gating mechanism: "Entity X requires Validation Y, enforced as Block/Warn/Log." A criterion can be a Skill level, a passing Quiz, a passing formal Assessment, or (not yet implemented) a Certification.
GB5's in-app guidance system — banners, tours, announcements, checklists. A Show can now have a Quiz attached to it.
GB5's shop-floor operational instruction module, with skill/eligibility gates. Now also checks the generic Validation Criteria gate, alongside its existing Skill checks.
A general survey/feedback tool. Used to list "Quiz"/"Test" as form types that never actually scored anything — that dead end is now retired.
Existing module for multi-channel interaction — WhatsApp, Teams, Telegram, Slack, SMS, in-app chat, voice. Two dispatch paths: one-tap DirectAction, and a full conversational Flow/Capability engine. No AI logic of its own today.
A module that does not exist yet. Would own AI capability and its governance (model, prompt versions, approval, cost tracking) as a separate concern from EIP's interaction/delivery job.
Does not exist yet ("coming soon"). The taxonomy work was built now specifically so LMS can reuse it later without a new migration.
A separate, existing GB5 module (interactive document management). Not yet wired into the quiz taxonomy/gating — reserved slots exist for later.
3. What's Built Today ✓ Built & Live
3.1 The Shared Taxonomy — Course / Subject / Topic / Learning Object
Where it lives: GB5Framework (the shared framework layer used by every module) — not inside TMS. Putting it in TMS would have meant every other module had to depend on TMS just to tag its own content. Framework-level masters like Country/City already live here, so this follows the existing convention.
| Table | Purpose |
|---|---|
| MCOURSE | Top level, e.g. "Warehouse Safety Induction". Can nest under a parent course; can be globally shared or client-specific. |
| MSUBJECT | Belongs to a Course, e.g. "Manual Handling". |
| MTOPIC | Belongs to a Subject, can nest, carries a difficulty level and an optional linked Skill. |
| TTOPICLINK | Flexible many-to-many "tag this with this topic" table, for content that touches several topics at once. |
| MLEARNINGOBJECT | Wraps any content (Quiz, WI, Show, document, video, external link) as one addressable "unit of learning," tagged to a primary Topic — the same concept most LMSs call a Learning Object or SCORM package. |
Why two tagging mechanisms? A direct FK column when something has exactly one topic and needs fast filtering (e.g. a quiz question). TTOPICLINK when the relationship is optional or many-to-many (e.g. a Work Instruction touching three topics at once). Both patterns already existed elsewhere in GB5.
Bridging existing TMS data: TMS's question bank already had free-text tag fields before this project. A migration added new Course/Subject/Topic columns, auto-matched existing free-text tags into real Topic rows where possible, and made question-bank searches check both the old tags and the new Topic link during a transition period — nothing broke.
3.2 The Standalone TMS Quiz Engine
Why a new engine, when TMS already had assessments? TMS's existing MSESSIONASSESSMENT only makes sense inside a training programme. There was no way to say "here's a quiz that exists on its own, attached to a Show or WI step, with no training programme involved." That's what MQUIZ adds.
| Table | Purpose |
|---|---|
| MQUIZ | Definition: title, purpose, Course/Subject/Topic, Quiz Mode (Instant/Structured), selection mode, pass threshold %, max attempts, time limit, anonymity. |
| MQUIZSECTION | Structured mode only — one or more sections, each with a question-count and filter (type, difficulty, topic). |
| TQUIZATTEMPT | One row per attempt: who, when, triggering context (e.g. "from Show #88"), marks, score %, pass/fail. |
| TQUIZATTEMPTRESPONSE | One row per question answered within an attempt: given answer, correctness, marks awarded. |
How scoring works
MCQ / True-False / Short Answer are matched exactly (case-insensitive); Multi-Select is compared as a set (order doesn't matter); Matching/Ordering are compared as normalized strings. Anything that can't be auto-graded is left pending for manual review. The final score, pass/fail, and marks are always computed server-side from the actual recorded answers — a client can never submit a score directly.
How question selection works
Instant-mode quizzes pick N random questions from the shared bank, optionally scoped to a Topic. Structured-mode sections each define their own filter and pull that many questions at random (or fixed/weighted) — reusing the same "pull random rows from the shared pool" pattern TMS's assessment-paper system already used.
MSESSIONASSESSMENT now has an optional QuizId — a training-programme assessment can delegate its questions to a shared standalone quiz instead of maintaining its own paper. Optional; existing assessments are unaffected.
3.3 Validation Criteria — the Generic "You Must Pass This First" Gate
The problem this solves: before this, any module wanting "you can't do this until you've passed a quiz" would have had to build its own quiz-specific requirement table. Now there's one generic, reusable pair any module can plug into.
MVALIDATIONCRITERIA— what needs to be true: a type (Skill / Quiz / formal ProgrammeAssessment / Certification), the specific thing, a minimum score/level, and how many days the proof stays valid.MVALIDATIONASSIGNMENT— who requires it: which entity (WI, Show, Training Programme, IDMS document…), optionally which step, which criterion, and how strictly (Log = record only, Warn = allow with a warning, Block = hard-stop).IValidationCriteriaEvaluator— a shared service answering "what has this person not yet satisfied?" by checking the right underlying proof: a Skill checks the employee's stored level; a Quiz checks for a recent passing attempt; a formal Assessment checks its own attempt table. Nothing new is invented for "where does the proof live."
Illustrative example (not literal seeded data):
| A Work Instruction step… | …requires… | …enforced as |
|---|---|---|
| "Operate Reach Truck, Cold Storage" (whole WI) | Forklift Operation skill, Intermediate level | Block |
| Step 3, "Load Pallet onto Rack" | 80%+ on "Warehouse Safety Pulse Check," within 90 days | Warn |
| Training Programme "Forklift Operator Induction" | Passed "Forklift Certification Final Exam" | Block |
Where it's actually wired in: Work Instruction's eligibility check calls this evaluator in two places — a display-only "am I eligible?" check, and the real "start this Work Instruction" action, which refuses to start if a Block-level criterion is unmet (exactly like WI's pre-existing Skill-level block already worked).
Deliberately not touched: WI's own, older Skill/Competency requirement tables were left completely alone — this is an additional layer, not a replacement.
3.4 Enablement Integration
Enablement's "Show" system already had a generic "attach content to this Show" mechanism supporting several content types (CMS article, external URL, file, video, document, Work Instruction, Training Topic). This project adds Quiz as one more attachable type — a Show (or a specific step) can point at a standalone Quiz, with its current title looked up live so a later rename never shows stale text, the same pattern already used for the WI and Training links.
Practical implication: an announcement like "Today's price briefing" could show an Instant-mode, single-question quiz right inside it, without Enablement needing to know anything about how quizzes are scored.
3.5 FLS — What Changed and Why
FLS is a general survey/feedback tool. It always had a "type" field that happened to include "Quiz" and "Test" — but nothing in FLS ever actually scored a quiz; those options were dead ends producing an unscored feedback form.
This is now retired: those two options are archived, and the system actively rejects any new FLS survey built against them, pointing the author at TMS's real Quiz engine instead — avoiding two different, inconsistent places where "a quiz" could mean something different.
Nothing changes — FLS still works exactly as before for feedback, ratings, registrations. If you wanted something labeled "Quiz"/"Test," that path is gone; use the TMS Quiz engine instead.
4. What's Planned But Not Built ◐ Planned
Nothing in this section exists in the codebase yet. Documented so adjacent work doesn't duplicate this design, and so stakeholders understand where the platform is headed.
4.1 Delivering Quizzes Through Chat & Voice (via EIP)
EIP already has two ways of talking to a user: a one-tap DirectAction (a signed link or WhatsApp-style button — no back-and-forth) planned for simple MCQ/True-False questions, and a full conversational Flow (chat or voice) planned for subjective, adaptive, or spoken questions. Both mechanisms already exist for other purposes — the plan reuses them rather than building new delivery infrastructure.
EIP can send outbound email but has no inbound email conversation path — two-way "quiz by email" is explicitly deferred; email can only ever notify or deliver a single tap-to-answer link.
4.2 EAI — the Planned AI Module
Does not exist yet. Envisioned as a brand-new module whose only job is AI: provider/model choice, versioned prompts, an approval step before AI content goes live, and cost tracking. No vendor has been chosen — every capability is designed to ship first as a clearly labeled "not configured" stub, matching a pattern already used elsewhere in GB5 for an unrelated AI feature.
| Capability | What it would do |
|---|---|
| Generate Questions | Draft question-bank questions from a Course/Topic and source material, for SME review before going live. |
| Generate a Data-Bound Question | Turn a template like "What is the current stock of {Item}?" into a real question with a real, current answer. |
| Evaluate an Answer | Grade a free-text or spoken answer against a rubric, with a confidence score and a human-review flag. |
| Suggest a Learning Path | After an attempt, suggest what to study next based on where the learner fell short. |
Who would call it: TMS (question generation, answer evaluation) and EIP (a thin "ask EAI, format for this channel" step). EAI itself would never talk to WhatsApp/Voice directly — that stays EIP's job.
4.3 Dynamic, Data-Driven Quiz Questions
The original motivating idea: a question that pulls a live fact from another module — current price, current stock — so staff are tested on real, current data. A small generic interface would let any data-owning module (Inventory, Finance, HR) expose "facts" for the question-generation capability to use; the live value is frozen onto the question at generation time so grading stays fair even if the real value changes minutes later.
4.4 Voice-Based Q&A
Once chat/voice delivery and AI evaluation exist, voice needs almost no extra work — a call is just another conversation, with an external provider handling speech-to-text and GB5's existing voice-response mechanism handling the reply. The one new planned rule: a scored voice attempt should require an extra identity check (like an OTP), since a phone call can't rely on an existing logged-in session.
4.5 Adaptive Learning Suggestions
After an attempt, planned functionality would look at a learner's history and topic-level gaps and produce a ranked "read this next" list with a short "why" for each item, delivered as a follow-up chat message once chat delivery exists.
4.6 LMS and IDMS
Neither exists yet. Because the taxonomy and gating work were built as shared, framework-level concepts from day one, the plan is that a future LMS "course" becomes a new LMS-owned enrolment table sitting on top of the existing Course/Learning-Object tables — not a new parallel taxonomy. IDMS documents already have a reserved (unused) slot in the tagging system.
5. Known Open Questions
Not yet decided — flagged for whoever picks up the next phase of this roadmap.
- Which AI provider/vendor? Not decided. Everything in Section 4.2 is designed to work with any provider, plugged in later.
- Does the older, separate in-app "Show" quiz-question mechanism get consolidated with the new standalone Quiz, or do both stay? Currently both are allowed to coexist by design, not yet explicitly confirmed as final.
- When EIP and the future EAI module talk to each other, is that in-process or a network call? Depends on how the two modules end up hosted — not yet decided.
- Should WI's older, quiz-unaware Skill-requirement table eventually migrate onto the new generic model? Deliberately deferred to avoid destabilizing a working gate.
- Two-way email as a quiz channel — explicitly out of scope for now.
6. Role-Specific Guides
6.1 Developers — Building On Top Of This Feature
"I want my module's content tagged with a subject-matter Topic." Use the shared taxonomy (MCOURSE/MSUBJECT/MTOPIC, GB5Framework/FrameworkDAL/DTO/Taxonomy/). One topic per entity → a direct TopicId FK. Many-to-many/optional → TTOPICLINK, adding your module's value to TaxonomyEntityTypeConstant (check for an already-reserved slot first).
"I want my content in a curriculum sequence." Wrap it as a MLEARNINGOBJECT (a LOTYPE likely already exists for your content kind). This is purely ordering — it doesn't gate anything.
"I want to require a passed quiz / a skill / a passed assessment before my module lets someone proceed." This is IValidationCriteriaEvaluator (GB5Framework/FrameworkBLL/Validation/). Register a MVALIDATIONCRITERIA + MVALIDATIONASSIGNMENT, then call GetUnmetValidationCriteriaAsync(...) from your own eligibility logic — copy WiExecutionBLL's usage as the reference implementation. Do not build your own quiz-requirement table — this model exists precisely to prevent that.
"I want to attach a quiz to my content like Enablement did." See ShowContentLinkBLL.cs for the exact pattern: a polymorphic link table + a live-title-refresh call into TMS's IQuizBLL.GetQuizById.
Layering rules (same as the rest of GB5): SL → BLL → DAL only; cross-module calls go BLL-to-BLL, never into another module's DAL. Reading another module's own shared (DBO.) table directly with parameterized SQL is acceptable only when it's genuinely shared/unprefixed — which is how the evaluator checks TMS's attempt tables without a project reference to TMS at all.
Working examples in the codebase today:
- Taxonomy 3-tier:
GB5Framework/FrameworkDAL/DTO/Taxonomy/,FrameworkBLL/Taxonomy/,FrameworkSL/Endpoints/Taxonomy/ - Full Quiz engine:
GB5Solution/TMS/TMSDAL/DTO/Quiz/,TMSBLL/Quiz/,TMSSL/EndPoints/Quiz/ - Validation Criteria + evaluator:
GB5Framework/FrameworkDAL/DTO/Validation/,FrameworkBLL/Validation/ - Cross-module consumer:
GB5Solution/WorkInstruction/WiBLL/WiExecution/WiExecutionBLL.cs - "Attach content" integration:
GB5Solution/Enablement/EnablementBLL/ShowContentLink/ShowContentLinkBLL.cs
6.2 Developers — Extending the Feature Itself
- Migrations live per-module (
GB5Framework/Migration/,GB5Solution/TMS/Migration/,GB5Solution/Enablement/Migration/), sequential (V001,V002…), written as idempotentIF NOT EXISTSblocks — never assume a migration has or hasn't run. - New question types, Validation Criteria types, LinkTypes, LOTYPEs are additive numeric enums — never renumber an existing value; it's persisted data, not a display label.
- A new AI capability (once EAI exists) should follow the existing
GB5Shared/RecordingIntelligence/IAICapabilityService.cs"provider-agnostic + not-configured stub" pattern, not a new convention. - A new EIP channel or delivery pattern belongs entirely inside EIP's own channel-handler/Flow-engine structure — Quiz/EAI should never need to know which chat channel is in use.
6.3 Content & Lesson Creators
- All questions come from one shared question bank — search before writing a new one; you may be able to reuse or lightly adapt an existing question.
- Tag questions and quizzes with a Course / Subject / Topic wherever possible — this is what makes filtered/random selection and future discovery work well.
- Choose Instant vs. Structured deliberately: Instant for a quick embedded check, Structured for a real multi-section exam.
- Not available yet: AI-assisted drafting, dynamic data-driven questions, voice delivery. Author manually today — there is no AI shortcut in the product yet.
- If you previously used FLS for a "Quiz"/"Test" — that option is gone. Build it as a real TMS Quiz instead; check with your project team about UI availability if you don't have direct API access.
6.4 Admins
- Configuring a quiz: pass threshold %, max attempts, time limit, Instant/Structured, anonymity — all on
MQUIZ. Random/Fixed/Weighted selection is per-section in Structured mode. - Setting up a gate ("this WI requires a passing quiz"): create a
MVALIDATIONCRITERIArow (what's required, passing threshold, validity) and aMVALIDATIONASSIGNMENTrow (which entity requires it, Block/Warn/Log). No dedicated admin UI is documented yet — this is a direct data-configuration capability today; check with your project team. - Attaching a quiz to an Enablement Show: use the existing Show-content-link admin flow, choosing "Quiz" as the content type.
- FLS instrument types: "Quiz"/"Test" no longer appear as valid options — intentional, not a bug.
- Reporting: attempt-level pass/fail and score data already exists (
TQUIZATTEMPT/TASSESSMENTATTEMPT); team/KRA-level rollup dashboards aren't built yet — request them via GB5's existing Analytics/Report Viewer tooling as their own deliverable.
6.5 Trainers
- A formal training-programme Assessment can now optionally delegate its questions to a shared standalone Quiz instead of maintaining a separate paper — optional, existing assessments are unaffected.
- Attempts that can't be auto-graded are left pending for manual review — a review/evaluate path already exists (mirroring the existing assessment-attempt flow), just not AI-assisted yet.
- Reporting shape (attempt number, score %, pass/fail, per-question detail) is unchanged from what already existed for formal assessments — the standalone Quiz engine mirrors it exactly.
6.6 End Users / Learners
What you can experience today: a quiz question (or full multi-section quiz) inside an in-app announcement/tour, as part of a shop-floor Work Instruction (sometimes required before you can proceed), or as part of your regular training-programme assessment. You'll see your score and pass/fail immediately after submitting — unless a question needs human review, in which case you'll see "pending review."
Not available yet: answering via WhatsApp/Teams/voice call, an AI explaining why an answer was right or wrong, quiz questions built from live company data, or personalized "read this next" suggestions.
7. Data Model Quick Reference
| Table | Owner | Purpose | Status |
|---|---|---|---|
| MCOURSE / MSUBJECT / MTOPIC | GB5Framework | Shared taxonomy | ✓ |
| TTOPICLINK | GB5Framework | Many-to-many topic tagging | ✓ |
| MLEARNINGOBJECT | GB5Framework | Curriculum-sequencing wrapper | ✓ |
| MVALIDATIONCRITERIA | GB5Framework | Defines a gate + threshold | ✓ |
| MVALIDATIONASSIGNMENT | GB5Framework | Assigns a gate to an entity | ✓ |
| MQUIZ / MQUIZSECTION | TMS | Standalone quiz definition | ✓ |
| TQUIZATTEMPT / TQUIZATTEMPTRESPONSE | TMS | Attempt header / per-question response | ✓ |
| MSESSIONASSESSMENT.QuizId | TMS | Optional delegation to a shared quiz | ✓ |
| MQUESTIONBANK | TMS | Shared question pool (pre-existing, reused) | ✓ pre-existing |
| MASSESSMENTPAPER / MPAPERSECTION / TASSESSMENTATTEMPT | TMS | Formal, programme-bound assessments | ✓ pre-existing |
| TShowContentLink (LinkType=8) | Enablement | Attaches a Quiz to a Show/step | ✓ |
| MSURVEYINSTRUMENTTYPE (Quiz/Test rows) | FLS | Archived, redirects to TMS | ✓ retired |
| MEAICAPABILITY / TEAIINVOCATIONLOG | EAI (new) | AI capability registry + usage log | ◐ not built |
| Live-data "fact provider" | Per module | Supplies dynamic quiz question data | ◐ not built |
8. API Reference ✓ built endpoints only
| Route | Purpose |
|---|---|
| /Course, /Subject, /Topic, /TopicLink, /LearningObject | Taxonomy CRUD (GB5Framework) |
| /Validation/...ValidationCriteria, /Validation/...ValidationAssignment | Gating configuration CRUD (GB5Framework) |
| GET /Validation/GetUnmetValidationCriteria | Cross-module eligibility check (query-only, never cached) |
| /Quiz/... | Quiz definition CRUD (TMS) |
| /Quiz/...QuizSection | Structured-mode section CRUD (TMS) |
| POST /Quiz/StartQuizAttempt, POST /Quiz/SubmitQuizAttempt, GET /Quiz/GetQuizAttempt | Taking a quiz (TMS) |