{"id":776,"date":"2026-03-04T16:06:23","date_gmt":"2026-03-04T16:06:23","guid":{"rendered":"https:\/\/i-cte.org\/robot\/?p=776"},"modified":"2026-03-04T16:06:23","modified_gmt":"2026-03-04T16:06:23","slug":"critical-evaluation-hallucinations-bias-and-source-reliability","status":"publish","type":"post","link":"https:\/\/i-cte.org\/robot\/critical-evaluation-hallucinations-bias-and-source-reliability\/","title":{"rendered":"Critical Evaluation: Hallucinations, Bias, and Source Reliability"},"content":{"rendered":"\n<!-- \u2705 ICTE Teacher Micro-Lesson \u2014 Critical Evaluation: Hallucinations, Bias, Source Reliability\n     WP-safe single block, Multi-speaker Google Voices (2 voices)\n     Includes: Overview + Conversation + Reading + Quiz + Toolkit + Prompts + Listening + Verification Lab + Problem-solving\n     Focus: spotting fabricated citations, triangulating claims, \u201ctrust but verify\u201d checklist.\n-->\n<div id=\"icte-criticalai\">\n\n  <!-- \u2705 TOP MENU -->\n  <nav class=\"icte-menu\" aria-label=\"Critical evaluation lesson navigation\">\n    <a href=\"#\" class=\"is-current\" data-view=\"overview\">Overview<\/a>\n    <a href=\"#\" data-view=\"conversation\">Conversation<\/a>\n    <a href=\"#\" data-view=\"reading\">Reading<\/a>\n    <a href=\"#\" data-view=\"toolkit\">Reliability Toolkit<\/a>\n    <a href=\"#\" data-view=\"prompts\">Prompts<\/a>\n    <a href=\"#\" data-view=\"listening\">Listening<\/a>\n    <a href=\"#\" data-view=\"lab\">Trust-but-Verify Lab<\/a>\n    <a href=\"#\" data-view=\"problem\">Problem-solving<\/a>\n    <a href=\"#\" data-view=\"progress\">Progress<\/a>\n  <\/nav>\n\n  <section class=\"icte-shell\" aria-label=\"ICTE critical evaluation lesson\">\n\n    <!-- \u2705 Header -->\n    <header class=\"icte-hero\">\n      <div class=\"icte-hero__text\">\n        <div class=\"hero-top\">\n          <img decoding=\"async\"\n            class=\"hero-img\"\n            src=\"https:\/\/i-cte.org\/robot\/wp-content\/uploads\/2026\/03\/Screenshot-2026-03-04-at-23.04.04.png\"\n            alt=\"Critical evaluation: hallucinations, bias, and source reliability banner\"\n            loading=\"lazy\"\n          \/>\n          <div class=\"hero-title\">\n            <h2>Critical Evaluation: Hallucinations, Bias, and Source Reliability<\/h2>\n            <p class=\"muted\">\n              Learn to spot <b>fabricated citations<\/b>, detect <b>hallucinated facts<\/b>, evaluate <b>bias<\/b>, and\n              triangulate claims with a practical checklist for <b>\u201ctrust but verify.\u201d<\/b>\n              Includes a <b>verification lab<\/b> and an end-of-lesson <b>problem-solving<\/b> task.\n            <\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"icte-hero__controls\">\n        <div class=\"icte-pill\">\n          <span class=\"dot\" id=\"icteMicDot\" aria-hidden=\"true\"><\/span>\n          <span id=\"icteMicStatus\">Mic: Off<\/span>\n        <\/div>\n\n        <div class=\"icte-row\">\n          <button class=\"btn\" id=\"icteStartVoice\" type=\"button\">Start Voice<\/button>\n          <button class=\"btn ghost\" id=\"icteStopVoice\" type=\"button\">Stop<\/button>\n        <\/div>\n\n        <!-- \u2705 Multi-speaker Google Voices -->\n        <div class=\"grid2\" style=\"margin-top:10px;\">\n          <label class=\"icte-label\">\n            Speaker A (Google)\n            <select id=\"voiceA\" class=\"icte-select\" aria-label=\"Speaker A voice\"><\/select>\n          <\/label>\n\n          <label class=\"icte-label\">\n            Speaker B (Google)\n            <select id=\"voiceB\" class=\"icte-select\" aria-label=\"Speaker B voice\"><\/select>\n          <\/label>\n        <\/div>\n\n        <div class=\"icte-row\" style=\"margin-top:10px;\">\n          <button class=\"btn mini ghost\" type=\"button\" id=\"speakActive\">\ud83d\udd0a Read this page<\/button>\n          <button class=\"btn mini ghost\" type=\"button\" id=\"stopSpeak\">\u23f9 Stop audio<\/button>\n        <\/div>\n\n        <div class=\"icte-small muted\">\n          Tip: For best voice options, use Chrome\/Edge. If voices don\u2019t appear yet, click once on the page and wait 2\u20133 seconds.\n        <\/div>\n      <\/div>\n    <\/header>\n\n    <!-- \u2705 Views -->\n    <main class=\"icte-main\">\n\n      <!-- ===================== -->\n      <!-- \u2705 OVERVIEW -->\n      <!-- ===================== -->\n      <section class=\"view is-active\" data-view=\"overview\" aria-label=\"Lesson overview\">\n        <div class=\"card\">\n          <div class=\"card-h\">\n            <h3>1) Outcomes<\/h3>\n            <div class=\"card-actions\">\n              <button class=\"btn mini\" type=\"button\" data-say=\"overview-instr\">\ud83d\udd0a Read instructions<\/button>\n            <\/div>\n          <\/div>\n\n          <div class=\"grid2\">\n            <div class=\"qitem\">\n              <div class=\"qtext\">By the end, you can\u2026<\/div>\n              <ul class=\"ul\">\n                <li>Identify <b>hallucinations<\/b> (confident statements without support).<\/li>\n                <li>Spot <b>fabricated citations<\/b> and suspicious bibliographic patterns.<\/li>\n                <li>Assess <b>bias<\/b> (framing, omitted alternatives, loaded language).<\/li>\n                <li>Triangulate claims using <b>multiple independent sources<\/b>.<\/li>\n                <li>Use a practical <b>trust-but-verify checklist<\/b> in research\/teaching.<\/li>\n              <\/ul>\n            <\/div>\n\n            <div class=\"qitem\">\n              <div class=\"qtext\">Safety rules<\/div>\n              <ul class=\"ul\">\n                <li>Never cite a source you haven\u2019t verified exists.<\/li>\n                <li>For high-stakes claims, require: <b>source<\/b> + <b>method<\/b> + <b>data<\/b> + <b>replication<\/b> (if possible).<\/li>\n                <li>Prefer primary sources (original studies, official reports) over summaries.<\/li>\n                <li>If evidence is unclear, label it: <b>Unverified<\/b> \/ <b>Needs confirmation<\/b>.<\/li>\n              <\/ul>\n            <\/div>\n          <\/div>\n\n          <div class=\"note\">\n            <b>Trust but verify<\/b> = treat AI output as a draft hypothesis. Verify claims with reliable sources before using them in teaching or publishing.\n          <\/div>\n        <\/div>\n      <\/section>\n\n      <!-- ===================== -->\n      <!-- \u2705 CONVERSATION -->\n      <!-- ===================== -->\n      <section class=\"view\" data-view=\"conversation\" aria-label=\"Conversation coach\">\n        <div class=\"card\">\n          <div class=\"card-h\">\n            <h3>2) Conversation (Reliability Coach)<\/h3>\n            <div class=\"card-actions\">\n              <button class=\"btn mini\" type=\"button\" data-say=\"conv-instr\">\ud83d\udd0a Read instructions<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"convHear\">\ud83d\udd0a Read last question<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"convReset\">Reset<\/button>\n            <\/div>\n          <\/div>\n\n          <p class=\"muted\">\n            Practice \u201ctrust but verify\u201d through short steps: identify claims \u2192 request evidence \u2192 check source quality \u2192 look for bias \u2192 triangulate.\n          <\/p>\n\n          <div class=\"chat\" id=\"convChat\" aria-live=\"polite\" aria-label=\"Conversation chat log\"><\/div>\n\n          <div class=\"chatbar\">\n            <input id=\"convText\" class=\"input\" type=\"text\" placeholder=\"Type your answer (or use voice)...\" autocomplete=\"off\" \/>\n            <button class=\"btn\" id=\"convSend\" type=\"button\">Send<\/button>\n          <\/div>\n\n          <div class=\"note\">\n            <b>Tip:<\/b> A good verifier question is: \u201cWhat evidence would change your conclusion?\u201d\n          <\/div>\n        <\/div>\n      <\/section>\n\n      <!-- ===================== -->\n      <!-- \u2705 READING + QUIZ -->\n      <!-- ===================== -->\n      <section class=\"view\" data-view=\"reading\" aria-label=\"Reading and quiz\">\n        <div class=\"card\">\n          <div class=\"card-h\">\n            <h3>3) Reading + Comprehension Quiz<\/h3>\n            <div class=\"card-actions\">\n              <button class=\"btn mini\" type=\"button\" data-say=\"reading-instr\">\ud83d\udd0a Read instructions<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"readTextBtn\">\ud83d\udd0a Read the text<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"quizCheck\">Check answers<\/button>\n            <\/div>\n          <\/div>\n\n          <article class=\"reading\" id=\"readingText\" aria-label=\"Reading text about critical evaluation\">\n            <div class=\"reading-title\">Reading: How to evaluate AI output critically<\/div>\n\n            <div class=\"reading-p\">\n              <b>1<\/b> AI systems can produce fluent answers that sound authoritative even when details are wrong. This is often called a <b>hallucination<\/b>:\n              a statement that is not supported by evidence or that misrepresents a source. Hallucinations are more likely when questions are vague,\n              when the topic is niche, or when the model is pushed to provide citations without access to real databases.\n            <\/div>\n\n            <div class=\"reading-p\">\n              <b>2<\/b> A major risk in academic settings is <b>fabricated citations<\/b>. Warning signs include references that cannot be found in Google Scholar,\n              inconsistent author names, impossible journal\/volume combinations, or suspiciously perfect formatting with missing key metadata.\n              A safe rule is: if you cannot locate the source, you cannot cite it.\n            <\/div>\n\n            <div class=\"reading-p\">\n              <b>3<\/b> Bias is not only about offensive content. In research, bias often appears as selective evidence, one-sided framing,\n              or ignoring reasonable alternative explanations. A strong critical reader asks: \u201cWhat assumptions are built into this answer?\u201d\n              and \u201cWhat counter-evidence might exist?\u201d\n            <\/div>\n\n            <div class=\"reading-p\">\n              <b>4<\/b> Triangulation improves reliability. Instead of trusting one source, verify a claim using multiple independent sources.\n              Prefer primary research and official data. If sources disagree, report uncertainty and investigate reasons (methods, populations, contexts).\n              For teaching and publishing, treat unverified AI output as a hypothesis, not as a fact.\n            <\/div>\n\n            <div class=\"reading-p\">\n              <b>5<\/b> A practical checklist is: identify the claim; ask for the source; check whether the source exists; evaluate methodology and relevance;\n              and cross-check with other sources. This process turns AI into a useful assistant while protecting academic integrity.\n            <\/div>\n          <\/article>\n\n          <h4 class=\"h4\" style=\"margin-top:12px;\">Comprehension check (choose the best answer)<\/h4>\n          <div id=\"quiz\" class=\"stack\"><\/div>\n          <div class=\"feedback\" id=\"quizFb\" aria-live=\"polite\"><\/div>\n        <\/div>\n      <\/section>\n\n      <!-- ===================== -->\n      <!-- \u2705 TOOLKIT -->\n      <!-- ===================== -->\n      <section class=\"view\" data-view=\"toolkit\" aria-label=\"Reliability toolkit\">\n        <div class=\"card\">\n          <div class=\"card-h\">\n            <h3>4) Reliability Toolkit (Hallucinations, bias, triangulation)<\/h3>\n            <div class=\"card-actions\">\n              <button class=\"btn mini\" type=\"button\" data-say=\"toolkit-instr\">\ud83d\udd0a Read instructions<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"toolkitSpeak\">\ud83d\udd0a Read toolkit<\/button>\n            <\/div>\n          <\/div>\n\n          <div class=\"grid2\">\n            <div class=\"qitem\">\n              <div class=\"qtext\">Hallucination red flags<\/div>\n              <pre class=\"pre\" id=\"tkHall\"><\/pre>\n            <\/div>\n            <div class=\"qitem\">\n              <div class=\"qtext\">Fabricated citation red flags<\/div>\n              <pre class=\"pre\" id=\"tkCite\"><\/pre>\n            <\/div>\n          <\/div>\n\n          <div class=\"grid2\" style=\"margin-top:12px;\">\n            <div class=\"qitem\">\n              <div class=\"qtext\">Bias checks (academic)<\/div>\n              <pre class=\"pre\" id=\"tkBias\"><\/pre>\n            <\/div>\n            <div class=\"qitem\">\n              <div class=\"qtext\">Triangulation workflow<\/div>\n              <pre class=\"pre\" id=\"tkTri\"><\/pre>\n            <\/div>\n          <\/div>\n\n          <div class=\"qitem\" style=\"margin-top:12px;\">\n            <div class=\"qtext\">Trust-but-verify checklist (printable)<\/div>\n            <pre class=\"pre\" id=\"tkChecklist\"><\/pre>\n          <\/div>\n        <\/div>\n      <\/section>\n\n      <!-- ===================== -->\n      <!-- \u2705 PROMPTS -->\n      <!-- ===================== -->\n      <section class=\"view\" data-view=\"prompts\" aria-label=\"Prompts and examples\">\n        <div class=\"card\">\n          <div class=\"card-h\">\n            <h3>5) Prompts + Examples (Copy &#038; Adapt)<\/h3>\n            <div class=\"card-actions\">\n              <button class=\"btn mini\" type=\"button\" data-say=\"prompts-instr\">\ud83d\udd0a Read instructions<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"promptsSpeak\">\ud83d\udd0a Read prompts<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"copyPrompts\">Copy all<\/button>\n            <\/div>\n          <\/div>\n\n          <div class=\"note\">\n            These prompts force AI to show uncertainty, cite verifiable sources, and propose triangulation steps.\n          <\/div>\n\n          <div class=\"grid2\">\n            <div class=\"qitem\">\n              <div class=\"qtext\">Prompt 1 \u2014 Claim \u2192 evidence \u2192 uncertainty<\/div>\n              <pre class=\"pre\" id=\"p1\"><\/pre>\n            <\/div>\n            <div class=\"qitem\">\n              <div class=\"qtext\">Prompt 2 \u2014 Citation verification plan<\/div>\n              <pre class=\"pre\" id=\"p2\"><\/pre>\n            <\/div>\n          <\/div>\n\n          <div class=\"grid2\" style=\"margin-top:12px;\">\n            <div class=\"qitem\">\n              <div class=\"qtext\">Prompt 3 \u2014 Bias audit<\/div>\n              <pre class=\"pre\" id=\"p3\"><\/pre>\n            <\/div>\n            <div class=\"qitem\">\n              <div class=\"qtext\">Prompt 4 \u2014 Triangulation plan<\/div>\n              <pre class=\"pre\" id=\"p4\"><\/pre>\n            <\/div>\n          <\/div>\n\n          <div class=\"qitem\" style=\"margin-top:12px;\">\n            <div class=\"qtext\">Mini example (expected output style)<\/div>\n            <pre class=\"pre\" id=\"pExample\"><\/pre>\n          <\/div>\n        <\/div>\n      <\/section>\n\n      <!-- ===================== -->\n      <!-- \u2705 LISTENING -->\n      <!-- ===================== -->\n      <section class=\"view\" data-view=\"listening\" aria-label=\"Two-speaker listening\">\n        <div class=\"card\">\n          <div class=\"card-h\">\n            <h3>6) Listening (Two Google Voices) \u2014 \u201cA claim is not a fact yet\u201d<\/h3>\n            <div class=\"card-actions\">\n              <button class=\"btn mini\" type=\"button\" data-say=\"list-instr\">\ud83d\udd0a Read instructions<\/button>\n              <button class=\"btn mini\" type=\"button\" id=\"listenPlay\">\u25b6\ufe0f Play dialogue<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"listenStop\">\u23f9 Stop<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"listenCheck\">Check answers<\/button>\n            <\/div>\n          <\/div>\n\n          <p class=\"muted\">Listen to two instructors discussing hallucinations, bias, and triangulation.<\/p>\n\n          <div id=\"listenQ\" class=\"stack\"><\/div>\n          <div class=\"feedback\" id=\"listenFb\" aria-live=\"polite\"><\/div>\n        <\/div>\n      <\/section>\n\n      <!-- ===================== -->\n      <!-- \u2705 LAB -->\n      <!-- ===================== -->\n      <section class=\"view\" data-view=\"lab\" aria-label=\"Trust but verify lab\">\n        <div class=\"card\">\n          <div class=\"card-h\">\n            <h3>7) Trust-but-Verify Lab (Paste AI output \u2192 flag risks)<\/h3>\n            <div class=\"card-actions\">\n              <button class=\"btn mini\" type=\"button\" data-say=\"lab-instr\">\ud83d\udd0a Read instructions<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"labRun\">Run checks<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"labCopy\">Copy report<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"labReset\">Reset<\/button>\n            <\/div>\n          <\/div>\n\n          <div class=\"note\">\n            Paste an AI-generated answer (or draft). The lab will flag:\n            (a) <b>strong claims without evidence<\/b>, (b) <b>citation-like strings<\/b>, (c) <b>loaded language<\/b>, and\n            (d) generate a <b>triangulation plan<\/b>. This is heuristic (teacher judgement still required).\n          <\/div>\n\n          <div class=\"grid2\">\n            <div class=\"qitem\">\n              <div class=\"qtext\">A) AI output to evaluate<\/div>\n              <textarea class=\"textarea\" id=\"aiText\" rows=\"14\" placeholder=\"Paste AI answer here...\"><\/textarea>\n              <div class=\"icte-small muted\" style=\"margin-top:6px;\">\n                Tip: Include any citations the AI provided.\n              <\/div>\n            <\/div>\n\n            <div class=\"qitem\">\n              <div class=\"qtext\">B) Your context (optional)<\/div>\n              <textarea class=\"textarea\" id=\"context\" rows=\"14\" placeholder=\"Topic area, audience, stakes (teaching? publication?), and what you already know...\"><\/textarea>\n              <div class=\"icte-small muted\" style=\"margin-top:6px;\">\n                Tip: High-stakes = stronger verification requirement.\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"qitem\" style=\"margin-top:12px;\">\n            <div class=\"qtext\">Risk report<\/div>\n            <pre class=\"pre\" id=\"riskReport\"><\/pre>\n          <\/div>\n\n          <div class=\"qitem\" style=\"margin-top:12px;\">\n            <div class=\"qtext\">Safe AI prompt (to request verifiable evidence)<\/div>\n            <pre class=\"pre\" id=\"safePrompt\"><\/pre>\n          <\/div>\n\n          <div class=\"feedback\" id=\"labFb\" aria-live=\"polite\"><\/div>\n        <\/div>\n      <\/section>\n\n      <!-- ===================== -->\n      <!-- \u2705 PROBLEM-SOLVING -->\n      <!-- ===================== -->\n      <section class=\"view\" data-view=\"problem\" aria-label=\"Problem solving task\">\n        <div class=\"card\">\n          <div class=\"card-h\">\n            <h3>8) Problem-solving<\/h3>\n            <div class=\"card-actions\">\n              <button class=\"btn mini\" type=\"button\" data-say=\"problem-instr\">\ud83d\udd0a Read instructions<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"psCheck\">Check my solution<\/button>\n              <button class=\"btn mini ghost\" type=\"button\" id=\"psReset\">Reset<\/button>\n            <\/div>\n          <\/div>\n\n          <div class=\"note\">\n            <b>Scenario:<\/b> A colleague pasted an AI paragraph into a paper. It includes 3 citations and a confident claim:\n            <i>\u201cAI chatbots improve speaking proficiency by 35% on average across studies.\u201d<\/i>\n            You suspect hallucination or cherry-picking.\n            <br><br>\n            Your task:\n            <ul class=\"ul\">\n              <li>Write a <b>verification plan<\/b> (5\u20138 bullets).<\/li>\n              <li>List <b>3 red flags<\/b> you would check for fabricated citations.<\/li>\n              <li>Draft a <b>triangulation strategy<\/b> (at least 3 independent sources\/types).<\/li>\n              <li>Rewrite the claim into a <b>cautious, evidence-aligned<\/b> statement suitable for a draft.<\/li>\n            <\/ul>\n          <\/div>\n\n          <div class=\"grid2\">\n            <div class=\"qitem\">\n              <div class=\"qtext\">A) Verification plan (5\u20138 bullets)<\/div>\n              <textarea class=\"textarea\" id=\"psPlan\" rows=\"10\" placeholder=\"- Locate each cited paper in Google Scholar...&#10;- Check if the effect size claim is present...&#10;- Identify methods and populations...\"><\/textarea>\n            <\/div>\n            <div class=\"qitem\">\n              <div class=\"qtext\">B) Fabricated citation red flags (3 bullets)<\/div>\n              <textarea class=\"textarea\" id=\"psFlags\" rows=\"10\" placeholder=\"- Citation not found in Scholar...&#10;- Journal\/volume mismatch...&#10;- Author names inconsistent...\"><\/textarea>\n            <\/div>\n          <\/div>\n\n          <div class=\"grid2\" style=\"margin-top:12px;\">\n            <div class=\"qitem\">\n              <div class=\"qtext\">C) Triangulation strategy (3 bullets)<\/div>\n              <textarea class=\"textarea\" id=\"psTri\" rows=\"7\" placeholder=\"- Meta-analysis or systematic review...&#10;- Two primary studies in top journals...&#10;- Conference proceedings + replication...\"><\/textarea>\n            <\/div>\n            <div class=\"qitem\">\n              <div class=\"qtext\">D) Cautious rewrite of the claim<\/div>\n              <textarea class=\"textarea\" id=\"psRewrite\" rows=\"7\" placeholder=\"A cautious rewrite example:\nExisting studies suggest AI chatbots may support speaking practice; however, reported effects vary across contexts and study designs, so further verification is needed.\"><\/textarea>\n            <\/div>\n          <\/div>\n\n          <div class=\"feedback\" id=\"psFb\" aria-live=\"polite\"><\/div>\n        <\/div>\n      <\/section>\n\n      <!-- ===================== -->\n      <!-- \u2705 PROGRESS -->\n      <!-- ===================== -->\n      <section class=\"view\" data-view=\"progress\" aria-label=\"Progress tracking\">\n        <div class=\"card\">\n          <div class=\"card-h\">\n            <h3>Progress<\/h3>\n            <div class=\"card-actions\">\n              <button class=\"btn mini ghost\" type=\"button\" id=\"progressReset\">Clear progress<\/button>\n            <\/div>\n          <\/div>\n\n          <div class=\"progress-grid\">\n            <div class=\"pbox\">\n              <div class=\"pnum\" id=\"pDone\">0<\/div>\n              <div class=\"muted\">Activities completed<\/div>\n            <\/div>\n            <div class=\"pbox\">\n              <div class=\"pnum\" id=\"pScore\">0%<\/div>\n              <div class=\"muted\">Average score<\/div>\n            <\/div>\n            <div class=\"pbox\">\n              <div class=\"pnum\" id=\"pChecks\">0<\/div>\n              <div class=\"muted\">Checklist items used<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"note\">Saved locally in your browser (local storage).<\/div>\n\n          <h4 class=\"h4\">Checklist bank<\/h4>\n          <div class=\"bank\" id=\"checksBank\"><\/div>\n        <\/div>\n      <\/section>\n\n    <\/main>\n  <\/section>\n\n  <style>\n    \/* ===== WP-SAFE STYLES (scoped) ===== *\/\n    #icte-criticalai *{ box-sizing:border-box; }\n    #icte-criticalai{\n      --green:#28a745;\n      --dark:#132018;\n      --card:#ffffff;\n      --muted:#6b7280;\n      --line:#e5e7eb;\n      --shadow:0 8px 24px rgba(17,24,39,.08);\n      --radius:16px;\n      font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\n      color:#111827;\n    }\n    #icte-criticalai .icte-menu{\n      width:100%;\n      background:var(--green);\n      padding:10px 12px;\n      text-align:center;\n      overflow-x:auto;\n      white-space:nowrap;\n      position:sticky;\n      top:0;\n      z-index:999;\n      box-shadow:0 2px 10px rgba(0,0,0,.12);\n      border-radius:12px;\n      margin-bottom:12px;\n    }\n    #icte-criticalai .icte-menu a{\n      display:inline-block;\n      color:#fff;\n      text-decoration:none;\n      font-weight:900;\n      padding:8px 10px;\n      border-radius:999px;\n      margin:0 3px;\n      opacity:.92;\n      transition:.15s;\n    }\n    #icte-criticalai .icte-menu a:hover{ opacity:1; background:rgba(255,255,255,.14); }\n    #icte-criticalai .icte-menu a.is-current{ background:#fff; color:var(--dark); opacity:1; }\n\n    #icte-criticalai .icte-shell{ max-width:1100px; margin:0 auto; }\n    #icte-criticalai .icte-hero{\n      display:grid;\n      grid-template-columns: 1.2fr .8fr;\n      gap:14px;\n      background:linear-gradient(135deg,#e9fff0, #ffffff);\n      border:1px solid var(--line);\n      border-radius:var(--radius);\n      padding:16px;\n      box-shadow:var(--shadow);\n      margin-bottom:14px;\n    }\n    @media (max-width: 920px){ #icte-criticalai .icte-hero{ grid-template-columns:1fr; } }\n    #icte-criticalai h2{ margin:0 0 6px 0; font-size:22px; }\n    #icte-criticalai .muted{ color:var(--muted); }\n\n    #icte-criticalai .hero-top{ display:flex; gap:12px; align-items:center; }\n    #icte-criticalai .hero-img{\n      width:140px;\n      height:auto;\n      border-radius:14px;\n      border:1px solid var(--line);\n      background:#111;\n      box-shadow:var(--shadow);\n    }\n    @media (max-width: 920px){\n      #icte-criticalai .hero-top{ flex-direction:column; align-items:flex-start; }\n      #icte-criticalai .hero-img{ width:100%; max-width:520px; }\n    }\n\n    #icte-criticalai .icte-hero__controls{\n      border-left:1px dashed var(--line);\n      padding-left:14px;\n    }\n    @media (max-width: 920px){\n      #icte-criticalai .icte-hero__controls{ border-left:none; padding-left:0; border-top:1px dashed var(--line); padding-top:12px; }\n    }\n\n    #icte-criticalai .icte-row{ display:flex; gap:8px; flex-wrap:wrap; }\n    #icte-criticalai .icte-label{ display:block; font-size:12px; font-weight:900; margin-top:8px; }\n    #icte-criticalai .icte-select{\n      width:100%;\n      padding:10px 10px;\n      border:1px solid var(--line);\n      border-radius:12px;\n      background:#fff;\n      outline:none;\n      margin-top:6px;\n    }\n\n    #icte-criticalai .icte-pill{\n      display:flex; align-items:center; gap:8px;\n      padding:10px 12px;\n      border:1px solid var(--line);\n      border-radius:999px;\n      background:#fff;\n      margin-bottom:10px;\n      font-weight:900;\n    }\n    #icte-criticalai .dot{\n      width:10px; height:10px; border-radius:50%;\n      background:#9ca3af;\n      box-shadow:0 0 0 4px rgba(156,163,175,.18);\n    }\n    #icte-criticalai .dot.on{\n      background:#22c55e;\n      box-shadow:0 0 0 4px rgba(34,197,94,.18);\n    }\n\n    #icte-criticalai .btn{\n      border:none;\n      padding:10px 12px;\n      border-radius:12px;\n      background:var(--green);\n      color:#fff;\n      font-weight:900;\n      cursor:pointer;\n      transition:.15s;\n    }\n    #icte-criticalai .btn:hover{ filter:brightness(.95); transform:translateY(-1px); }\n    #icte-criticalai .btn:active{ transform:translateY(0); }\n    #icte-criticalai .btn.ghost{\n      background:#fff;\n      color:#111827;\n      border:1px solid var(--line);\n    }\n    #icte-criticalai .btn.mini{ padding:8px 10px; border-radius:10px; font-size:13px; }\n    #icte-criticalai .icte-small{ font-size:12px; }\n\n    #icte-criticalai .card{\n      background:var(--card);\n      border:1px solid var(--line);\n      border-radius:var(--radius);\n      padding:14px;\n      box-shadow:var(--shadow);\n      margin-bottom:14px;\n    }\n    #icte-criticalai .card-h{\n      display:flex; gap:10px; align-items:flex-start; justify-content:space-between;\n      border-bottom:1px solid var(--line);\n      padding-bottom:10px;\n      margin-bottom:10px;\n    }\n    #icte-criticalai .card-h h3{ margin:0; font-size:18px; }\n    #icte-criticalai .card-actions{ display:flex; gap:8px; flex-wrap:wrap; justify-content:flex-end; }\n\n    #icte-criticalai .view{ display:none; }\n    #icte-criticalai .view.is-active{ display:block; }\n\n    #icte-criticalai .grid2{\n      display:grid;\n      grid-template-columns:1fr 1fr;\n      gap:14px;\n      margin-top:10px;\n    }\n    @media (max-width: 920px){ #icte-criticalai .grid2{ grid-template-columns:1fr; } }\n\n    #icte-criticalai .stack{ display:flex; flex-direction:column; gap:10px; }\n    #icte-criticalai .h4{ margin:0 0 6px 0; font-size:15px; }\n    #icte-criticalai .qitem{\n      padding:10px;\n      border:1px solid var(--line);\n      border-radius:14px;\n      background:#fafafa;\n    }\n    #icte-criticalai .qtext{ font-weight:900; margin-bottom:8px; }\n\n    #icte-criticalai .feedback{\n      margin-top:10px;\n      padding:10px 12px;\n      border-radius:14px;\n      border:1px solid var(--line);\n      background:#f9fafb;\n      font-weight:800;\n      display:none;\n      white-space:pre-line;\n    }\n    #icte-criticalai .feedback.ok{ display:block; border-color:rgba(34,197,94,.35); background:#ecfdf5; }\n    #icte-criticalai .feedback.bad{ display:block; border-color:rgba(239,68,68,.35); background:#fef2f2; }\n\n    #icte-criticalai .note{\n      background:#eff6ff;\n      border:1px solid rgba(59,130,246,.22);\n      padding:10px 12px;\n      border-radius:14px;\n      margin:10px 0;\n    }\n\n    #icte-criticalai .reading{\n      border:1px solid var(--line);\n      border-radius:14px;\n      padding:12px;\n      background:#fff;\n      margin-top:10px;\n    }\n    #icte-criticalai .reading-title{ font-weight:900; margin-bottom:8px; }\n    #icte-criticalai .reading-p{ padding:8px 0; border-top:1px dashed var(--line); }\n    #icte-criticalai .reading-p:first-of-type{ border-top:none; }\n\n    #icte-criticalai .progress-grid{\n      display:grid;\n      grid-template-columns:repeat(3,1fr);\n      gap:12px;\n      margin-top:10px;\n      margin-bottom:10px;\n    }\n    @media (max-width: 920px){ #icte-criticalai .progress-grid{ grid-template-columns:1fr; } }\n    #icte-criticalai .pbox{\n      border:1px solid var(--line);\n      border-radius:16px;\n      background:#fff;\n      padding:12px;\n      text-align:center;\n      box-shadow:var(--shadow);\n    }\n    #icte-criticalai .pnum{ font-size:28px; font-weight:1000; }\n\n    #icte-criticalai .bank{\n      border:1px solid var(--line);\n      border-radius:14px;\n      padding:12px;\n      background:#fff;\n      display:flex;\n      flex-wrap:wrap;\n      gap:8px;\n    }\n    #icte-criticalai .tag{\n      border:1px solid var(--line);\n      background:#f9fafb;\n      padding:6px 10px;\n      border-radius:999px;\n      font-weight:900;\n      font-size:13px;\n    }\n\n    #icte-criticalai .pre{\n      white-space:pre-wrap;\n      background:#0b1220;\n      color:#e5e7eb;\n      border-radius:12px;\n      padding:12px;\n      border:1px solid rgba(255,255,255,.08);\n      overflow:auto;\n      font-size:13px;\n      line-height:1.45;\n    }\n\n    #icte-criticalai .ul{ margin:0; padding-left:18px; }\n    #icte-criticalai .ul li{ margin:6px 0; }\n\n    #icte-criticalai .textarea{\n      width:100%;\n      padding:12px;\n      border:1px solid var(--line);\n      border-radius:12px;\n      outline:none;\n      resize:vertical;\n    }\n\n    \/* Conversation UI *\/\n    #icte-criticalai .chat{\n      background:#0b1220;\n      color:#e5e7eb;\n      border-radius:14px;\n      padding:12px;\n      min-height:220px;\n      max-height:420px;\n      overflow:auto;\n      border:1px solid rgba(255,255,255,.08);\n    }\n    #icte-criticalai .msg{ margin:10px 0; display:flex; gap:10px; align-items:flex-start; }\n    #icte-criticalai .who{\n      min-width:90px;\n      font-weight:900;\n      font-size:12px;\n      color:#93c5fd;\n      text-transform:uppercase;\n      letter-spacing:.06em;\n    }\n    #icte-criticalai .bubble{\n      flex:1;\n      background:rgba(255,255,255,.06);\n      padding:10px 10px;\n      border-radius:12px;\n      line-height:1.45;\n      border:1px solid rgba(255,255,255,.06);\n      white-space:pre-line;\n    }\n    #icte-criticalai .msg.user .who{ color:#86efac; }\n    #icte-criticalai .msg.user .bubble{ background:rgba(34,197,94,.10); border-color:rgba(34,197,94,.18); }\n\n    #icte-criticalai .chatbar{\n      margin-top:10px;\n      display:flex;\n      gap:8px;\n      align-items:center;\n    }\n    #icte-criticalai .input{\n      flex:1;\n      padding:12px 12px;\n      border:1px solid var(--line);\n      border-radius:12px;\n      outline:none;\n    }\n  <\/style>\n\n  <script>\n    (function(){\n      const root = document.getElementById('icte-criticalai');\n      if(!root) return;\n\n      \/* =========================\n         Helpers\n      ========================= *\/\n      const qs = (sel, el=root) => el.querySelector(sel);\n      const qsa = (sel, el=root) => Array.from(el.querySelectorAll(sel));\n      const clamp = (n,min,max)=>Math.max(min,Math.min(max,n));\n      const norm = (s)=> (s||\"\").toString().trim();\n      const esc = (s)=> (s||\"\").replace(\/[&<>\"']\/g, m=>({ \"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#039;\" }[m]));\n\n      \/* =========================\n         Navigation\n      ========================= *\/\n      const navLinks = qsa('.icte-menu a');\n      const views = qsa('.view');\n      function showView(name){\n        views.forEach(v=> v.classList.toggle('is-active', v.getAttribute('data-view')===name));\n        navLinks.forEach(a=> a.classList.toggle('is-current', a.getAttribute('data-view')===name));\n        window.scrollTo({top: root.offsetTop - 10, behavior:'smooth'});\n      }\n      navLinks.forEach(a=>{\n        a.addEventListener('click', (e)=>{\n          e.preventDefault();\n          const v = a.getAttribute('data-view');\n          if(v) showView(v);\n        });\n      });\n      function activeViewName(){\n        const v = qs('.view.is-active');\n        return v ? v.getAttribute('data-view') : \"overview\";\n      }\n\n      \/* =========================\n         Multi-speaker Google Voices\n      ========================= *\/\n      const voiceASelect = qs('#voiceA');\n      const voiceBSelect = qs('#voiceB');\n\n      let allVoices = [];\n      let googleVoicesEN = [];\n      let voiceA = null;\n      let voiceB = null;\n\n      function isEnglish(v){ return (v.lang||\"\").toLowerCase().startsWith(\"en\"); }\n      function isGoogle(v){ return (v.name||\"\").toLowerCase().includes(\"google\"); }\n      function looksMaleName(name){\n        const n=(name||\"\").toLowerCase();\n        return n.includes(\"male\")||n.includes(\"david\")||n.includes(\"mark\")||n.includes(\"daniel\");\n      }\n      function looksFemaleName(name){\n        const n=(name||\"\").toLowerCase();\n        return n.includes(\"female\")||n.includes(\"susan\")||n.includes(\"amy\")||n.includes(\"emma\");\n      }\n      function pickDefaultVoices(list){\n        const a = list.find(v=>looksFemaleName(v.name)) || list[0] || null;\n        const b = list.find(v=>v!==a && looksMaleName(v.name)) || list.find(v=>v!==a) || a || null;\n        return {a,b};\n      }\n\n      function loadVoices(){\n        if(!window.speechSynthesis) return;\n        allVoices = speechSynthesis.getVoices() || [];\n        const google = allVoices.filter(v => isEnglish(v) && isGoogle(v));\n        const english = allVoices.filter(v => isEnglish(v));\n        googleVoicesEN = google.length ? google : english;\n\n        const buildSelect = (sel, list)=>{\n          sel.innerHTML=\"\";\n          list.forEach((v,i)=>{\n            const opt=document.createElement(\"option\");\n            opt.value=String(i);\n            opt.textContent=`${v.name} (${v.lang})`;\n            sel.appendChild(opt);\n          });\n        };\n\n        buildSelect(voiceASelect, googleVoicesEN);\n        buildSelect(voiceBSelect, googleVoicesEN);\n\n        const picked = pickDefaultVoices(googleVoicesEN);\n        voiceA = picked.a;\n        voiceB = picked.b;\n\n        voiceASelect.value = String(Math.max(0, googleVoicesEN.indexOf(voiceA)));\n        voiceBSelect.value = String(Math.max(0, googleVoicesEN.indexOf(voiceB)));\n\n        voiceASelect.onchange = ()=>{\n          const idx=parseInt(voiceASelect.value,10);\n          voiceA = googleVoicesEN[idx] || voiceA;\n        };\n        voiceBSelect.onchange = ()=>{\n          const idx=parseInt(voiceBSelect.value,10);\n          voiceB = googleVoicesEN[idx] || voiceB;\n        };\n      }\n      if(window.speechSynthesis){\n        loadVoices();\n        speechSynthesis.onvoiceschanged = loadVoices;\n      }\n\n      function stopSpeak(){ if(window.speechSynthesis) speechSynthesis.cancel(); }\n      function speakAs(role, text, opts){\n        const t = norm(text);\n        if(!t || !window.speechSynthesis) return Promise.resolve();\n        const o = opts || {};\n        const u = new SpeechSynthesisUtterance(t);\n        if(role===\"A\" && voiceA) u.voice = voiceA;\n        if(role===\"B\" && voiceB) u.voice = voiceB;\n        u.rate = o.rate ?? 1.02;\n        u.pitch = o.pitch ?? 1.0;\n        u.volume = o.volume ?? 1.0;\n        return new Promise(resolve=>{\n          u.onend=resolve; u.onerror=resolve;\n          speechSynthesis.speak(u);\n        });\n      }\n      async function speakDialogue(lines){\n        stopSpeak();\n        for(const line of lines){\n          await speakAs(line.role, line.text);\n        }\n      }\n\n      qs('#stopSpeak').addEventListener('click', stopSpeak);\n\n      \/* =========================\n         Progress (localStorage)\n      ========================= *\/\n      const LS_KEY = \"icte_criticalai_progress_v1\";\n      const progress = JSON.parse(localStorage.getItem(LS_KEY) || \"{}\");\n\n      function saveProgress(){ localStorage.setItem(LS_KEY, JSON.stringify(progress)); renderProgress(); }\n      function markDone(key, scorePct){\n        progress[key] = { done:true, score: clamp(scorePct,0,100), ts: Date.now() };\n        saveProgress();\n      }\n      function resetProgress(){ localStorage.removeItem(LS_KEY); location.reload(); }\n      qs('#progressReset').addEventListener('click', resetProgress);\n\n      const checks = [\n        {k:\"claims\", label:\"Claims extracted\"},\n        {k:\"evidence\", label:\"Evidence requested\"},\n        {k:\"citations\", label:\"Citations verified\"},\n        {k:\"bias\", label:\"Bias checked\"},\n        {k:\"tri\", label:\"Triangulated\"},\n        {k:\"uncertainty\", label:\"Uncertainty labeled\"},\n        {k:\"rewrite\", label:\"Claim rewritten cautiously\"},\n        {k:\"log\", label:\"Verification log\"}\n      ];\n      qs('#checksBank').innerHTML = checks.map(x=>`<span class=\"tag\">${esc(x.label)}<\/span>`).join(\"\");\n\n      function addCheck(k){\n        progress._checks = progress._checks || {};\n        progress._checks[k] = true;\n        saveProgress();\n      }\n\n      function renderProgress(){\n        const items = Object.values(progress).filter(p=>p && p.done);\n        const done = items.length;\n        const avg = done ? Math.round(items.reduce((s,p)=>s+(p.score||0),0)\/done) : 0;\n        qs('#pDone').textContent = String(done);\n        qs('#pScore').textContent = String(avg) + \"%\";\n        qs('#pChecks').textContent = String(Object.keys(progress._checks || {}).length);\n      }\n\n      \/* =========================\n         Instruction TTS map\n      ========================= *\/\n      const SAY = {\n        \"overview-instr\":\"Overview. Learn to detect hallucinations, spot fabricated citations, check bias, triangulate claims, and apply a trust but verify checklist.\",\n        \"conv-instr\":\"Conversation. Practice verification steps: identify claims, request evidence, verify sources, check bias, triangulate, and rewrite cautiously.\",\n        \"reading-instr\":\"Reading. Read the text and answer multiple choice questions. Then check your score.\",\n        \"toolkit-instr\":\"Toolkit. Review red flags for hallucinations and fabricated citations, bias checks, triangulation workflow, and a printable checklist.\",\n        \"prompts-instr\":\"Prompts. Copy prompts that force evidence, uncertainty labels, and triangulation steps.\",\n        \"list-instr\":\"Listening. Two instructors discuss why a claim is not a fact until verified.\",\n        \"lab-instr\":\"Lab. Paste an AI output and generate a risk report and verification plan.\",\n        \"problem-instr\":\"Problem-solving. Create a verification plan for a suspicious quantitative claim with citations.\"\n      };\n      qsa('[data-say]').forEach(btn=>{\n        btn.addEventListener('click', async ()=>{\n          const k = btn.getAttribute('data-say');\n          if(SAY[k]) await speakAs(\"A\", SAY[k]);\n        });\n      });\n\n      qs('#speakActive').addEventListener('click', async ()=>{\n        const v = activeViewName();\n        const map = {\n          overview:\"Overview page. Outcomes and safety rules for critical evaluation.\",\n          conversation:\"Conversation page. Practice trust but verify steps.\",\n          reading:\"Reading page. Read and take the quiz.\",\n          toolkit:\"Toolkit page. Red flags, bias checks, triangulation, and checklist.\",\n          prompts:\"Prompts page. Copy and adapt prompts for verification.\",\n          listening:\"Listening page. Two-speaker dialogue about verification.\",\n          lab:\"Lab page. Paste AI text and get a risk report and a safe evidence prompt.\",\n          problem:\"Problem-solving page. Verify a suspicious claim and rewrite it cautiously.\",\n          progress:\"Progress page.\"\n        };\n        await speakAs(\"A\", map[v] || \"Critical evaluation lesson.\");\n      });\n\n      \/* =========================\n         Conversation coach\n      ========================= *\/\n      const convChat = qs('#convChat');\n      const convText = qs('#convText');\n      const convSend = qs('#convSend');\n      const convReset = qs('#convReset');\n      const convHear  = qs('#convHear');\n\n      let convStep = 0;\n      let lastCoachQ = \"\";\n\n      const convSteps = [\n        { bot:\"Step 1: Write ONE claim you want to verify (one sentence).\",\n          check:(a)=> a.split(\/\\s+\/).length >= 6,\n          tips:\"Write a single clear claim (not a question).\"\n        },\n        { bot:\"Step 2: What evidence would support or refute it? (name data, method, or source type).\",\n          check:(a)=>\/(data|study|trial|experiment|survey|meta|systematic|report|dataset|method)\/i.test(a),\n          tips:\"Mention at least one: study design, data type, or source type.\"\n        },\n        { bot:\"Step 3: Name TWO independent sources you would check (e.g., Google Scholar + publisher page).\",\n          check:(a)=> (a.match(\/google scholar|publisher|springer|elsevier|taylor|sage|crossref|scopus|wos|pubmed|gov|un|unesco\/gi)||[]).length >= 2,\n          tips:\"Example: Google Scholar and publisher page; or Scopus and Crossref.\"\n        },\n        { bot:\"Step 4: Identify ONE possible bias risk in the claim (framing, omitted alternatives, generalization).\",\n          check:(a)=>\/(bias|frame|omit|general|overgeneral|counter|alternative|assumption)\/i.test(a),\n          tips:\"Example: It generalizes across contexts without specifying population.\"\n        },\n        { bot:\"Step 5: Rewrite the claim cautiously with uncertainty language (e.g., may, suggests, evidence is mixed).\",\n          check:(a)=>\/(may|might|suggest|mixed|varies|limited|preliminary|context)\/i.test(a),\n          tips:\"Use cautious wording: suggests\/may\/varies\/limited.\"\n        }\n      ];\n\n      function addMsg(who, text){\n        const div = document.createElement('div');\n        div.className = 'msg ' + (who==='You' ? 'user' : 'bot');\n        div.innerHTML = `<div class=\"who\">${esc(who)}<\/div><div class=\"bubble\">${esc(text)}<\/div>`;\n        convChat.appendChild(div);\n        convChat.scrollTop = convChat.scrollHeight;\n      }\n\n      async function coachAsk(){\n        const step = convSteps[convStep];\n        if(!step){\n          addMsg(\"Coach\",\"\u2705 Done. You identified a claim, required evidence, selected independent sources, checked bias, and rewrote cautiously.\");\n          markDone(\"conversation\", 100);\n          addCheck(\"claims\"); addCheck(\"evidence\"); addCheck(\"bias\"); addCheck(\"rewrite\"); addCheck(\"uncertainty\");\n          await speakAs(\"A\",\"Done. You identified a claim, required evidence, checked sources, assessed bias, and rewrote cautiously.\");\n          return;\n        }\n        lastCoachQ = step.bot;\n        addMsg(\"Coach\", step.bot);\n        await speakAs(\"A\", step.bot);\n      }\n\n      async function handleConversationInput(text){\n        const a = norm(text);\n        if(!a) return;\n        addMsg(\"You\", a);\n\n        if(\/claim\/i.test(lastCoachQ) || convStep===0) addCheck(\"claims\");\n        if(\/data|study|method|meta|systematic|report|dataset\/i.test(a)) addCheck(\"evidence\");\n        if(\/google scholar|publisher|crossref|scopus|wos|springer|elsevier|taylor|sage\/i.test(a)) addCheck(\"citations\");\n        if(\/bias|frame|assumption|alternative|counter\/i.test(a)) addCheck(\"bias\");\n        if(\/may|might|suggest|mixed|varies|limited|context\/i.test(a)) addCheck(\"uncertainty\");\n\n        const step = convSteps[convStep];\n        const ok = step.check(a);\n        const msg = ok ? \"\u2705 Good. Next.\" : \"\u26a0\ufe0f Try again. \" + step.tips;\n\n        addMsg(\"Coach\", msg);\n        await speakAs(\"A\", msg);\n\n        if(ok){ convStep++; setTimeout(coachAsk, 250); }\n      }\n\n      convSend.addEventListener('click', ()=>{ handleConversationInput(convText.value); convText.value=\"\"; });\n      convText.addEventListener('keydown', (e)=>{\n        if(e.key===\"Enter\"){ e.preventDefault(); handleConversationInput(convText.value); convText.value=\"\"; }\n      });\n      convHear.addEventListener('click', ()=> speakAs(\"A\", lastCoachQ || \"No question yet.\"));\n      convReset.addEventListener('click', ()=>{\n        convChat.innerHTML=\"\";\n        convStep=0;\n        addMsg(\"Coach\",\"Ready. Let\u2019s practice trust-but-verify.\");\n        coachAsk();\n      });\n\n      addMsg(\"Coach\",\"Ready. Let\u2019s practice trust-but-verify.\");\n      coachAsk();\n\n      \/* =========================\n         Reading TTS\n      ========================= *\/\n      qs('#readTextBtn').addEventListener('click', ()=>{\n        const parts = qsa('#readingText .reading-p').map(p=>p.textContent).join(\" \");\n        speakAs(\"A\", \"Reading. \" + parts);\n      });\n\n      \/* =========================\n         Quiz\n      ========================= *\/\n      const quiz = qs('#quiz');\n      const quizFb = qs('#quizFb');\n\n      const quizItems = [\n        { q:\"1) A hallucination is best described as\u2026\",\n          ans:\"A confident statement not supported by evidence\",\n          opts:[\n            \"A correct citation every time\",\n            \"A confident statement not supported by evidence\",\n            \"A peer-reviewed article\",\n            \"A database search result\"\n          ]\n        },\n        { q:\"2) A safe rule about citations is\u2026\",\n          ans:\"If you cannot locate the source, you cannot cite it\",\n          opts:[\n            \"Always trust AI citations\",\n            \"If you cannot locate the source, you cannot cite it\",\n            \"Cite anything formatted in APA style\",\n            \"Use only blogs to save time\"\n          ]\n        },\n        { q:\"3) Bias in research answers often appears as\u2026\",\n          ans:\"Selective evidence and one-sided framing\",\n          opts:[\n            \"Only offensive language\",\n            \"Selective evidence and one-sided framing\",\n            \"Perfect balance always\",\n            \"Only spelling mistakes\"\n          ]\n        },\n        { q:\"4) Triangulation means\u2026\",\n          ans:\"Verifying a claim using multiple independent sources\",\n          opts:[\n            \"Using only one source to be consistent\",\n            \"Verifying a claim using multiple independent sources\",\n            \"Adding more adjectives\",\n            \"Avoiding uncertainty language\"\n          ]\n        }\n      ];\n\n      function renderQuiz(){\n        quiz.innerHTML = quizItems.map((it)=>{\n          const options = ['<option value=\"\">Choose\u2026<\/option>']\n            .concat(it.opts.map(o=>`<option value=\"${esc(o)}\">${esc(o)}<\/option>`))\n            .join(\"\");\n          return `\n            <div class=\"qitem\">\n              <div class=\"qtext\">${esc(it.q)}<\/div>\n              <select class=\"icte-select\" data-ans=\"${esc(it.ans)}\">${options}<\/select>\n            <\/div>\n          `;\n        }).join(\"\");\n      }\n      renderQuiz();\n\n      qs('#quizCheck').addEventListener('click', ()=>{\n        const sels = qsa('#quiz select');\n        let correct = 0;\n        sels.forEach(s=>{\n          const ok = s.value === s.getAttribute('data-ans');\n          s.style.borderColor = ok ? \"rgba(34,197,94,.6)\" : \"rgba(239,68,68,.6)\";\n          if(ok) correct++;\n        });\n        const pct = Math.round((correct \/ sels.length) * 100);\n        quizFb.className = \"feedback \" + (pct>=70 ? \"ok\":\"bad\");\n        quizFb.textContent = `Score: ${correct}\/${sels.length} (${pct}%).`;\n        if(pct>=70){ addCheck(\"claims\"); addCheck(\"tri\"); }\n        markDone(\"reading_quiz\", pct);\n      });\n\n      \/* =========================\n         Toolkit content\n      ========================= *\/\n      qs('#tkHall').textContent =\n`Hallucination red flags:\n- Overconfident numbers without a source\n- Vague references: \u201cstudies show\u201d with no citation\n- Precise details that sound plausible but can\u2019t be verified\n- Name-dropping journals\/authors without links\n- Unexplained leaps from evidence to conclusion`;\n\n      qs('#tkCite').textContent =\n`Fabricated citation red flags:\n- Not findable in Google Scholar\n- Author names inconsistent across mentions\n- Journal\/volume\/issue combination impossible\n- DOI pattern looks wrong or does not resolve\n- Title sounds generic or too perfectly aligned\n- No publisher page exists`;\n\n      qs('#tkBias').textContent =\n`Bias checks:\n- What assumptions are built into the framing?\n- What alternative explanations exist?\n- Are counterexamples omitted?\n- Does the answer generalize beyond the evidence?\n- Is the language loaded (always\/never\/proves)?\n- Who benefits from this conclusion?`;\n\n      qs('#tkTri').textContent =\n`Triangulation workflow:\n1) Identify the claim + what would count as evidence\n2) Find 2\u20133 independent sources (Scholar + publisher + review\/meta-analysis)\n3) Compare: methods, samples, contexts, outcomes\n4) If disagreement exists, report uncertainty and reasons\n5) Update your claim to match the strongest evidence`;\n\n      qs('#tkChecklist').textContent =\n`TRUST-BUT-VERIFY CHECKLIST\n[ ] What is the exact claim?\n[ ] What evidence is required (data\/method\/source)?\n[ ] Are citations verifiable (Scholar\/publisher\/DOI)?\n[ ] Is the source primary and relevant?\n[ ] Any bias signals (one-sided framing, omissions)?\n[ ] Triangulate with 2+ independent sources\n[ ] Label uncertainty and limits\n[ ] Rewrite claim cautiously if evidence is mixed\n[ ] Keep a verification log (what you checked + when)`;\n\n      qs('#toolkitSpeak').addEventListener('click', ()=>{\n        speakAs(\"A\",\"Toolkit. Learn red flags for hallucinations and fabricated citations, check bias in framing and evidence selection, triangulate claims with independent sources, and use the trust but verify checklist.\");\n      });\n\n      \/* =========================\n         Prompts content\n      ========================= *\/\n      const p1 = qs('#p1'), p2 = qs('#p2'), p3 = qs('#p3'), p4 = qs('#p4'), pExample = qs('#pExample');\n\n      p1.textContent =\n`PROMPT 1 \u2014 CLAIM \u2192 EVIDENCE \u2192 UNCERTAINTY\nTake the text below and do:\n1) Extract claims (bullet list).\n2) For each claim, state what evidence is needed (data\/method\/source).\n3) Mark confidence (High\/Medium\/Low) and why.\nRules:\n- If a claim is not supported, label: UNVERIFIED.\nText:\n[PASTE]`;\n\n      p2.textContent =\n`PROMPT 2 \u2014 CITATION VERIFICATION PLAN (NO INVENTION)\nFor each citation in the text:\n- Provide a Google Scholar search query (exact title or author-year-title)\n- Provide steps to verify on a publisher page\n- If not findable, mark as POSSIBLY FABRICATED and list red flags\nRules:\n- Do NOT invent DOIs or references.\nText:\n[PASTE]`;\n\n      p3.textContent =\n`PROMPT 3 \u2014 BIAS AUDIT\nAnalyze the text for bias risks:\n- framing assumptions\n- omitted alternatives\n- overgeneralizations\n- loaded language\nThen propose a more balanced rewrite outline.\nText:\n[PASTE]`;\n\n      p4.textContent =\n`PROMPT 4 \u2014 TRIANGULATION PLAN\nGiven the claim:\n[PASTE CLAIM]\nPropose a triangulation plan:\n- 3 independent sources\/types to check\n- what to compare across sources (methods\/samples\/outcomes)\n- how you will report uncertainty if sources disagree`;\n\n      pExample.textContent =\n`EXPECTED OUTPUT (snippet)\nClaim: \"Chatbots improve speaking proficiency by 35%.\"\nEvidence needed: meta-analysis effect sizes OR multiple RCTs with comparable measures.\nConfidence: LOW (no source shown).\nVerification: search Scholar for \"chatbot speaking proficiency meta-analysis\"; check publisher pages for cited studies.\nRewrite: \"Some studies suggest chatbots may support speaking practice, but reported effects vary across contexts and measures.\"`;\n\n      qs('#promptsSpeak').addEventListener('click', ()=>{\n        speakAs(\"A\",\"Prompts page. Use prompts to extract claims, require evidence and uncertainty labels, verify citations without invention, audit bias, and create a triangulation plan.\");\n      });\n\n      qs('#copyPrompts').addEventListener('click', ()=>{\n        const all =\n`PROMPT 1\\n${p1.textContent}\\n\\nPROMPT 2\\n${p2.textContent}\\n\\nPROMPT 3\\n${p3.textContent}\\n\\nPROMPT 4\\n${p4.textContent}\\n\\nEXAMPLE\\n${pExample.textContent}`;\n        navigator.clipboard.writeText(all).then(()=> speakAs(\"A\",\"Copied prompts.\")).catch(()=> alert(\"Clipboard blocked. Copy manually.\"));\n      });\n\n      \/* =========================\n         Listening\n      ========================= *\/\n      const listenFb = qs('#listenFb');\n      const listenQ = qs('#listenQ');\n\n      const dialogue = [\n        {role:\"A\", text:\"The AI answer sounds convincing, but it includes numbers and citations I haven\u2019t checked.\"},\n        {role:\"B\", text:\"Then treat it as a hypothesis. Extract the claims, verify each citation in Google Scholar, and triangulate with independent sources.\"},\n        {role:\"A\", text:\"What if the citation doesn\u2019t exist?\"},\n        {role:\"B\", text:\"Assume it may be fabricated. Do not cite it. Replace it with a verified source or remove the claim.\"},\n        {role:\"A\", text:\"And bias?\"},\n        {role:\"B\", text:\"Check framing and omissions. Ask what counter-evidence could exist, and rewrite claims cautiously.\"},\n        {role:\"A\", text:\"So a claim is not a fact yet.\"},\n        {role:\"B\", text:\"Exactly. Verification turns AI output into reliable knowledge.\"}\n      ];\n\n      const listenItems = [\n        {q:\"1) The recommended stance toward AI output is\u2026\", ans:\"Treat it as a hypothesis until verified\"},\n        {q:\"2) If a citation cannot be found, you should\u2026\", ans:\"Not cite it and treat it as possibly fabricated\"},\n        {q:\"3) Triangulation means\u2026\", ans:\"Checking multiple independent sources\"},\n        {q:\"4) Bias checking involves\u2026\", ans:\"Framing, omissions, and cautious rewriting\"}\n      ];\n\n      function renderListenQ(){\n        const optsMap = {\n          \"Treat it as a hypothesis until verified\":[\n            \"Treat it as a hypothesis until verified\",\n            \"Accept it as fact if it sounds fluent\",\n            \"Use it directly in a publication\"\n          ],\n          \"Not cite it and treat it as possibly fabricated\":[\n            \"Not cite it and treat it as possibly fabricated\",\n            \"Invent a similar citation\",\n            \"Keep it because it looks academic\"\n          ],\n          \"Checking multiple independent sources\":[\n            \"Checking multiple independent sources\",\n            \"Using only one blog post\",\n            \"Avoiding primary studies\"\n          ],\n          \"Framing, omissions, and cautious rewriting\":[\n            \"Framing, omissions, and cautious rewriting\",\n            \"Only grammar correction\",\n            \"Only adding more citations\"\n          ]\n        };\n\n        listenQ.innerHTML = listenItems.map((it)=>{\n          const options = ['<option value=\"\">Choose\u2026<\/option>']\n            .concat((optsMap[it.ans]||[it.ans]).map(o=>`<option value=\"${esc(o)}\">${esc(o)}<\/option>`)).join(\"\");\n          return `\n            <div class=\"qitem\">\n              <div class=\"qtext\">${esc(it.q)}<\/div>\n              <select class=\"icte-select\" data-ans=\"${esc(it.ans)}\">${options}<\/select>\n            <\/div>\n          `;\n        }).join(\"\");\n      }\n      renderListenQ();\n\n      qs('#listenPlay').addEventListener('click', async ()=>{\n        if(googleVoicesEN.length >= 2 && voiceA === voiceB){\n          voiceB = googleVoicesEN.find(v => v !== voiceA) || voiceB;\n          voiceBSelect.value = String(googleVoicesEN.indexOf(voiceB));\n        }\n        await speakDialogue(dialogue);\n      });\n      qs('#listenStop').addEventListener('click', stopSpeak);\n\n      qs('#listenCheck').addEventListener('click', ()=>{\n        const sels = qsa('#listenQ select');\n        let correct = 0;\n        sels.forEach(s=>{\n          const ok = s.value === s.getAttribute('data-ans');\n          s.style.borderColor = ok ? \"rgba(34,197,94,.6)\" : \"rgba(239,68,68,.6)\";\n          if(ok) correct++;\n        });\n        const pct = Math.round((correct \/ sels.length) * 100);\n        listenFb.className = \"feedback \" + (pct>=70 ? \"ok\":\"bad\");\n        listenFb.textContent = `Score: ${correct}\/${sels.length} (${pct}%).`;\n        if(pct>=70){ addCheck(\"tri\"); addCheck(\"uncertainty\"); }\n        markDone(\"listening\", pct);\n      });\n\n      \/* =========================\n         LAB: heuristic risk checks\n      ========================= *\/\n      const aiText = qs('#aiText');\n      const context = qs('#context');\n      const riskReport = qs('#riskReport');\n      const safePrompt = qs('#safePrompt');\n      const labFb = qs('#labFb');\n\n      const DOI_RE = \/\\b10\\.\\d{4,9}\\\/[-._;()\/:A-Z0-9]+\\b\/i;\n      const YEAR_RE = \/\\b(19|20)\\d{2}\\b\/g;\n\n      function extractCitationLike(text){\n        const t = text || \"\";\n        const hits = [];\n        \/\/ APA-ish: (Author, 2020)\n        const p = \/\\([A-Z][A-Za-z\\u00C0-\\u017F' -]+,\\s*(19|20)\\d{2}[a-z]?\\)\/g;\n        let m;\n        while((m = p.exec(t)) !== null){ hits.push(m[0]); }\n        \/\/ Author (2020)\n        const n = \/[A-Z][A-Za-z\\u00C0-\\u017F' -]+\\s*\\(\\s*(19|20)\\d{2}[a-z]?\\s*\\)\/g;\n        while((m = n.exec(t)) !== null){ hits.push(m[0]); }\n        \/\/ DOI or doi.org\n        const d = t.match(\/https?:\\\/\\\/doi\\.org\\\/\\S+\/gi) || [];\n        d.forEach(x=>hits.push(x));\n        \/\/ raw DOI\n        const rd = t.match(DOI_RE) || [];\n        rd.forEach(x=>hits.push(x));\n        return Array.from(new Set(hits)).slice(0,40);\n      }\n\n      function countLoadedLanguage(text){\n        const words = (text||\"\").toLowerCase();\n        const loaded = [\"proves\",\"always\",\"never\",\"guarantees\",\"undeniable\",\"clearly\",\"obviously\",\"everyone knows\",\"no doubt\",\"best\",\"worst\",\"shocking\"];\n        let c=0;\n        loaded.forEach(w=>{ if(words.includes(w)) c++; });\n        return c;\n      }\n\n      function extractStrongNumbers(text){\n        const t = text || \"\";\n        const nums = [];\n        \/\/ percentages\n        (t.match(\/\\b\\d{1,3}\\s*%\/g) || []).forEach(x=>nums.push(x));\n        \/\/ \"X times\", \"X-fold\", \"p <\"\n        (t.match(\/\\b\\d+(\\.\\d+)?\\s*(times|x|fold)\\b\/gi) || []).forEach(x=>nums.push(x));\n        (t.match(\/\\bp\\s*[<=>]\\s*0?\\.\\d+\/gi) || []).forEach(x=>nums.push(x));\n        return Array.from(new Set(nums)).slice(0,30);\n      }\n\n      function heuristicClaims(text){\n        \/\/ Split into sentences and look for claim verbs\n        const sents = (text||\"\")\n          .replace(\/\\s+\/g,\" \")\n          .split(\/(?<=[.!?])\\s+(?=[A-Z(])\/)\n          .map(s=>s.trim())\n          .filter(Boolean);\n\n        const claimSig = \/(shows|demonstrates|proves|confirms|indicates|suggests|leads to|results in|increases|improves|reduces|causes)\/i;\n        const claims = sents.filter(s=>claimSig.test(s)).slice(0,12);\n        return {sents, claims};\n      }\n\n      function buildRiskReport(txt, ctx){\n        const citations = extractCitationLike(txt);\n        const loadedCount = countLoadedLanguage(txt);\n        const nums = extractStrongNumbers(txt);\n        const {claims} = heuristicClaims(txt);\n\n        \/\/ crude risk scoring\n        let score = 100;\n        if(claims.length >= 6) score -= 10;\n        if(nums.length >= 2) score -= 15;\n        if(citations.length === 0 && claims.length > 0) score -= 20; \/\/ claims but no citations\n        if(loadedCount >= 2) score -= 15;\n        if(txt.length < 120) score -= 10; \/\/ too short to support precision\n        score = clamp(score, 0, 100);\n\n        \/\/ checks\n        addCheck(\"claims\");\n        if(citations.length) addCheck(\"citations\");\n        if(loadedCount) addCheck(\"bias\");\n        if(nums.length) addCheck(\"evidence\"); \/\/ needs evidence\n        if(\/may|might|suggest|limited|mixed|varies\/i.test(txt)) addCheck(\"uncertainty\");\n\n        const lines = [];\n        lines.push(`TRUST-BUT-VERIFY RISK REPORT (heuristic)\\nRisk score (higher is better): ${score}%\\n`);\n        lines.push(`Context (optional): ${ctx ? ctx.slice(0,160) + (ctx.length>160?\"\u2026\":\"\") : \"(none provided)\"}\\n`);\n\n        lines.push(`1) Claim-like sentences detected (${claims.length})`);\n        if(claims.length) claims.forEach(c=>lines.push(`- ${c}`));\n        else lines.push(`- None detected (or too implicit).`);\n\n        lines.push(`\\n2) Strong numbers \/ stats detected (${nums.length})`);\n        if(nums.length) nums.forEach(n=>lines.push(`- ${n}  (VERIFY SOURCE)`));\n        else lines.push(`- None detected.`);\n\n        lines.push(`\\n3) Citation-like strings detected (${citations.length})`);\n        if(citations.length) citations.forEach(c=>lines.push(`- ${c}`));\n        else lines.push(`- None detected (risk if claims are strong).`);\n\n        lines.push(`\\n4) Loaded language signals (${loadedCount})`);\n        lines.push(loadedCount ? `- Found ${loadedCount} loaded phrasing patterns (check bias \/ overclaiming).` : `- None detected.`);\n\n        lines.push(`\\n5) Recommended actions`);\n        lines.push(`- Extract top 3 claims and demand sources for each (title\/DOI).`);\n        lines.push(`- Verify each cited source exists (Google Scholar + publisher).`);\n        lines.push(`- Triangulate: at least 2 independent sources; prefer systematic reviews\/meta-analyses when available.`);\n        lines.push(`- If sources disagree, report uncertainty and revise claims cautiously.`);\n        lines.push(`- Keep a verification log (what you checked, where, and what you found).`);\n\n        return {score, text: lines.join(\"\\n\"), citations, claims, nums, loadedCount};\n      }\n\n      function buildSafeEvidencePrompt(txt){\n        return `ROLE: You are a critical research assistant.\n\nTASK:\nEvaluate the claims in the text below and provide ONLY verifiable support.\n\nSTRICT RULES:\n- Do NOT invent citations, DOIs, titles, or author lists.\n- If you cannot verify a source exists, label it: UNVERIFIED.\n- For each claim, provide:\n  (a) what evidence is needed,\n  (b) where to verify (Google Scholar query + publisher page),\n  (c) how to report uncertainty.\n\nOUTPUT FORMAT:\n1) Claims (max 5) with confidence (High\/Med\/Low) + reason\n2) Verification plan for each claim (Scholar query string + what to check)\n3) Triangulation: 3 independent source types\n4) Cautious rewrite of the strongest claim\n\nTEXT:\n${txt}`;\n      }\n\n      qs('#labRun').addEventListener('click', ()=>{\n        const txt = norm(aiText.value);\n        const ctx = norm(context.value);\n        if(txt.length < 60){\n          labFb.className = \"feedback bad\";\n          labFb.textContent = \"\u26a0\ufe0f Paste more text (at least ~60 characters) to evaluate.\";\n          return;\n        }\n        const rr = buildRiskReport(txt, ctx);\n        riskReport.textContent = rr.text;\n        safePrompt.textContent = buildSafeEvidencePrompt(txt);\n\n        markDone(\"lab\", rr.score);\n        labFb.className = \"feedback \" + (rr.score>=70 ? \"ok\":\"bad\");\n        labFb.textContent = `Report generated. Risk score: ${rr.score}%. Next: verify sources and triangulate before using in teaching\/publishing.`;\n      });\n\n      qs('#labCopy').addEventListener('click', async ()=>{\n        const pack = `RISK REPORT\\n${riskReport.textContent}\\n\\nSAFE EVIDENCE PROMPT\\n${safePrompt.textContent}`;\n        if(!pack.trim()){\n          labFb.className = \"feedback bad\";\n          labFb.textContent = \"\u26a0\ufe0f Run checks first.\";\n          return;\n        }\n        try{\n          await navigator.clipboard.writeText(pack);\n          labFb.className = \"feedback ok\";\n          labFb.textContent = \"\u2705 Copied report + prompt.\";\n        }catch(_){\n          labFb.className = \"feedback bad\";\n          labFb.textContent = \"\u26a0\ufe0f Clipboard blocked. Copy manually from the boxes.\";\n        }\n      });\n\n      qs('#labReset').addEventListener('click', ()=>{\n        aiText.value = \"\";\n        context.value = \"\";\n        riskReport.textContent = \"\";\n        safePrompt.textContent = \"\";\n        labFb.className = \"feedback\";\n        labFb.textContent = \"\";\n      });\n\n      \/* =========================\n         Problem-solving checker\n      ========================= *\/\n      const psPlan = qs('#psPlan');\n      const psFlags = qs('#psFlags');\n      const psTri = qs('#psTri');\n      const psRewrite = qs('#psRewrite');\n      const psFb = qs('#psFb');\n\n      function countBullets(txt){ return (txt.match(\/^\\s*[-\u2022]\/gm)||[]).length; }\n\n      qs('#psCheck').addEventListener('click', ()=>{\n        const planOk = countBullets(psPlan.value) >= 5 && \/(scholar|publisher|verify|doi|triang|meta|systematic|replic)\/i.test(psPlan.value);\n        const flagsOk = countBullets(psFlags.value) >= 3;\n        const triOk = countBullets(psTri.value) >= 3;\n        const rewriteOk = psRewrite.value.length >= 80 && \/(may|might|suggest|varies|limited|mixed|preliminary|context)\/i.test(psRewrite.value);\n\n        const pct = Math.round(((planOk?1:0)+(flagsOk?1:0)+(triOk?1:0)+(rewriteOk?1:0))\/4*100);\n\n        psFb.className = \"feedback \" + (pct>=70 ? \"ok\":\"bad\");\n        psFb.textContent =\n          `Check: ${pct}%\\n` +\n          `- Verification plan (>=5 bullets + verification terms): ${planOk ? \"Yes\" : \"No\"}\\n` +\n          `- Red flags (>=3 bullets): ${flagsOk ? \"Yes\" : \"No\"}\\n` +\n          `- Triangulation strategy (>=3 bullets): ${triOk ? \"Yes\" : \"No\"}\\n` +\n          `- Cautious rewrite (uncertainty language): ${rewriteOk ? \"Yes\" : \"No\"}`;\n\n        markDone(\"problem_solving\", pct);\n        addCheck(\"tri\"); addCheck(\"rewrite\"); addCheck(\"log\");\n      });\n\n      qs('#psReset').addEventListener('click', ()=>{\n        psPlan.value = \"\";\n        psFlags.value = \"\";\n        psTri.value = \"\";\n        psRewrite.value = \"\";\n        psFb.className = \"feedback\";\n        psFb.textContent = \"\";\n      });\n\n      \/* =========================\n         Toolkit + Prompts population\n      ========================= *\/\n      qs('#tkHall').textContent =\n`Hallucination red flags:\n- Precise numbers without a source\n- \u201cStudies show\u201d with no citations\n- Specific author\/journal claims without traceable links\n- Overconfident causal language from correlational evidence\n- Overgeneralization across contexts\/populations`;\n\n      qs('#tkCite').textContent =\n`Fabricated citation red flags:\n- Not findable in Google Scholar\n- DOI does not resolve or looks malformed\n- Journal\/volume\/issue mismatch\n- Title cannot be found anywhere\n- Author names inconsistent across mentions\n- Publisher page missing or unrelated`;\n\n      qs('#tkBias').textContent =\n`Bias checks:\n- Is the framing one-sided?\n- Are plausible alternatives omitted?\n- Are limitations ignored?\n- Is language loaded (always\/never\/proves)?\n- Is evidence cherry-picked?\n- Does it generalize beyond the sample?`;\n\n      qs('#tkTri').textContent =\n`Triangulation workflow:\n1) Identify claim + evidence needed\n2) Verify cited sources exist (Scholar\/publisher)\n3) Compare 2+ independent sources\n4) Prefer systematic reviews\/meta-analyses when available\n5) Report uncertainty when evidence is mixed`;\n\n      qs('#tkChecklist').textContent =\n`TRUST-BUT-VERIFY CHECKLIST\n[ ] Extract claims (max 5)\n[ ] Identify required evidence (data\/method)\n[ ] Verify citations exist (Scholar + publisher)\n[ ] Check DOI\/URL resolves\n[ ] Evaluate source quality (peer review? methods? relevance?)\n[ ] Check bias (framing\/omissions\/overclaiming)\n[ ] Triangulate with independent sources\n[ ] Rewrite claims cautiously + note limits\n[ ] Keep a verification log`;\n\n      p1.textContent =\n`PROMPT 1 \u2014 CLAIMS & CONFIDENCE\nExtract up to 5 claims from the text.\nFor each claim:\n- evidence needed\n- confidence (High\/Med\/Low) with reasons\nRules: mark UNVERIFIED if no evidence is provided.\nText:\n[PASTE]`;\n\n      p2.textContent =\n`PROMPT 2 \u2014 SPOT FABRICATED CITATIONS\nList all citations in the text.\nFor each:\n- why it might be fabricated (red flags)\n- how to verify (Google Scholar query + publisher check)\nRules: do NOT invent missing citations or DOIs.\nText:\n[PASTE]`;\n\n      p3.textContent =\n`PROMPT 3 \u2014 BIAS & OVERCLAIMING AUDIT\nIdentify:\n- loaded language\n- omitted alternatives\n- overgeneralization\nThen rewrite the argument outline in a balanced way.\nText:\n[PASTE]`;\n\n      p4.textContent =\n`PROMPT 4 \u2014 TRIANGULATION PLAN\nGiven the claim:\n[PASTE CLAIM]\nPropose:\n- 3 independent sources\/types to verify it\n- what to compare (methods, sample, measures)\n- how to report uncertainty if evidence is mixed`;\n\n      pExample.textContent =\n`Example:\nClaim: \"Chatbots improve speaking by 35%.\"\nEvidence needed: meta-analysis effect sizes OR multiple controlled studies with comparable measures.\nConfidence: LOW (no verifiable source shown).\nRewrite: \"Some studies suggest chatbots may support speaking practice; however, effects vary across contexts and study designs.\"`;\n\n      qs('#toolkitSpeak').addEventListener('click', ()=> speakAs(\"A\", \"Toolkit. Use red flags, bias checks, and triangulation to verify AI output before using it.\"));\n      qs('#promptsSpeak').addEventListener('click', ()=> speakAs(\"A\", \"Prompts. Copy prompts to extract claims, verify citations, audit bias, and plan triangulation.\"));\n      qs('#listenStop').addEventListener('click', stopSpeak);\n\n      \/* =========================\n         Listening Q rendering already done\n      ========================= *\/\n\n      \/* =========================\n         Copy prompts button\n      ========================= *\/\n      qs('#copyPrompts').addEventListener('click', ()=>{\n        const all =\n`PROMPT 1\\n${p1.textContent}\\n\\nPROMPT 2\\n${p2.textContent}\\n\\nPROMPT 3\\n${p3.textContent}\\n\\nPROMPT 4\\n${p4.textContent}\\n\\nEXAMPLE\\n${pExample.textContent}`;\n        navigator.clipboard.writeText(all).then(()=> speakAs(\"A\",\"Copied prompts.\")).catch(()=> alert(\"Clipboard blocked. Copy manually.\"));\n      });\n\n      \/* =========================\n         Start state\n      ========================= *\/\n      renderProgress();\n\n    })();\n  <\/script>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Overview Conversation Reading Reliability Toolkit Prompts Listening Trust-but-Verify Lab Problem-solving Progress Critical Evaluation: Hallucinations, Bias, and Source Reliability Learn to<\/p>\n","protected":false},"author":1,"featured_media":775,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_layout":"default_layout","footnotes":""},"categories":[52,45],"tags":[],"class_list":["post-776","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-for-research","category-ai-for-teachers"],"_links":{"self":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/776","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/comments?post=776"}],"version-history":[{"count":1,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/776\/revisions"}],"predecessor-version":[{"id":777,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/776\/revisions\/777"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media\/775"}],"wp:attachment":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media?parent=776"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/categories?post=776"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/tags?post=776"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}