| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8" /> |
| <title>GenAI Fact or Fiction</title> |
|
|
| |
| <link rel="preconnect" href="https://fonts.gstatic.com" /> |
| <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;600&display=swap" rel="stylesheet"> |
|
|
| <style> |
| * { margin: 0; padding: 0; box-sizing: border-box; } |
| |
| body { |
| font-family: 'Poppins', sans-serif; |
| background: linear-gradient(120deg, #ade0f4, #f2cfff); |
| min-height: 100vh; |
| display: flex; |
| flex-direction: column; |
| align-items: center; |
| justify-content: flex-start; |
| padding-bottom: 2rem; |
| } |
| |
| h1 { |
| text-align: center; |
| margin-top: 2rem; |
| color: #333; |
| font-weight: 600; |
| letter-spacing: 1px; |
| } |
| |
| .article-link { |
| margin-top: 0.75rem; |
| font-size: 0.95rem; |
| color: #333; |
| text-align: center; |
| } |
| |
| .article-link a { |
| color: #1b66c9; |
| text-decoration: none; |
| font-weight: 600; |
| } |
| |
| .article-link a:hover { |
| text-decoration: underline; |
| } |
| |
| #game-container { |
| background: #ffffffcc; |
| width: 90%; |
| max-width: 650px; |
| margin: 1.5rem auto; |
| padding: 2rem; |
| border-radius: 12px; |
| box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2); |
| transition: transform 0.3s ease; |
| display: flex; |
| flex-direction: column; |
| align-items: center; |
| } |
| |
| #game-container:hover { |
| transform: scale(1.01); |
| } |
| |
| #statement { |
| font-size: 1.25rem; |
| margin-bottom: 1rem; |
| min-height: 100px; |
| text-align: center; |
| color: #444; |
| line-height: 1.5; |
| } |
| |
| .btn-group { |
| margin: 1rem 0; |
| } |
| |
| button { |
| margin: 0.5rem; |
| padding: 0.75rem 1.5rem; |
| font-size: 1rem; |
| cursor: pointer; |
| border: none; |
| border-radius: 8px; |
| background-color: #3498db; |
| color: #fff; |
| transition: background-color 0.3s ease, transform 0.2s ease; |
| } |
| |
| button:hover { |
| background-color: #2980b9; |
| transform: translateY(-2px); |
| } |
| |
| #result { |
| margin-top: 1rem; |
| padding: 1rem; |
| border-radius: 6px; |
| font-weight: 600; |
| text-align: center; |
| width: 100%; |
| display: none; |
| } |
| |
| #result.correct { |
| background-color: #d4edda; |
| color: #155724; |
| display: block; |
| } |
| |
| #result.incorrect { |
| background-color: #f8d7da; |
| color: #721c24; |
| display: block; |
| } |
| |
| #explanation { |
| margin-top: 0.5rem; |
| padding: 1rem; |
| border-radius: 6px; |
| background-color: #f9f9f9; |
| color: #555; |
| display: none; |
| width: 100%; |
| line-height: 1.5; |
| } |
| |
| #next-btn { |
| background-color: #2ecc71; |
| } |
| |
| #next-btn:hover { |
| background-color: #27ae60; |
| } |
| |
| #restart-btn { |
| background-color: #ff7675; |
| margin-top: 0.5rem; |
| } |
| |
| #restart-btn:hover { |
| background-color: #d63031; |
| } |
| |
| .progress-container { |
| width: 100%; |
| background-color: #eeeeee; |
| border-radius: 50px; |
| overflow: hidden; |
| margin: 1rem 0; |
| } |
| |
| .progress-bar { |
| height: 16px; |
| background-color: #3498db; |
| width: 0%; |
| transition: width 0.3s ease; |
| } |
| |
| #score { |
| margin-top: 1rem; |
| font-weight: 600; |
| color: #333; |
| } |
| |
| .note { |
| margin-top: 0.75rem; |
| font-size: 0.85rem; |
| color: #555; |
| text-align: center; |
| opacity: 0.9; |
| } |
| </style> |
| </head> |
|
|
| <body> |
| <h1>GenAI Fact or Fiction</h1> |
|
|
| <div class="article-link"> |
| Read the article: |
| <a href="https://www.linkedin.com/pulse/genai-mcp-michael-lively-jhguc/" target="_blank" rel="noopener noreferrer"> |
| GenAI + MCP (LinkedIn) |
| </a> |
| </div> |
|
|
| <div id="game-container"> |
| <div class="progress-container"> |
| <div class="progress-bar" id="progress-bar"></div> |
| </div> |
|
|
| <div id="statement">Loading statement...</div> |
|
|
| <div class="btn-group"> |
| <button onclick="guessFact()">Fact</button> |
| <button onclick="guessFiction()">Fiction</button> |
| </div> |
|
|
| <div id="result"></div> |
| <div id="explanation"></div> |
|
|
| <button id="next-btn" style="display:none;" onclick="nextStatement()">Next</button> |
| <button id="restart-btn" style="display:none;" onclick="restartGame()">Restart</button> |
|
|
| <div id="score"></div> |
|
|
| <div class="note">10 questions • 5 Facts + 5 Fictions • Even (alternating) random spread each play</div> |
| </div> |
|
|
| <script> |
| const masterStatements = [ |
| |
| { |
| text: "The 'Agent Delusion' is the mistake of thinking a successful AI agent is mostly about picking the best LLM or prompt, while ignoring the problem environment.", |
| isFact: true, |
| explanation: "Fact! The article says the 'Agent Delusion' happens when teams focus too narrowly on the model or prompt and ignore the world the agent must navigate." |
| }, |
| { |
| text: "In the PEAS framework, a good performance measure should evaluate the external state of the environment, not just count the agent’s internal actions.", |
| isFact: true, |
| explanation: "Fact! The article stresses that performance should be measured by real-world outcomes, not internal activity like miles driven or gears shifted." |
| }, |
| { |
| text: "Partially observable environments often require agents to maintain memory or an internal world model, because they cannot see everything at once.", |
| isFact: true, |
| explanation: "Fact! The article contrasts fully observable environments like chess with partially observable ones like driving, where memory and internal models are needed." |
| }, |
| { |
| text: "A utility-based agent can balance conflicting goals like speed, safety, and cost by quantifying trade-offs between outcomes.", |
| isFact: true, |
| explanation: "Fact! The article places utility-based agents at the top of the ladder because they can weigh competing preferences and find the most useful path." |
| }, |
| { |
| text: "MCP is described as the 'USB-C port' of AI applications because it creates a universal, interoperable way for AI systems to connect to tools and context.", |
| isFact: true, |
| explanation: "Fact! The article explicitly compares MCP to USB-C because it standardizes how AI applications connect to external tools and resources." |
| }, |
| |
| |
| { |
| text: "The best way to define AI success is to track how many internal steps the agent performs, because more activity always means better results.", |
| isFact: false, |
| explanation: "Fiction! The article warns against measuring internal actions and says success must be based on the external state of the world." |
| }, |
| { |
| text: "A simple reflex agent is the ideal design for partially observable environments because it never needs memory or an internal model.", |
| isFact: false, |
| explanation: "Fiction! The article says simple reflex agents are vulnerable in partially observable environments and that model-based agents are needed to handle hidden state." |
| }, |
| { |
| text: "The article argues that users naturally treat AI agents as purely mechanical tools, so social design and transparency are not major concerns.", |
| isFact: false, |
| explanation: "Fiction! The article highlights the 'Social Being' paradox and says users often treat agents like social beings, making trust and transparency essential." |
| }, |
| { |
| text: "MCP keeps models tightly coupled to one vendor’s API, which makes toolsets harder to reuse across different clients and platforms.", |
| isFact: false, |
| explanation: "Fiction! The article says MCP does the opposite: it decouples models from implementations and supports portability across compliant environments." |
| }, |
| { |
| text: "According to the article, chatbots and AI agents are basically the same because both are rigid systems that cannot interact with live data or execute actions.", |
| isFact: false, |
| explanation: "Fiction! The article draws a sharp distinction: chatbots are rigid and limited, while AI agents are learning, autonomous, adaptive, and can act through tools." |
| } |
| ]; |
| |
| function shuffleArray(arr) { |
| for (let i = arr.length - 1; i > 0; i--) { |
| const j = Math.floor(Math.random() * (i + 1)); |
| [arr[i], arr[j]] = [arr[j], arr[i]]; |
| } |
| return arr; |
| } |
| |
| function buildBalancedDeck(items) { |
| const facts = items.filter(x => x.isFact); |
| const fictions = items.filter(x => !x.isFact); |
| |
| shuffleArray(facts); |
| shuffleArray(fictions); |
| |
| const startWithFact = Math.random() < 0.5; |
| const deck = []; |
| |
| for (let i = 0; i < Math.max(facts.length, fictions.length); i++) { |
| if (startWithFact) { |
| if (facts[i]) deck.push(facts[i]); |
| if (fictions[i]) deck.push(fictions[i]); |
| } else { |
| if (fictions[i]) deck.push(fictions[i]); |
| if (facts[i]) deck.push(facts[i]); |
| } |
| } |
| |
| return deck; |
| } |
| |
| let statements = []; |
| let currentIndex = 0; |
| let score = 0; |
| let answered = false; |
| |
| const statementDiv = document.getElementById("statement"); |
| const resultDiv = document.getElementById("result"); |
| const explanationDiv = document.getElementById("explanation"); |
| const nextBtn = document.getElementById("next-btn"); |
| const restartBtn = document.getElementById("restart-btn"); |
| const scoreDiv = document.getElementById("score"); |
| const progressBar = document.getElementById("progress-bar"); |
| |
| startGame(); |
| |
| function startGame() { |
| statements = buildBalancedDeck(masterStatements); |
| currentIndex = 0; |
| score = 0; |
| answered = false; |
| restartBtn.style.display = "none"; |
| loadStatement(); |
| } |
| |
| function loadStatement() { |
| if (currentIndex >= statements.length) { |
| endGame(); |
| return; |
| } |
| |
| const current = statements[currentIndex]; |
| statementDiv.textContent = current.text; |
| |
| resultDiv.textContent = ""; |
| resultDiv.className = ""; |
| resultDiv.style.display = "none"; |
| |
| explanationDiv.textContent = ""; |
| explanationDiv.style.display = "none"; |
| |
| nextBtn.style.display = "none"; |
| answered = false; |
| |
| const progressPercent = (currentIndex / statements.length) * 100; |
| progressBar.style.width = progressPercent + "%"; |
| scoreDiv.textContent = `Score: ${score} / ${statements.length}`; |
| } |
| |
| function guessFact() { |
| if (!answered) checkAnswer(true); |
| } |
| |
| function guessFiction() { |
| if (!answered) checkAnswer(false); |
| } |
| |
| function checkAnswer(userGuess) { |
| answered = true; |
| const correctAnswer = statements[currentIndex].isFact; |
| |
| if (userGuess === correctAnswer) { |
| score++; |
| resultDiv.textContent = "Correct!"; |
| resultDiv.className = "correct"; |
| } else { |
| resultDiv.textContent = "Incorrect!"; |
| resultDiv.className = "incorrect"; |
| } |
| |
| resultDiv.style.display = "block"; |
| explanationDiv.textContent = statements[currentIndex].explanation; |
| explanationDiv.style.display = "block"; |
| |
| scoreDiv.textContent = `Score: ${score} / ${statements.length}`; |
| const progressPercent = ((currentIndex + 1) / statements.length) * 100; |
| progressBar.style.width = progressPercent + "%"; |
| |
| if (currentIndex === statements.length - 1) { |
| nextBtn.style.display = "none"; |
| endGame(); |
| } else { |
| nextBtn.style.display = "inline-block"; |
| } |
| } |
| |
| function nextStatement() { |
| currentIndex++; |
| loadStatement(); |
| } |
| |
| function endGame() { |
| statementDiv.textContent = "Game Over!"; |
| resultDiv.textContent = `You scored ${score} out of ${statements.length}!`; |
| resultDiv.className = "correct"; |
| resultDiv.style.display = "block"; |
| |
| explanationDiv.innerHTML = ` |
| Want to review? Open the article here: |
| <a href="https://www.linkedin.com/pulse/genai-mcp-michael-lively-jhguc/" target="_blank" rel="noopener noreferrer"> |
| GenAI + MCP (LinkedIn) |
| </a> |
| `; |
| explanationDiv.style.display = "block"; |
| |
| nextBtn.style.display = "none"; |
| restartBtn.style.display = "inline-block"; |
| progressBar.style.width = "100%"; |
| } |
| |
| function restartGame() { |
| startGame(); |
| } |
| </script> |
| </body> |
| </html> |