Anthropic Academy Courses

AI Fluency for educators

This course empowers faculty, instructional designers, and educational leaders to apply AI Fluency into their own teaching practice and institutional strategy.

rate limit

Code not recognized.

About this course

Anthropic has partnered with academic experts Prof. Joseph Feller (University College Cork) and Prof. Rick Dakan (Ringling College) to launch an AI fluency course that empowers academic faculty, instructional designers, and apply AI Fluency into their own teaching practices.

This course requires an understanding of the 4D AI Fluency Framework covered in our core course.

About this course

Certificate of completion

After finishing the course, you will have the opportunity to take a final assessment and receive a certificate of completion.

Curriculum

  • Introduction and AI Fluency Framework
  • Introduction to AI Fluency for Educators
  • AI Fluency Framework review
  • AI Fluency applications for educators
  • Applying AI Fluency to course design and learning outcomes
  • Applying AI Fluency to learning materials and assignments
  • Conclusion & certificate
  • Certificate of completion

About this course

Anthropic has partnered with academic experts Prof. Joseph Feller (University College Cork) and Prof. Rick Dakan (Ringling College) to launch an AI fluency course that empowers academic faculty, instructional designers, and apply AI Fluency into their own teaching practices.

This course requires an understanding of the 4D AI Fluency Framework covered in our core course.

About this course

Certificate of completion

After finishing the course, you will have the opportunity to take a final assessment and receive a certificate of completion.

Curriculum

  • Introduction and AI Fluency Framework
  • Introduction to AI Fluency for Educators
  • AI Fluency Framework review
  • AI Fluency applications for educators
  • Applying AI Fluency to course design and learning outcomes
  • Applying AI Fluency to learning materials and assignments
  • Conclusion & certificate
  • Certificate of completion
' }, connectors: { label: 'Multiple tools', text: 'Three different tools, one ask. Cowork orchestrates across your connectors in a single run instead of you querying each one separately and stitching the results yourself.', extra: '
' + 'Gmail' + 'Slack' + 'Drive' + '
' }, multistep: { label: 'Multiple steps', text: 'A multi-step job — read, cross-reference, synthesize. Cowork plans the steps, works through them, and keeps going while you do something else.', extra: '
' + '
Read Q3 Sales folder
' + '
Pull from Gmail, Slack, Drive
' + '
Cross-reference decisions
' + '
Draft the summary
' + '
' }, deliverable: { label: 'A real deliverable', text: 'A finished file, not a reply. It lands in your folder as a real .docx you can attach and send.', extra: '
' + '' + 'pricing-summary.docx' + '
' } }; var clicked = {}; var $panel = document.getElementById('anc-panel'); var $close = document.getElementById('anc-close'); var $helper = document.getElementById('anc-helper-text'); var $progress = document.getElementById('anc-progress'); var $spans = document.querySelectorAll('.anc-span'); function activate(key) { clicked\\[key\\] = true; // Spans visual state Array.prototype.forEach.call($spans, function (s) { var k = s.getAttribute('data-span'); s.classList.toggle('is-active', k === key); s.classList.toggle('is-clicked', !!clicked\\[k\\] && k !== key); }); // Progress pips Array.prototype.forEach.call($progress.querySelectorAll('.anc-progress-pip'), function (p) { var k = p.getAttribute('data-pip'); p.classList.toggle('is-on', !!clicked\\[k\\]); }); // Panel content var a = ANNOTATIONS\\[key\\]; $panel.classList.remove('is-empty'); $panel.innerHTML = '
' + '
' + GLYPHS\\[key\\] + '
' + '
' + '

' + a.label + '

' + '

' + a.text + '

' + (a.extra || '') + '
' + '
'; // Helper text var clickedCount = Object.keys(clicked).length; if (clickedCount = 4) $close.classList.add('is-shown'); } Array.prototype.forEach.call($spans, function (span) { span.addEventListener('click', function () { activate(span.getAttribute('data-span')); }); }); })();\n\n### How Cowork works in your environment\n\nCowork works in your environment. Not adjacent to it.\n\n- **On your files** — Claude reads what's in the folder you point it at, writes finished outputs back.\n- **In your apps** — Claude pulls context from the email, calendar, messaging, drive, CRM you've connected.\n- **In your browser** — for web tools that don't have a connector, Claude in Chrome reads and acts on the page itself: dashboards, portals, or anything behind a login.\n- **With your tools** — Claude takes action, not just describes what to do.\n\n### Chat vs. Cowork vs. Code\n\nNow that you know what Cowork is, take a moment to see how it fits alongside the other two ways you work with Claude on the desktop app.\n\nThe three modes are built for different shapes of work. **Chat** is turn-by-turn dialogue — quick exchanges, brainstorming, exploratory thinking, one tool at a time. **Cowork** is what you've just been reading about: a workspace where Claude reaches across many tools, sustains work over time, and produces finished outputs. **Code** is a full development environment that runs inside your codebase, with terminal and git access — built for developers writing and shipping software.\n\nThe interactive below has two parts: a three-way comparison so you can see all three at a glance, and a six-task challenge that asks you to pick the right mode for each scenario.\n\n/\\* Chat / Cowork / Code interactive — namespaced .ccc- to avoid Skilljar collisions \\*/ .ccc { /\\* Chat = olive (the teaching/concept accent), Cowork = clay (the product accent), Code = ink (neutral; not the focus of this course) \\*/ --cap: #788C5D; --cap-soft: rgba(120,140,93,0.12); --lim: #D97757; --lim-soft: rgba(217,119,87,0.10); --code: #6B6A64; --code-soft: rgba(20,20,19,0.05); --paper: #FAF9F5; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --border: rgba(20, 20, 19, 0.12); --radius: 12px; --radius-sm: 6px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-weight: 430; color: var(--ink); line-height: 1.55; margin: 28px 0; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } .ccc \\* { box-sizing: border-box; } /\\* Reset Skilljar's pill link styling, just in case \\*/ .ccc a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* --- Comparison cards --- \\*/ .ccc-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-bottom: 36px; } .ccc-card { background: var(--surface); border: 1px solid var(--border); border-top: 4px solid var(--cap); border-radius: var(--radius); padding: 20px 18px; display: flex; flex-direction: column; } .ccc-card.is-chat { border-top-color: var(--cap); } .ccc-card.is-cowork { border-top-color: var(--lim); } .ccc-card.is-code { border-top-color: var(--code); } .ccc-card-name { font-family: Georgia, serif; font-size: 22px; font-weight: 400; letter-spacing: -0.01em; margin: 0 0 4px; color: var(--ink); } .ccc-card-tag { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; color: var(--ink-3); margin-bottom: 14px; } .ccc-card.is-chat .ccc-card-tag { color: var(--cap); } .ccc-card.is-cowork .ccc-card-tag { color: var(--lim); } .ccc-card.is-code .ccc-card-tag { color: var(--code); } .ccc-card-line { font-size: 14px; color: var(--ink-2); margin: 0 0 14px; } .ccc-card-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 600; color: var(--ink-3); margin: 8px 0 6px; } .ccc-card ul { margin: 0 0 8px; padding-left: 18px; font-size: 13.5px; color: var(--ink-2); } .ccc-card li { margin-bottom: 4px; } /\\* --- Quiz block --- \\*/ .ccc-quiz { background: var(--paper); border: 1px solid var(--border); border-radius: var(--radius); padding: 18px 20px; } .ccc-quiz-title { font-family: Georgia, serif; font-size: 19px; font-weight: 400; letter-spacing: -0.01em; margin: 0 0 2px; color: var(--ink); } .ccc-quiz-sub { font-size: 13px; color: var(--ink-3); margin: 0 0 12px; } .ccc-progress { font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 600; color: var(--ink-3); margin-bottom: 8px; } .ccc-task { font-size: 15.5px; color: var(--ink); background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 14px 16px; margin: 0 0 14px; font-style: italic; } .ccc-options { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-bottom: 14px; } .ccc-btn { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 10px 8px; font-family: inherit; font-size: 14px; font-weight: 500; color: var(--ink-2); cursor: pointer; transition: all 0.15s ease; } .ccc-btn:hover:not(:disabled) { border-color: var(--ink-3); background: #fdfcf8; } .ccc-btn:disabled { cursor: default; opacity: 0.55; } .ccc-btn.is-correct { background: #EAF1E6; border-color: #6B8E5A; color: #2E4A1F; opacity: 1; } .ccc-btn.is-wrong { background: #F6E3D8; border-color: var(--lim); color: #7A3D24; opacity: 1; } .ccc-feedback { background: var(--surface); border: 1px solid var(--border); border-left: 3px solid var(--cap); border-radius: 0 var(--radius-sm) var(--radius-sm) 0; padding: 12px 14px; font-size: 14px; color: var(--ink-2); margin-bottom: 14px; display: none; } .ccc-feedback.is-shown { display: block; } .ccc-feedback.is-cowork { border-left-color: var(--lim); } .ccc-feedback.is-code { border-left-color: var(--code); } .ccc-feedback strong { color: var(--ink); } .ccc-controls { display: flex; justify-content: space-between; align-items: center; } .ccc-next { background: var(--ink); color: var(--surface); border: none; border-radius: 999px; padding: 9px 18px; font-family: inherit; font-size: 13px; font-weight: 500; cursor: pointer; transition: opacity 0.15s ease; } .ccc-next:hover:not(:disabled) { opacity: 0.85; } .ccc-next:disabled { opacity: 0.3; cursor: default; } .ccc-score { font-size: 12px; color: var(--ink-3); } .ccc-done { text-align: center; padding: 8px 0; } .ccc-done-title { font-family: Georgia, serif; font-size: 22px; margin: 8px 0 6px; color: var(--ink); } .ccc-done-line { font-size: 14px; color: var(--ink-2); margin: 0 0 14px; } .ccc-restart { background: transparent; color: var(--ink); border: 1px solid var(--border); border-radius: 999px; padding: 7px 16px; font-family: inherit; font-size: 12px; cursor: pointer; } .ccc-restart:hover { background: var(--surface); } /\\* --- Responsive --- \\*/ @media (max-width: 600px) { .ccc-cards { grid-template-columns: 1fr; gap: 10px; } .ccc-options { grid-template-columns: 1fr; } .ccc-quiz { padding: 20px 16px; } .ccc-card { padding: 16px 14px; } }\n\nChat\n\n### Thinking with Claude\n\nA conversation. You ask, draft, brainstorm, or think out loud — Claude responds in the chat window.\n\nBest for\n\n- Asking questions and exploring ideas\n- Drafting something you'll polish yourself\n- Anything that fits in a single response\n\nCowork\n\n### Delegating to Claude\n\nA workspace. Point Claude at a folder and your tools, describe an outcome — Claude plans, executes, and delivers.\n\nBest for\n\n- Multi-step work across files and tools\n- Producing real deliverables (docs, decks, sheets)\n- Work you want to set in motion and come back to\n\nCode\n\n### Building software with Claude\n\nAn agentic coding tool. Claude works inside a codebase — editing files, running tests, making commits.\n\nBest for\n\n- Working in a repo\n- Building or refactoring across many source files\n- Developer work, not document work\n\n### Match the task to the mode\n\nFor each task, pick the mode you'd reach for. We'll tell you why.\n\nTask 1 of 6\n\nChat Cowork Code\n\nPick a mode to continue Next task\n\n(function () { var tasks = \\[ { text: '\"Read the five vendor PDFs in my Downloads folder, compare them on price and SLAs, and put the result in a spreadsheet.\"', answer: 'cowork', explain: 'Cowork is the right fit. This task touches local files, has multiple steps (read each PDF, extract criteria, compare, format), and ends in a real deliverable on your drive — exactly the shape Cowork is built for.' }, { text: '\"Refactor the authentication module across these five source files and run the test suite.\"', answer: 'code', explain: 'Code is the right fit. This is software work inside a repo — editing source files, running tests, and likely making commits. That\\\\'s Claude Code\\\\'s home turf.' }, { text: '\"Help me brainstorm tagline ideas for our new product launch — about 10 directions, mix of playful and serious.\"', answer: 'chat', explain: 'Chat is the right fit. You\\\\'re thinking out loud and want a list of ideas in the response itself. There\\\\'s no folder to read, no tool to use, and no deliverable beyond the ideas themselves.' }, { text: '\"Pull together a one-page brief on our Q1 results. The numbers are in a spreadsheet on my Desktop, and I\\\\'d like the brief saved in my Reports folder.\"', answer: 'cowork', explain: 'Cowork is the right fit — but this one is a closer call. A one-page brief sounds like something you could draft in Chat, and you could. But the data lives in a spreadsheet on your drive, and you want the deliverable saved to a folder. With Cowork, Claude reads the spreadsheet directly (no copy-paste, accurate numbers) and lands the brief where you want it. The presence of a real file and a real save location is the signal.' }, { text: '\"Take a look at the customer feedback in our #product-feedback Slack channel from this week. What themes are emerging that I should pay attention to?\"', answer: 'chat', explain: 'Chat is the right fit — even though it pulls in data from a connector. A connector being involved isn\\\\'t what makes something Cowork. The question is what you want delivered. Here you want insight — themes you can absorb in conversation, not a saved artifact. Chat can pull from connectors too. Reach for Cowork when there\\\\'s a deliverable that needs to be produced and saved somewhere; reach for Chat when the answer is the conversation.' }, { text: '\"Our React frontend has a bug — the analytics dashboard\\\\'s data table doesn\\\\'t render on mobile. Trace through the components, figure out what\\\\'s wrong, and push a fix.\"', answer: 'code', explain: 'Code is the right fit. \"Fix the dashboard\" can sound like the general doing-work that Cowork handles, but you\\\\'re operating inside a codebase — navigating React components, debugging rendering, and pushing code changes. That\\\\'s what Code is built for. Cowork can read source files, but it\\\\'s not designed to work inside a repo, run a test suite, or manage Git the way Code is.' } \\]; var idx = 0; var correct = 0; var answered = false; var $task = document.getElementById('ccc-task'); var $progress = document.getElementById('ccc-progress'); var $options = document.getElementById('ccc-options'); var $buttons = $options.querySelectorAll('.ccc-btn'); var $feedback = document.getElementById('ccc-feedback'); var $score = document.getElementById('ccc-score'); var $next = document.getElementById('ccc-next'); var $body = document.getElementById('ccc-quiz-body'); function render() { answered = false; var t = tasks\\[idx\\]; $task.textContent = t.text; $progress.textContent = 'Task ' + (idx + 1) + ' of ' + tasks.length; $feedback.classList.remove('is-shown', 'is-cowork', 'is-code'); $feedback.innerHTML = ''; $next.disabled = true; $next.textContent = (idx === tasks.length - 1) ? 'See results' : 'Next task'; $score.textContent = 'Pick a mode to continue'; $buttons.forEach(function (b) { b.disabled = false; b.classList.remove('is-correct', 'is-wrong'); }); } function handleChoice(choice, $btn) { if (answered) return; answered = true; var t = tasks\\[idx\\]; var isRight = (choice === t.answer); if (isRight) correct++; $buttons.forEach(function (b) { b.disabled = true; var c = b.getAttribute('data-choice'); if (c === t.answer) b.classList.add('is-correct'); else if (c === choice) b.classList.add('is-wrong'); }); $feedback.classList.add('is-shown'); if (t.answer === 'cowork') $feedback.classList.add('is-cowork'); if (t.answer === 'code') $feedback.classList.add('is-code'); $feedback.innerHTML = t.explain; $score.textContent = isRight ? 'Nice — that\\\\'s the right call.' : 'Not quite — see the explanation above.'; $next.disabled = false; } function showResults() { $body.innerHTML = '
' + '
Done
' + '

' + correct + ' of ' + tasks.length + ' matched

' + '

The pattern to remember: Chat for thinking, Cowork for delegating, Code for software. When in doubt, ask whether the task touches your files or tools and ends in a real deliverable — if yes, Cowork.

' + '' + '
'; document.getElementById('ccc-restart').addEventListener('click', function () { idx = 0; correct = 0; $body.innerHTML = '
Task 1 of 6
' + '

' + '
' + '' + '' + '' + '
' + '
' + '
' + 'Pick a mode to continue' + '' + '
'; rebind(); render(); }); } function rebind() { $task = document.getElementById('ccc-task'); $progress = document.getElementById('ccc-progress'); $options = document.getElementById('ccc-options'); $buttons = $options.querySelectorAll('.ccc-btn'); $feedback = document.getElementById('ccc-feedback'); $score = document.getElementById('ccc-score'); $next = document.getElementById('ccc-next'); bindOptions(); bindNext(); } function bindOptions() { $buttons.forEach(function (b) { b.addEventListener('click', function () { handleChoice(b.getAttribute('data-choice'), b); }); }); } function bindNext() { $next.addEventListener('click', function () { if (idx as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 8 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Open Cowork in the Claude Desktop app and point it at a working folder\n- Connect the apps where your work lives\n- Recognize what Claude asks before doing — and what it doesn't — so you can hand off work with confidence\n\n* * *\n\n### Install Cowork\n\nCowork runs inside the Claude Desktop app on Mac and Windows. If you don't have it yet, install it from [claude.com/download](https://claude.com/download). Open the app, sign in, and find Cowork in the mode selector at the top right hand corner of the page. If Cowork isn't visible, you may need a paid plan or a more recent version of the desktop app.\n\n### Pointing Claude at a folder\n\nClick **Work in a project** in the prompt bar and pick a folder on your computer. This is the single most important setup choice you'll make for each new task, because the folder is where the work lives. Claude reads every file inside (Word docs, Excel files, PDFs, PowerPoints, whatever's there) and saves finished outputs back to the same location.\n\nChoose a folder that's scoped to one project or stream of work. Claude doesn't need access to your entire documents folder, just the one that includes the files it needs for the task. See the interactive below for an example.\n\n.pkf { --paper: #FAF9F5; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --border: rgba(31,30,29,0.12); --border-strong: rgba(20,20,19,0.16); --hover: rgba(20,20,19,0.04); /\\* Teaching frame — Olive (consistent with L1b, L3a) \\*/ --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); /\\* Verdict warmth (only on success — uses olive, not green, to keep palette tight) \\*/ --verdict-bg: rgba(120,140,93,0.08); --verdict-line: rgba(120,140,93,0.55); --radius: 10px; --radius-sm: 6px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-weight: 430; color: var(--ink); line-height: 1.5; margin: 28px 0; width: 100%; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } .pkf \\*, .pkf \\*::before, .pkf \\*::after { box-sizing: border-box; } /\\* Framing line \\*/ .pkf-frame { margin: 0 4px 14px; padding: 12px 16px; background: var(--olive-soft); border-left: 3px solid var(--olive); border-radius: 0 6px 6px 0; font-size: 13.5px; color: var(--ink); line-height: 1.55; } .pkf-frame strong { color: var(--ink); font-weight: 600; } /\\* Cowork \"Add folder\" dialog look \\*/ .pkf-dialog { background: var(--surface); border: 1px solid var(--border); border-radius: 14px; box-shadow: rgba(0,0,0,0.04) 0px 6px 24px 0px; overflow: hidden; } .pkf-dialog-head { padding: 14px 18px; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 8px; } .pkf-dialog-head svg { width: 14px; height: 14px; color: var(--ink-3); } .pkf-dialog-title { font-size: 13px; font-weight: 600; color: var(--ink); letter-spacing: -0.005em; } /\\* Two-column body \\*/ .pkf-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); min-height: 380px; } .pkf-tree { padding: 14px 8px 16px 14px; border-right: 1px solid var(--border); background: var(--paper); overflow: auto; } .pkf-consequence { padding: 18px 20px; background: var(--surface); display: flex; flex-direction: column; min-width: 0; } /\\* Tree \\*/ .pkf-tree-eyebrow { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-4); margin: 0 0 8px 6px; } .pkf-row { display: flex; align-items: center; gap: 6px; padding: 5px 8px 5px 4px; border-radius: 6px; cursor: pointer; user-select: none; font-size: 13px; color: var(--ink); transition: background 0.12s ease; position: relative; } .pkf-row:hover { background: var(--hover); } .pkf-row.is-selected { background: var(--clay-soft); } .pkf-row.is-selected .pkf-row-name { color: var(--ink); font-weight: 600; } .pkf-row.is-target.is-selected { background: var(--verdict-bg); } .pkf-row .pkf-row-toggle { width: 14px; height: 14px; flex-shrink: 0; color: var(--ink-3); display: inline-flex; align-items: center; justify-content: center; transition: transform 0.15s ease; } .pkf-row .pkf-row-toggle.is-open { transform: rotate(90deg); } .pkf-row .pkf-row-toggle.is-leaf { visibility: hidden; } .pkf-row .pkf-row-toggle svg { width: 9px; height: 9px; } .pkf-row .pkf-row-icon { width: 14px; height: 12px; flex-shrink: 0; color: var(--clay); } .pkf-row.is-target .pkf-row-icon { color: var(--olive); } .pkf-row-name { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .pkf-row-count { font-size: 11.5px; color: var(--ink-3); font-variant-numeric: tabular-nums; flex-shrink: 0; margin-left: 6px; } .pkf-row-target-mark { font-size: 10px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--olive); margin-left: 8px; flex-shrink: 0; } /\\* Indented children \\*/ .pkf-children { margin-left: 14px; padding-left: 8px; border-left: 1px dashed rgba(20,20,19,0.10); display: none; } .pkf-children.is-open { display: block; } /\\* Consequence panel \\*/ .pkf-cons-empty { flex: 1; display: flex; align-items: center; justify-content: center; text-align: center; color: var(--ink-3); font-size: 13px; font-style: italic; padding: 24px 16px; } .pkf-cons-content { display: none; flex-direction: column; gap: 14px; } .pkf-cons-content.is-shown { display: flex; } .pkf-cons-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; } .pkf-cons-label { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-4); } .pkf-cons-name { font-size: 15px; font-weight: 600; color: var(--ink); letter-spacing: -0.01em; } .pkf-counter { display: flex; align-items: baseline; gap: 8px; padding: 12px 14px; background: var(--paper); border: 1px solid var(--border); border-radius: 8px; } .pkf-counter-num { font-size: 26px; font-weight: 600; color: var(--ink); letter-spacing: -0.02em; font-variant-numeric: tabular-nums; } .pkf-counter-text { font-size: 12.5px; color: var(--ink-3); } .pkf-cons-content.is-target .pkf-counter { background: var(--verdict-bg); border-color: var(--verdict-line); } .pkf-cons-content.is-target .pkf-counter-num { color: var(--olive); } /\\* Sample list \\*/ .pkf-sample { display: flex; flex-direction: column; gap: 4px; } .pkf-sample-eyebrow { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-4); margin-bottom: 2px; } .pkf-sample-row { display: flex; align-items: center; gap: 8px; padding: 5px 10px; background: var(--paper); border: 1px solid var(--border); border-radius: 6px; font-size: 12.5px; color: var(--ink-2); } .pkf-sample-row svg { width: 11px; height: 13px; color: var(--ink-4); flex-shrink: 0; } .pkf-sample-row.is-folder svg { color: var(--clay); width: 13px; height: 11px; } .pkf-sample-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /\\* Callout \\*/ .pkf-callout { padding: 12px 14px; border-radius: 8px; font-size: 13.5px; line-height: 1.5; background: var(--olive-soft); border-left: 3px solid var(--olive); color: var(--ink); } .pkf-callout strong { font-weight: 600; } .pkf-cons-content.is-target .pkf-callout { background: var(--verdict-bg); border-left-color: var(--olive); } .pkf-callout-icon { display: inline-block; width: 13px; height: 13px; color: var(--olive); margin-right: 6px; vertical-align: -2px; } /\\* End-state \\*/ .pkf-endstate { margin: 14px 4px 0; padding: 12px 16px; background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 8px; font-size: 13.5px; color: var(--ink); line-height: 1.55; opacity: 0; max-height: 0; overflow: hidden; transition: opacity 0.4s ease, max-height 0.4s ease, padding 0.4s ease, margin 0.4s ease; padding-top: 0; padding-bottom: 0; } .pkf-endstate.is-shown { opacity: 1; max-height: 200px; padding: 12px 16px; } .pkf-endstate strong { font-weight: 600; } /\\* Responsive \\*/ @media (max-width: 640px) { .pkf-body { grid-template-columns: 1fr; min-height: 0; } .pkf-tree { border-right: none; border-bottom: 1px solid var(--border); padding: 12px 8px 14px 12px; } .pkf-consequence { padding: 16px 16px 18px; min-height: 240px; } }\n\nYou're about to ask Cowork to write the **Q3 competitive memo**. Pick the folder it should work in.\n\nAdd folder for Cowork\n\nYour computer\n\nClick a folder to see what comes into scope.\n\n**Pick the smallest folder that holds what the task needs.** You can always add another folder later if you need to give Cowork access to something outside it.\n\n(function () { // Icons var SVG\\_FOLDER = ''; var SVG\\_FILE = ''; var SVG\\_CHEV = ''; var SVG\\_CHECK = ''; // Tree data var TREE = \\[ { id: 'home', name: '~ (Home)', count: 24782, children: \\[ { id: 'desktop', name: 'Desktop', count: 1203, children: \\[\\] }, { id: 'downloads', name: 'Downloads', count: 3800, children: \\[\\] }, { id: 'documents', name: 'Documents', count: 8910, children: \\[ { id: 'personal', name: 'Personal', count: 2400, children: \\[\\] }, { id: 'work', name: 'Work', count: 6400, children: \\[ { id: 'clients', name: 'Clients', count: 4100, children: \\[ { id: 'northwind', name: 'Northwind', count: 340, children: \\[\\] }, { id: 'acme', name: 'Acme', count: 89, children: \\[\\] } \\]}, { id: 'q3', name: 'Q3 Competitive Review', count: 12, children: \\[\\], target: true } \\]} \\]} \\]} \\]; // Per-folder content var DATA = { home: { sample: \\[ { name: 'tax-return-2024.pdf' }, { name: 'IMG\\_4012.HEIC' }, { name: 'Personal/mortgage/', folder: true } \\], callout: 'That’s your entire home folder. Cowork now has read and write access to all 24,000 files in it — including Personal/ and every other client. Anything it saves could land anywhere in there.' }, desktop: { sample: \\[ { name: 'meeting-notes.txt' }, { name: 'screenshot-jan-12.png' }, { name: 'random-pdf.pdf' } \\], callout: 'Your desktop catch-all. The competitive review materials don’t live here.' }, downloads: { sample: \\[ { name: 'installer.dmg' }, { name: 'invoice (3).pdf' }, { name: 'Screenshot 2026-…' } \\], callout: 'Wrong neighborhood — the competitive review materials aren’t in Downloads at all.' }, documents: { sample: \\[ { name: 'Personal/', folder: true }, { name: 'Work/', folder: true }, { name: 'Archive/old-resumes/', folder: true } \\], callout: 'The materials are somewhere under here — but so are your personal docs. Keep narrowing.' }, personal: { sample: \\[ { name: 'mortgage/', folder: true }, { name: 'medical/', folder: true }, { name: 'family-photos/', folder: true } \\], callout: 'Nothing here is work. And you probably don’t want Cowork with write access to it.' }, work: { sample: \\[ { name: 'Clients/', folder: true }, { name: 'Q3 Competitive Review/', folder: true }, { name: '2025 planning/', folder: true } \\], callout: 'Closer — the folder you want is right here. But selecting Work gives Cowork write access to every client folder too.' }, clients: { sample: \\[ { name: 'Northwind/', folder: true }, { name: 'Acme/', folder: true }, { name: 'Globex/', folder: true } \\], callout: 'That’s client work — not where the competitive review lives. Back up one level.' }, northwind: { sample: \\[ { name: 'SOW-v3.docx' }, { name: 'kickoff-notes.md' }, { name: 'rates-2026.xlsx' } \\], callout: 'That’s one client’s deliverables — not where the competitive review lives. Back up.' }, acme: { sample: \\[ { name: 'contract.pdf' }, { name: 'roadmap.docx' }, { name: 'kickoff-notes.md' } \\], callout: 'That’s one client’s deliverables — not where the competitive review lives. Back up.' }, q3: { sample: \\[ { name: 'analyst-call-1.pdf' }, { name: 'gartner-snapshot.pdf' }, { name: 'Q2-memo.docx' } \\], callout: 'Exactly what the task needs. Cowork reads the analyst PDFs and last quarter’s memo, writes the new one here, and can’t touch anything else.', target: true } }; // State var openFolders = { home: true, documents: true, work: true }; // start drilled to \"work\" var selectedId = null; var $root = document.getElementById('pkf-tree-root'); var $consEmpty = document.getElementById('pkf-cons-empty'); var $cons = document.getElementById('pkf-cons-content'); var $endstate = document.getElementById('pkf-endstate'); function fmt(n) { return n.toLocaleString('en-US'); } function renderTree() { $root.innerHTML = ''; TREE.forEach(function (node) { $root.appendChild(buildNode(node, 0)); }); } function buildNode(node, depth) { var wrap = document.createElement('div'); var row = document.createElement('div'); row.className = 'pkf-row' + (node.target ? ' is-target' : '') + (selectedId === node.id ? ' is-selected' : ''); row.setAttribute('data-id', node.id); var hasChildren = node.children && node.children.length > 0; var isOpen = !!openFolders\\[node.id\\]; var toggle = document.createElement('span'); toggle.className = 'pkf-row-toggle' + (hasChildren ? '' : ' is-leaf') + (isOpen ? ' is-open' : ''); toggle.innerHTML = SVG\\_CHEV; row.appendChild(toggle); var icon = document.createElement('span'); icon.className = 'pkf-row-icon'; icon.innerHTML = SVG\\_FOLDER; row.appendChild(icon); var name = document.createElement('span'); name.className = 'pkf-row-name'; name.textContent = node.name; row.appendChild(name); var count = document.createElement('span'); count.className = 'pkf-row-count'; count.textContent = fmt(node.count); row.appendChild(count); if (node.target) { var mark = document.createElement('span'); mark.className = 'pkf-row-target-mark'; mark.textContent = 'target'; row.appendChild(mark); } row.addEventListener('click', function (e) { e.stopPropagation(); // Toggle open if has children, regardless of where clicked (chevron also fine) if (hasChildren) { openFolders\\[node.id\\] = !openFolders\\[node.id\\]; } // Always select on click selectedId = node.id; renderTree(); renderConsequence(); }); wrap.appendChild(row); if (hasChildren) { var kids = document.createElement('div'); kids.className = 'pkf-children' + (isOpen ? ' is-open' : ''); node.children.forEach(function (c) { kids.appendChild(buildNode(c, depth + 1)); }); wrap.appendChild(kids); } return wrap; } // Walk tree to find a node by id (for count + name + target) function findNode(id, list) { list = list || TREE; for (var i = 0; i ' + icon + '' + item.name + ''; }).join(''); var nameLabel = isTarget ? '' + node.name + ' ' : '' + node.name + ''; var calloutPrefix = isTarget ? '' : ''; $cons.innerHTML = '
' + 'In scope' + nameLabel + '
' + '
' + '' + fmt(node.count) + '' + 'files Cowork can read & write' + '
' + '
' + '
Sample of what’s now in scope
' + sampleHtml + '
' + '
' + calloutPrefix + data.callout + '
'; // End-state if (isTarget) $endstate.classList.add('is-shown'); } renderTree(); renderConsequence(); })();\n\n**The folder is where Cowork has read AND write access.** It can open your files, edit them, create new ones, and organize them. This is the main difference from Chat: In Chat, Claude can read what you upload but can't save anything back to your computer — in Cowork, Claude can.\n\n**Pick a real folder with the right context.** Cowork works best when the folder has the context for what you're doing — the source materials, the relevant documents, the templates.\n\n**Cloud-based files behave differently.** What a cloud connector lets Claude do varies. Many — like the default Google Drive and M365 connectors — are read-and-search only. Others can also create or edit. To confirm what your connectors can do, check each connector's description when you enable it. The most reliable place for Claude to build and iterate on a document is still your local working folder.\n\n### Adding connectors\n\nConnectors are how Claude reaches into the apps where your work already happens — your email, your calendar, your team messaging tool, your CRM, your cloud storage. You set them up once in the **Customize** area and then you can toggle off/on the connectors you need for each task.\n\nConnectors most people set up first:\n\n- **Email and calendar** (Outlook via M365 or Gmail) — for pulling context out of meetings, drafting follow-ups, finding past threads\n- **Messaging** (Slack or Teams via M365) — for searching channel history and synthesizing what your team has said\n- **Cloud storage** (SharePoint or OneDrive via Microsoft 365, Google Drive, Box) — for accessing documents that don't live on your local machine\n- **CRM and project tools** — Notion, Salesforce, HubSpot, Asana, Linear, and others, depending on what your team uses and where your real data lives\n\nOnce a connector is on, you reference it naturally in your prompts. \"Check what the team said in Slack about the launch\" or \"find the customer follow-up email from last quarter\" — Claude knows where to look.\n\nTry this interactive below to see the power of connecting Claude to your work.\n\n.cblk { --paper: #FAF9F5; --surface: #FFFFFF; --surface-2: #F5F4ED; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --coral: #D97757; --green: #788C5D; --oat: #E3DACC; --border: rgba(20, 20, 19, 0.10); --border-strong: rgba(20, 20, 19, 0.16); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; width: 100%; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } .cblk \\* { box-sizing: border-box; } .cblk-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 12px 22px; } .cblk-card { background: var(--paper); border: 1px solid var(--border); border-radius: 6px; padding: 32px 32px 26px; width: 100%; } .cblk-sub { font-size: 13px; color: var(--coral); font-weight: 500; margin: 0 0 6px; letter-spacing: 0.005em; } .cblk-title { font-family: Georgia, 'Times New Roman', serif; font-size: 28px; font-weight: 400; letter-spacing: -0.015em; margin: 0 0 10px; color: var(--ink); line-height: 1.2; } .cblk-lede { font-size: 14.5px; color: var(--ink-2); margin: 0 0 24px; } /\\* The two-pane interactive \\*/ .cblk-grid { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); gap: 14px; } /\\* ----- Left: connectors panel ----- \\*/ .cblk-panel { background: var(--surface); border: 1px solid var(--border); border-radius: 6px; overflow: hidden; display: flex; flex-direction: column; } .cblk-panel-head { padding: 14px 16px 10px; border-bottom: 1px solid var(--border); } .cblk-panel-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-3); margin: 0 0 4px; } .cblk-panel-name { font-size: 14px; font-weight: 600; color: var(--ink); letter-spacing: 0.005em; } .cblk-bulk { display: flex; gap: 6px; padding: 10px 16px; align-items: center; border-bottom: 1px solid var(--border); } .cblk-bulk-btn { appearance: none; background: transparent; border: 1px solid var(--border-strong); color: var(--ink-2); font: inherit; font-size: 12px; font-weight: 500; padding: 4px 10px; border-radius: 999px; cursor: pointer; transition: background 0.15s ease, border-color 0.15s ease; } .cblk-bulk-btn:hover { background: var(--surface-2); border-color: var(--ink-3); } .cblk-bulk-btn:focus-visible { outline: 2px solid var(--coral); outline-offset: 2px; } .cblk-bulk-count { margin-left: auto; font-size: 12px; color: var(--ink-3); } .cblk-bulk-count strong { color: var(--ink); font-weight: 600; } .cblk-rows { flex: 1; } .cblk-row { display: flex; align-items: center; gap: 12px; padding: 13px 16px; border-bottom: 1px solid var(--border); transition: background 0.15s ease; } .cblk-row:last-child { border-bottom: none; } .cblk-row.is-on { background: var(--surface-2); } .cblk-icon { width: 32px; height: 32px; flex-shrink: 0; border-radius: 6px; background: var(--surface-2); display: flex; align-items: center; justify-content: center; } .cblk-row.is-on .cblk-icon { background: #fff; border: 1px solid var(--border); } .cblk-icon svg { width: 22px; height: 22px; display: block; } .cblk-row-text { flex: 1; min-width: 0; } .cblk-row-name { font-size: 13.5px; font-weight: 600; color: var(--ink); } .cblk-row-desc { font-size: 12px; color: var(--ink-3); margin-top: 2px; line-height: 1.35; } /\\* Toggle \\*/ .cblk-toggle { appearance: none; background: var(--ink-4); border: 0; padding: 0; width: 36px; height: 21px; border-radius: 999px; position: relative; flex-shrink: 0; cursor: pointer; transition: background 0.2s ease; } .cblk-toggle\\[aria-checked=\"true\"\\] { background: #2C84DB; } .cblk-toggle:focus-visible { outline: 2px solid #2C84DB; outline-offset: 3px; } .cblk-toggle-thumb { position: absolute; top: 2px; left: 2px; width: 17px; height: 17px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,0.18); transition: transform 0.2s ease; } .cblk-toggle\\[aria-checked=\"true\"\\] .cblk-toggle-thumb { transform: translateX(15px); } /\\* ----- Right: consequence panel ----- \\*/ .cblk-conseq { background: rgba(120,140,93,0.10); border: 1px solid rgba(120,140,93,0.40); border-radius: 8px; padding: 16px 18px 18px; display: flex; flex-direction: column; gap: 14px; } .cblk-conseq-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-3); margin: 0 0 4px; } .cblk-conseq-head { font-family: Georgia, 'Times New Roman', serif; font-size: 17px; font-weight: 400; color: var(--ink); line-height: 1.3; letter-spacing: -0.005em; } .cblk-count-pill { display: inline-block; min-width: 20px; padding: 0 7px; height: 20px; line-height: 20px; text-align: center; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 11px; font-weight: 600; background: var(--ink); color: var(--paper); border-radius: 999px; margin-right: 6px; transform: translateY(-2px); } .cblk-pills { display: flex; flex-wrap: wrap; gap: 6px; } .cblk-pill { font-size: 12px; background: #fff; color: var(--ink); padding: 4px 10px; border-radius: 999px; border: 1px solid var(--border); display: inline-flex; align-items: center; gap: 6px; animation: cblkPill 0.2s ease both; } .cblk-pill .cblk-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--coral); } @keyframes cblkPill { from { opacity: 0; transform: translateY(2px); } to { opacity: 1; transform: translateY(0); } } .cblk-empty { font-size: 13px; font-style: italic; color: var(--ink-3); } .cblk-narration { font-size: 13px; color: var(--ink); line-height: 1.5; min-height: 1em; } .cblk-prompt { background: #fff; border: 1px solid var(--border); border-radius: 6px; padding: 12px 14px; } .cblk-prompt-label { font-size: 10px; font-weight: 600; letter-spacing: 0.10em; text-transform: uppercase; color: var(--ink-3); margin-bottom: 6px; } .cblk-prompt-text { font-size: 13px; color: var(--ink); line-height: 1.5; font-family: Georgia, 'Times New Roman', serif; } .cblk-prompt-text .cblk-quote { color: var(--ink); } .cblk-prompt-text .cblk-strike { text-decoration: line-through; color: var(--ink-3); } .cblk-prompt-foot { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 12.5px; color: var(--ink-2); margin-top: 8px; padding-top: 8px; border-top: 1px dashed var(--border); line-height: 1.45; } .cblk-verdict { margin-top: auto; display: inline-flex; align-self: flex-start; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; padding: 4px 10px; border-radius: 999px; background: #fff; border: 1px solid var(--border); color: var(--ink-3); text-transform: uppercase; letter-spacing: 0.08em; } .cblk-verdict .cblk-vdot { width: 6px; height: 6px; border-radius: 50%; background: var(--ink-4); } .cblk-verdict.is-low { color: var(--ink-3); } .cblk-verdict.is-mid { color: var(--coral); } .cblk-verdict.is-mid .cblk-vdot { background: var(--coral); } .cblk-verdict.is-high { color: var(--green); } .cblk-verdict.is-high .cblk-vdot { background: var(--green); } /\\* Responsive \\*/ @media (max-width: 640px) { .cblk-grid { grid-template-columns: 1fr; } } @media (max-width: 600px) { .cblk-card { padding: 22px 18px 18px; } .cblk-eyebrow { margin-left: 4px; } .cblk-title { font-size: 22px; } } @media (prefers-reduced-motion: reduce) { .cblk-toggle, .cblk-toggle-thumb, .cblk-row, .cblk-bulk-btn, .cblk-pill { transition: none; animation: none; } }\n\nConnectors\n\nTry it\n\n### Toggle the connectors Cowork can reach for this task.\n\nEach task only uses the connectors you've toggled on. Flip them and watch what changes — both the reach and the kind of work Cowork can actually do.\n\nCustomize\n\nConnectors for this task\n\nAll on All off\n\n**0** of 4 on\n\nGmail\n\nRead mail, draft replies, find past threads\n\nGoogle Calendar\n\nSee meetings, create or update events, pull context from invites\n\nSlack\n\nSearch channels, summarize threads, send messages\n\nGoogle Drive\n\nSearch documents, pull data, summarize folders\n\nWhat Cowork can reach\n\n0Nothing connected yet.\n\nFlip a connector and Cowork can pull from that source for this task.\n\nWorked example\n\n\"Draft a Monday status update .\"\n\nReach: none\n\n(function () { var root = document.getElementById(\"cblkConn\"); if (!root) return; var CONNECTORS = { gmail: { label: \"Gmail\", verb: \"read your mail\" }, gcal: { label: \"Google Calendar\", verb: \"see your meetings\" }, slack: { label: \"Slack\", verb: \"summarize Slack threads\" }, gdrive: { label: \"Google Drive\", verb: \"open documents and folders\" } }; // Worked-example segments — each tied to a connector. Strikethrough when off. var SEGS = \\[ { key: \"slack\", text: \"this week's Slack threads\" }, { key: \"gcal\", text: \"the meetings on your calendar\" }, { key: \"gmail\", text: \"open email threads\" }, { key: \"gdrive\", text: \"the planning doc in Drive\" } \\]; // Pre-canned narration for notable configs; otherwise build from verbs. var PRESETS = { \"\": \"Flip a connector and Cowork can pull from that source for this task.\", \"gmail\": \"Cowork can read your mail and draft replies. It won't see your calendar, Slack, or files — those stay out of reach until you toggle them on.\", \"gcal\": \"Cowork can see what's on your calendar and pull context from invites. Mail, Slack, and files stay out of reach.\", \"slack\": \"Cowork can search Slack channels and summarize threads. Mail, calendar, and files stay out of reach.\", \"gdrive\": \"Cowork can open and search Google Drive. It won't read mail, calendar, or Slack until those are on.\", \"gcal,gmail\": \"Cowork sees what's in your inbox and what's on your calendar. Good for \\\\\"draft a follow-up to yesterday's meeting\\\\\" or \\\\\"what's on for tomorrow.\\\\\"\", \"gmail,slack\": \"Cowork sees what people emailed and what they said in Slack. Good for \\\\\"summarize the conversation about the launch.\\\\\"\", \"gdrive,gmail\": \"Cowork sees the documents and the email context around them. Good for \\\\\"draft a follow-up using last week's brief.\\\\\"\", \"gcal,gmail,slack\": \"Cowork sees the conversations and what was scheduled. Good for \\\\\"summarize the week\\\\\" — but it can't open documents.\", \"gcal,gdrive,gmail,slack\": \"Full reach. Cowork can pull context from every connected tool — powerful, but assess how much you trust a connector before turning it on.\" }; var toggles = root.querySelectorAll(\".cblk-toggle\"); var els = { countOn: document.getElementById(\"cblkCountOn\"), count: document.getElementById(\"cblkCount\"), head: document.getElementById(\"cblkHead\"), pills: document.getElementById(\"cblkPills\"), narration: document.getElementById(\"cblkNarration\"), promptSegs: document.getElementById(\"cblkPromptSegs\"), promptFoot: document.getElementById(\"cblkPromptFoot\"), verdict: document.getElementById(\"cblkVerdict\"), verdictText: document.getElementById(\"cblkVerdictText\") }; function activeKeys() { var on = \\[\\]; toggles.forEach(function (btn) { if (btn.getAttribute(\"aria-checked\") === \"true\") on.push(btn.dataset.key); }); return on; } function setToggle(btn, on) { btn.setAttribute(\"aria-checked\", on ? \"true\" : \"false\"); var row = btn.closest(\".cblk-row\"); if (row) row.classList.toggle(\"is-on\", on); } function renderPills(on) { if (!on.length) { els.pills.innerHTML = 'Cowork can still reason, but can\\\\'t access any of your tools.'; return; } els.pills.innerHTML = on.map(function (k) { return '' + CONNECTORS\\[k\\].label + ''; }).join(\"\"); } function renderHead(on) { els.count.textContent = on.length; if (on.length === 0) els.head.textContent = \"Nothing connected yet.\"; else if (on.length === 4) els.head.textContent = \"Every tool connected.\"; else if (on.length === 1) els.head.textContent = \"One tool connected.\"; else els.head.textContent = on.length + \" tools connected.\"; } function renderNarration(on) { var key = on.slice().sort().join(\",\"); if (PRESETS\\[key\\]) { els.narration.textContent = PRESETS\\[key\\]; return; } if (on.length === 0) { els.narration.textContent = PRESETS\\[\"\"\\]; return; } var verbs = on.map(function (k) { return CONNECTORS\\[k\\].verb; }); var last = verbs.pop(); var sentence = verbs.length ? \"Cowork can \" + verbs.join(\", \") + \", and \" + last + \".\" : \"Cowork can \" + last + \".\"; els.narration.textContent = sentence + \" Other sources stay out of reach.\"; } function joinList(items, cls) { if (items.length === 0) return \"\"; if (items.length === 1) return items\\[0\\]; if (items.length === 2) return items\\[0\\] + ' and ' + items\\[1\\]; return items.slice(0, -1).join(', ') + ', and ' + items\\[items.length - 1\\]; } function renderPrompt(on) { // Build the sentence from active sources first (proper Oxford-comma joining, // joiners un-struck), then append struck-through sources with their own // struck joiners. With zero active, the whole clause including \"from\" is struck. var active = SEGS.filter(function (s) { return on.indexOf(s.key) !== -1; }); var inactive = SEGS.filter(function (s) { return on.indexOf(s.key) === -1; }); var html; if (active.length === 0) { var struck = inactive.map(function (s) { return '' + s.text + ''; }); html = 'from ' + joinList(struck, \"cblk-strike\"); } else { var act = active.map(function (s) { return '' + s.text + ''; }); html = 'from ' + joinList(act, \"cblk-quote\"); inactive.forEach(function (s) { html += ', ' + s.text + ''; }); } els.promptSegs.innerHTML = html; var foot; if (active.length === 0) { foot = \"With nothing connected, Cowork can still reason about what you upload or paste in — but it can't see any of these sources.\"; } else if (inactive.length === 0) { foot = \"Cowork has everything it needs. It can pull all four sources without you uploading or pasting anything.\"; } else { foot = \"Cowork will draft what it can reach and ask about the \" + inactive.length + \" source\" + (inactive.length > 1 ? \"s\" : \"\") + \" it can't see — you'll fill those in.\"; } els.promptFoot.textContent = foot; } function renderVerdict(on) { els.verdict.classList.remove(\"is-low\", \"is-mid\", \"is-high\"); if (on.length === 0) { els.verdict.classList.add(\"is-low\"); els.verdictText.textContent = \"Reach: none\"; } else if (on.length as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 11 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Spot the three patterns of work that suit Cowork: multi-step, file-based, multi-tool\n- Set up a scheduled task with /schedule\n- Send Claude a task from your phone with Dispatch\n\n* * *\n\n### What makes a task right for Claude Cowork\n\nNot every task is a fit for Cowork, and you'll get more out of it when you can recognize the tasks that are. Three patterns cover most of the work Cowork is built for: tasks that take several steps, tasks that leverage context from real files, and tasks that span the tools you already use.\n\n**Pattern 1: The task is multi-step.** If a task requires several steps, it's a good fit for Cowork. In one prompt, Claude gathers context, compares sources, does additional research, drafts a summary, and formats the deliverable. With Cowork, you can hand the whole arc to Claude.\n\nExamples:\n\n- Triage a week of customer-feedback emails into themes, with example quotes for each\n- Pull figures from three reports and a spreadsheet, then assemble them into a single interactive dashboard\n\n**Pattern 2: The task lives in real files on your computer.** Cowork is a great fit for when the objective of the task is to output a real artifact — a Word doc, a spreadsheet, a deck, a PDF — saved in the format you need. And the inputs are real too: Claude reads the existing files in your folder, edits them, and saves changes back. Chat can produce a new document; Cowork works on the files you already have.\n\nExamples:\n\n- A formatted client proposal that pulls from your standard template and the meeting notes\n- A monthly metrics report assembled from raw spreadsheets, complete with charts\n\n**Pattern 3: The task spans multiple tools.** The work touches the systems where you already operate — Gmail, Slack, the M365 suite, your calendar, your CRM. Claude accesses them through your connectors (the integrations that link Claude to your apps), gathers context, and acts. Chat connects to tools too — the difference is that Cowork plans across them and runs the whole sequence as one delegation, instead of you stitching the steps together one prompt at a time.\n\nExamples:\n\n- Drafting follow-up emails in Outlook after a meeting based on the calendar invite, attendee list, and meeting notes\n- Searching Slack for everything the team has said about a launch and synthesizing it into an update\n\nExplore the interactive below to see how Cowork performs across the three patterns.\n\n.tpr { --warm-white: #FDFCF9; --ivory: #FAF9F5; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --blue: #2C84DB; --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); --hairline: 1px solid rgba(31,30,29,0.15); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; color: var(--ink); line-height: 1.55; margin: 28px 0; -webkit-font-smoothing: antialiased; } .tpr \\*, .tpr \\*::before, .tpr \\*::after { box-sizing: border-box; } .tpr button { font-family: inherit; cursor: pointer; } .tpr-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 12px 4px; } .tpr-tabs { display: inline-flex; background: var(--ivory); border: var(--hairline); border-radius: 999px; padding: 3px; margin-bottom: 14px; } .tpr-tab { background: transparent; border: none; font-family: inherit; font-size: 12.5px; font-weight: 500; color: var(--ink-3); padding: 6px 14px; border-radius: 999px; transition: all 0.15s ease; } .tpr-tab:hover { color: var(--ink); } .tpr-tab.is-active { background: var(--warm-white); color: var(--ink); box-shadow: 0 1px 2px rgba(0,0,0,0.05); } .tpr-shell { background: var(--warm-white); border: var(--hairline); border-radius: 12px; padding: 22px 24px 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.04); display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 24px; align-items: start; } /\\* Left: pattern name + definition + examples \\*/ .tpr-text { display: flex; flex-direction: column; gap: 12px; } .tpr-num { font-size: 11px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--clay); margin: 0; } .tpr-name { font-family: Georgia, 'Iowan Old Style', serif; font-size: 22px; font-weight: 400; color: var(--ink); letter-spacing: -0.01em; line-height: 1.2; margin: 0; } .tpr-def { font-size: 14px; color: var(--ink-2); line-height: 1.55; margin: 2px 0 4px; } .tpr-def strong { color: var(--ink); font-weight: 600; } .tpr-examples-h { font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 600; color: var(--ink-4); margin: 6px 0 0; } .tpr-examples { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 6px; } .tpr-examples li { font-size: 13px; color: var(--ink-2); line-height: 1.5; padding-left: 18px; position: relative; } .tpr-examples li::before { content: ''; position: absolute; left: 4px; top: 8px; width: 5px; height: 5px; border-radius: 50%; background: var(--clay); } /\\* Right: the Cowork-UI tell for this pattern — matches real product card \\*/ .tpr-tell { background: #FFFFFF; border: 1px solid rgba(31,30,29,0.15); border-radius: 12px; padding: 16px 18px; min-height: 200px; box-shadow: 0 1px 2px rgba(0,0,0,0.03); } .tpr-tell-h { font-size: 11px; color: var(--ink-3); margin: 0 0 12px; font-style: italic; } /\\* Progress card (multi-step) — matches real Cowork right-sidebar Progress \\*/ .tpr-progress { display: flex; flex-direction: column; gap: 2px; } .tpr-progress-head { font-size: 14px; font-weight: 500; color: var(--ink); margin: 0 0 12px; display: flex; justify-content: space-between; align-items: center; } .tpr-progress-head .ch { color: var(--ink-3); font-weight: 400; transform: rotate(0deg); transition: transform 0.2s; } .tpr-progress-head .ch svg { width: 12px; height: 12px; } .tpr-step { display: flex; align-items: flex-start; gap: 10px; padding: 6px 0; font-size: 13px; line-height: 1.4; } .tpr-step-dot { width: 18px; height: 18px; border-radius: 50%; background: rgba(31,30,29,0.06); display: grid; place-items: center; flex-shrink: 0; font-size: 10px; color: var(--ink-4); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; margin-top: 1px; } .tpr-step.is-done .tpr-step-dot { background: var(--blue); color: transparent; } .tpr-step.is-done .tpr-step-dot::before { content: ''; position: absolute; width: 6px; height: 3px; border-left: 1.5px solid #fff; border-bottom: 1.5px solid #fff; transform: rotate(-45deg) translate(0, -1px); } .tpr-step.is-active .tpr-step-dot { background: var(--blue); color: #fff; animation: tpr-pulse 1.4s ease-in-out infinite; } @keyframes tpr-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(44,132,219,0.35); } 50% { box-shadow: 0 0 0 6px rgba(44,132,219,0); } } .tpr-step-lbl { color: var(--ink-3); flex: 1; } .tpr-step.is-done .tpr-step-lbl { text-decoration: line-through; text-decoration-color: rgba(0,0,0,0.2); } .tpr-step.is-active .tpr-step-lbl { color: var(--ink); font-weight: 500; } /\\* Finder-style folder window (file-based) \\*/ .tpr-finder { border: var(--hairline); border-radius: 10px; background: var(--ivory); overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.04); } .tpr-finder-bar { display: flex; align-items: center; gap: 8px; padding: 8px 12px; background: #F5F3EC; border-bottom: var(--hairline); } .tpr-finder-traffic { display: flex; gap: 5px; } .tpr-finder-traffic span { width: 9px; height: 9px; border-radius: 50%; display: inline-block; } .tpr-finder-title { flex: 1; text-align: center; font-size: 11.5px; font-weight: 500; color: var(--ink-2); margin-left: -42px; } .tpr-finder-head, .tpr-finder-row { display: grid; grid-template-columns: minmax(0, 1.7fr) 0.9fr 0.5fr; gap: 8px; padding: 5px 12px; font-size: 11px; align-items: center; } .tpr-finder-head { color: var(--ink-4); font-weight: 500; border-bottom: var(--hairline); background: var(--ivory); } .tpr-finder-row { color: var(--ink-2); border-bottom: 0.5px solid rgba(31,30,29,0.06); } .tpr-finder-row .n { display: flex; align-items: center; gap: 6px; color: var(--ink); min-width: 0; } .tpr-finder-row .n span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .tpr-finder-row svg { width: 11px; height: 11px; flex-shrink: 0; } .tpr-finder-row.is-new { background: #2C84DB; color: #fff; } .tpr-finder-row.is-new .n, .tpr-finder-row.is-new .d, .tpr-finder-row.is-new .s { color: #fff; } .tpr-finder-row.is-new svg { color: #fff; } /\\* Connector chips (multi-tool) \\*/ .tpr-conns { display: flex; flex-direction: column; gap: 8px; } .tpr-conn { display: flex; align-items: center; gap: 10px; padding: 7px 4px; font-size: 13px; color: var(--ink); } .tpr-conn-ic { width: 22px; height: 22px; border-radius: 5px; background: #fff; border: var(--hairline); display: grid; place-items: center; flex-shrink: 0; padding: 2px; } .tpr-conn-ic svg { width: 14px; height: 14px; display: block; } .tpr-conn-name { flex: 1; } .tpr-conn-toggle { width: 30px; height: 17px; border-radius: 999px; background: rgba(20,20,19,0.20); position: relative; flex-shrink: 0; } .tpr-conn-toggle::after { content: ''; position: absolute; top: 2px; left: 2px; width: 13px; height: 13px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,0.15); transition: left 0.18s ease; } .tpr-conn.is-on .tpr-conn-toggle { background: var(--blue); } .tpr-conn.is-on .tpr-conn-toggle::after { left: 15px; } .tpr-conn:not(.is-on) { opacity: 0.5; } .tpr-caption { margin: 14px 4px 0; padding: 10px 14px; font-size: 13px; color: var(--ink-2); line-height: 1.55; border-left: 2px solid var(--olive-line); } .tpr-caption strong { color: var(--ink); font-weight: 600; } @media (max-width: 640px) { .tpr-shell { grid-template-columns: 1fr; gap: 16px; padding: 18px; } } @media (prefers-reduced-motion: reduce) { .tpr-step.is-active .tpr-step-dot { animation: none; } }\n\nThree patterns of work that suit Cowork\n\nMulti-step File-based Multi-tool\n\n(function () { var FOLDER = ''; var FILE = ''; function step(n, text, status) { var cls = 'tpr-step'; if (status === 'done') cls += ' is-done'; if (status === 'active') cls += ' is-active'; return '
' + '' + (status === 'done' ? '' : n) + '' + '' + text + '' + '
'; } function conn(name, on, svg) { return '
' + '' + svg + '' + '' + name + '' + '' + '
'; } var SLACK = ''; var GMAIL = ''; var M365 = ''; var PATTERNS = { multistep: { num: 'Pattern 1', name: 'The task is multi-step', def: 'If a task requires several steps — gather, compare, draft, format — hand the whole arc to Claude, in one prompt.', examples: \\[ 'Triage a week of customer-feedback emails into themes, with example quotes for each', 'Pull figures from three reports and a spreadsheet, then assemble them into a single dashboard' \\], tellH: 'What you’ll see: the Progress panel', tell: function () { return '
' + '

Progress

' + step(1, 'Read the source files', 'done') + step(2, 'Compare and group', 'done') + step(3, 'Draft the deliverable', 'active') + step(4, 'Format', 'pending') + step(5, 'Self-review', 'pending') + '
'; }, caption: 'Cowork breaks the work into steps and shows you each one as it runs. You can watch it work, or come back when it’s done.' }, filebased: { num: 'Pattern 2', name: 'The task lives in real files', def: 'The output is a real artifact — a Word doc, a spreadsheet, a deck — and the inputs are files you already have. Cowork works on your real files, not just creating new ones.', examples: \\[ 'A formatted client proposal that pulls from your standard template and the meeting notes', 'A monthly metrics report assembled from raw spreadsheets, complete with charts' \\], tellH: 'What you’ll see: a real file saved to your folder', tell: function () { var PDF = ''; var XLS = ''; var DOC = ''; function row(ico, name, date, size, isNew) { return '
' + '
' + ico + '' + name + '
' + '
' + date + '
' + '
' + size + '
' + '
'; } return '
' + '
' + '
' + '
Q4-Earnings
' + '
' + '
Name
Date Modified
Size
' + row(PDF, 'ACME-Q4-Transcript.pdf', 'Feb 24, 2026', '2.1 MB') + row(PDF, 'Birch-Q4-Transcript.pdf', 'Feb 25, 2026', '1.8 MB') + row(XLS, 'Coverage-Model-2026.xlsx', 'Feb 20, 2026', '854 KB') + row(DOC, 'Q3-Research-Note.docx', 'Nov 15, 2025', '342 KB') + row(DOC, 'Q4-Research-Note.docx', 'Just now', '128 KB', true) + '
'; }, caption: 'Point Cowork at a folder. It reads what’s there and saves a finished file back — right alongside the inputs. It works on your real files, not just creating new ones.' }, multitool: { num: 'Pattern 3', name: 'The task spans multiple tools', def: 'The work touches Gmail, Slack, M365, your calendar, your CRM. Claude reaches them through your connectors and runs the whole sequence as one delegation.', examples: \\[ 'Drafting follow-up emails in Outlook based on the calendar invite, attendee list, and meeting notes', 'Searching Slack for everything the team has said about a launch and synthesizing it into an update' \\], tellH: 'What you’ll see: connectors lighting up', tell: function () { return '
' + conn('Gmail', true, GMAIL) + conn('Slack', true, SLACK) + conn('Microsoft 365', false, M365) + '
'; }, caption: 'Each connector you turn on is a tool Cowork can reach into. One prompt; Cowork moves between the tools so you don’t have to.' } }; var $tabs = document.getElementById('tpr-tabs'); var $text = document.getElementById('tpr-text'); var $tell = document.getElementById('tpr-tell'); var $caption = document.getElementById('tpr-caption'); function render(key) { var p = PATTERNS\\[key\\]; $text.innerHTML = '

' + p.num + '

' + '

' + p.name + '

' + '

' + p.def + '

' + '

For example

' + ''; $tell.innerHTML = '

' + p.tellH + '

' + p.tell(); $caption.innerHTML = p.caption; } $tabs.addEventListener('click', function (e) { var btn = e.target.closest('.tpr-tab\\[data-pattern\\]'); if (!btn) return; Array.prototype.forEach.call($tabs.querySelectorAll('.tpr-tab'), function (b) { b.classList.toggle('is-active', b === btn); }); render(btn.getAttribute('data-pattern')); }); render('multistep'); })();\n\nThe through-line across all three patterns is the same: work that used to mean juggling steps, files, and tools in your own head can now be handed off as a single task. When you spot that shape, give it to Cowork.\n\n### Scheduled tasks: have Claude work on a cadence\n\n\n\nScheduled tasks let you set up a task once and have Claude run it on a cadence.\n\nThere are two ways to set up a scheduled task. You can start fresh: type /schedule, describe the task and the cadence, and Claude drafts a prompt for you to review and accept. Or — the more natural path — do the task once in Cowork, confirm the output looks right, then type /schedule to turn that exact process into a recurring one. Tell Claude your preferred cadence (hourly, daily, weekdays, or manual), review the prompt, and accept.\n\nScheduled tasks only run when your computer is on and Claude is running. If your laptop is closed, asleep, or off at the scheduled time, Claude picks the task up as soon as you're back and lets you know it was delayed.\n\nSome ideas worth scheduling:\n\n- A Friday afternoon review: what shipped during the week, a recap of the major decisions made in Slack or Teams, and a preview of next week's tasks\n- A monthly metrics roll-up pulled from your spreadsheets on the first of every month\n- A morning briefing for the meetings on your calendar that draws on past meeting notes in your folder and your email threads to surface necessary context\n\n### Dispatch: send Claude a task from your phone\n\n\n\nSo far we've covered tasks you start at your desk and tasks Claude starts on a schedule. Dispatch covers the third case: tasks you start while away from your computer entirely. Dispatch lets you start a Cowork task from the Claude mobile app. You assign the task from your phone; the work runs on your desktop — same files, same connectors, same permissions; you get a push notification when it's done.\n\nJust like with scheduled tasks, Dispatch only works when your desktop is on, awake, and signed in with Cowork open. If your machine is asleep or off when you send a task from your phone, Claude holds it until you're back at your desk.\n\nA note on availability: Dispatch is in research preview, currently on Pro and Max plans. If you're on an Enterprise plan, it may not be available yet — and where it is enabled, your IT admin sets it up. If you don't see Dispatch in your Claude app, that's likely why.\n\n### Bringing it together\n\nMulti-step, file-based, multi-tool — the patterns tell you what's worth handing off. Scheduled tasks and Dispatch tell you when and where the handoff can happen. The judgment stays with you: Claude plans, executes, and asks. You decide what gets sent, shared, or shipped.\n\n### Lesson reflection\n\nLook at your calendar or to-do list for this week. Pick one piece of work that matches one or more of the three patterns above — multi-step, file-producing, or tool-using. Write it down. You'll hand it to Claude in Lesson 4.\n\n### What’s next\n\nIn the next lesson, you'll walk through delegating that task end to end — from prompt to finished deliverable.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n\n\n## Lesson 4: Hand Claude Cowork your first task\n\n/\\* Slide figure — visual overview separation from prose \\*/ figure.slide { background: #f7f6f1; padding: 20px; border-radius: 10px; margin: 24px 0; } figure.slide figcaption { font-size: 11px; color: #9c9a92; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; margin-bottom: 10px; } figure.slide img { max-width: 100%; height: auto; display: block; border-radius: 6px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); margin: 0; } /\\* Links — Skilljar styles as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 15 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Walk a Cowork task end-to-end: through delegation, mid-task steering, and final review\n- Respond to Cowork's clarifying questions in a way that produces better output\n- Course-correct when Claude heads in the wrong direction\n\n* * *\n\n### Watch one go end-to-end\n\n\n\nThis video walks through a single, real piece of work from delegation to deliverable: the prompt, the clarifying questions Claude asks, the moment the user reroutes mid-task, and the finished result at the end. Notice the rhythm — it's less like prompting a chatbot and more like briefing a smart colleague who's about to disappear into a task and come back with something done.\n\n#### Key takeaways\n\n- **Claude asks before it commits.** Most non-trivial tasks start with a clarifying question or two. The questions are how Claude closes context gaps before the work starts, not friction in the way.\n- **You can steer mid-task.** If Claude is heading in the wrong direction, jump in. You don't have to wait for it to finish and start over.\n- **The finished deliverable is the artifact, not the chat.** Claude makes changes to the files on your computer. Your job at the end is to review it the way you'd review a colleague's work.\n\n### Delegate your first task\n\nYou picked a task in previous lessons. Now is when it leaves your plate. Open Cowork, point it at the folder where the context for the task lives, turn on any connectors that hold relevant context for the task, and write your prompt.\n\nA good Cowork prompt does three things:\n\n- **Names the deliverable.** \"A one-page brief,\" \"a slide for the QBR,\" \"a ranked list with notes per candidate.\" Specifics about format and length save you a regenerate.\n- **Names the inputs.** Which folder, which channels, which date range, which application. Cowork is only as good as the context you point it at.\n- **Names additional specifics or nuances Claude would need to get the job done.** _\"I want to see base, best, and worst case scenarios that also account for the 3 new locations we opened in Q3 last year.\"_ That sentence directs Claude on the type of output you're looking for, and provides key insights from your expertise that Claude might not see.\n\nBuild an example Cowork prompt in the interactive below.\n\n.bpm { /\\* Cowork chrome tokens (canonical) \\*/ --cwk-warm-white: #FFFFFF; --cwk-ivory: #FAF9F5; --cwk-slate: #141413; --cwk-text-2: #3D3D3A; --cwk-text-3: #6B6A64; --cwk-text-4: #B0AEA5; --cwk-clay: #D97757; --cwk-clay-soft: rgba(217,119,87,0.10); --cwk-clay-line: rgba(217,119,87,0.45); --cwk-border: rgba(31,30,29,0.15); --cwk-border-strong: rgba(20,20,19,0.16); --cwk-hover: rgba(20,20,19,0.04); /\\* Olive teaching frame (concept callout only) \\*/ --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-weight: 430; color: var(--cwk-slate); line-height: 1.55; margin: 28px 0; width: 100%; -webkit-font-smoothing: antialiased; } .bpm \\*, .bpm \\*::before, .bpm \\*::after { box-sizing: border-box; } .bpm a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } .bpm-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--cwk-text-4); margin: 0 0 12px 4px; } /\\* Teaching frame around the chip selector — visually distinct from the Cowork composer below \\*/ .bpm-teach { background: var(--olive-soft); border: 1px dashed var(--olive-line); border-radius: 12px; padding: 12px 14px 14px; margin-bottom: 12px; } /\\* Chip rows \\*/ .bpm-rows { display: flex; flex-direction: column; gap: 8px; } .bpm-row { background: rgba(255,255,255,0.55); border: 1px solid rgba(120,140,93,0.20); border-radius: 10px; padding: 10px 12px; display: flex; gap: 14px; align-items: flex-start; } .bpm-row-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--cwk-text-3); width: 80px; flex-shrink: 0; padding-top: 6px; } .bpm-chips { display: flex; flex-wrap: wrap; gap: 6px; flex: 1; } .bpm-chip { appearance: none; font-family: inherit; text-align: left; display: inline-flex; align-items: center; padding: 6px 12px; border: 1px solid var(--cwk-border); background: var(--cwk-warm-white); border-radius: 999px; font-size: 12.5px; color: var(--cwk-text-2); cursor: pointer; transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease; } .bpm-chip:focus-visible { outline: 2px solid var(--cwk-clay); outline-offset: 2px; } .bpm-chip:hover { background: var(--cwk-hover); } .bpm-chip.is-on { background: var(--cwk-clay-soft); border-color: var(--cwk-clay-line); color: var(--cwk-slate); font-weight: 500; } /\\* Cowork composer \\*/ /\\* Cowork composer — pixel match to product screenshot \\*/ .bpm-input { background: #FFFFFF; border: 1px solid rgba(31,30,29,0.15); border-radius: 16px; padding: 16px 18px 12px; box-shadow: 0 1px 3px rgba(0,0,0,0.04), 0 8px 24px rgba(0,0,0,0.04); margin-bottom: 12px; } .bpm-prompt { font-size: 15px; line-height: 1.55; color: var(--cwk-slate); min-height: 48px; margin: 0 0 14px; } .bpm-prompt.is-empty { color: #B0AEA5; } .bpm-span { border-bottom: 1.5px solid var(--cwk-clay-line); padding-bottom: 1px; } /\\* Bottom row: + | Ask ▾ ........... Sonnet 4.6 ▾ | mic \\*/ .bpm-input-foot { display: flex; align-items: center; gap: 4px; } .bpm-foot-btn { appearance: none; background: transparent; border: none; color: #73726C; font-family: inherit; font-size: 13px; padding: 4px 8px; border-radius: 6px; display: inline-flex; align-items: center; gap: 5px; cursor: default; } .bpm-foot-btn:hover { background: rgba(0,0,0,0.04); } .bpm-foot-btn svg { width: 14px; height: 14px; } .bpm-foot-btn.plus svg { width: 16px; height: 16px; } .bpm-foot-btn .car { width: 10px; height: 10px; } .bpm-foot-spacer { flex: 1; } .bpm-foot-btn.model { color: #B0AEA5; font-size: 12.5px; } /\\* Hidden input-label/dot/send for back-compat with existing markup/JS \\*/ .bpm-input-label, .bpm-input-dot, .bpm-input-hint, .bpm-send { display: none; } /\\* Olive verdict (teaching) \\*/ .bpm-verdict { margin: 0 4px; padding: 0 14px; background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 8px; font-size: 13px; color: var(--cwk-slate); line-height: 1.55; display: flex; align-items: flex-start; gap: 8px; opacity: 0; max-height: 0; overflow: hidden; transition: opacity 0.3s ease, max-height 0.3s ease, padding 0.3s ease; } .bpm-verdict.is-shown { opacity: 1; max-height: 100px; padding: 10px 14px; } .bpm-verdict-icon { width: 14px; height: 14px; color: var(--olive); flex-shrink: 0; margin-top: 2px; } .bpm-verdict strong { font-weight: 600; } .bpm-foot-line { margin: 10px 4px 0; font-size: 12.5px; color: var(--cwk-text-3); font-style: italic; } @media (max-width: 560px) { .bpm-row { flex-direction: column; gap: 8px; } .bpm-row-label { width: auto; padding-top: 0; } .bpm-input { padding: 12px 14px 10px; } .bpm-prompt { font-size: 14px; } }\n\nBuild the prompt\n\nDeliverable\n\nfour-page memo slide for the QBR ranked list with notes\n\nInputs\n\nQ3 Competitive Review folder last quarter's memo as format reference analyst-call PDFs only\n\nNuance\n\nfor the executive team at the leadership offsite — help them decide on the new pricing tier lead with the recommendation flag anything we can't verify\n\nWrite a message…\n\nAsk Sonnet 4.6\n\n0 of 3 rows complete\n\n**That's a complete delegation** — deliverable, inputs, and the context Cowork can't guess.\n\nLeave a row empty and Cowork will usually ask you for it.\n\n(function () { var FRAGMENTS = { 'del-memo': { row: 'del', text: 'a four-page memo' }, 'del-slide': { row: 'del', text: 'a single slide for the QBR' }, 'del-list': { row: 'del', text: 'a ranked list with notes' }, 'inp-folder': { row: 'inp', text: 'the Q3 Competitive Review folder' }, 'inp-format': { row: 'inp', text: 'last quarter’s memo as format reference' }, 'inp-pdfs': { row: 'inp', text: 'the analyst-call PDFs' }, 'nua-aud': { row: 'nua', text: 'the audience is the leadership offsite deciding on a new pricing tier' }, 'nua-rec': { row: 'nua', text: 'lead with the recommendation' }, 'nua-flag': { row: 'nua', text: 'flag anything we can’t verify' } }; // del = single-select; inp/nua = multi-select var state = { del: null, inp: \\[\\], nua: \\[\\] }; var $prompt = document.getElementById('bpm-prompt'); var $hint = document.getElementById('bpm-hint'); var $send = document.getElementById('bpm-send'); var $verdict = document.getElementById('bpm-verdict'); var $chips = document.querySelectorAll('.bpm-chip'); function toggle(key) { var row = FRAGMENTS\\[key\\].row; if (row === 'del') { state.del = (state.del === key) ? null : key; } else { var arr = state\\[row\\]; var i = arr.indexOf(key); if (i >= 0) arr.splice(i, 1); else arr.push(key); } render(); } function joinList(arr, conj) { if (arr.length === 0) return ''; if (arr.length === 1) return arr\\[0\\]; if (arr.length === 2) return arr\\[0\\] + ' ' + conj + ' ' + arr\\[1\\]; return arr.slice(0, -1).join(', ') + ', ' + conj + ' ' + arr\\[arr.length - 1\\]; } function span(text) { return '' + text + ''; } function render() { Array.prototype.forEach.call($chips, function (c) { var k = c.getAttribute('data-key'); var row = FRAGMENTS\\[k\\].row; var on = (row === 'del') ? (state.del === k) : (state\\[row\\].indexOf(k) >= 0); c.classList.toggle('is-on', on); }); var parts = \\[\\]; var rowsFilled = 0; if (state.del) { parts.push('Write me ' + span(FRAGMENTS\\[state.del\\].text)); rowsFilled++; } else { parts.push('\\[deliverable\\]'); } if (state.inp.length > 0) { var inps = state.inp.map(function (k) { return span(FRAGMENTS\\[k\\].text); }); parts.push('using ' + joinList(inps, 'and')); rowsFilled++; } if (state.nua.length > 0) { var nuas = state.nua.map(function (k) { return span(FRAGMENTS\\[k\\].text); }); parts.push('— ' + joinList(nuas, 'and')); rowsFilled++; } var html = parts.join(' ') + '.'; $prompt.classList.toggle('is-empty', rowsFilled === 0); $prompt.innerHTML = (rowsFilled === 0) ? 'Write a message…' : '“' + html + '”'; $hint.textContent = rowsFilled + ' of 3 rows complete'; $send.classList.toggle('is-ready', rowsFilled === 3); $send.disabled = (rowsFilled !== 3); $verdict.classList.toggle('is-shown', rowsFilled === 3); } Array.prototype.forEach.call($chips, function (c) { c.addEventListener('click', function () { toggle(c.getAttribute('data-key')); }); }); render(); })();\n\nIf you're used to prompting a chatbot, this will feel like more upfront work — it is. The trade is that more of the back-and-forth happens upfront, before Claude starts, instead of across five rounds of \"actually, can you also...\"\n\n### Answer the clarifying questions\n\nClaude asks questions to clarify any ambiguities about your objectives before it gets into the work. In Chat, you collaborate as you go — context shows up turn by turn. In Cowork, you delegate and it returns with a completed artifact. Anything that might trip it up — any gaps in its understanding — comes up through the questions before it dives in.\n\nMost are easy: Claude presents a couple of options and you click the one that fits. If none of the options fit, you can answer in your own words.\n\nBelow are some examples of the questions you might receive from Cowork after submitting the prompt you built above.\n\n.clq { --paper: #FAF9F5; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --border: rgba(31,30,29,0.12); --hover: rgba(20,20,19,0.04); --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; -webkit-font-smoothing: antialiased; } .clq \\*, .clq \\*::before, .clq \\*::after { box-sizing: border-box; } .clq button { font-family: inherit; cursor: pointer; } .clq-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 12px 4px; } /\\* The modal card itself \\*/ .clq-card { background: var(--surface); border: 0.5px solid var(--border); border-radius: 14px; padding: 18px 20px 14px; box-shadow: 0 2px 8px rgba(0,0,0,0.04); } .clq-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 18px; } .clq-q { font-size: 14px; font-weight: 500; color: var(--ink); line-height: 1.4; margin: 0; flex: 1; } .clq-q strong { font-weight: 600; } .clq-q em { font-style: italic; color: var(--clay); font-weight: 500; } .clq-meta { display: flex; align-items: center; gap: 14px; flex-shrink: 0; padding-top: 6px; } .clq-page { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--ink-3); } .clq-page-arrow { background: none; border: none; width: 18px; height: 18px; color: var(--ink-3); display: flex; align-items: center; justify-content: center; border-radius: 4px; padding: 0; } .clq-page-arrow:hover { background: var(--hover); color: var(--ink); } .clq-page-arrow:disabled { opacity: 0.35; cursor: default; } .clq-page-arrow svg { width: 12px; height: 12px; } .clq-page-text { font-variant-numeric: tabular-nums; color: var(--ink-3); min-width: 38px; text-align: center; } .clq-close { background: none; border: none; width: 22px; height: 22px; color: var(--ink-3); display: flex; align-items: center; justify-content: center; border-radius: 4px; padding: 0; } .clq-close:hover { background: var(--hover); color: var(--ink); } .clq-close svg { width: 14px; height: 14px; } /\\* Options \\*/ .clq-options { display: flex; flex-direction: column; gap: 0; } .clq-opt { appearance: none; background: transparent; border: none; text-align: left; width: 100%; padding: 10px 14px; border-radius: 8px; font-family: inherit; font-size: 13px; color: var(--ink); display: flex; align-items: center; gap: 11px; border-bottom: 0.5px solid var(--border); transition: background 0.12s ease; } .clq-opt:last-of-type { border-bottom: none; } .clq-opt:hover { background: var(--hover); } .clq-opt.is-focus { background: rgba(115,114,108,0.08); } .clq-opt.is-focus .clq-opt-arrow { opacity: 1; transform: translateX(0); } .clq-opt-num { width: 22px; height: 22px; border-radius: 5px; background: rgba(0,0,0,0.05); color: var(--ink-3); font-size: 11px; font-weight: 500; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .clq-opt.is-focus .clq-opt-num { background: var(--ink); color: var(--paper); } .clq-opt-text { flex: 1; } .clq-opt-rec { color: var(--ink-3); font-size: 14px; margin-left: 2px; } .clq-opt-arrow { width: 18px; color: var(--ink-3); opacity: 0; transform: translateX(-4px); transition: opacity 0.15s, transform 0.15s; flex-shrink: 0; } .clq-opt-arrow svg { width: 18px; height: 14px; } /\\* Custom answer (something else) row \\*/ .clq-custom { display: flex; align-items: center; gap: 14px; padding: 14px 16px 4px; border-top: 1px solid var(--border); margin-top: 4px; } .clq-custom-icon { width: 26px; height: 26px; border-radius: 7px; background: rgba(20,20,19,0.04); color: var(--ink-4); display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .clq-custom-icon svg { width: 12px; height: 12px; } .clq-custom-input { flex: 1; border: none; background: transparent; font-family: inherit; font-size: 15px; color: var(--ink); outline: none; padding: 0; } .clq-custom-input::placeholder { color: var(--ink-4); } .clq-skip { appearance: none; background: transparent; border: 1px solid var(--border); color: var(--ink-2); font-family: inherit; font-size: 13px; font-weight: 500; padding: 7px 16px; border-radius: 999px; flex-shrink: 0; } .clq-skip:hover { background: var(--hover); } .clq-helper { text-align: center; margin: 14px 4px 0; font-size: 12.5px; color: var(--ink-4); display: flex; justify-content: center; gap: 22px; flex-wrap: wrap; } .clq-helper kbd { font-family: inherit; font-size: 12.5px; color: var(--ink-3); background: none; border: none; padding: 0 2px; } /\\* Caption (teaching frame) \\*/ .clq-caption { margin: 16px 4px 0; padding: 14px 16px; background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 10px; font-size: 13.5px; color: var(--ink); line-height: 1.55; display: flex; align-items: flex-start; gap: 10px; transition: opacity 0.3s ease; } .clq-caption.is-empty { color: var(--ink-3); background: var(--paper); border-color: var(--border); border-style: dashed; font-style: italic; } .clq-caption.is-skip { background: rgba(20,20,19,0.04); border-color: var(--border); border-style: solid; color: var(--ink-2); } .clq-caption-icon { flex-shrink: 0; margin-top: 2px; color: var(--olive); } .clq-caption.is-skip .clq-caption-icon { color: var(--ink-4); } .clq-caption-icon svg { width: 14px; height: 14px; } .clq-caption-body { flex: 1; } .clq-caption-next { appearance: none; background: var(--olive); color: #fff; border: none; border-radius: 999px; padding: 6px 14px; font-size: 12.5px; font-weight: 500; margin-top: 10px; display: inline-block; cursor: pointer; } .clq-caption-next:hover { filter: brightness(0.96); } .clq-caption-label { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--olive); margin-bottom: 3px; display: block; } .clq-caption.is-skip .clq-caption-label { color: var(--ink-4); } @media (max-width: 560px) { .clq-card { padding: 18px 16px 14px; } .clq-head { flex-direction: column; gap: 10px; } .clq-meta { padding-top: 0; align-self: flex-end; } .clq-q { font-size: 18px; } .clq-opt { padding: 12px 8px; font-size: 14px; gap: 10px; } .clq-helper { gap: 14px; font-size: 11.5px; } } .clq-end { margin-top: 8px; text-align: center; } .clq-restart { background: none; border: none; font-family: inherit; color: var(--clay); font-weight: 600; font-size: 13px; text-decoration: underline; padding: 4px 8px; }\n\nCowork is asking you a few things\n\n1 of 4\n\n Skip\n\n↑↓ to navigate Enter to select Esc to skip\n\nPick an answer to see what it tells Cowork.\n\nTry again\n\n(function () { var QUESTIONS = \\[ { q: 'I see two memos in this folder — Q2-board-memo.docx and Q2-board-memo-FINAL.docx. Which should I match?', opts: \\[ { text: 'Q2-board-memo-FINAL.docx', rec: true }, { text: 'Q2-board-memo.docx' }, { text: 'Either — they’re close enough' } \\], caption: 'Cowork now knows the format target. It’ll mirror that memo’s section order, headings, and length without you specifying them.', label: 'Closes the format gap' }, { q: 'How much of the regional breakdown should the memo cover?', opts: \\[ { text: 'Full regional breakdown for every competitor', rec: true }, { text: 'Regional only where it changed the price' }, { text: 'Product-side moves only — skip regional' } \\], caption: 'This is a scope call. Your answer changes which sources Cowork reads and how long the memo runs.', label: 'Closes the scope gap' }, { q: 'How will the leaders read this memo?', opts: \\[ { text: 'Pre-read the night before', rec: true }, { text: 'Live in a 30-minute slot' }, { text: 'Skim — one page only' } \\], caption: 'Audience and setting. A pre-read gets full reasoning; a 30-min slot gets the recommendation up top and detail in an appendix.', label: 'Closes the audience gap' }, { q: 'When something can’t be verified in the source PDFs, how should I handle it?', opts: \\[ { text: 'Flag it inline as unverified', rec: true }, { text: 'Move it to a footnoted appendix' }, { text: 'Leave it out entirely' } \\], caption: 'Tells Cowork what to do when the sources are quiet on something — rather than guess and present a number with false confidence.', label: 'Closes the rigor gap' } \\]; var TOTAL = QUESTIONS.length; var idx = 0; var answers = QUESTIONS.map(function () { return null; }); // {choice: i, skipped: bool} var focusOpt = 0; var $q = document.getElementById('clq-q'); var $page = document.getElementById('clq-page'); var $prev = document.getElementById('clq-prev'); var $next = document.getElementById('clq-next'); var $close = document.getElementById('clq-close'); var $options = document.getElementById('clq-options'); var $skip = document.getElementById('clq-skip'); var $custom = document.getElementById('clq-custom-input'); var $caption = document.getElementById('clq-caption'); var $end = document.getElementById('clq-end'); var $restart = document.getElementById('clq-restart'); var $card = document.getElementById('clq-card'); function renderQuestion() { var Q = QUESTIONS\\[idx\\]; $q.innerHTML = Q.q; $page.textContent = (idx + 1) + ' of ' + TOTAL; $prev.disabled = idx === 0; $next.disabled = idx === TOTAL - 1; $options.innerHTML = Q.opts.map(function (o, i) { var label = o.text + (o.rec ? ' (Recommended)' : ''); return ''; }).join(''); Array.prototype.forEach.call($options.querySelectorAll('.clq-opt'), function (el) { el.addEventListener('click', function () { pick(parseInt(el.getAttribute('data-opt'), 10)); }); el.addEventListener('mouseenter', function () { focusOpt = parseInt(el.getAttribute('data-opt'), 10); Array.prototype.forEach.call($options.querySelectorAll('.clq-opt'), function (x, i) { x.classList.toggle('is-focus', i === focusOpt); }); }); }); $custom.value = ''; refreshCaption(); } function pick(i) { answers\\[idx\\] = { choice: i, skipped: false }; refreshCaption(); } function skip() { answers\\[idx\\] = { choice: null, skipped: true }; refreshCaption(); } function advanceOrFinish() { if (idx ' + '
' + 'Skipped' + 'Cowork will use its best guess for this. Sometimes that’s fine; sometimes you find out at the end.' + '
'; } else { var Q = QUESTIONS\\[idx\\]; var nextBtn = (idx Next question →' : ''; $caption.innerHTML = '' + '
' + '' + Q.label + '' + Q.caption + nextBtn + '
'; var $nb = $caption.querySelector('.clq-caption-next'); if ($nb) $nb.addEventListener('click', advanceOrFinish); } } function reset() { idx = 0; focusOpt = 0; answers = QUESTIONS.map(function () { return null; }); $end.style.display = 'none'; renderQuestion(); } $prev.addEventListener('click', function () { if (idx > 0) { idx--; focusOpt = 0; renderQuestion(); } }); $next.addEventListener('click', function () { if (idx \" style \\*/ .stm-activity { font-size: 12px; color: #73726C; display: inline-flex; align-items: center; gap: 6px; margin-top: 6px; } .stm-activity::after { content: '\\\\203A'; color: var(--ink-4); } .stm-activity.is-working { color: var(--ink-2); } .stm-activity.is-working::before { content: ''; width: 12px; height: 12px; border: 1.5px solid var(--clay); border-top-color: transparent; border-radius: 50%; animation: stm-spin 0.9s linear infinite; } @keyframes stm-spin { to { transform: rotate(360deg); } } @keyframes stm-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } /\\* Plan panel — matches real Cowork Progress sidebar \\*/ .stm-plan { padding: 16px 18px; background: #FFFFFF; border-left: 1px solid rgba(31,30,29,0.15); display: flex; flex-direction: column; gap: 2px; } .stm-plan-eyebrow { font-size: 14px; font-weight: 500; color: var(--ink); margin: 0 0 12px; display: flex; justify-content: space-between; align-items: center; } .stm-plan-eyebrow::after { content: ''; width: 12px; height: 12px; background: no-repeat center / contain url(\"data:image/svg+xml,%3Csvg viewBox='0 0 12 12' fill='none' stroke='%2373726C' stroke-width='1.6' stroke-linecap='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpolyline points='3 5 6 8 9 5'/%3E%3C/svg%3E\"); } .stm-plan-row { display: flex; gap: 10px; align-items: flex-start; font-size: 13px; color: var(--ink-2); line-height: 1.4; padding: 6px 0; } .stm-plan-check { width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0; margin-top: 2px; background: rgba(20,20,19,0.06); color: var(--ink-4); font-size: 10px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 500; display: flex; align-items: center; justify-content: center; position: relative; } .stm-plan-row.done .stm-plan-check { background: #2C84DB; color: transparent; } .stm-plan-row.done .stm-plan-check::before { content: ''; position: absolute; width: 6px; height: 3px; border-left: 1.5px solid #fff; border-bottom: 1.5px solid #fff; transform: rotate(-45deg) translate(0, -1px); } .stm-plan-row.spinning .stm-plan-check { background: #2C84DB; color: #fff; animation: stm-pulse-blue 1.4s ease-in-out infinite; } @keyframes stm-pulse-blue { 0%, 100% { box-shadow: 0 0 0 0 rgba(44,132,219,0.35); } 50% { box-shadow: 0 0 0 6px rgba(44,132,219,0); } } .stm-plan-row.spinning .stm-plan-text { color: var(--ink); font-weight: 500; } .stm-plan-row.done .stm-plan-text { color: var(--ink-3); text-decoration: line-through; text-decoration-color: rgba(0,0,0,0.2); } .stm-plan-text-old { text-decoration: line-through; color: var(--ink-4); font-size: 11.5px; display: block; margin-top: 2px; } .stm-plan-text-new { color: var(--ink); font-weight: 500; } /\\* Composer — simple pill: + / placeholder / send \\*/ .stm-input-row { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-top: 1px solid var(--border); background: var(--surface); } .stm-input-plus { width: 26px; height: 26px; display: flex; align-items: center; justify-content: center; color: var(--ink-3); background: transparent; border: 1px solid var(--border); border-radius: 8px; cursor: default; flex-shrink: 0; pointer-events: none; } .stm-input-plus svg { width: 14px; height: 14px; } .stm-input-fake { flex: 1; padding: 9px 14px; border: 1px solid var(--border); border-radius: 12px; font-size: 13px; color: var(--ink-4); font-style: italic; background: var(--surface); transition: all 0.2s; min-height: 36px; display: flex; align-items: center; } .stm-input-fake.is-typed { color: var(--ink); font-style: normal; border-color: var(--clay-line); } .stm-steer-btn { display: inline-flex; align-items: center; gap: 5px; padding: 6px 13px 6px 10px; background: #E0A894; color: #fff; border: none; border-radius: 999px; font-size: 12px; font-weight: 500; cursor: pointer; flex-shrink: 0; transition: filter 0.15s; animation: stm-cta-pulse 2s ease-in-out infinite; } .stm-steer-btn svg { width: 12px; height: 12px; } .stm-steer-btn\\[disabled\\] { animation: none; } @keyframes stm-cta-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(224,168,148,0.6); } 60% { box-shadow: 0 0 0 8px rgba(224,168,148,0); } } .stm-steer-btn:hover { filter: brightness(0.96); } .stm-steer-btn\\[disabled\\] { opacity: 0.4; cursor: default; } .stm-reset { font-size: 11.5px; color: var(--ink-3); background: none; border: none; cursor: pointer; text-decoration: underline; padding: 0; } .stm-reset:hover { color: var(--ink); } /\\* Caption \\*/ .stm-caption { margin: 12px 4px 0; padding: 12px 14px; background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 8px; font-size: 13px; color: var(--ink); line-height: 1.55; opacity: 0; max-height: 0; overflow: hidden; transition: opacity 0.4s ease, max-height 0.4s ease, padding 0.4s ease, margin 0.4s ease; padding-top: 0; padding-bottom: 0; } .stm-caption.is-shown { opacity: 1; max-height: 200px; padding: 12px 14px; } .stm-caption strong { font-weight: 600; } /\\* Responsive \\*/ @media (max-width: 640px) { .stm-body { grid-template-columns: 1fr; } .stm-stream { border-right: none; border-bottom: 1px solid var(--border); } } @media (prefers-reduced-motion: reduce) { .stm-activity.is-working::before, .stm-plan-row.spinning .stm-plan-check { animation: none; } .stm-caption { transition: none; } }\n\nSteer mid-task\n\nHelp me draft the Q3 competitive memo for the leadership offsite.\n\nI'll read the analyst-call PDFs and last quarter's memo, cross-reference each competitor's pricing changes against our positioning notes, then draft against the Q2 board-memo template.\n\nRead 3 files, searched 2 folders\n\nWriting draft · section 2 of 4\n\nProgress\n\n1Read source PDFs and last quarter's memo\n\n2Cross-reference pricing changes\n\n3Outline three competitor moves\n\n4 Drafting against Q2 board-memo template\n\n5Review against original prompt\n\nWrite a message… (click Queue to steer mid-task)\n\nQueue\n\n**You don't need to wait for it to finish and then regenerate.** You can correct the plan while it's still running — Cowork picks up from where it was.\n\nReset\n\n(function () { var STEER\\_TEXT = 'Stop on the format \\\\u2014 use the leadership-offsite one-pager template instead.'; var $btn = document.getElementById('stm-steer'); var $input = document.getElementById('stm-input'); var $stream = document.getElementById('stm-stream'); var $caption = document.getElementById('stm-caption'); var $reset = document.getElementById('stm-reset'); var $rowText = document.getElementById('stm-row-template-text'); var $toolRow = document.getElementById('stm-tool-row'); var fired = false; function fire() { if (fired) return; fired = true; // 1. Type into input $btn.disabled = true; $input.classList.add('is-typed'); $input.textContent = ''; var i = 0; var typer = setInterval(function () { i++; $input.textContent = STEER\\_TEXT.slice(0, i); if (i >= STEER\\_TEXT.length) { clearInterval(typer); setTimeout(sendIt, 400); } }, 20); } function sendIt() { // 2. User message appears in stream var userMsg = document.createElement('div'); userMsg.className = 'stm-msg user'; userMsg.innerHTML = '
' + STEER\\_TEXT + '
'; $stream.appendChild(userMsg); // Clear input $input.textContent = 'Click Queue to steer Cowork while it works\\\\u2026'; $input.classList.remove('is-typed'); // 3. Update plan in place setTimeout(function () { $rowText.innerHTML = 'Drafting against Q2 board-memo template' + 'Drafting against the leadership-offsite one-pager template'; // Cowork ack message var ack = document.createElement('div'); ack.className = 'stm-msg'; ack.innerHTML = '
Switching templates — reusing the analysis I’ve already drafted.
' + '
Rewriting against the leadership-offsite one-pager · keeping content
'; $stream.appendChild(ack); }, 600); // 4. Show caption setTimeout(function () { $caption.classList.add('is-shown'); }, 900); } function reset() { fired = false; $btn.disabled = false; $input.textContent = 'Click Queue to steer Cowork while it works\\\\u2026'; $input.classList.remove('is-typed'); $caption.classList.remove('is-shown'); $rowText.textContent = 'Drafting against Q2 board-memo template'; // Remove any added user/ack messages — keep only the first user prompt + 2 Cowork messages var msgs = $stream.querySelectorAll('.stm-msg'); for (var i = msgs.length - 1; i >= 3; i--) msgs\\[i\\].remove(); } $btn.addEventListener('click', fire); $reset.addEventListener('click', reset); })();\n\n### Review the finished deliverable\n\nWhen Claude is done, you can preview the file in the app. The file is also in your folder, so you can open it up and see it there.\n\nReview it the way you'd read a draft from someone you trust but don't yet fully know — with your discernment turned on. Things to check, especially the first few times:\n\n- **Does it meet the actual objective?** Or did it produce something subtly different from what you asked for?\n- **Are the facts accurate?** If Claude references facts or figures, confirm they're correct by reviewing the source material. Start by asking Claude to identify the docs it pulled from, then check them yourself.\n- **Does anything sound made up?** A specific date, name, or quote that you can't trace to an input is a flag, not a feature.\n\nIf the draft is mostly right, tell Claude what to change rather than starting over. Claude remembers the conversation and edits faster than it regenerates.\n\nIf the draft is wrong in a load-bearing way, the prompt was missing the load-bearing piece of context. Point Claude to the new context and ask it to make adjustments.\n\n### Try it now\n\nTake the task you identified in Lesson 3 — or pick one now. Hand it to Cowork using the process you just walked through — name the deliverable, the inputs, and any nuance; answer the clarifying questions specifically; steer if it drifts; review the result with your discernment on. The first run is the one that teaches you the most.\n\n### What’s next\n\nYou've now done it once. In Module 2, you'll start making Cowork _yours_ — keeping the context that worked, the workflows you want repeated, and the expertise your team relies on, so you don't re-supply it every time you start a task.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n\n\n## Lesson 5: Get better results faster\n\n/\\* Slide figure — visual overview separation from prose \\*/ figure.slide { background: #f7f6f1; padding: 20px; border-radius: 10px; margin: 24px 0; } figure.slide figcaption { font-size: 11px; color: #9c9a92; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; margin-bottom: 10px; } figure.slide img { max-width: 100%; height: auto; display: block; border-radius: 6px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); margin: 0; } /\\* Links — Skilljar styles
as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 5 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Name the four building blocks that make Claude better at your work over time: global instructions, projects, skills, and plugins\n\n* * *\n\n### How Cowork gets better at your work\n\nIn Lesson 4 you delegated one task and got a real deliverable back. What this module adds is the part that compounds: the more Claude knows about you, your work, and how your team does things, the better the next deliverable is — and the faster you get there.\n\nFour building blocks make that happen. Each one gives Claude something it can carry forward, so the context you supply once keeps paying off.\n\n### The four building blocks\n\n.fwl { --paper: #FAF9F5; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --clay: #D97757; --border: rgba(31,30,29,0.12); --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; -webkit-font-smoothing: antialiased; } .fwl \\*, .fwl \\*::before, .fwl \\*::after { box-sizing: border-box; } .fwl-shell { background: var(--paper); border: 1px solid var(--border); border-radius: 14px; padding: 22px 22px 20px; } .fwl-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 4px 2px; } .fwl-frame { font-size: 13.5px; color: var(--ink-2); margin: 0 2px 16px; line-height: 1.5; } .fwl-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .fwl-card { background: var(--surface); border: 1px solid var(--border); border-radius: 10px; padding: 18px 18px 16px; display: flex; flex-direction: column; gap: 8px; position: relative; min-height: 168px; } .fwl-head { display: flex; align-items: center; gap: 10px; margin-bottom: 2px; } .fwl-icon { width: 28px; height: 28px; border-radius: 7px; background: var(--olive-soft); color: var(--olive); display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .fwl-icon svg { width: 15px; height: 15px; } .fwl-name { font-family: 'Iowan Old Style', 'Palatino Linotype', Georgia, serif; font-size: 20px; font-weight: 500; color: var(--ink); letter-spacing: -0.01em; line-height: 1.2; margin: 0; } .fwl-learns-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-4); margin: 4px 0 2px; } .fwl-learns { font-family: 'Iowan Old Style', 'Palatino Linotype', Georgia, serif; font-size: 14.5px; font-style: italic; color: var(--clay); line-height: 1.4; margin: 0 0 6px; } .fwl-unlocks-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-4); margin: 4px 0 2px; } .fwl-unlocks { font-size: 13px; color: var(--ink-2); line-height: 1.5; margin: 0; } .fwl-chip { position: absolute; top: 14px; right: 14px; font-size: 10px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-3); background: var(--paper); border: 1px solid var(--border); border-radius: 999px; padding: 3px 9px; } .fwl-throughline { margin: 18px 4px 0; text-align: center; font-family: 'Iowan Old Style', 'Palatino Linotype', Georgia, serif; font-size: 14.5px; font-style: italic; color: var(--ink-2); letter-spacing: -0.005em; line-height: 1.5; } .fwl-throughline strong { color: var(--ink); font-weight: 600; font-style: normal; } @media (max-width: 640px) { .fwl-grid { grid-template-columns: 1fr; } }\n\nFour ways Cowork learns about you\n\nEach one gives Cowork a different kind of knowledge. Each kind makes it more capable.\n\nL6\n\n### Global instructions\n\nWhat Cowork learns\n\nWho you are and how you work.\n\nWhat that unlocks\n\nEvery task starts already calibrated to your role, your formats, and your preferences.\n\nL6\n\n### Projects\n\nWhat Cowork learns\n\nThe context of one stream of work.\n\nWhat that unlocks\n\nInside the project, Cowork works like someone already on the team, with access to the files, the history, and the decisions to date.\n\nL7\n\n### Skills\n\nWhat Cowork learns\n\nHow a specific process should be done.\n\nWhat that unlocks\n\nWhen a matching task comes up, Cowork runs it the way your team would: your templates, your standards, your steps.\n\nL8\n\n### Plugins\n\nWhat Cowork learns\n\nThe expertise of your role or field.\n\nWhat that unlocks\n\nCowork goes from generalist to specialist, with the workflows, connectors, and know-how someone in your seat needs.\n\nThey're independent and they compound. **The more Cowork knows, the more it can take off your plate.**\n\nYou're not going to start with all four of these on Day 1. As you work in Cowork more, you'll realize what global instructions make sense to apply to every conversation. You'll start to see your recurring workstreams and what makes sense to have as a project. If you find you're explaining the same workflows to Claude multiple times, those will be the right opportunities for your first skills. And as you and your teams perfect those processes, plugins will come in as you have something worth sharing.\n\n### What’s next\n\nThe next three lessons take you through these layers in order. Lesson 6 covers global instructions and projects — the layer most people set up first. Lessons 7 and 8 cover skills and plugins, finishing with a hands-on activity that gets a real plugin installed for your work.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n\n\n## Lesson 6: Standing context: Global instructions and projects\n\n/\\* Slide figure — visual overview separation from prose \\*/ figure.slide { background: #f7f6f1; padding: 20px; border-radius: 10px; margin: 24px 0; } figure.slide figcaption { font-size: 11px; color: #9c9a92; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; margin-bottom: 10px; } figure.slide img { max-width: 100%; height: auto; display: block; border-radius: 6px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); margin: 0; } /\\* Links — Skilljar styles as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 7 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Set global instructions so Claude starts every session already knowing how you work\n- Decide when a piece of work belongs in a project\n- Choose between the three ways to start a project\n\n* * *\n\n### Onboard your new collaborator\n\nIn Chat, memory builds itself — turn it on and Claude learns from your conversations automatically. Cowork works differently. The context that carries from task to task is mostly the context you set up: **global instructions**, which apply to every Cowork session, and **projects**, where Claude builds memory automatically from the conversations you have inside them. Most people start with global instructions and add projects as recurring work surfaces.\n\n### Global instructions: the brief that applies to every session\n\nGlobal instructions are a standing brief. You write them once, in Settings, and Claude will reference them during every session — every chat, every scheduled task, every Dispatch.\n\nTo set them up:\n\n- 1\\. Open the Claude desktop app and go to **Settings → Cowork**.\n- 2\\. Click **Edit** next to **Global instructions**.\n- 3\\. Write your brief and save.\n\nWhat to put in it: who you are and what you do; the shorthand and acronyms you use (so Claude doesn't have to ask what \"the QBR deck\" is); and how you like output delivered (format, length, tone, etc.). The interactive below shows a few worked examples based on different roles.\n\n.gip { --paper: #FAF9F5; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --border: rgba(31,30,29,0.12); --hover: rgba(20,20,19,0.04); --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; -webkit-font-smoothing: antialiased; } .gip \\*, .gip \\*::before, .gip \\*::after { box-sizing: border-box; } .gip-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 12px 4px; } .gip-tabs { display: inline-flex; padding: 3px; background: var(--paper); border: 1px solid var(--border); border-radius: 999px; margin-bottom: 14px; } .gip-tab { padding: 6px 14px; font-size: 12.5px; font-weight: 500; color: var(--ink-3); border: none; background: none; border-radius: 999px; cursor: pointer; font-family: inherit; } .gip-tab.is-on { background: var(--surface); color: var(--ink); box-shadow: 0 1px 2px rgba(0,0,0,0.05); } .gip-body { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); gap: 14px; } /\\* Instructions panel — matches Settings > General > Instructions for Claude \\*/ .gip-panel { background: var(--surface); padding: 4px 0 0; } .gip-panel-title { font-size: 16px; font-weight: 500; color: var(--ink); margin: 0 0 6px; } .gip-panel-sub { font-size: 13px; color: var(--ink-3); margin: 0 0 12px; line-height: 1.5; } .gip-panel-sub .u { text-decoration: underline; color: var(--ink-3); } .gip-textarea { width: 100%; min-height: 130px; border: 1px solid rgba(31,30,29,0.15); border-radius: 10px; padding: 12px 14px; font-family: inherit; font-size: 14px; line-height: 1.55; color: var(--ink); background: var(--surface); resize: vertical; white-space: pre-wrap; outline: none; } .gip-textarea::placeholder { color: var(--ink-4); } .gip-textarea:focus { border-color: rgba(31,30,29,0.30); } .gip-side { background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 12px; padding: 14px 16px; } .gip-side-label { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--olive); margin: 0 0 10px; } .gip-bullet { font-size: 13px; color: var(--ink); line-height: 1.5; margin: 0 0 10px; padding-left: 18px; position: relative; } .gip-bullet::before { content: ''; position: absolute; left: 0; top: 8px; width: 6px; height: 6px; border-radius: 50%; background: var(--olive); } .gip-bullet:last-child { margin-bottom: 0; } @media (max-width: 640px) { .gip-body { grid-template-columns: 1fr; } }\n\nGlobal instructions\n\nProduct Manager Finance Legal\n\nInstructions for Claude\n\nClaude will keep these in mind across chats and Cowork within Anthropic's guidelines. Learn more\n\nWhat this gets you\n\n(function () { var ROLES = { pm: { text: 'I lead product for a 200-person B2B SaaS company in late-stage growth.\\\\nMy team ships PRDs, launch briefs, and quarterly roadmaps.\\\\nDefault to crisp, decision-oriented writing — lead with the user problem before the solution.\\\\nWhen citing a metric, name the source doc.\\\\nAlways flag assumptions I should pressure-test before sharing.', bullets: \\[ 'Defaults to PRD and brief formats without you specifying.', 'Leads with the user problem before the solution.', 'Cites the source doc for any metric.' \\] }, fin: { text: 'I run FP&A at a 1,000-person company. We report monthly to the exec team and quarterly to the board.\\\\nVariance materiality threshold is 5% — flag anything above without being asked.\\\\nAll board memos use the in-house template (Variance / Forecast / Risks / Asks, in that order).\\\\nAlways show the calculation, not just the result.\\\\nNever round currency below thousands without flagging it.', bullets: \\[ 'Defaults to the board-memo template.', 'Flags any variance >5% without being asked.', 'Shows working for every number.' \\] }, leg: { text: 'I’m in-house counsel at a B2B SaaS company. I review SaaS, vendor, and NDA contracts.\\\\nApply the house redline playbook: surface indemnity, limitation-of-liability, and termination clauses first.\\\\nUse our standard redline conventions (insertions underlined, deletions struck through, comments in margin).\\\\nNever produce final language for external use — every output ends “draft — needs your review before sending.”', bullets: \\[ 'Applies the house redline style.', 'Surfaces indemnity and limitation clauses first.', 'Always ends “draft — needs your review before sending.”' \\] } }; var $tabs = document.querySelectorAll('.gip-tab'); var $text = document.getElementById('gip-text'); var $bul = document.getElementById('gip-bullets'); function render(role) { var r = ROLES\\[role\\]; $text.value = r.text.replace(/—/g, '\\\\u2014').replace(/“/g, '\\\\u201C').replace(/”/g, '\\\\u201D').replace(/’/g, '\\\\u2019'); $bul.innerHTML = r.bullets.map(function (b) { return '

' + b + '

'; }).join(''); Array.prototype.forEach.call($tabs, function (t) { t.classList.toggle('is-on', t.getAttribute('data-role') === role); }); } Array.prototype.forEach.call($tabs, function (t) { t.addEventListener('click', function () { render(t.getAttribute('data-role')); }); }); render('pm'); })();\n\nYour global instructions don't need to be complete on day one. As you work with Cowork more, you'll notice corrections you keep giving (_\"share the bottom line up front in your responses\"_ or _\"don't use Oxford commas\"_) — those are global-instruction candidates.\n\n### Projects: a scoped workspace for a stream of work\n\nGlobal instructions cover _you_. Projects cover _what you're working on_.\n\nA project is a workspace tied to a specific stream of work — a customer, a recurring deliverable, a launch. Inside the project are three things you can set up and one that Claude builds for you:\n\n- **Instructions** — like global instructions, but scoped to this project. (\"This project is for our weekly transformation team meetings. The purpose is to gather data from across the organization and distill it into a slide deck each week.\")\n- **Scheduled tasks** — recurring runs you've set up that belong to the project: the Friday status pull, the pre-meeting brief, the end-of-month rollup. You set these up from a conversation inside the project, and they run with the project's context every time.\n- **Context** — one or more folders or links Claude should work from. Every conversation in the project has access to them.\n- **Memory** — what Claude learns from the conversations you have inside the project. This builds up over time as you work; you don't write it.\n\nThat last one is the difference projects make. Outside of a project, each session starts fresh apart from your global instructions. Inside one, every conversation adds to what Claude knows — so the next task opens with the client's situation, last week's decisions, and what's still open already in hand.\n\nReview the examples below to get a sense for the makeup of a Cowork project.\n\n.pst { --paper: #FAF9F5; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #73726C; --ink-4: #B0AEA5; --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --border: rgba(31,30,29,0.15); --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; -webkit-font-smoothing: antialiased; } .pst \\*, .pst \\*::before, .pst \\*::after { box-sizing: border-box; } .pst-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 12px 4px; } .pst-tabs { display: inline-flex; padding: 3px; background: var(--paper); border: 1px solid var(--border); border-radius: 999px; margin-bottom: 14px; flex-wrap: wrap; } .pst-tab { padding: 6px 14px; font-size: 12.5px; font-weight: 500; color: var(--ink-3); border: none; background: none; border-radius: 999px; cursor: pointer; font-family: inherit; } .pst-tab.is-on { background: var(--surface); color: var(--ink); box-shadow: 0 1px 2px rgba(0,0,0,0.05); } .pst-name { font-family: Georgia, 'Iowan Old Style', serif; font-size: 24px; font-weight: 400; letter-spacing: -0.01em; margin: 0 0 14px; } .pst-rail { display: flex; flex-direction: column; gap: 10px; } .pst-card { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 14px 16px; } .pst-card-h { display: flex; align-items: center; justify-content: space-between; font-size: 14px; color: var(--ink-3); margin: 0 0 10px; } .pst-card-h .actions { display: inline-flex; align-items: center; gap: 10px; color: var(--ink-3); } .pst-card-h .actions svg { width: 14px; height: 14px; } .pst-card-body { font-size: 13px; color: var(--ink); line-height: 1.55; } .pst-sched { margin: 0; padding: 0; list-style: none; } .pst-sched li { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; color: var(--ink); padding: 4px 0; line-height: 1.45; } .pst-sched li svg { width: 13px; height: 13px; color: var(--ink-3); flex-shrink: 0; margin-top: 3px; } .pst-sched .when { color: var(--ink-3); font-size: 12px; display: block; } .pst-ctx-sub { margin-bottom: 14px; } .pst-ctx-sub:last-child { margin-bottom: 0; } .pst-ctx-h { font-size: 13px; font-weight: 500; color: var(--ink); margin: 0 0 8px; } .pst-ctx-row { display: flex; align-items: center; gap: 8px; background: var(--paper); border-radius: 8px; padding: 8px 10px; font-size: 13px; color: var(--ink); margin-bottom: 4px; } .pst-ctx-row svg { width: 14px; height: 14px; color: var(--ink-3); flex-shrink: 0; } .pst-ctx-row .car { width: 12px; height: 12px; color: var(--ink-4); margin-left: -4px; margin-right: 2px; } .pst-mem-files { padding-left: 24px; font-size: 12px; color: var(--ink-3); margin-top: 4px; } .pst-mem-files div { padding: 2px 0; } .pst-caption { margin: 14px 0 0; padding: 12px 14px; background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 8px; font-size: 13px; color: var(--ink); line-height: 1.55; } .pst-caption strong { font-weight: 600; } @media (max-width: 600px) { .pst-name { font-size: 20px; } }\n\nThree workstreams, three project setups\n\nA customer account A recurring deliverable A launch\n\n(function () { var CARET = ''; var CHEVRON = ''; var PENCIL = ''; var PLUS = ''; var FOLDER = ''; var MEMORY = ''; var DOC = ''; var CLOCK = ''; var DATA = { account: { name: 'Northwind — account', instructions: 'Formal tone. Address the EB by name (Sarah Chen, VP Ops). Always end with “draft for review.”', scheduled: \\[ { when: 'Mon 8am', what: 'Pull weekend Northwind activity from CRM and draft a 3-line account update' }, { when: 'Renewal −30 days', what: 'Draft the renewal-prep brief' } \\], folders: \\['Clients/Northwind/', 'QBR-prep/'\\], memory: \\['eb-prefs-sarah-chen.md', 'renewal-march-15.md', 'qbr-price-sensitivity.md'\\], links: \\['Salesforce / Northwind account', 'Notion / Northwind customer profile'\\], caption: 'A project for one customer account — one folder, one EB, one set of guardrails. Cowork stops asking “who’s this for?” every time.' }, recurring: { name: 'Monthly board memo', instructions: 'Match prior memos: Variance → Forecast → Risks → Asks. Flag any variance >5%. Always show the calculation.', scheduled: \\[ { when: '1st of month, 7am', what: 'Pull the close data and draft the variance section' }, { when: 'Fri before board', what: 'Self-review the memo against last quarter’s' } \\], folders: \\['Board-memos/', 'Monthly-close-data/'\\], memory: \\['ceo-asks-churn-arr-first.md', 'dont-say-at-risk-for-contracted.md'\\], links: \\['Looker / Variance dashboard', 'NetSuite / Monthly close'\\], caption: 'A project for a recurring deliverable — the format and standards live in the project so each month’s memo isn’t a fresh negotiation.' }, launch: { name: 'Pricing tier launch — Q3', instructions: 'Audience is the exec team. Lead with the launch decision and date. Defer detail to the appendix.', scheduled: \\[ { when: 'Daily 5pm', what: 'Summarize today’s launch-tracker changes in 5 lines' }, { when: 'T−7 days', what: 'Draft the go / no-go checklist from open Linear items' } \\], folders: \\['Analyst-call-transcripts/', 'Pricing-research/', 'Launch-plan/'\\], memory: \\['audience-execs-not-eng.md', 'launch-date-locked-jun-12.md'\\], links: \\['Linear / Launch tracker', 'Notion / Launch roadmap'\\], caption: 'A project for one launch — lives as long as the launch does. Holds the launch plan, the tracker, and context about the audience.' } }; var $tabs = document.querySelectorAll('.pst-tab'); var $name = document.getElementById('pst-name'); var $rail = document.getElementById('pst-rail'); var $cap = document.getElementById('pst-caption'); function ctxRow(icon, label, hasCaret) { return '
' + (hasCaret ? CARET : '') + icon + '' + label + '
'; } function render(key) { var d = DATA\\[key\\]; $name.innerHTML = d.name; var sched = d.scheduled.map(function (s) { return '
  • ' + CLOCK + '
    ' + s.when + '' + s.what + '
  • '; }).join(''); $rail.innerHTML = '
    ' + '

    Instructions ' + PENCIL + CHEVRON + '

    ' + '
    ' + d.instructions + '
    ' + '
    ' + '
    ' + '

    Scheduled ' + PLUS + CHEVRON + '

    ' + '' + '
    ' + '
    ' + '

    Context ' + PLUS + CHEVRON + '

    ' + '

    On your computer

    ' + d.folders.map(function (f) { return ctxRow(FOLDER, f, true); }).join('') + '
    ' + '

    Memory

    ' + ctxRow(MEMORY, 'Memory', true) + '
    ' + d.memory.map(function (m) { return '
    ' + m + '
    '; }).join('') + '
    ' + '
    ' + '

    Links

    ' + d.links.map(function (l) { return ctxRow(DOC, l, false); }).join('') + '
    ' + '
    '; $cap.innerHTML = d.caption; Array.prototype.forEach.call($tabs, function (t) { t.classList.toggle('is-on', t.getAttribute('data-key') === key); }); } Array.prototype.forEach.call($tabs, function (t) { t.addEventListener('click', function () { render(t.getAttribute('data-key')); }); }); render('account'); })();\n\nSome streams of work that are good for a project:\n\n- **A client or account.** The folder of meeting notes and deliverables, and the standing instructions for the account. Every meeting prep, follow-up, and review draft happens inside the project, and Claude picks up the relationship as it goes.\n- **A recurring deliverable.** The monthly report, the quarterly review, the weekly leadership update. Each new cycle is a new conversation inside the same project that automatically builds on the insights from the last time.\n- **A launch or initiative.** The redesign, the migration, the new program rollout. Briefs, decisions, status updates — the whole thread of the work in one place until it ships.\n\n### Three ways to start a project\n\nThere are three ways to create a project, depending on where the materials already live:\n\n- **From scratch** — start empty, add instructions and context as you go.\n- **From an existing folder on your computer** — point the project at a folder you already work out of. The folder becomes the project's working directory.\n- **From a Chat project** — if you've been using projects in Chat, you can transition the instructions and knowledge over to Cowork. This only works one-way: changes you make in Cowork don't sync back to Chat.\n\nTo create one, click **Projects** in the Cowork sidebar, then **New project**, and choose whichever option makes the setup easiest for you. You can change the working folder, instructions, and connectors at any time.\n\n### Try it now\n\nPut both layers in place — global instructions for you, and one project for a stream of work you're in right now.\n\n- 1\\. **Write a first-pass global instructions block.** Don't overthink it — just start with a few sentences.\n\n> A useful starter:\n> \n> _I'm a \\[role\\] at \\[company\\], working on \\[main 1–2 streams of work\\]. Here are some common \\[acronyms/shorthand\\] you need to know. Most of my deliverables are \\[docs, decks, briefs, models — whatever\\]. I want updates and briefs concise — lead with the recommendation, keep background to one paragraph. I like to review the .md previews before creating the final document file._\n\n- 2\\. **Create a project for one stream of work.** Pick something recurring — a customer account, a monthly deliverable, a current initiative. Point it at the folder where the materials already live, or start fresh if there isn't one yet.\n\n### What’s next\n\nIn the next lesson, you'll meet skills — how to teach Claude the processes you and your team rely on, so the way you do specialized work happens automatically.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n\n\n## Lesson 7: Skills: Teach Claude Cowork your way\n\n/\\* Slide figure — visual overview separation from prose \\*/ figure.slide { background: #f7f6f1; padding: 20px; border-radius: 10px; margin: 24px 0; } figure.slide figcaption { font-size: 11px; color: #9c9a92; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; margin-bottom: 10px; } figure.slide img { max-width: 100%; height: auto; display: block; border-radius: 6px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); margin: 0; } /\\* Links — Skilljar styles
    as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 12 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Define a skill and explain how Claude uses one\n- Recognize the four building blocks a skill can include\n- Build a skill from one of your own recurring processes\n\n* * *\n\n### What a skill actually is\n\n\n\nA skill is a reusable playbook — a folder of files and resources — that teaches Claude how to do a specific kind of work the way you'd want it done. When you start a task that matches the skill, Claude loads the playbook and follows it.\n\nSkills are automatically used during the task right when you need them. You don't have to invoke them by name; Claude notices when a task matches a skill you have installed and loads it automatically. You can also be explicit (_\"use the board memo drafting skill\"_) when you want to.\n\n### What’s inside a skill\n\nA skill is more than a long instruction. The four kinds of files a skill can include — and how they work together — are how you encode a real process well enough that Claude can run it like your team would:\n\n- **Instructions** (the SKILL.md file). The brief that tells Claude what the skill does, when to use it, and how to do it. Write it the way you'd write a runbook for a new colleague — specific enough that they can do the work.\n- **Assets.** Logos, brand templates, slide masters, fonts. The raw materials the skill uses to produce real-looking output.\n- **References.** Examples of good output, style guides, clause libraries, the past work you'd hand a new teammate as the bar to match. References are how Claude learns what \"good\" looks like for this kind of work.\n- **Scripts.** Small pieces of code Claude can run for the parts of the process that should happen the same way every time — a variance calculation, a structured comparison, a chart formatter, a doc reformatter.\n\nA skill can use any combination of these. Some skills are just a SKILL.md file with instructions, and that's perfectly fine for some processes. Others have a SKILL.md plus a brand asset folder. Others have all four. The mix follows the work: include what needs to be included, nothing more.\n\nBelow are three examples of skills. Click through each to get a sense for their application and makeup.\n\n.ins { --paper: #FAF9F5; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --border: rgba(31,30,29,0.12); --hover: rgba(20,20,19,0.04); --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; -webkit-font-smoothing: antialiased; } .ins \\*, .ins \\*::before, .ins \\*::after { box-sizing: border-box; } .ins-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 4px 4px; } .ins-frame { font-size: 13.5px; color: var(--ink-2); margin: 0 4px 14px; line-height: 1.5; } .ins-frame strong { color: var(--ink); font-weight: 600; } /\\* Skill switcher (chips) \\*/ .ins-tabs { display: inline-flex; background: var(--paper); border: 1px solid var(--border); border-radius: 999px; padding: 3px; margin-bottom: 12px; gap: 0; } .ins-tab { background: transparent; border: none; font-family: inherit; font-size: 12.5px; font-weight: 500; color: var(--ink-3); padding: 7px 14px; border-radius: 999px; cursor: pointer; transition: all 0.15s ease; display: inline-flex; align-items: center; gap: 6px; } .ins-tab:hover { color: var(--ink); } .ins-tab.is-active { background: var(--surface); color: var(--ink); box-shadow: 0 1px 2px rgba(0,0,0,0.05); } .ins-tab-shape { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 10.5px; color: var(--ink-4); font-weight: 500; } .ins-tab.is-active .ins-tab-shape { color: var(--clay); } /\\* Body: tree + explainer side-by-side \\*/ .ins-body { display: grid; grid-template-columns: minmax(0, 240px) minmax(0, 1fr); gap: 14px; } .ins-skill { display: none; } .ins-skill.is-on { display: contents; } .ins-tree { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 14px 12px; font-size: 13px; } .ins-tree-root { display: flex; align-items: center; gap: 8px; padding: 4px 6px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12.5px; font-weight: 600; color: var(--ink); } .ins-tree-root svg { width: 13px; height: 11px; color: var(--clay); flex-shrink: 0; } .ins-tree-children { margin-top: 4px; margin-left: 12px; padding-left: 10px; border-left: 1px dashed rgba(20,20,19,0.12); } .ins-row { appearance: none; background: transparent; border: none; width: 100%; text-align: left; display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; font-size: 12.5px; color: var(--ink-2); cursor: pointer; margin: 1px 0; transition: background 0.12s ease, color 0.12s ease; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; } .ins-row:focus-visible { outline: 2px solid var(--clay); outline-offset: 1px; } .ins-row:hover { background: var(--hover); color: var(--ink); } .ins-row.is-on { background: var(--clay-soft); color: var(--ink); font-weight: 500; } .ins-row svg { flex-shrink: 0; } .ins-row .ico-folder { width: 13px; height: 11px; color: var(--clay); } .ins-row .ico-file { width: 11px; height: 13px; color: var(--ink-3); } .ins-row.is-on .ico-file { color: var(--clay); } .ins-row.is-leaf { cursor: default; color: var(--ink-3); padding: 4px 8px; font-size: 12px; } .ins-row.is-leaf:hover { background: transparent; color: var(--ink-3); } /\\* Explainer panel beside the tree \\*/ .ins-panel { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 18px 20px; min-height: 280px; display: flex; flex-direction: column; } .ins-empty { flex: 1; display: flex; align-items: center; justify-content: center; color: var(--ink-3); font-style: italic; text-align: center; font-size: 13.5px; padding: 30px 20px; } .ins-section { display: none; flex-direction: column; gap: 14px; } .ins-section.is-on { display: flex; } .ins-head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; } .ins-head-skill { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--clay); margin-right: 4px; } .ins-head-name { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 14px; font-weight: 600; } .ins-head-label { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-4); } .ins-what { font-size: 14px; color: var(--ink); line-height: 1.55; margin: 0; } .ins-preview { background: var(--paper); border: 1px solid var(--border); border-radius: 8px; padding: 12px 14px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; line-height: 1.6; color: var(--ink-2); white-space: pre; overflow-x: auto; } .ins-preview-asset { background: var(--paper); border: 1px solid var(--border); border-radius: 8px; padding: 12px; display: flex; align-items: center; gap: 12px; } .ins-thumb { width: 64px; height: 48px; border-radius: 4px; background: linear-gradient(135deg, var(--clay) 0%, #B85A3F 100%); flex-shrink: 0; position: relative; display: flex; align-items: flex-end; padding: 5px; } .ins-thumb::before { content: ''; position: absolute; top: 8px; left: 8px; right: 14px; height: 6px; background: rgba(255,255,255,0.65); border-radius: 1px; } .ins-thumb::after { content: ''; position: absolute; top: 18px; left: 8px; width: 24px; height: 16px; background: rgba(255,255,255,0.4); border-radius: 1px; } .ins-thumb-name { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--ink-2); } .ins-refs { display: flex; flex-direction: column; gap: 6px; } .ins-ref { display: flex; align-items: center; gap: 8px; padding: 8px 12px; background: var(--paper); border: 1px solid var(--border); border-radius: 6px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--ink-2); } .ins-ref svg { width: 11px; height: 13px; color: var(--ink-3); flex-shrink: 0; } .ins-use { padding: 12px 14px; background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 8px; font-size: 13px; color: var(--ink); line-height: 1.55; } .ins-use-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--olive); margin-bottom: 3px; display: block; } @media (max-width: 600px) { .ins-body { grid-template-columns: 1fr; } }\n\nInside a skill\n\nA skill is a folder. **What goes inside depends on the process.** Switch between three examples:\n\nmeeting-recap board-memo variance-analysis\n\nmeeting-recap/\n\nSKILL.md\n\nboard-memo/\n\nSKILL.md assets/\n\nbrand-template.pptx\n\nreferences/\n\n2025-Q4-board-memo.docx\n\n2026-Q1-board-memo.docx\n\nvariance-analysis/\n\nSKILL.md scripts/\n\nvariance.py\n\nClick SKILL.md in the meeting-recap folder to see what it does.\n\nmeeting-recap SKILL.md The brief\n\nThe simplest skill is just this one file — the instructions, with nothing else attached.\n\n\\--- name: meeting-recap description: Write a recap after any meeting with action items --- # Meeting recap ## When to use After any meeting with action items. ## Format - Decisions - Action items (owner + date) - Open questions ## Length Under 150 words.\n\nWhat you'd use it for Lock in the recap format once. No template, no script, no examples needed — just the rules.\n\nboard-memo SKILL.md The brief\n\nTells Cowork what this skill does and how to do it — written like a runbook for a new colleague.\n\n\\--- name: board-memo description: Draft the monthly board memo in our house format --- # Board memo ## When to use Monthly close. Quarterly board prep. ## Process 1. Pull variance from the close folder 2. Section order: Variance → Forecast → Risks → Asks 3. Lead with churn-adjusted ARR\n\nWhat you'd use it for Codify the unwritten rules — the section order, the question that always comes up — so Cowork doesn't have to be told them every month.\n\nboard-memo assets/ Templates & brand\n\nThe actual files Cowork reaches for — templates, brand kits, anything the deliverable needs to look like.\n\nbrand-template.pptx\n\nWhat you'd use it for Put your team's slide template here and decks Cowork builds with this skill can match it.\n\nboard-memo references/ Prior work\n\nYour two best past memos — finished work Cowork reads to match the tone, length, and structure.\n\n2025-Q4-board-memo.docx\n\n2026-Q1-board-memo.docx\n\nWhat you'd use it for When the easiest way to describe the bar is to show it, not write it down.\n\nvariance-analysis SKILL.md The brief\n\nTells Cowork where the inputs live, what counts as material, and which script to run before writing it up.\n\n\\--- name: variance-analysis description: Compare actuals vs plan and write up material variances --- # Variance analysis ## Sources Actuals: Finance/close/{YYYY-MM}/ Plan: Finance/plan/{YYYY}-plan.xlsx ## What counts as material >5% AND >$50K. Both, not either. ## Run 1. Call scripts/variance.py 2. One paragraph per material line\n\nWhat you'd use it for Put the team's definition of “material” and the write-up format here once. Every month, Cowork applies them without being re-told.\n\nvariance-analysis scripts/ Repeatable calculation\n\nA small Python script that does the same calculation, the same way, every time. Say “run variance for May” — Cowork pulls the right files, runs the script, produces the write-up.\n\n\\# scripts/variance.py # Same calculation every month, no rounding drift. def variance(month): actuals = read\\_close(month) plan = read\\_plan(month) rows = \\[\\] for line in actuals.lines: delta\\_pct = (line.actual - plan\\[line.id\\]) / plan\\[line.id\\] delta\\_abs = line.actual - plan\\[line.id\\] if abs(delta\\_pct) > 0.05 and abs(delta\\_abs) > 50\\_000: rows.append((line.name, delta\\_pct, delta\\_abs)) return rows\n\nWhat you'd use it for Pin the calculation you don't want re-derived — same numbers, same shape, every run. The write-up is the part Cowork drafts; the math is the part the script owns.\n\n(function () { var $tabs = document.querySelectorAll('.ins-tab'); var $skills = document.querySelectorAll('.ins-skill'); var $rows = document.querySelectorAll('.ins-row\\[data-key\\]'); var $empty = document.getElementById('ins-empty'); var $sections = document.querySelectorAll('.ins-section'); var SKILL\\_NAMES = { mr: 'meeting-recap', bm: 'board-memo', va: 'variance-analysis' }; function setSkill(key) { Array.prototype.forEach.call($tabs, function (t) { t.classList.toggle('is-active', t.getAttribute('data-skill') === key); }); Array.prototype.forEach.call($skills, function (s) { s.classList.toggle('is-on', s.getAttribute('data-skill') === key); }); Array.prototype.forEach.call($rows, function (r) { r.classList.remove('is-on'); }); Array.prototype.forEach.call($sections, function (s) { s.classList.remove('is-on'); }); $empty.style.display = 'flex'; $empty.textContent = 'Click any item in the ' + SKILL\\_NAMES\\[key\\] + ' folder to see what it does.'; } Array.prototype.forEach.call($tabs, function (t) { t.addEventListener('click', function () { setSkill(t.getAttribute('data-skill')); }); }); Array.prototype.forEach.call($rows, function (it) { it.addEventListener('click', function () { var k = it.getAttribute('data-key'); Array.prototype.forEach.call($rows, function (x) { x.classList.toggle('is-on', x === it); }); $empty.style.display = 'none'; Array.prototype.forEach.call($sections, function (s) { s.classList.toggle('is-on', s.getAttribute('data-sec') === k); }); }); }); })();\n\nThis is what makes skills so useful for codifying how your team works. Cowork is a coworker that can act on your behalf — and skills are how you get it to do the work the way it should be done. The instructions tell it what to do; the assets give it the raw materials; the references show it what good looks like; the scripts let it run the repeatable parts the same way every time.\n\n### Build a skill with Claude\n\nThe fastest way to build a skill is with Claude.\n\nStart a new conversation in Cowork and say something like:\n\n> _I want to build a skill for \\[the recurring process you're tired of re-explaining\\]. Walk me through what you need to know._\n\nClaude will ask a few questions: what the skill should do, when it should trigger, what good output looks like, what resources it should use to inform the skill. Answer as specifically as you can — point at real examples of the work, real templates, real prior outputs. The output is a skill folder with the SKILL.md and any assets, references, and scripts the skill needs, ready to install.\n\nOnce it's installed, you can find the skill in **Customize**. If you want to make any changes to the skill, you can just provide Claude with the correction and ask it to update the skill. _\"Add a step that flags any deal over $100K that slipped two stages — that always matters.\"_ Claude updates the skill in place.\n\nSkills work the same way inside any conversation, including conversations inside a project. So a skill you build for variance analysis will show up whenever variance analysis is the task — whether you're working in your default Cowork session or inside a specific finance project.\n\n### Lesson reflection\n\nThink of one process you repeat — a report you run, a format you always use, a checklist you follow. Jot it down. That's your first skill candidate. You don't need to build it now. Come back and build it with Claude when you have time.\n\n### What’s next\n\nSkills package your specific workflows so anyone on your team can run them and get the same quality result. Plugins bundle several skills and connectors into one installable package built around a job. That's the next lesson.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n\n\n## Lesson 8: Plugins: Encode your team's expertise\n\n/\\* Slide figure — visual overview separation from prose \\*/ figure.slide { background: #f7f6f1; padding: 20px; border-radius: 10px; margin: 24px 0; } figure.slide figcaption { font-size: 11px; color: #9c9a92; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; margin-bottom: 10px; } figure.slide img { max-width: 100%; height: auto; display: block; border-radius: 6px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); margin: 0; } /\\* Links — Skilljar styles as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 12 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Define a plugin and what it bundles together\n- Recognize the two shapes plugins take\n- Install or customize a plugin against a real piece of your work\n\n* * *\n\n### Watch what a plugin unlocks\n\n\n\nThe video shows what changes when a team's workflow stops being one person's playbook and becomes a shared toolkit anyone can install.\n\n#### Key takeaways\n\n- **A plugin is a packaged set of skills built around a job.** Where a skill is one playbook, a plugin is several — skills, plus the connectors and subagents they depend on. (A subagent is a purpose-built helper a skill can spin up to handle one part of the work in its own context — e.g., a research subagent for a research step, a drafting subagent for a drafting step.)\n- **Plugins teach Claude your team's way of working.** Install a finance plugin and Claude knows the way your team analyzes equities. Install a legal plugin and it knows your contract playbook. The expertise travels with the install, not the person.\n- **Anthropic publishes plugins for common roles** — finance, legal, sales, marketing, customer support, product management, and more. You can install one off the shelf, customize it, or build your own.\n\n### Two kinds of plugins\n\nPlugins come in two flavors — both useful, both common.\n\n**Shape 1: An end-to-end process bundled together.** When the work has many sequential steps, you can package the skills for each step into a plugin so the whole process runs as one. For example, a monthly-close plugin might include separate skills for pulling the actuals, building the variance table, and drafting the board memo — each one a step in the larger workflow. Anyone on the team installs the plugin and gets the entire process the way you do it.\n\n**Shape 2: A team's most-used skills bundled together.** This is great for a set of recurring jobs the team does. You can bundle the most important ones into a single plugin. For example, a finance plugin might include separate skills for variance analysis, financial modeling, investment-memo drafting, and quarterly reports. They aren't dependent on each other — they're just the skills the team reaches for most. Bundling them means new teammates install one thing and have the team's whole toolkit.\n\nExplore the interactive below to see the different shapes of plugins.\n\n.pl { --paper: #FAF9F5; --warm: #FDFCF9; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --border: rgba(31,30,29,0.12); --hover: rgba(20,20,19,0.04); --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); --toggle-on: #2C84DB; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; -webkit-font-smoothing: antialiased; } .pl \\*, .pl \\*::before, .pl \\*::after { box-sizing: border-box; } .pl a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; color: inherit; } .pl-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 12px 4px; } /\\* Tab pill \\*/ .pl-tabs { display: inline-flex; background: var(--paper); border: 1px solid var(--border); border-radius: 999px; padding: 3px; margin-bottom: 12px; } .pl-tab { background: transparent; border: none; font-family: inherit; font-size: 12.5px; font-weight: 500; color: var(--ink-3); padding: 7px 14px; border-radius: 999px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; transition: all 0.15s ease; } .pl-tab:hover { color: var(--ink); } .pl-tab.is-active { background: var(--surface); color: var(--ink); box-shadow: 0 1px 2px rgba(0,0,0,0.05); } .pl-tab-shape { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 10.5px; color: var(--ink-4); font-weight: 500; } .pl-tab.is-active .pl-tab-shape { color: var(--clay); } /\\* Plugin detail page (mock) \\*/ .pl-page { background: var(--warm); border: 1px solid var(--border); border-radius: 14px; padding: 18px 20px 16px; } .pl-page-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 14px; } .pl-page-name { font-family: Georgia, 'Iowan Old Style', serif; font-size: 22px; font-weight: 400; color: var(--ink); line-height: 1.15; margin: 0; } .pl-page-actions { display: flex; align-items: center; gap: 10px; } .pl-btn-customize { border: 1px solid var(--border); background: var(--surface); border-radius: 999px; padding: 5px 14px; font-size: 12.5px; color: var(--ink-2); cursor: pointer; font-family: inherit; transition: all 0.12s; } .pl-btn-customize:hover { background: var(--hover); } .pl-btn-customize.is-on { background: var(--clay-soft); border-color: var(--clay); color: var(--ink); } .pl-toggle { cursor: pointer; } .pl-toggle.is-on { box-shadow: 0 0 0 3px var(--clay-soft); } .pl-toggle { width: 32px; height: 18px; background: var(--toggle-on); border-radius: 999px; position: relative; } .pl-toggle::after { content: ''; position: absolute; top: 2px; right: 2px; width: 14px; height: 14px; background: #fff; border-radius: 50%; box-shadow: 0 1px 2px rgba(0,0,0,0.15); } .pl-page-dots { color: var(--ink-3); font-size: 16px; line-height: 1; padding-left: 4px; } /\\* Metadata row \\*/ .pl-meta { display: flex; gap: 28px; flex-wrap: wrap; margin: 0 0 14px; } .pl-meta-cell { display: flex; flex-direction: column; gap: 2px; } .pl-meta-h { font-size: 10px; color: var(--ink-4); margin: 0; } .pl-meta-v { font-size: 12px; color: var(--ink); margin: 0; } .pl-meta-v a { color: var(--toggle-on); text-decoration: underline; } .pl-desc-h { font-size: 11px; color: var(--ink-3); margin: 0 0 4px; } .pl-desc { font-size: 11.5px; color: var(--ink); margin: 0 0 14px; line-height: 1.5; } /\\* Skills section \\*/ .pl-skills-head { display: flex; align-items: center; gap: 10px; margin: 14px 0 10px; } .pl-skills-pill { background: rgba(20,20,19,0.08); color: var(--ink); font-size: 12.5px; font-weight: 500; padding: 4px 12px; border-radius: 999px; } .pl-skills-hint { font-size: 11.5px; color: var(--ink-3); } .pl-meta-cell\\[data-info\\] { cursor: pointer; border-radius: 6px; margin: -4px -8px; padding: 4px 8px; transition: background 0.12s; } .pl-meta-cell\\[data-info\\]:hover { background: rgba(0,0,0,0.04); } .pl-meta-cell\\[data-info\\] .pl-meta-h::after { content: ' \\\\203A'; color: var(--ink-4); } .pl-meta-cell.is-on { background: rgba(217,119,87,0.10); } .pl-meta-cell.is-on .pl-meta-h::after { color: var(--clay); } .pl-meta-tip { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; background: var(--paper); border-left: 2px solid var(--clay); border-radius: 0 6px 6px 0; padding: 10px 13px; margin: -4px 0 14px; display: none; } .pl-meta-tip.is-on { display: block; } .pl-meta-tip strong { color: var(--ink); font-weight: 600; } .pl-skill::after { content: '\\\\203A'; float: right; color: var(--ink-4); font-size: 14px; margin-left: 8px; } .pl-skill:hover::after { color: var(--clay); } .pl-skills-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; } @media (max-width: 600px) { .pl-skills-grid { grid-template-columns: 1fr; } } .pl-skill { appearance: none; text-align: left; font-family: inherit; background: #fff; border: 0.5px solid var(--border); border-radius: 6px; padding: 8px 11px; cursor: pointer; transition: border-color 0.15s, box-shadow 0.15s; } .pl-skill:hover { border-color: rgba(20,20,19,0.20); box-shadow: 0 1px 3px rgba(0,0,0,0.04); } .pl-skill.is-on { border-color: var(--clay); box-shadow: 0 0 0 1px var(--clay-soft); } .pl-skill-desc { font-size: 11.5px; margin: 0 0 6px; color: var(--ink-2); line-height: 1.45; } .pl-skill-tag { display: inline-block; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 10px; color: var(--ink); background: rgba(0,0,0,0.04); border-radius: 4px; padding: 2px 6px; margin: 0; } .pl-skill-expand { font-size: 12px; color: var(--olive); margin: 6px 0 0; line-height: 1.45; display: none; } .pl-skill.is-on .pl-skill-expand { display: block; } /\\* Connectors row \\*/ .pl-conns { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 12px 0 4px; margin-top: 14px; border-top: 1px solid var(--border); } .pl-conns { cursor: pointer; border-radius: 8px; margin-left: -8px; margin-right: -8px; padding-left: 8px; padding-right: 8px; transition: background 0.12s; } .pl-conns:hover { background: var(--hover); } .pl-conns.is-on { background: var(--clay-soft); } .pl-conns-h { font-size: 11px; color: var(--ink-3); margin: 0 6px 0 0; font-weight: 500; } .pl-conns-h::after { content: ' \\\\203A'; color: var(--ink-4); } .pl-conns.is-on .pl-conns-h::after { color: var(--clay); } .pl-desc-wrap { cursor: pointer; border-radius: 6px; margin: 0 -8px 14px; padding: 0 8px; transition: background 0.12s; } .pl-desc-wrap:hover { background: var(--hover); } .pl-desc-wrap.is-on { background: var(--clay-soft); } .pl-desc-wrap .pl-desc { margin-bottom: 0; } .pl-desc-h::after { content: ' \\\\203A'; color: var(--ink-4); } .pl-desc-wrap.is-on .pl-desc-h::after { color: var(--clay); } .pl-conn { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border: 1px solid var(--border); background: var(--surface); border-radius: 999px; font-size: 12px; color: var(--ink-2); } .pl-conn-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--olive); } /\\* Plugin variants \\*/ .pl-plugin { display: none; } .pl-plugin.is-on { display: block; } .pl-caption { margin: 14px 0 0; padding: 12px 14px; background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 8px; font-size: 13px; color: var(--ink); line-height: 1.55; } .pl-caption em { font-style: italic; font-weight: 600; }\n\nTwo plugins, two shapes\n\nLegal function's toolkit Experiment Readout end-to-end pipeline\n\n## Experiment Readout\n\nCustomize …\n\nSource\n\nUploaded from file\n\nVersion\n\n1.0.0\n\nLast updated\n\n3 days ago\n\nDescription\n\nRun an A/B test from raw results to shipped readout.\n\nSkills Click any skill to see what it does.\n\nPull experiment exposures and metrics from the warehouse.\n\n/pull-results\n\nJoins exposures to event tables, dedupes by user, returns one row per user per metric for the experiment window.\n\nBreak results down by the cuts that matter (platform, plan, geo).\n\n/segment-cuts\n\nComputes lift per segment, flags any segment where the effect reverses sign or loses significance.\n\nValidate traffic balance, sample ratio, and metric definitions.\n\n/sanity-check\n\nRuns a chi-square SRM test, checks pre-period parity, confirms metric definitions match the spec.\n\nBuild the lift charts and confidence-interval plots.\n\n/visualize\n\nGenerates the team's standard chart pack: lift over time, CI bars, segment heatmap.\n\nDraft the decision memo in the team's readout format.\n\n/write-readout\n\nHeadline metric → segment cuts → risks → recommendation. Same shape every readout.\n\nDraft the TL;DR for the experiments channel.\n\n/ship-summary\n\nDrafts a Slack-ready two-line summary with a link to the full readout — you post it.\n\nConnectors BigQuery Slack Hex\n\n## Legal\n\nCustomize …\n\nSource\n\nMarketplace (Anthropic & Partners)\n\nVersion\n\n1.2.0\n\nAuthor\n\nAnthropic\n\nLast updated\n\n9 hours ago\n\nDescription\n\nThe contract and review work a legal team does most.\n\nSkills Click any skill to see what it does.\n\nRedline an NDA against the house playbook.\n\n/nda-review\n\nCompares incoming language to the house position; flags deltas; produces a redline + a short rationale per change.\n\nPull key terms, dates, and obligations from any contract.\n\n/contract-summary\n\nOne-page summary: parties, term, fees, termination triggers, indemnity, key dates calendar.\n\nFind pre-approved fallback language for a given clause.\n\n/clause-library\n\nSearches the team's clause bank by topic; returns the approved alternatives in priority order.\n\nFlag jurisdiction-specific issues in a draft.\n\n/regulatory-check\n\nChecks the draft against the jurisdiction's known requirements; flags missing notices or non-compliant clauses.\n\nPull public filings and prior deal history.\n\n/counterparty-research\n\nPublic filings, prior contracts on file, recent press. One-page brief on who you're negotiating with.\n\nConnectors Box Egnyte Slack M365 Atlassian\n\n_Stay in the loop._ A plugin enables Claude to run your workflows, but the output is still yours to review.\n\n(function () { var $tabs = document.querySelectorAll('.pl-tab'); var $plugins = document.querySelectorAll('.pl-plugin'); var $skills = document.querySelectorAll('.pl-skill'); Array.prototype.forEach.call($tabs, function (t) { t.addEventListener('click', function () { var k = t.getAttribute('data-plugin'); Array.prototype.forEach.call($tabs, function (x) { x.classList.toggle('is-active', x === t); }); Array.prototype.forEach.call($plugins, function (p) { p.classList.toggle('is-on', p.getAttribute('data-plugin') === k); }); Array.prototype.forEach.call($skills, function (s) { s.classList.remove('is-on'); }); }); }); Array.prototype.forEach.call($skills, function (s) { s.addEventListener('click', function () { var on = s.classList.contains('is-on'); Array.prototype.forEach.call($skills, function (x) { x.classList.remove('is-on'); }); if (!on) s.classList.add('is-on'); }); }); var INFO = { 'legal-source': 'Marketplace (Anthropic & Partners) — built and maintained by Anthropic. Updates ship to you automatically when a new version is published.', 'exp-source': 'Uploaded from file — built by someone in your organization and added to your private marketplace. Updates flow when the owner re-uploads or syncs from GitHub.', 'version': 'Version — bumped each time the plugin is updated. A jump from 1.0 to 1.2 means it’s been revised since you last looked.', 'author': 'Author — who built and maintains it. For Marketplace plugins this is Anthropic or a partner; for uploaded ones it’s usually a teammate or your enablement team.', 'updated': 'Last updated — how recently it was touched. Hours or days = actively maintained. Months = check whether it still matches how your team works.', 'customize': 'Customize — lets you tailor this plugin to your work — either by entering the context yourself, or by letting Claude search your connectors to find what it needs to customize the plugin for you.', 'toggle': 'Enabled toggle — turns the whole plugin on or off for you. When it’s on, every skill below is available; when it’s off, none of them are. (If your admin set it to Required, this toggle is locked on.)', 'desc': 'Description — the plugin author’s one-line summary of what it’s for. Use it to decide whether to install before reading every skill.', 'conns-legal': 'Connectors — the apps this plugin reaches into. Box and Egnyte for the contracts on file; Slack and M365 for where the requests come in; Atlassian for tracking what’s open. The skills above use these so you don’t paste data in by hand.', 'conns-exp': 'Connectors — the apps this plugin reaches into. BigQuery for the experiment data; Hex for the visualizations; Slack for where the readout gets shared. The skills above use these so you don’t export and re-import.' }; function showTip($page, key, $trigger) { var $tip = $page.querySelector('.pl-meta-tip'); var allTriggers = $page.querySelectorAll('\\[data-info\\], .pl-btn-customize, .pl-toggle, .pl-desc-wrap, .pl-conns'); var wasOn = $trigger.classList.contains('is-on'); Array.prototype.forEach.call(allTriggers, function (t) { t.classList.remove('is-on'); }); if (wasOn) { $tip.classList.remove('is-on'); } else { $trigger.classList.add('is-on'); $tip.innerHTML = INFO\\[key\\] || ''; $tip.classList.add('is-on'); } } Array.prototype.forEach.call(document.querySelectorAll('.pl-meta-cell\\[data-info\\]'), function (cell) { cell.addEventListener('click', function () { showTip(cell.closest('.pl-page'), cell.getAttribute('data-info'), cell); }); }); Array.prototype.forEach.call(document.querySelectorAll('.pl-btn-customize'), function (b) { b.addEventListener('click', function () { showTip(b.closest('.pl-page'), 'customize', b); }); }); Array.prototype.forEach.call(document.querySelectorAll('.pl-toggle'), function (t) { t.addEventListener('click', function () { showTip(t.closest('.pl-page'), 'toggle', t); }); }); Array.prototype.forEach.call(document.querySelectorAll('.pl-desc-wrap'), function (d) { d.addEventListener('click', function () { showTip(d.closest('.pl-page'), 'desc', d); }); }); Array.prototype.forEach.call(document.querySelectorAll('.pl-conns'), function (c) { c.addEventListener('click', function () { var k = c.closest('.pl-plugin').getAttribute('data-plugin') === 'legal' ? 'conns-legal' : 'conns-exp'; showTip(c.closest('.pl-page'), k, c); }); }); })();\n\nThe shape that matters in either case: a plugin is a package built around _workflows_. \"Renewal prep for our customer success team\" is a plugin. \"Equity research for our fund\" is a plugin. \"The monthly board cycle for the CFO's office\" is a plugin.\n\n### Install a plugin from the Anthropic marketplace\n\nAnthropic publishes plugins for the most common roles in knowledge work, each one built and maintained as a starting point you can use as-is or shape to your team. Find them in **Customize → Plugins** in Cowork. Browse for the plugin that matches your work, click **Install**, and approve the connectors the plugin uses. The plugin's skills become available immediately.\n\n### Customize a plugin to fit your team\n\nA plugin from the marketplace is a strong default, not a final answer. The skills and connectors inside use a generic version of the workflow; your team has its own templates, definitions, and steps. You can shape any installed plugin to match.\n\nAfter you've installed the plugin, go back to **Customize → Plugins → \\[Plugin name\\]** and click **Customize**. This opens a new Cowork task where you and Claude work together to tailor the plugin. You can add a starter prompt by directing it to specific assets, sharing context, or uploading the examples you want it to use as a base. Claude will then update the plugin to be true to your team's context.\n\nFor example, you could say something like:\n\n> _\"Here are our last three red-lined NDAs. Update the /nda-triage skill in this plugin so the format and tone match these.\"_\n\nClaude adapts the plugin in place. The more you shape it to your team's actual work, the more leverage it produces.\n\n### Build your own plugin\n\nIf your team has a workflow that doesn't fit any existing plugin, you can build one by working with Cowork. It will bundle the skills the workflow needs, include any connectors it depends on, and package it for easy installation into your instance of Cowork.\n\nMost teams start small. One skill for the most repetitive task. Then another. By the time it has three or four skills and the connectors that matter, it's a plugin worth sharing — and you'll learn how to share it with your team in Lesson 13.\n\nYour admin may have already published plugins for your organization — check the Directory (Customize → Plugins) before you build anything yourself.\n\n### Try it now\n\nLet's find the plugins that fit your work. In a new Cowork conversation, type:\n\n> /setup-cowork\n\nThe skill starts a short interview. Claude asks about the type of work you do, then suggests a plugin that would work best for your needs. You can easily add the plugin right from chat and test it out in the conversation. Once installed, customize it for your team.\n\n### What’s next\n\nYou've now made Cowork yours for one piece of your work. The next module is about extending Cowork beyond the desktop — into your browser, and into the M365 apps where a lot of the work lands.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n\n\n## Lesson 9: Claude in Chrome\n\n/\\* Slide figure — visual overview separation from prose \\*/ figure.slide { background: #f7f6f1; padding: 20px; border-radius: 10px; margin: 24px 0; } figure.slide figcaption { font-size: 11px; color: #9c9a92; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; margin-bottom: 10px; } figure.slide img { max-width: 100%; height: auto; display: block; border-radius: 6px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); margin: 0; } /\\* Links — Skilljar styles as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 10 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Recognize the kinds of work Claude in Chrome unlocks\n- Use Chrome alongside Cowork on a real piece of work\n\n* * *\n\n### Watch it work\n\n\n\nThe video shows how Claude can work in Chrome to read, click, and navigate websites alongside you.\n\n#### Key takeaways\n\n- **Claude in Chrome is the bridge for tools that don't have a connector.** For anything that lives in a browser, Claude can read and act on those pages.\n- **Claude in Chrome and Cowork work together.** Claude can gather info and take actions in the browser; it then takes the results and builds the deliverable back in Cowork. One conversation, both surfaces.\n- **You stay in control.** By default, Claude in Chrome asks before sensitive actions, and you can approve or deny each one.\n\n### What this unlocks\n\nA few examples that matter in real work:\n\n- **Internal dashboards.** Your finance team's Tableau view, your sales ops Looker dashboard, the BI tool with the metric you check every Monday. Claude can pull the numbers, download them to your computer, and use that context for Cowork tasks.\n- **Vendor portals and customer systems.** The procurement portal that doesn't have an API. The CRM that's behind your single sign-on. The customer support tool where every ticket has to be triaged. Claude can navigate the portal, pull what you need, and act on it the way you would.\n- **Web apps behind a login.** Anything with a browser interface — even tools your team built — becomes scriptable. _\"Open the procurement system, find every PO from our top ten suppliers in Q3, and pull the line items into a spreadsheet.\"_\n- **Web research that ends in a deliverable.** Open ten tabs, pull what's on each, and turn it into a brief — without copy-paste.\n\nThe pattern: any time you'd find yourself thinking _\"I'd love to give this context to Claude, but it lives on the web,\"_ Claude in Chrome is the answer.\n\n### Use it with Cowork\n\nA real example: your team's customer health dashboard lives behind a login and doesn't have a connector. You want a one-page summary of every account showing yellow or red, by Friday.\n\nIn Cowork, you say:\n\n> _Open the customer health dashboard in Chrome, pull every account showing yellow or red, and for each one, pull the past 30 days of activity from the customer's folder in Drive and recent threads in #customer-success in Slack. Build a one-page summary I can review before my Friday call._\n\n.cwk-09 { --cwk-warm-white: #FDFCF9; --cwk-ivory: #FAF9F5; --cwk-paper: #FAF9F5; --cwk-slate: #141413; --cwk-clay: #D97757; --cwk-clay-soft: #C5755C; --cwk-text-1: #141413; --cwk-text-2: #6B6A64; --cwk-text-3: #A09E94; --cwk-olive: #788C5D; --cwk-hairline: 0.5px solid rgba(31,30,29,0.12); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, system-ui, sans-serif; color: var(--cwk-text-1); background: #EDEBE4; padding: 36px 0; display: flex; justify-content: center; } .cwk-09 \\* { box-sizing: border-box; } .cwk-09 .scaler { width: 100%; max-width: 1160px; container-type: inline-size; } .cwk-09 .stage { width: 1160px; transform-origin: top left; transform: scale(calc(min(1160, 100cqw) / 1160)); display: flex; flex-direction: column; align-items: center; gap: 24px; } @supports not (width: 1cqw) { .cwk-09 .stage { transform: scale(1); } } .cwk-09 .prompt-row { width: 720px; background: var(--cwk-warm-white); border: var(--cwk-hairline); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 2px rgba(0,0,0,0.03); } .cwk-09 .prompt-row .pr-eye { font-size: 11px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--cwk-text-3); margin: 0 0 6px; display: flex; align-items: center; gap: 6px; } .cwk-09 .prompt-row .pr-eye-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--cwk-clay); } .cwk-09 .prompt-row .pr-text { font-size: 16px; line-height: 1.55; color: var(--cwk-text-1); margin: 0; } .cwk-09 .browser { width: 1160px; background: var(--cwk-warm-white); border: var(--cwk-hairline); border-radius: 12px; box-shadow: 0 1px 3px rgba(0,0,0,0.06), 0 18px 48px rgba(0,0,0,0.10); overflow: hidden; position: relative; transition: filter 0.4s ease; } .cwk-09 .browser.is-dimmed { filter: brightness(0.96) saturate(0.92); } .cwk-09 .chrome-top { background: var(--cwk-ivory); padding: 10px 14px 0; border-bottom: var(--cwk-hairline); } .cwk-09 .chrome-traffic { display: flex; gap: 7px; margin-bottom: 10px; } .cwk-09 .chrome-traffic .dot { width: 11px; height: 11px; border-radius: 50%; } .cwk-09 .tabs-bar { display: flex; gap: 2px; } .cwk-09 .ctab { display: flex; align-items: center; gap: 8px; padding: 8px 14px 9px; font-size: 12.5px; color: var(--cwk-text-2); border-radius: 8px 8px 0 0; border: var(--cwk-hairline); border-bottom: none; background: #F2EFE6; } .cwk-09 .ctab.active { background: var(--cwk-warm-white); color: var(--cwk-text-1); font-weight: 500; } .cwk-09 .ctab.claude { background: var(--cwk-clay-soft); color: #fff; border-color: rgba(0,0,0,0.1); } .cwk-09 .ctab .fav { width: 14px; height: 14px; border-radius: 3px; } .cwk-09 .ctab .x { color: var(--cwk-text-3); font-size: 13px; margin-left: 4px; } .cwk-09 .addr-row { background: var(--cwk-warm-white); padding: 10px 14px; display: flex; align-items: center; gap: 10px; border-bottom: var(--cwk-hairline); } .cwk-09 .addr-row .nav { display: flex; gap: 6px; color: var(--cwk-text-2); } .cwk-09 .addr-row .url { flex: 1; padding: 7px 14px; background: #F2EFE6; border-radius: 999px; font-size: 12.5px; color: var(--cwk-text-2); display: flex; align-items: center; gap: 8px; } .cwk-09 .addr-row .url svg { flex-shrink: 0; } .cwk-09 .page { padding: 24px 32px 32px; position: relative; min-height: 520px; } .cwk-09 .page-head { display: flex; align-items: center; margin-bottom: 18px; } .cwk-09 .page-head h1 { font-family: \"Iowan Old Style\", Georgia, serif; font-size: 24px; font-weight: 500; margin: 0; } .cwk-09 .page-head .sp { flex: 1; } .cwk-09 .filters { display: flex; gap: 10px; align-items: center; } .cwk-09 .dd-wrap { position: relative; } .cwk-09 .dd { background: #fff; border: var(--cwk-hairline); border-radius: 8px; padding: 7px 11px; font-size: 12.5px; display: inline-flex; align-items: center; gap: 6px; transition: background 0.12s ease, border-color 0.12s ease, transform 0.08s ease; position: relative; } .cwk-09 .dd.hover { background: #F5F3EC; } .cwk-09 .dd.press { transform: scale(0.97); background: #ECE9DF; } .cwk-09 .dd.open { border-color: var(--cwk-text-2); background: #F5F3EC; } .cwk-09 .dd .car { transition: transform 0.18s ease; } .cwk-09 .dd.open .car { transform: rotate(180deg); } .cwk-09 .dd-pill-status { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: #45C252; margin-right: 2px; } .cwk-09 .dd-pill-status.both { background: linear-gradient(90deg, #F4C029 50%, #E14C4C 50%); } .cwk-09 .dd-menu { position: absolute; top: calc(100% + 4px); left: 0; min-width: 170px; background: #fff; border: var(--cwk-hairline); border-radius: 8px; box-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 8px 22px rgba(0,0,0,0.10); padding: 4px; opacity: 0; transform: translateY(-3px) scale(0.985); pointer-events: none; transform-origin: top left; transition: opacity 0.16s ease, transform 0.16s ease; z-index: 10; } .cwk-09 .dd-menu.open { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; } .cwk-09 .dd-item { padding: 7px 10px; font-size: 12.5px; border-radius: 6px; color: var(--cwk-text-1); display: flex; align-items: center; gap: 8px; transition: background 0.1s ease; } .cwk-09 .dd-item.hover { background: rgba(0,0,0,0.04); } .cwk-09 .dd-item-check { width: 14px; height: 14px; border-radius: 3px; border: 1px solid var(--cwk-text-3); background: #fff; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .cwk-09 .dd-item.checked .dd-item-check { background: var(--cwk-slate); border-color: var(--cwk-slate); } .cwk-09 .dd-item-check svg { width: 9px; height: 9px; color: #fff; opacity: 0; } .cwk-09 .dd-item.checked .dd-item-check svg { opacity: 1; } .cwk-09 .dd-item-pip { width: 8px; height: 8px; border-radius: 50%; } .cwk-09 .btn-primary { background: var(--cwk-slate); color: var(--cwk-ivory); border: none; padding: 7px 13px; border-radius: 8px; font-size: 12.5px; font-weight: 500; font-family: inherit; transition: transform 0.08s ease, filter 0.12s ease; } .cwk-09 .btn-primary.hover { filter: brightness(1.15); } .cwk-09 .btn-primary.press { transform: scale(0.97); filter: brightness(0.92); } .cwk-09 .table { background: #fff; border: var(--cwk-hairline); border-radius: 12px; overflow: hidden; } .cwk-09 .thead { display: grid; grid-template-columns: 2.4fr 1fr 1.2fr 1.6fr; padding: 11px 18px; background: var(--cwk-ivory); font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; font-weight: 600; color: var(--cwk-text-3); border-bottom: var(--cwk-hairline); } .cwk-09 .trow { display: grid; grid-template-columns: 2.4fr 1fr 1.2fr 1.6fr; padding: 12px 18px; font-size: 13px; align-items: center; border-bottom: var(--cwk-hairline); transition: opacity 0.35s ease, max-height 0.35s ease, padding 0.35s ease; overflow: hidden; max-height: 60px; } .cwk-09 .trow:last-child { border-bottom: none; } .cwk-09 .trow.is-hidden { opacity: 0; max-height: 0; padding-top: 0; padding-bottom: 0; } .cwk-09 .trow .name { font-weight: 500; } .cwk-09 .trow .arr { font-variant-numeric: tabular-nums; color: var(--cwk-text-2); } .cwk-09 .pill { display: inline-flex; align-items: center; gap: 5px; padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 500; } .cwk-09 .pill.green { background: rgba(69,194,82,0.15); color: #2D7A38; } .cwk-09 .pill.yellow { background: rgba(244,192,41,0.20); color: #8C6E0E; } .cwk-09 .pill.red { background: rgba(225,76,76,0.15); color: #B23F3F; } .cwk-09 .pill .dot { width: 6px; height: 6px; border-radius: 50%; } .cwk-09 .pill.green .dot { background: #45C252; } .cwk-09 .pill.yellow .dot { background: #F4C029; } .cwk-09 .pill.red .dot { background: #E14C4C; } .cwk-09 .trow .last { color: var(--cwk-text-2); } .cwk-09 .cursor { position: absolute; top: 0; left: 0; pointer-events: none; z-index: 20; transition: top 0.85s cubic-bezier(.45,.05,.25,1), left 0.85s cubic-bezier(.45,.05,.25,1); will-change: top, left; } .cwk-09 .cursor svg.arrow { display: block; filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2)); } .cwk-09 .cursor .tag { background: var(--cwk-clay-soft); color: #fff; padding: 4px 10px; border-radius: 999px; font-size: 11.5px; font-weight: 500; margin-top: 4px; margin-left: 14px; display: inline-block; } .cwk-09 .cursor.click svg.arrow { transform: scale(0.9); transition: transform 0.1s ease; } .cwk-09 .ripple { position: absolute; left: 4px; top: 4px; width: 12px; height: 12px; border-radius: 50%; background: rgba(217,119,87,0.5); opacity: 0; transform: scale(0.4); pointer-events: none; } .cwk-09 .ripple.fire { animation: cwk09-ripple 0.55s ease-out; } @keyframes cwk09-ripple { 0% { opacity: 0.55; transform: scale(0.4); } 100% { opacity: 0; transform: scale(3.6); } } .cwk-09 .toast { position: absolute; top: 14px; right: 14px; background: var(--cwk-slate); color: var(--cwk-ivory); padding: 8px 13px; border-radius: 8px; font-size: 12px; display: flex; align-items: center; gap: 7px; box-shadow: 0 6px 18px rgba(0,0,0,0.2); opacity: 0; transform: translateY(-6px); transition: opacity 0.3s ease, transform 0.3s ease; z-index: 30; pointer-events: none; } .cwk-09 .toast.on { opacity: 1; transform: translateY(0); } .cwk-09 .toast svg { width: 12px; height: 12px; } .cwk-09 .cwk-tile-wrap { width: 720px; display: flex; flex-direction: column; gap: 10px; opacity: 0; transform: translateY(8px); transition: opacity 0.45s ease, transform 0.45s ease; } .cwk-09 .cwk-tile-wrap.on { opacity: 1; transform: translateY(0); } .cwk-09 .cwk-tile-eye { font-size: 11px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--cwk-text-3); margin: 0 0 0 4px; display: flex; align-items: center; gap: 6px; } .cwk-09 .cwk-tile-eye-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--cwk-olive); } .cwk-09 .cwk-tile { background: var(--cwk-warm-white); border: var(--cwk-hairline); border-radius: 10px; padding: 12px 16px; display: flex; align-items: center; gap: 14px; box-shadow: 0 1px 2px rgba(0,0,0,0.03); } .cwk-09 .cwk-tile-icon { width: 32px; height: 38px; flex-shrink: 0; color: var(--cwk-clay); } .cwk-09 .cwk-tile-icon svg { width: 100%; height: 100%; } .cwk-09 .cwk-tile-name { font-size: 13.5px; font-weight: 500; color: var(--cwk-text-1); } .cwk-09 .cwk-tile-meta { font-size: 11.5px; color: var(--cwk-text-2); margin-top: 2px; } .cwk-09 .cwk-tile-body { display: flex; flex-direction: column; flex: 1; } @media (prefers-reduced-motion: reduce) { .cwk-09 .cursor { display: none; } .cwk-09 .dd-menu, .cwk-09 .toast { display: none; } }\n\nCowork prompt\n\n“Pull yellow and red accounts from the customer-health dashboard for the last 30 days, then build a one-page summary with the top three at-risk accounts.”\n\nClaude (MCP)\n\nCustomer Health — Dashboard ×\n\napp.internal/customer-health\n\n# Customer health\n\nAll statuses\n\nGreen\n\nYellow\n\nRed\n\nLast 90 days\n\nLast 7 days\n\nLast 30 days\n\nLast 90 days\n\nExport\n\nExported · handed to Cowork\n\nAccount\n\nARR\n\nStatus\n\nLast activity\n\nNorthwind\n\n$1.4M\n\nGreen\n\n2 hours ago\n\nAcme\n\n$980K\n\nGreen\n\nYesterday\n\nGlobex\n\n$640K\n\nYellow\n\n5 days ago\n\nInitech\n\n$420K\n\nRed\n\n12 days ago\n\nHooli\n\n$1.1M\n\nGreen\n\n3 hours ago\n\nMassive Dynamic\n\n$830K\n\nYellow\n\n8 days ago\n\nSoylent\n\n$310K\n\nGreen\n\nYesterday\n\nClaude\n\nCowork takes it from here\n\nat-risk-accounts-summary.docx Pulling Drive context · building summary · 1 of 3 sections\n\n(function(){ var root = document.currentScript.parentElement; var stage = root.querySelector('.stage'); var scaler = root.querySelector('.scaler'); var W = 1160; function fit() { var w = scaler.clientWidth; var s = Math.min(w / W, 1); stage.style.transform = 'scale(' + s + ')'; scaler.style.height = (stage.scrollHeight \\* s) + 'px'; } fit(); if ('ResizeObserver' in window) new ResizeObserver(fit).observe(scaler); else window.addEventListener('resize', fit); var browser = root.querySelector('\\[data-browser\\]'); var cursor = root.querySelector('\\[data-cursor\\]'); var ripple = root.querySelector('\\[data-ripple\\]'); var ddStatus = root.querySelector('\\[data-dd=\"status\"\\]'); var ddStatusMenu = root.querySelector('\\[data-dd-menu=\"status\"\\]'); var ddStatusLabel = root.querySelector('\\[data-dd-label=\"status\"\\]'); var ddStatusPill = root.querySelector('.dd-pill-status'); var ddRange = root.querySelector('\\[data-dd=\"range\"\\]'); var ddRangeMenu = root.querySelector('\\[data-dd-menu=\"range\"\\]'); var ddRangeLabel = root.querySelector('\\[data-dd-label=\"range\"\\]'); var exportBtn = root.querySelector('\\[data-export\\]'); var toast = root.querySelector('\\[data-toast\\]'); var rows = root.querySelectorAll('.trow'); var cwkTile = root.querySelector('\\[data-cwk-tile\\]'); var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; var timers = \\[\\]; var running = false; function clear() { timers.forEach(clearTimeout); timers = \\[\\]; } function at(ms, fn) { timers.push(setTimeout(fn, ms)); } function moveTo(target, offX, offY) { var br = browser.getBoundingClientRect(); var tr = target.getBoundingClientRect(); var scale = br.width / browser.offsetWidth; var x = (tr.left - br.left) / scale + (offX || 0); var y = (tr.top - br.top) / scale + (offY || 0); cursor.style.left = x + 'px'; cursor.style.top = y + 'px'; } function click() { cursor.classList.add('click'); ripple.classList.remove('fire'); void ripple.offsetWidth; ripple.classList.add('fire'); at(140, function(){ cursor.classList.remove('click'); }); } function applyStatusFilter(statuses) { rows.forEach(function (r) { var s = r.getAttribute('data-status'); r.classList.toggle('is-hidden', statuses.indexOf(s) as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 5 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Recognize what Claude does inside Word, Excel, PowerPoint, and Outlook\n- Move work between the apps with one Claude conversation\n- Decide when to do the work in Cowork versus inside the document\n\n* * *\n\n### Collaborate with Claude across Microsoft 365 apps\n\n\n\n#### Key takeaways\n\n- **Claude lives inside the document.** Claude shows up as an add-in inside Word, Excel, PowerPoint, and Outlook, working on the files and spaces you have open.\n- **One conversation can carry context across the apps.** Build the analysis in Excel and hand it to PowerPoint to make the slide. Use the Word memo as the source for the draft Outlook reply.\n- **Claude in Cowork and Claude in M365 are different tools for different moments.** Claude inside Cowork builds finished deliverables across many sources. Claude inside M365 is for refining, debugging, and shaping a file you're already working on — and for carrying context from that file into other documents you're building.\n\n### What Claude does inside each app\n\n**Excel.** Analyze data, write formulas, debug #REF! errors and circular references, run scenario tests without breaking the model, build a sheet from a template, cite back to specific cells. The strongest move: _\"Pull the actuals from the Q3 sheet, compare them to the Q3 plan in the same workbook, and write the variance commentary in column F next to each line item.\"_\n\n**PowerPoint.** Read your slide master, fonts, and color scheme, then build slides that match. Generate native, editable charts (not pasted images). Operate on whatever slide you have selected. The strongest move: _\"Take the analysis I just did in Excel and turn it into a three-slide deck for the QBR, using our deck template.\"_\n\n**Word.** Draft, revise, and reformat in place. Work with comments and tracked changes. Pull context from connected sources to ground the draft. The strongest move: _\"Draft the executive summary based on the body of this memo and the source data referenced in the appendix.\"_\n\n**Outlook.** Triage incoming mail with context from the rest of your work. Draft replies that reflect prior threads, calendar context, and recent decisions.\n\n### Move work across the apps in one conversation\n\nThe cross-app move is where M365 plus Claude starts to feel different from working in any single app. You're not just working _on_ one document — you're carrying its context into the next one.\n\n- **Outlook → Word.** A client brief lands in your inbox. _\"Open the brief in Word and start the memo from our firm template.\"_ Word launches with the attachment open and the email thread already loaded in the sidebar. Claude already knows what the sender asked for.\n- **Word → Excel.** Partway through the memo you need the numbers behind it. _\"Build the market-sizing model behind option 2.\"_ Excel opens, pulls the assumptions from the brief Claude just read in Word, and builds a multi-tab model with formulas you can inspect.\n- **Excel → PowerPoint.** _\"Turn this into the steering-committee deck in the client template.\"_ The deck builds in your slide master with native, editable charts with the updated numbers from Excel.\n- **Back to Outlook.** _\"Find 30 minutes with the team before Thursday.\"_ The invite drafts with the attendees and waits for you to click Send.\n\n### When to use M365 versus Cowork\n\nA useful rule:\n\n- **Reach for Cowork** when the work pulls from many sources and ends in a deliverable. Building the brief from twenty source files, pulling a report together from Salesforce and three Slack channels, running a workflow on a schedule.\n- **Reach for Claude inside M365** when you're working in the Office files themselves — editing in place and carrying context from one app to the next.\n\nMost real work uses both. Claude builds the first draft of the deck; you open it in PowerPoint and refine it with Claude in the slide. Claude pulls the data into the model; you open it in Excel and ask Claude to investigate the outlier you spotted. The two surfaces hand off cleanly — and the file is the file in both cases.\n\n### Try it now\n\nFirst, install the Claude add-in for the M365 app you use most — see [Work across Excel, PowerPoint, and Word](https://support.claude.com/en/articles/13892150-work-across-excel-powerpoint-and-word) for more on setup, and [Claude for Outlook](https://support.claude.com/en/articles/14855664-use-claude-for-outlook) for the separate Outlook beta listing. If add-ins are managed by your IT team, check with them.\n\nOpen one of the M365 apps with a real document you're working on this week. Try one move with Claude inside the app — refine a paragraph, debug a formula, build a slide from a passage in a Word doc. The first time you see Claude operating on the document you're staring at, the difference from chat-then-paste lands.\n\n### What’s next\n\nYou've now seen Cowork everywhere it shows up — the desktop, the browser, and the documents themselves. Module 4 turns to the parts of using Cowork that matter once you're handing it real work: working safely, making sure the things you build behave, and sharing them with your team.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n\n\n## Lesson 11: Best practices for working safely\n\n/\\* Slide figure — visual overview separation from prose \\*/ figure.slide { background: #f7f6f1; padding: 20px; border-radius: 10px; margin: 24px 0; } figure.slide figcaption { font-size: 11px; color: #9c9a92; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; margin-bottom: 10px; } figure.slide img { max-width: 100%; height: auto; display: block; border-radius: 6px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); margin: 0; } /\\* Links — Skilljar styles as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 8 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Set up your workspace so the important stuff stays protected\n- Write prompts that don't leave room for the wrong action\n- Recognize the moments when _\"stop and think\"_ matters more than speed\n\n* * *\n\n### Your part in working safely with Cowork\n\nYou already know from Lesson 2 that Claude always asks before deleting, and — in the default permission mode — before sending or sharing too. That's the floor. This lesson is what _you_ bring on top — the pre-emptive moves that keep an autonomous tool with file, app, and connector access from doing something you didn't intend.\n\n### Set up so mistakes can't reach what matters\n\nThe single highest-leverage move is the folder you point Claude at. It's the boundary for what Claude can read, write, and (with your confirmation) delete.\n\n- **Use a dedicated working folder, not a catch-all.** Pointing Claude at Documents, Downloads, or Desktop is the equivalent of letting a new colleague rummage through every file you have. Make a folder for the work. Move (or copy) in what's needed. Point Claude there.\n- **Back up anything irreplaceable before you start.** If a file matters and a fresh copy can't be regenerated — old client deliverables, contracts you can't get re-issued, anything you'd be sorry to lose — make sure a copy lives somewhere Cowork can't reach. Cloud backup, a separate folder, a drive that isn't connected. Claude won't delete without asking, but the cost of clicking through the wrong confirmation is the cost of the file.\n- **Test new workflows on copies first.** For example if you're building a scheduled task that'll run every Friday, the first run goes against a copy of the data. Once you've seen it behave, point it at the live folder.\n\n### Write prompts that leave no room for the wrong action\n\nHow you ask matters as much as what folder you point at.\n\n- **Be specific about destructive verbs.** _\"Cut the section\"_ can be read as _\"remove from view\"_ or _\"delete from the file.\"_ _\"Update the file\"_ can mean _\"rewrite it\"_ or _\"add to it.\"_ If the wrong reading would be irrecoverable, name what you mean: _\"Remove the section from the draft, but keep the file.\"_ _\"Add a new appendix; don't rewrite the existing sections.\"_\n- **Name the bounds in the prompt.** _\"Only the 3 most recently updated files in this folder.\"_ _\"Only contracts that closed in Q3.\"_ _\"Don't message anyone — draft only.\"_ This narrows what Cowork is doing and gives you a clear line for spotting drift.\n- **Use scheduled tasks for drafts initially.** Scheduled tasks run while you're not watching. Until you're confident that the task runs the way you need it to, prompt it to draft for your review rather than send on your behalf.\n\n### In the moment: the three checks that catch the rest\n\n**Read the plan once it has been made.** When Claude starts a task, it lays out what it's going to do in the progress tab. Skim it. Consider: does the plan make sense? are the steps in the right order? is it using the right sources? Redirect as necessary.\n\n**Watch for unexpected patterns.** You don't need to validate every command. But if Claude is touching files or sites you didn't mention, or scope is creeping past what you asked for, stop the task. _\"Something feels off\"_ is a real signal — pay attention to this.\n\n**Approve confirmation prompts deliberately.** Stay in “Ask before acting” for anything that sends, posts, or shares — and when a confirmation prompt does appear, read it. Most mistakes don't happen because the safeguards failed; they happen because someone clicked through a confirmation that wasn't quite the action they intended. The dialog exists because the action matters — treat it that way.\n\n### When Cowork isn't the right tool\n\nA short list:\n\n- **Regulated workflows that need an audit trail.** Cowork activity isn't captured in audit logs, the Compliance API, or data exports.\n- **Anything you wouldn't trust a smart, quick colleague to do unsupervised.** Sending the legal doc to a counterparty, posting the public announcement, pushing a customer-facing change. Claude can prepare; you ship.\n- **Highly sensitive personal data** outside the boundary your IT team has explicitly approved.\n\n### Go deeper\n\n[Use Claude Cowork safely](https://support.claude.com/en/articles/13364135-use-claude-cowork-safely) is a valuable resource for learning what to do — and not to do — when working with Claude in Cowork. It covers the rest of what warrants more thought so that you understand the built-in guardrails and what you remain responsible for as Claude acts on your behalf.\n\n### Lesson reflection\n\nReview the interactive below to get a sense for how to work safely with Cowork.\n\n.str { --paper: #FAF9F5; --surface: #FFFFFF; --warm: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --clay-line: rgba(217,119,87,0.45); --border: rgba(31,30,29,0.15); --hover: rgba(20,20,19,0.04); --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); --hot: #C4523A; --hot-soft: rgba(196,82,58,0.12); --hot-line: rgba(196,82,58,0.55); /\\* iOS toggle accent \\*/ --toggle-on: #2C84DB; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; -webkit-font-smoothing: antialiased; } .str \\*, .str \\*::before, .str \\*::after { box-sizing: border-box; } .str-frame { margin: 0 4px 14px; padding: 12px 16px; background: var(--olive-soft); border-left: 3px solid var(--olive); border-radius: 0 6px 6px 0; font-size: 13.5px; line-height: 1.55; } .str-frame strong { font-weight: 600; } /\\* Counter strip \\*/ .str-counter { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; background: var(--surface); border: 1px solid var(--border); border-radius: 8px 8px 0 0; border-bottom: none; } .str-counter-label { font-size: 12px; color: var(--ink-3); } .str-counter-num { font-size: 12.5px; font-weight: 600; color: var(--ink); font-variant-numeric: tabular-nums; } .str-pips { display: flex; gap: 4px; } .str-pip { width: 16px; height: 4px; border-radius: 2px; background: rgba(20,20,19,0.10); transition: background 0.2s; } .str-pip.is-on { background: var(--hot); } .str-mode-toggle { display: none; gap: 0; border: 1px solid var(--border); border-radius: 999px; overflow: hidden; font-size: 11.5px; } .str-mode-toggle.is-shown { display: flex; } .str-mode-btn { padding: 4px 12px; background: transparent; border: none; cursor: pointer; color: var(--ink-3); font-weight: 500; font-family: inherit; } .str-mode-btn.is-on { background: var(--ink); color: #fff; } /\\* Cowork window \\*/ .str-window { background: var(--surface); border: 1px solid var(--border); border-radius: 0 0 12px 12px; overflow: hidden; transition: border-color 0.4s; } .str-window.is-safe { border-color: var(--olive-line); } .str-win-body { padding: 18px; } /\\* Pre-prompt setup card \\*/ .str-setup { background: var(--warm); border: 1px solid var(--border); border-radius: 12px; padding: 14px 16px; margin-bottom: 12px; } .str-setup-section + .str-setup-section { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border); } .str-setup-h { font-size: 10px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--ink-4); margin: 0 0 8px; } .str-conn-list { display: flex; flex-direction: column; gap: 6px; } .str-conn { display: flex; align-items: center; gap: 10px; padding: 6px 4px; font-size: 13px; color: var(--ink); } .str-conn-icon { width: 22px; height: 22px; border-radius: 5px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 13px; font-weight: 600; } .str-conn-icon.ms, .str-conn-icon.asana, .str-conn-icon.chrome { background: #fff; border: 1px solid var(--border); padding: 2px; } .str-conn-icon svg { width: 14px; height: 14px; display: block; } .str-conn-name { flex: 1; } .str-toggle { width: 32px; height: 18px; background: rgba(20,20,19,0.20); border-radius: 999px; position: relative; flex-shrink: 0; cursor: pointer; transition: background 0.18s ease; } .str-toggle::after { content: ''; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; background: #fff; border-radius: 50%; box-shadow: 0 1px 2px rgba(0,0,0,0.15); transition: left 0.18s ease; } .str-toggle.is-on { background: var(--toggle-on); } .str-toggle.is-on::after { left: 16px; } .str-conn\\[data-hot\\] { border-radius: 8px; margin: 0 -8px; padding: 6px 8px; cursor: pointer; } .str-conn:not(\\[data-hot\\]) { margin: 0 -8px; padding: 6px 8px; } .str-conn\\[data-hot\\]:hover { background: var(--hot-soft); } .str-toggle.is-hot { box-shadow: 0 0 0 2px var(--hot-soft); } .str-conn.is-found .str-toggle.is-hot { box-shadow: 0 0 0 2px var(--hot-line); } .str-hot-flag { position: absolute; right: 40px; display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; border-radius: 50%; background: var(--hot); color: #fff; font-size: 10px; font-weight: 700; opacity: 0; transition: opacity 0.2s; } .str-conn { position: relative; } .str-conn.is-found .str-hot-flag { opacity: 1; } .str-folder-row { display: flex; align-items: center; gap: 10px; } .str-folder-pick { display: inline-flex; align-items: center; gap: 8px; padding: 7px 12px 7px 10px; border: 1px solid var(--border); background: var(--surface); border-radius: 8px; font-size: 12.5px; color: var(--ink); cursor: pointer; transition: all 0.2s; } .str-folder-pick:hover { background: var(--hot-soft); border-color: var(--hot-line); } .str-folder-pick svg { width: 13px; height: 11px; color: var(--clay); flex-shrink: 0; } .str-folder-pick.is-found { background: var(--hot-soft); border-color: var(--hot-line); border-style: solid; } .str-folder-pick.is-found svg { color: var(--hot); } .str-folder-meta { color: var(--ink-3); font-size: 11px; } .str-folder-caret { color: var(--ink-4); font-size: 10px; margin-left: 2px; } .str-folder-flag { display: none; width: 14px; height: 14px; border-radius: 50%; background: var(--hot); color: #fff; font-size: 10px; font-weight: 700; align-items: center; justify-content: center; margin-left: 2px; } .str-folder-pick.is-found .str-folder-flag { display: inline-flex; } /\\* Cowork composer — matches project page (white card, placeholder, bottom strip) \\*/ .str-input { background: #FFFFFF; border: 1px solid rgba(31,30,29,0.15); border-radius: 16px; padding: 16px 18px 0; box-shadow: 0 1px 3px rgba(0,0,0,0.04), 0 8px 24px rgba(0,0,0,0.04); overflow: hidden; } .str-prompt { font-size: 15px; line-height: 1.6; color: var(--ink); margin: 0 0 14px; min-height: 40px; } .str-prompt-span { cursor: pointer; border-bottom: 1.5px dotted var(--ink-3); padding-bottom: 1px; transition: all 0.15s; } .str-prompt-span:hover { background: var(--hot-soft); border-bottom: 1.5px solid var(--hot); } .str-prompt-span.is-found { background: var(--hot-soft); border-bottom: 1.5px solid var(--hot); padding: 1px 2px; border-radius: 2px; } .str-prompt-num { display: none; align-items: center; justify-content: center; width: 13px; height: 13px; border-radius: 50%; background: var(--hot); color: #fff; font-size: 10px; font-weight: 700; margin-left: 4px; vertical-align: 1px; } .str-prompt-span.is-found + .str-prompt-num { display: inline-flex; } /\\* Composer foot row inside the card: + | mic \\*/ .str-input-foot { display: flex; align-items: center; gap: 4px; padding-bottom: 12px; } .str-foot-btn { background: transparent; border: none; color: #73726C; font-family: inherit; font-size: 13px; padding: 4px 8px; border-radius: 6px; display: inline-flex; align-items: center; gap: 5px; cursor: default; } .str-foot-btn svg { width: 14px; height: 14px; } .str-foot-btn.plus svg { width: 16px; height: 16px; } .str-foot-spacer { flex: 1; } /\\* Below-composer strip: folder chip | Ask | model — like the project page \\*/ .str-input-strip { display: flex; align-items: center; gap: 8px; background: var(--paper); border-top: 1px solid var(--border); margin: 0 -18px; padding: 10px 18px; } .str-strip-folder { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: #73726C; padding: 4px 8px; border-radius: 6px; cursor: pointer; transition: all 0.15s; } .str-strip-folder svg { width: 14px; height: 14px; } .str-strip-folder .car { width: 10px; height: 10px; } .str-strip-folder:hover { background: rgba(0,0,0,0.04); } .str-strip-folder.is-found { background: var(--hot-soft); color: var(--ink); } .str-strip-folder.is-found svg { color: var(--hot); } .str-strip-btn { display: inline-flex; align-items: center; gap: 5px; font-size: 13px; color: #73726C; padding: 4px 8px; border-radius: 6px; } .str-strip-btn .car { width: 10px; height: 10px; } .str-strip-btn.model { color: #B0AEA5; font-size: 12.5px; margin-left: auto; } /\\* Schedule badge sits in the strip too \\*/ .str-badge { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border: 1px solid var(--border); background: var(--surface); border-radius: 999px; font-size: 12px; color: var(--ink-2); transition: all 0.2s; } .str-badge svg { width: 11px; height: 11px; color: var(--ink-3); } .str-badge.is-hot { cursor: pointer; } .str-badge.is-hot:hover { background: var(--hot-soft); border-color: var(--hot-line); } .str-badge.is-found { background: var(--hot-soft); border-color: var(--hot-line); color: var(--ink); } .str-badge.is-found svg { color: var(--hot); } .str-badge .str-prompt-num { margin-left: 4px; } .str-badge.is-found .str-prompt-num { display: inline-flex; } .str-send { background: #E0A894; color: #fff; border: none; padding: 6px 13px 6px 10px; border-radius: 999px; display: none; align-items: center; gap: 5px; font-size: 12px; font-weight: 500; cursor: not-allowed; transition: all 0.25s; font-family: inherit; } .str-send svg { width: 12px; height: 12px; } .str-window.is-safe .str-send { background: var(--olive); } /\\* Callout \\*/ .str-callout { margin: 12px 4px 0; padding: 14px 16px; background: var(--paper); border: 1px solid var(--border); border-radius: 10px; min-height: 90px; transition: all 0.25s; } .str-callout.is-empty { color: var(--ink-3); font-style: italic; font-size: 13px; display: flex; align-items: center; justify-content: center; text-align: center; } .str-callout-row { display: flex; gap: 12px; align-items: flex-start; } .str-callout-num { flex-shrink: 0; width: 28px; height: 28px; border-radius: 50%; background: var(--hot); color: #fff; font-size: 13px; font-weight: 700; display: flex; align-items: center; justify-content: center; } .str-callout-body { flex: 1; min-width: 0; } .str-callout-label { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--hot); margin: 2px 0 4px; } .str-callout-text { font-size: 13.5px; color: var(--ink); line-height: 1.55; } .str-callout-text em { background: var(--olive-soft); border-radius: 3px; padding: 0 4px; font-style: normal; font-family: 'Iowan Old Style', Georgia, serif; color: var(--ink); } /\\* Make-it-safe payoff \\*/ .str-payoff { margin: 14px 4px 0; padding: 16px; background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 10px; text-align: center; opacity: 0; max-height: 0; overflow: hidden; transition: opacity 0.4s, max-height 0.4s, padding 0.4s, margin 0.4s; padding-top: 0; padding-bottom: 0; } .str-payoff.is-shown { opacity: 1; max-height: 200px; padding: 16px; } .str-payoff-text { font-size: 13.5px; color: var(--ink); margin: 0 0 10px; } .str-payoff-text strong { font-weight: 600; } .str-payoff-btn { background: var(--olive); color: #fff; border: none; padding: 9px 20px; border-radius: 999px; font-size: 13px; font-weight: 600; cursor: pointer; font-family: inherit; transition: opacity 0.15s; } .str-payoff-btn:hover { opacity: 0.9; } .str-safe-cap { margin: 14px 4px 0; font-family: 'Iowan Old Style', Georgia, serif; font-style: italic; font-size: 14.5px; color: var(--ink); text-align: center; opacity: 0; max-height: 0; overflow: hidden; transition: opacity 0.4s, max-height 0.4s, margin 0.4s; } .str-safe-cap.is-shown { opacity: 1; max-height: 60px; } .str-foot-note { margin: 8px 4px 0; font-size: 11.5px; color: var(--ink-4); font-style: italic; } @media (max-width: 560px) { .str-win-body { padding: 14px; } .str-setup { padding: 12px 14px; } .str-counter { flex-wrap: wrap; gap: 8px; } .str-pips { order: 3; width: 100%; } .str-input-foot { flex-wrap: wrap; gap: 8px; } .str-prompt { font-size: 14px; } }\n\nThis Cowork task is about to run. **Five things about it would make a careful colleague pause.** Find them.\n\nHazards found 0 of 5 Risky Safe\n\nConnectors\n\nMicrosoft 365\n\nClaude in Chrome can act on pages in tabs you've allowed it to access 1\n\nAsana\n\nClean up last quarter's client files3 — archive the old stuff4 and post a note in each client's Slack channel that their folder's been tidied5.\n\nScheduled · Every Friday 5pm\n\n~/Documents/Work Ask Sonnet 4.6\n\nClick anything in the window that looks risky.\n\nAll five found. **Now watch it become a task you'd run unattended.**\n\nMake it safe →\n\nSame job. Nothing here can't be undone.\n\nLook at the connectors, the folder, the prompt wording, and what runs when. Click anything that gives you pause.\n\n(function () { var HOTSPOTS = { chrome: { n: 1, label: 'Chrome can act on any open tab', text: '“Claude in Chrome” lets Cowork click and type on whatever page you have open. Useful — but for an unattended run, narrow it: only click on app.northwind.com, or turn it off for this task.' }, folder: { n: 2, label: 'Scope is too wide', text: 'That’s every file you have — including Personal/ and every other client. Point Cowork at the one client folder this task is about, or a working copy of it.' }, bounds: { n: 3, label: 'Bounds not named', text: 'Which clients? Which quarter? Name the bounds so you can spot drift: “Only Northwind/ and Acme/, only files dated before 2026-01-01.”' }, verbs: { n: 4, label: 'Destructive verb', text: '“Clean up” and “archive” can mean move — or delete. Cowork will still ask before deleting, but you don’t want to be denying deletions you didn’t intend. If the wrong reading can’t be undone, say which: “Move anything dated before Jan 1 into /Archive. Don’t delete anything.”' }, send: { n: 5, label: 'Acts instead of drafts', text: 'Once it’s posted, it’s posted. Have Cowork draft the notes — you review and post. Cowork prepares; you ship.' }, schedule: { n: 5, label: 'Scheduled action, not a draft', text: 'This runs while you’re not watching — and it posts to a customer-facing channel. Scheduled tasks are safe when they produce a draft for you to review. Scheduling an irrecoverable action delegates the part you should keep.' } }; var found = {}; var transformed = false; var $callout = document.getElementById('str-callout'); var $counter = document.getElementById('str-counter'); var $pips = document.getElementById('str-pips').querySelectorAll('.str-pip'); var $payoff = document.getElementById('str-payoff'); var $window = document.getElementById('str-window'); var $modeWrap = document.getElementById('str-mode'); var $safeCap = document.getElementById('str-safe-cap'); function findCount() { return Object.keys(found).length; } function activate(key) { if (transformed) return; if (!HOTSPOTS\\[key\\]) return; found\\[key\\] = true; var hot = HOTSPOTS\\[key\\]; if (key === 'folder') { var chip = document.querySelector('.str-strip-folder\\[data-hot=\"folder\"\\]'); if (chip) chip.classList.add('is-found'); } else if (key === 'chrome') { var conn = document.getElementById('str-conn-chrome'); if (conn) conn.classList.add('is-found'); } else if (key === 'schedule') { var b = document.querySelector('\\[data-hot=\"schedule\"\\]'); if (b) b.classList.add('is-found'); } else { var span = document.querySelector('.str-prompt-span\\[data-hot=\"' + key + '\"\\]'); if (span) span.classList.add('is-found'); } var n = findCount(); $counter.textContent = n + ' of 5'; Array.prototype.forEach.call($pips, function (p, i) { p.classList.toggle('is-on', i ' + '' + hot.n + '' + '
    ' + '

    ' + hot.label + '

    ' + '

    ' + hot.text + '

    ' + '
    ' + ''; if (n === 5) $payoff.classList.add('is-shown'); } document.querySelectorAll('.str \\[data-hot\\]').forEach(function (el) { if (!el.hasAttribute('role')) el.setAttribute('role', 'button'); if (!el.hasAttribute('tabindex')) el.setAttribute('tabindex', '0'); el.addEventListener('keydown', function (e) { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); activate(el.getAttribute('data-hot')); } }); el.addEventListener('click', function () { activate(el.getAttribute('data-hot')); }); }); document.getElementById('str-make-safe').addEventListener('click', function () { if (transformed) return; transformed = true; applyMode('safe'); $payoff.classList.remove('is-shown'); setTimeout(function () { $modeWrap.classList.add('is-shown'); $safeCap.classList.add('is-shown'); $callout.innerHTML = '
    ' + '' + '
    ' + '

    Five habits, applied

    ' + '

    Chrome scoped. Tight folder. Specific verbs. Named bounds. Drafts, not sends. A run-once, not a schedule. Toggle Risky / Safe above to compare.

    ' + '
    ' + '
    '; }, 700); }); $modeWrap.querySelectorAll('.str-mode-btn').forEach(function (b) { b.addEventListener('click', function () { applyMode(b.getAttribute('data-mode')); $modeWrap.querySelectorAll('.str-mode-btn').forEach(function (x) { x.classList.toggle('is-on', x === b); }); }); }); function applyMode(m) { if (m === 'safe') { $window.classList.add('is-safe'); // Chrome: turn off var ct = document.querySelector('#str-conn-chrome .str-toggle'); if (ct) ct.classList.remove('is-on'); // Folder document.getElementById('str-folder-name').innerHTML = 'Clients/Northwind working copy · 89 files'; // Prompt document.getElementById('str-prompt-text').innerHTML = '“In Northwind/, ' + 'move files dated before 2026-01-01 into Northwind/Archive/. ' + 'Don’t delete anything. ' + 'Then draft (don’t post) a short Slack note to the client summarizing what moved — save it as tidy-note.md for me to review.”'; // Badge document.getElementById('str-badge-text').textContent = 'Run once now'; } else { $window.classList.remove('is-safe'); var ct2 = document.querySelector('#str-conn-chrome .str-toggle'); if (ct2) ct2.classList.add('is-on'); document.getElementById('str-folder-name').textContent = '~/Documents/Work'; document.getElementById('str-prompt-text').innerHTML = '“Clean up last quarter’s client files3 — ' + 'archive the old stuff4 and ' + 'post a note in each client’s Slack channel that their folder’s been tidied5.”'; document.getElementById('str-badge-text').textContent = 'Scheduled · Every Friday 5pm'; } } })();\n\nAs you think about the tasks _you're_ going to hand to Cowork:\n\n- Which folder would you point Claude at — and is there anything inside it that shouldn't be reachable, or anything irreplaceable that needs to be backed up first?\n- Is there a destructive verb in the prompt you'd write that you'd want to be more specific about?\n\n### What’s next\n\nIn the next lesson, you'll learn how to make sure the skills and plugins you build actually behave — using lightweight evals to check their output before you rely on them or share them with anyone else.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n\n\n## Lesson 12: Validating skills for plugins\n\n/\\* Slide figure — visual overview separation from prose \\*/ figure.slide { background: #f7f6f1; padding: 20px; border-radius: 10px; margin: 24px 0; } figure.slide figcaption { font-size: 11px; color: #9c9a92; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; margin-bottom: 10px; } figure.slide img { max-width: 100%; height: auto; display: block; border-radius: 6px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); margin: 0; } /\\* Links — Skilljar styles
    as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 8 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Explain what an eval is and why it matters before you share or rely on a skill\n- Run a lightweight eval through skill-creator\n\n* * *\n\n### Why this matters\n\nWhen you build a skill or bundle them into a plugin, you're essentially building a small product that other people will use. And like anything you'd hand to a colleague — a template, a spreadsheet model, a checklist — it's worth a test drive before it leaves your desk.\n\nWhen you use a skill you built, you know how to work around any issues or failures. You know exactly what to ask it, what files to give it, and what the answer is supposed to look like. A teammate doesn't have any of that. They might phrase the request a little differently, hand it slightly different inputs, or hit an edge case — an unusual-but-real situation, like a request that's just outside what the skill was designed for. That's where skills tend to stumble, and the person using it won't know why.\n\nTesting a skill with evals — short for evaluations — is how you catch those stumbles before someone else does. Don't let the word intimidate you. An eval is just a try-out: a realistic request goes in, you look at what comes out, and you tell Claude what to fix. No code, no test scripts — just your judgment about whether the result is good enough to put your name on.\n\n### How the eval system works\n\nWhen you build a skill with skill-creator — Claude's built-in helper for creating skills — it walks you through evals as part of the process. Here's what that actually looks like.\n\nSkill-creator comes up with two or more realistic prompts someone might use with your skill. For each prompt, it produces a pair of outputs:\n\n- One where Claude uses your skill\n- One where Claude answers the same prompt _without_ your skill\n\nThat second one is the comparison point. It's there so you can see, side by side, what difference your skill is actually making — not just \"is this output okay,\" but \"is this output better than what Claude would have done on its own.\"\n\nReview each pair and give feedback in plain English, right on the review page. As you read each pair, you're really just answering two questions:\n\n- Is the skill version the one I'd use? If yes, great — note what made it better so the skill keeps doing that.\n- If not, what's missing or off? Be specific. \"The tone is too formal\" or \"it skipped the executive summary\" gives Claude something to act on; \"this isn't quite right\" doesn't.\n\nOnce you submit your feedback, Claude revises the skill for you based on what you said.\n\n### Iterate on the skill\n\nYour feedback is the fix. Once you submit it, Claude updates the skill — rewriting the instructions, adjusting the examples, tightening what it asks for — and you can run the same prompts again to see if the change stuck.\n\nChange one thing at a time. If the first round showed the skill was too wordy _and_ missing a section, pick the one that matters more, fix it, re-run, then come back for another review. You'll be able to tell what actually moved the needle. If you're still not happy with the outputs after the revision, run it again — it's a loop, not a one-time gate. Most skills are ready after one or two rounds. The bar for shipping a skill — to yourself, to a teammate — isn't perfect evals. It's that the cases you care about pass meaningfully better than the baseline, and that you've named the cases you don't yet handle.\n\nAnd if the outputs already look great on the first pass? You're done. Evals aren't a hoop to jump through — they're there for when you need confidence, not ceremony.\n\n### Try it now\n\nStep through a mock eval review below — three prompts, each with a with-skill and a without-skill output side by side.\n\n.ev { --paper: #FAF9F5; --warm: #FAFAF6; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --border: rgba(31,30,29,0.12); --hover: rgba(20,20,19,0.04); --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --olive: #788C5D; --olive-deep: #4F6632; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); --olive-tint: #E8F0DD; --fail: #C44; --fail-deep:#A33; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.55; margin: 28px 0; -webkit-font-smoothing: antialiased; } .ev \\*, .ev \\*::before, .ev \\*::after { box-sizing: border-box; } .ev a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; color: inherit; } .ev button { font-family: inherit; cursor: pointer; } .ev-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 4px 4px; } .ev-frame { font-size: 13.5px; color: var(--ink-2); margin: 0 4px 14px; } .ev-frame strong { color: var(--ink); font-weight: 600; } /\\* Carousel nav \\*/ .ev-nav { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; background: var(--paper); border: 1px solid var(--border); border-radius: 10px; margin-bottom: 12px; } .ev-nav-arrow { width: 30px; height: 30px; background: var(--surface); border: 1px solid var(--border); border-radius: 999px; color: var(--ink-2); display: flex; align-items: center; justify-content: center; transition: all 0.15s; flex-shrink: 0; } .ev-nav-arrow:hover { background: var(--hover); color: var(--ink); border-color: rgba(20,20,19,0.20); } .ev-nav-arrow:disabled { opacity: 0.35; cursor: default; } .ev-nav-arrow svg { width: 13px; height: 13px; } .ev-nav-mid { display: flex; flex-direction: column; align-items: center; gap: 6px; } .ev-nav-pos { font-size: 12.5px; color: var(--ink-2); font-weight: 500; } .ev-nav-pos b { color: var(--ink); font-weight: 600; } .ev-nav-dots { display: flex; gap: 5px; } .ev-nav-dot { width: 7px; height: 7px; border-radius: 50%; background: rgba(20,20,19,0.15); transition: background 0.15s; cursor: pointer; border: none; padding: 0; } .ev-nav-dot.is-on { background: var(--clay); } .ev-nav-dot.is-done { background: var(--olive); } /\\* Case panel — one at a time \\*/ .ev-case { display: none; } .ev-case.is-on { display: block; } .ev-case-tag { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--clay); margin: 0 4px 4px; } .ev-case-title { font-family: Georgia, 'Iowan Old Style', serif; font-size: 19px; font-weight: 500; color: var(--ink); letter-spacing: -0.01em; margin: 0 4px 12px; } .ev-prompt { background: var(--paper); border-left: 3px solid var(--clay); border-radius: 0 6px 6px 0; padding: 10px 14px; margin-bottom: 14px; } .ev-prompt-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.10em; color: var(--ink-3); font-weight: 600; margin-bottom: 4px; } .ev-prompt-body { font-size: 13px; color: var(--ink-2); } /\\* Two-column outputs \\*/ .ev-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 14px; } @media (max-width: 640px) { .ev-grid { grid-template-columns: 1fr; } } .ev-col { border: 2px solid transparent; border-radius: 10px; padding: 0; transition: border-color 0.18s, opacity 0.18s; } .ev-col-inner { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; } .ev-col.is-picked { border-color: var(--olive); } .ev-col.is-not-picked { opacity: 0.55; } .ev-col.is-picked .ev-col-inner { border-color: var(--olive-line); } .ev-col-h { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding-bottom: 10px; margin-bottom: 10px; border-bottom: 1px solid var(--border); } .ev-col-h-l { font-size: 13px; font-weight: 600; color: var(--ink); } .ev-col-asrts { display: flex; align-items: center; gap: 4px; font-size: 11.5px; color: var(--ink-3); font-variant-numeric: tabular-nums; } .ev-col-asrts-marks { display: inline-flex; gap: 2px; margin-right: 4px; } .ev-mark { font-weight: 700; } .ev-mark.pass { color: var(--olive); } .ev-mark.fail { color: var(--fail); } .ev-out { font-size: 12.5px; line-height: 1.55; color: var(--ink-2); max-height: 170px; overflow: auto; } .ev-out h5 { font-family: Georgia, 'Iowan Old Style', serif; font-size: 13px; font-weight: 600; margin: 0 0 6px; color: var(--ink); letter-spacing: -0.005em; } .ev-out h6 { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-3); font-weight: 600; margin: 8px 0 3px; } .ev-out h6:first-of-type { margin-top: 0; } .ev-out p { margin: 0 0 6px; } .ev-out p:last-child { margin-bottom: 0; } .ev-out ul { margin: 0 0 6px; padding-left: 14px; } .ev-out li { margin-bottom: 2px; } .ev-out em.miss { background: rgba(196,68,68,0.10); border-radius: 2px; padding: 0 3px; font-style: normal; color: var(--fail-deep); } .ev-out em.hit { background: var(--olive-soft); border-radius: 2px; padding: 0 3px; font-style: normal; color: var(--olive-deep); } .ev-out em.flag { background: rgba(244,192,41,0.18); border-radius: 2px; padding: 0 3px; font-style: italic; color: #8C6E0E; } /\\* Assertion list — compact, inline beneath each output \\*/ .ev-asrts { margin: 12px 0 0; padding: 10px 12px; background: var(--warm); border: 1px solid var(--border); border-radius: 6px; } .ev-asrts-h { font-size: 10px; text-transform: uppercase; letter-spacing: 0.10em; color: var(--ink-3); font-weight: 600; margin: 0 0 6px; } .ev-asrts ul { list-style: none; padding: 0; margin: 0; } .ev-asrts li { font-size: 12.5px; font-size: 12.5px; color: var(--ink-2); padding: 3px 0; line-height: 1.4; display: flex; align-items: flex-start; gap: 7px; } .ev-asrts li.is-fail { color: var(--ink-3); } .ev-asrts .mark { flex-shrink: 0; margin-top: 1px; font-weight: 700; } .ev-asrts li.is-pass .mark { color: var(--olive); } .ev-asrts li.is-fail .mark { color: var(--fail); } /\\* Picker \\*/ .ev-action { padding: 12px 14px; background: var(--paper); border: 1px solid var(--border); border-radius: 10px; } .ev-action-h { font-size: 13px; color: var(--ink); font-weight: 600; margin: 0 0 10px; } .ev-action-row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 12px; } @media (max-width: 640px) { .ev-action-row { grid-template-columns: 1fr; } } .ev-pick { appearance: none; background: var(--surface); border: 1px solid var(--border); border-radius: 999px; padding: 9px 14px; font-size: 12.5px; color: var(--ink-2); font-weight: 500; transition: all 0.15s; display: flex; align-items: center; justify-content: center; gap: 7px; } .ev-pick:hover { background: var(--olive-tint); border-color: var(--olive-line); color: var(--olive-deep); } .ev-pick.is-on { background: var(--olive); border-color: var(--olive); color: #fff; } .ev-pick-check { display: inline-flex; opacity: 0; transition: opacity 0.15s; } .ev-pick.is-on .ev-pick-check { opacity: 1; } .ev-pick-check svg { width: 11px; height: 11px; } .ev-feedback-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 600; color: var(--ink-3); margin: 0 0 5px; } .ev-feedback-input { width: 100%; background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 9px 12px; font-family: inherit; font-size: 13px; color: var(--ink); outline: none; transition: border-color 0.15s; } .ev-feedback-input:focus { border-color: var(--olive-line); } .ev-feedback-input::placeholder { color: var(--ink-4); font-style: italic; } /\\* Closer line — only visible after final case \\*/ .ev-closer { margin: 14px 4px 0; padding: 14px 16px; background: var(--olive-tint); border: 1px solid var(--olive-line); border-radius: 10px; font-size: 13px; line-height: 1.55; color: var(--ink); display: none; } .ev-closer.is-on { display: block; } .ev-closer strong { font-weight: 600; }\n\nRead an eval\n\nAn eval is just two outputs side by side, with a few rules of what “good” looks like. **Your job is to pick which one you'd actually send** — and tell Claude what to change.\n\n**1** of 3\n\nTypical case\n\n### Recap a regular team sync\n\nPrompt\n\nWrite the recap for today's product sync. Notes are in `notes/2026-05-01-product-sync.md`.\n\nWith skill ✓✓✓✓ 4/4\n\n##### Product sync — recap\n\n###### Decisions\n\n- Ship the new onboarding flow to 10% of new sign-ups starting Monday.\n- Pause the in-app tour redesign until after launch.\n\n###### Action items\n\n- Maya — finalize the rollout plan by Fri May 9.\n- Devon — instrument the new flow for activation rate by Wed May 7.\n- Priya — draft the announcement post by Mon May 12.\n\n###### Open questions\n\n- _Do we need legal sign-off on the new copy before 10%?_\n\nHouse rules\n\n- ✓ Leads with decisions\n- ✓ Every action item has an owner and a date\n- ✓ Open questions called out\n- ✓ Under 150 words\n\nWithout skill ×××✓ 1/4\n\n##### Product sync recap\n\nThe team had a productive discussion about the new onboarding flow this morning. After reviewing the latest mockups, the group decided to move ahead with a 10% rollout starting next Monday. The in-app tour redesign came up but the consensus was to revisit it after launch.\n\nMaya offered to finalize the rollout plan and Devon mentioned he'd look at the instrumentation. Priya is going to draft something for the announcement. There was also some back and forth about whether legal needs to weigh in on the new copy — the team didn't reach a conclusion on that.\n\nOverall _a productive meeting with clear next steps_.\n\nHouse rules\n\n- × Leads with decisions\n- × Every action item has an owner and a date\n- × Open questions called out\n- ✓ Under 150 words\n\nWhich one would you send?\n\nI'd send this one I'd send this one\n\nOne thing you'd tell Claude to change\n\nMessy input\n\n### Recap a stand-up from rough, partly pasted-in notes\n\nPrompt\n\nRecap the marketing stand-up — notes are pretty rough, half of it is just pasted Slack messages.\n\nWith skill ✓✓✓× 3/4\n\n##### Marketing stand-up — recap\n\n###### Decisions\n\n- Move the webinar from May 14 to May 21 to avoid the customer-conference overlap.\n\n###### Action items\n\n- Jordan — update the registration page and re-send invites by Mon May 5.\n- _(owner unclear — confirm with Priya?)_ — rework the email cadence around the new date by Wed May 7.\n\n###### Open questions\n\n- Do we need to notify partners who promoted the original date?\n- Who's on point for the rescheduled day-of logistics?\n\nHouse rules\n\n- ✓ Leads with decisions\n- ✓ Every action item has an owner and a date _(or flagged)_\n- ✓ Open questions called out\n- × Under 150 words _(164)_\n\nWithout skill ✓××✓ 2/4\n\n##### Marketing stand-up\n\nThe team agreed to push the webinar from May 14 to May 21 because the customer conference is the same week. Jordan will update the landing page and re-send invites.\n\n_Priya will rework the email cadence around the new date._ The team also discussed how to handle the partners who already promoted the original date and the day-of logistics for the new date.\n\nGood progress — everyone's aligned on the move.\n\nHouse rules\n\n- ✓ Leads with decisions\n- × Every action item has an owner and a date _(invented an owner)_\n- × Open questions called out _(buried in prose)_\n- ✓ Under 150 words\n\nWhich one would you send?\n\nI'd send this one I'd send this one\n\nOne thing you'd tell Claude to change\n\nStyle vs. substance\n\n### Recap for an exec who reads only the first three lines\n\nPrompt\n\nRecap for the exec check-in — keep it brief, they only read the first three lines.\n\nWith skill ✓✓✓× 3/4\n\n##### Exec check-in — recap\n\n###### Decisions\n\n- Move the launch from May 28 to _June 12_ to absorb the QA delay.\n- Hold the customer-comms plan until the new date is locked.\n\n###### Action items\n\n- Sam — circulate the revised launch plan by Mon May 5.\n\n###### Open questions\n\n- Does the new date affect the Q2 number we committed to?\n\nHouse rules\n\n- ✓ Leads with decisions\n- ✓ Every action item has an owner and a date\n- ✓ Open questions called out\n- × Headline in the first three lines _(date pushed to line 5)_\n\nWithout skill ✓✓×✓ 3/4\n\n##### Exec check-in\n\n_Launch moved to June 12_ — QA needs another two weeks for the new auth flow, and shipping on May 28 would land us with a partial release.\n\nCustomer comms are on hold until the date is locked. Sam will circulate the revised plan by Monday May 5.\n\n_Open: does the new date affect the Q2 commit?_ — flagged for finance to confirm.\n\nHouse rules\n\n- ✓ Leads with decisions\n- ✓ Every action item has an owner and a date\n- × Open questions called out _(buried in prose)_\n- ✓ Headline in the first three lines\n\nWhich one would you send?\n\nI'd send this one I'd send this one\n\nOne thing you'd tell Claude to change\n\n**That's a full eval round.** When it's your skill, Claude takes your picks and feedback and revises it for you.\n\n(function () { var root = document.getElementById('evRoot'); var cases = root.querySelectorAll('.ev-case'); var dots = root.querySelectorAll('.ev-nav-dot'); var prev = document.getElementById('evPrev'); var next = document.getElementById('evNext'); var pos = document.getElementById('evPos'); var closer = document.getElementById('evCloser'); var idx = 0; var picked = { '1': null, '2': null, '3': null }; var seen = \\[false, false, false\\]; seen\\[0\\] = true; function show(i) { idx = i; Array.prototype.forEach.call(cases, function (c, j) { c.classList.toggle('is-on', j === i); }); Array.prototype.forEach.call(dots, function (d, j) { d.classList.toggle('is-on', j === i); d.classList.toggle('is-done', seen\\[j\\] && j !== i); }); pos.textContent = String(i + 1); prev.disabled = (i === 0); next.disabled = (i === cases.length - 1); seen\\[i\\] = true; if (seen\\[0\\] && seen\\[1\\] && seen\\[2\\]) closer.classList.add('is-on'); } prev.addEventListener('click', function () { if (idx > 0) show(idx - 1); }); next.addEventListener('click', function () { if (idx as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 7 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Explain how plugins get distributed across an Enterprise organization\n- Apply a few good habits for keeping a shared plugin healthy over time\n\n* * *\n\n### Scaling workflows across your team\n\nBy this point, your team has a handful of skills that have earned their place. They started as someone's personal way of working, they've been run through evals, and they hold up on more than one person's use cases.\n\nWhen you want to scale those across the whole team efficiently, you bundle them into a plugin — you covered how in Lesson 8. This lesson is about the next step: getting that plugin to everyone who needs it.\n\n### Distributing a plugin in your organization\n\nInside a larger company, the recommended way to share a plugin is through your organization's private marketplace — a catalog of company-approved plugins that an admin manages.\n\nIn practice, distribution is a hand-off. You bring the plugin to whoever owns the marketplace for your org — that might be a team lead, an enablement or operations owner, or IT — and they publish it. When they do, they choose how it lands for everyone else:\n\n- Available — it appears in the company Directory and people can install it if they want it.\n- Installed by default — it's already there when people open Cowork; they can turn it off.\n- Required — it's installed and stays on; useful for things like compliance checks that everyone needs to run the same way.\n\nFrom your teammates' seat, the plugin simply shows up in their Directory labeled as coming from your company, alongside the public Anthropic ones. They can use it and turn it off (unless it's required), but they can't edit it — updates flow from whoever maintains it.\n\nWhat this looks like for _you_ depends on what your admin has set up. Some organizations have a marketplace running and a clear owner to hand things to; others haven't switched it on yet. Use the interactive below to find your situation and the right next step.\n\n.dp { --paper: #FAF9F5; --warm: #FDFCF9; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --border: rgba(31,30,29,0.12); --hover: rgba(20,20,19,0.04); --clay: #D97757; --clay-soft: rgba(217,119,87,0.10); --olive: #788C5D; --olive-deep: #4F6632; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); --olive-tint: #E8F0DD; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; -webkit-font-smoothing: antialiased; } .dp \\*, .dp \\*::before, .dp \\*::after { box-sizing: border-box; } .dp a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; color: inherit; } .dp button { font-family: inherit; cursor: pointer; } .dp-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 4px 4px; } .dp-frame { font-size: 13.5px; color: var(--ink-2); margin: 0 4px 14px; line-height: 1.5; } .dp-frame strong { color: var(--ink); font-weight: 600; } /\\* Chip pill switcher - matches L7A / L8A \\*/ .dp-tabs { display: inline-flex; background: var(--paper); border: 1px solid var(--border); border-radius: 999px; padding: 3px; margin-bottom: 14px; flex-wrap: wrap; max-width: 100%; } .dp-tab { background: transparent; border: none; font-family: inherit; font-size: 12.5px; font-weight: 500; color: var(--ink-3); padding: 7px 14px; border-radius: 999px; transition: all 0.15s ease; display: inline-flex; align-items: center; gap: 6px; text-align: left; } .dp-tab:hover { color: var(--ink); } .dp-tab.is-active { background: var(--surface); color: var(--ink); box-shadow: 0 1px 2px rgba(0,0,0,0.05); } .dp-tab-shape { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 10.5px; color: var(--ink-4); font-weight: 500; } .dp-tab.is-active .dp-tab-shape { color: var(--clay); } /\\* Panel \\*/ .dp-panel { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 18px 20px; display: none; } .dp-panel.is-on { display: block; } .dp-panel-h { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin: 0 0 8px; } .dp-panel-name { font-family: Georgia, 'Iowan Old Style', serif; font-size: 18px; font-weight: 500; color: var(--ink); letter-spacing: -0.005em; margin: 0; } .dp-panel-tag { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--clay); } .dp-means { font-size: 13.5px; color: var(--ink-2); margin: 0 0 14px; line-height: 1.55; } .dp-step { background: var(--olive-soft); border: 1px solid var(--olive-line); border-radius: 8px; padding: 12px 14px; margin-bottom: 14px; } .dp-step-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--olive); margin-bottom: 4px; display: block; } .dp-step-body { font-size: 13px; color: var(--ink); line-height: 1.55; } .dp-step-body b { font-weight: 600; } .dp-tiers { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; margin-bottom: 14px; } @media (max-width: 640px) { .dp-tiers { grid-template-columns: 1fr; } } .dp-tier { background: var(--paper); border: 1px solid var(--border); border-radius: 8px; padding: 11px 13px; } .dp-tier-name { font-size: 12.5px; font-weight: 600; color: var(--ink); margin-bottom: 3px; } .dp-tier-desc { font-size: 11.5px; color: var(--ink-3); line-height: 1.45; } .dp-ask { font-size: 12.5px; color: var(--ink-3); border-top: 1px solid var(--border); margin-top: 14px; padding-top: 12px; line-height: 1.55; } .dp-ask em { color: var(--ink); font-style: italic; background: var(--clay-soft); border-radius: 3px; padding: 1px 5px; } .dp-ask strong { color: var(--ink); font-weight: 600; font-style: normal; } .dp-foot { margin: 14px 4px 0; font-size: 12.5px; color: var(--ink-3); font-style: italic; }\n\nDistribution paths\n\nWhen you go to share your plugin in Cowork, **what you see depends on how your org has set things up**. Pick the one that matches:\n\nIt's there — I know the owner hand-off I'm not sure it exists yet discovery I'm the admin setup\n\nPath A\n\n### The marketplace exists and you know who runs it\n\nThe path is already paved. Your job is a hand-off, not a setup.\n\nYour next step\n\nBring your plugin to the **marketplace owner** — team lead, enablement, or IT. Tell them who it's for and how it should land. They'll pick one of the install levels below when they publish.\n\nAvailable\n\nIn the Directory for anyone who wants it. Right for most team plugins.\n\nInstalled by default\n\nAlready on when teammates open Cowork; they can switch it off.\n\nRequired\n\nOn and stays on. Reserve for compliance or must-run-the-same-way work.\n\nHidden\n\nIn the marketplace but not shown in the Directory — for staging or restricted rollouts.\n\nOnce it's published, your teammates see it in their Directory labeled as coming from your company. **Your updates flow to them automatically.**\n\nPath B\n\n### You're not sure the marketplace is set up\n\nCommon in orgs that just rolled out Cowork — the marketplace is an admin switch, and someone has to flip it.\n\nYour next step\n\nFind out **who manages Claude for your organization** — usually IT, an enablement lead, or whoever owns software tools. Ask them whether a private plugin marketplace is turned on, and who you'd hand a plugin to.\n\nThe ask, in one line: _“We've built a Cowork plugin our team wants to share — is the org marketplace turned on, and who owns it?”_ \n \nUntil it's live, you can still **export the plugin folder and hand it to a teammate directly** — it's just manual.\n\nPath C\n\n### You're the admin\n\nThen you're the person everyone else in this lesson is looking for.\n\nYour next step\n\nHead to **Organization settings → Plugins** to create your private marketplace — upload a plugin directly, or connect a GitHub repo so updates sync automatically. Then set each plugin's install preference — **Available**, **Installed by default**, **Required**, or **Hidden** — org-wide or per group.\n\nThe full admin walkthrough lives in the help center: _Manage Claude Cowork plugins for your organization_. Group-level targeting, share-event audit logs, and the rest of the admin controls are beyond what an individual contributor needs in this course.\n\nWhichever path applies, the goal is the same: a skill that started on one laptop becomes something a teammate can install and run.\n\n(function(){ var root = document.getElementById('dpRoot'); var tabs = root.querySelectorAll('.dp-tab'); var panels = root.querySelectorAll('.dp-panel'); Array.prototype.forEach.call(tabs, function(tab){ tab.addEventListener('click', function(){ var target = tab.getAttribute('data-panel'); Array.prototype.forEach.call(tabs, function(t){ t.classList.toggle('is-active', t === tab); }); Array.prototype.forEach.call(panels, function(p){ p.classList.toggle('is-on', p.getAttribute('data-panel') === target); }); }); }); })();\n\nMatch what you see in your org to the distribution path that fits — and who to talk to if the marketplace isn't live yet.\n\n### Habits worth keeping\n\nA short set of practices that prevent a shared plugin from quietly going stale:\n\n- **One owner.** Every shared plugin has a named person who reviews changes, runs the evals after edits, and decides when to update or retire it.\n- **Evals before every publish.** Treat the eval loop as the gate — if the cases you care about don't hold up after a change, don't push it to everyone.\n- **Name skills and plugins specifically.** \"meeting-prep\" may collide with three other meeting-prep skills across your organization's plugins directory. \"sales-customer-renewal-prep\" won't.\n- **Set a review rhythm.** Quarterly is a reasonable starting point to look at what's installed, what's actually getting used, and what's gone stale. Retire what nobody runs and make amendments where people have identified opportunities for improvement.\n\n### Lesson reflection\n\nThink about the skills you and your immediate teammates rely on most in Cowork today.\n\n- Which two or three would be the first candidates to bundle into a team plugin?\n- Who in your organization is the person you'd bring that plugin to — the one who could get it onto the marketplace?\n\nIf you don't know the answer to the second question yet, that's your real next step.\n\n### What’s next\n\nIn the final lesson, you'll get a quick recap of the arc you've just been through and the next moves to keep the momentum going.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n\n\n## Lesson 14: Wrap up and next steps\n\n/\\* Slide figure — visual overview separation from prose \\*/ figure.slide { background: #f7f6f1; padding: 20px; border-radius: 10px; margin: 24px 0; } figure.slide figcaption { font-size: 11px; color: #9c9a92; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 500; margin-bottom: 10px; } figure.slide img { max-width: 100%; height: auto; display: block; border-radius: 6px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); margin: 0; } /\\* Links — Skilljar styles as pills with gray bg; reset to inline underline \\*/ a { display: inline; background: none; padding: 0; border: none; border-radius: 0; text-decoration: underline; font-family: inherit; font-size: inherit; } /\\* Blockquotes — example prompts (Claude 101 doesn't use these) \\*/ blockquote { background: #f5f4ed; border-left: 3px solid #d1cfc5; padding: 12px 18px; margin: 16px 0; border-radius: 0 6px 6px 0; color: #3d3d3a; } blockquote pre { font-family: ui-monospace, monospace; font-size: 14px; }\n\n**Estimated time:** 5 minutes\n\n### Learning objectives\n\nBy the end of this lesson you'll be able to:\n\n- Recall the arc of Cowork 101 and what each module gave you\n- Pick the next moves that keep you using Cowork after the course ends\n\n* * *\n\n### What you've covered\n\n.mrc { --paper: #FAF9F5; --surface: #FFFFFF; --ink: #141413; --ink-2: #3D3D3A; --ink-3: #6B6A64; --ink-4: #B0AEA5; --border: rgba(31,30,29,0.12); --olive: #788C5D; --olive-soft: rgba(120,140,93,0.10); --olive-line: rgba(120,140,93,0.40); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--ink); line-height: 1.5; margin: 28px 0; -webkit-font-smoothing: antialiased; } .mrc \\*, .mrc \\*::before, .mrc \\*::after { box-sizing: border-box; } .mrc-shell { background: var(--paper); border: 1px solid var(--border); border-radius: 14px; padding: 22px 22px 20px; } .mrc-eyebrow { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; color: var(--ink-4); margin: 0 0 14px 2px; } .mrc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .mrc-card { background: var(--surface); border: 1px solid var(--border); border-radius: 10px; padding: 18px 18px 16px; display: flex; flex-direction: column; gap: 4px; position: relative; } .mrc-num { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.10em; font-weight: 600; color: var(--olive); margin: 0; } .mrc-name { font-family: Georgia, 'Iowan Old Style', 'Times New Roman', serif; font-size: 19px; font-weight: 500; color: var(--ink); letter-spacing: -0.01em; line-height: 1.25; margin: 2px 32px 6px 0; } .mrc-sum { font-size: 13px; color: var(--ink-2); line-height: 1.5; margin: 0; } .mrc-sum strong { color: var(--ink); font-weight: 600; } .mrc-check { position: absolute; top: 18px; right: 18px; width: 22px; height: 22px; border-radius: 50%; background: var(--olive-soft); border: 1px solid var(--olive-line); display: flex; align-items: center; justify-content: center; color: var(--olive); flex-shrink: 0; } .mrc-check svg { width: 10px; height: 10px; } .mrc-throughline { margin: 18px 4px 0; text-align: center; font-family: 'Iowan Old Style', 'Palatino Linotype', Georgia, serif; font-size: 16px; font-style: italic; color: var(--ink); letter-spacing: -0.005em; line-height: 1.45; } @media (max-width: 600px) { .mrc-grid { grid-template-columns: 1fr; } .mrc-name { font-size: 17px; } }\n\nWhat you've covered\n\nModule 1\n\n### Meet Claude Cowork\n\nWhat Cowork is, how it differs from Chat and Code, the kinds of work it's built for, and your first real task.\n\nModule 2\n\n### Make Claude Cowork Yours\n\nGlobal instructions, projects, skills, and plugins — how much more capable Cowork becomes when it knows what you know, has access to what you have access to, and does things the way your team does.\n\nModule 3\n\n### Use Claude wherever you work\n\nCowork in your browser via Claude in Chrome, and inside Word, Excel, PowerPoint, and Outlook via Claude in M365.\n\nModule 4\n\n### Sharing and safety in Claude Cowork\n\nWorking with autonomy responsibly, validating what you build, and turning personal workflows into team infrastructure.\n\nHand off a task, get a polished deliverable.\n\nThe throughline: Cowork goes beyond chat to allow you to delegate real work. Everything else in the course builds on that.\n\n### Try it now\n\nPick **one** of these to do this week.\n\n- **Set up memory.** Write a five-sentence global instructions block, or create a project for a stream of work you're already in.\n- **Schedule a task or set up Dispatch.** Take a recurring deliverable and put it on a cadence. Or set up Dispatch so that the next time something comes to mind off-hours, you can hand it to Cowork.\n- **Install a plugin.** Go to **Customize → Plugins**, install the plugin closest to your role, and run it against this week's version of your work.\n- **Try Claude in Chrome or M365.** Pick the surface that aligns with where most of your real work happens, install it, and use it on one task.\n- **Share something you built.** Share a use case you found valuable, a workflow that produced great results, or a skill you've built with your team. You could be the unlock they need to get more comfortable working with Claude.\n\n### Go deeper\n\nA few learning paths worth knowing about:\n\n- [**AI Fluency: Framework & Foundations**](https://anthropic.skilljar.com/ai-fluency-framework-foundations)**.** The foundations of working effectively with AI — prompting, evaluating output, knowing when AI is and isn't the right tool.\n- [**AI Capabilities and Limitations**](https://anthropic.skilljar.com/ai-capabilities-and-limitations)**.** A deeper survey of what generative AI tools can do across modalities and surfaces.\n- [**Claude 101**](https://anthropic.skilljar.com/claude-101)**.** The companion course on using Claude across all surfaces.\n- [**Claude use-case library**](https://claude.com/resources/use-cases)**.** Filter to Claude Cowork for ideas and inspiration on what to delegate next.\n\n#### Feedback\n\nAs you progress through the course, we'd love to hear how you're using concepts from it in your work, plus any feedback you may have. Share your feedback [here](https://docs.google.com/forms/d/e/1FAIpQLScol7ZPi1cxhXy40g0AQieFbhTNQoVNm1Bvvs2gD1giMzOXHQ/viewform).\n\n#### Acknowledgments and license\n\n_Copyright 2026 Anthropic. All rights reserved._\n", "mcp_advanced": "\n\nBelow are notes from a video course about working with the Claude language model.\nUse these notes as a resource to answer the user's question.\nWrite your answer as a standalone response - do not refer directly to these notes unless specifically requested by the user.\n\n\nSampling = technique allowing MCP servers to request language model text generation from clients instead of directly accessing LLMs themselves.\n\nPurpose = shifts LLM access responsibility from server to client, avoiding need for servers to handle API keys, authentication, or token costs.\n\nArchitecture = Server creates message request → Client receives via sampling callback → Client calls LLM → Client returns generated text to server.\n\nBenefits = eliminates server complexity for LLM integration, removes API key requirements from servers, prevents unauthorized token usage on public servers.\n\nImplementation = Server uses create_message() function with message list, Client implements sampling callback to handle LLM requests and return create_message_result.\n\nPrimary use case = publicly accessible MCP servers that need LLM capabilities without direct LLM access or associated costs/security concerns.\n\n\n\nLog and Progress Notifications = MCP server feature that provides real-time feedback during tool execution to improve user experience.\n\nImplementation on server side:\n- Tool functions automatically receive context argument as last parameter\n- Context object provides methods: info() for logging, report_progress() for progress updates\n- Calling these methods automatically sends messages back to client\n\nImplementation on client side:\n- Create callback function for logging statements\n- Create separate callback for progress updates\n- Pass logging callback to client session\n- Pass progress callback to call_tool function\n- Callbacks handle how to display information to user (terminal output, web UI, etc.)\n\nKey benefits:\n- Prevents user confusion about stalled/failed tool calls\n- Provides visibility into long-running operations\n- Real-time feedback during tool execution\n\nOptional feature = can be omitted if not needed, purely for UX enhancement.\n\n\n\nMCP Roots = codified way for users to grant server access to specific files/folders\n\nProblem without roots: User says \"convert bikin.mp4\" but Claude can't locate file in complex filesystem without full path. Requiring full paths inconvenient for users.\n\nSolution with roots: Add 3 tools to MCP server:\n- ConvertVideo (original tool)\n- ReadDirectory (lists files/folders in directory) \n- ListRoots (returns available roots)\n\nRoot = file/folder user grants permission to access beforehand (via command line args when starting server)\n\nImplementation requirement: Tools must check that accessed files/folders are contained within granted roots using function like is_path_allowed()\n\nTwo main benefits:\n1. Permission control - limits server access to authorized areas only\n2. Autonomous discovery - Claude can search through available roots to find files without user providing full paths\n\nKey limitation: MCP SDK doesn't automatically enforce root restrictions. Server developer must implement access checks manually.\n\nListRoots tool optional - can alternatively include root list in prompt directly. Tool pattern allows Claude to dynamically check available roots when needed.\n\n\n\nJSON Message Types in MCP:\n\nMCP communication = JSON messages between clients and servers. Each message type has distinct purpose.\n\nMessage categories:\n- Request/Result pairs = Always come together (call_tool_request + call_tool_result, initialize_request + initialize_result)\n- Notifications = Events that don't need responses (progress_notification, logging_message_notification, tool_change_notification)\n\nMessage direction classification:\n- Client messages = Sent by MCP client to server\n- Server messages = Sent by MCP server to client\n\nKey insight: Servers can send messages TO clients (server requests, server notifications). This directional capability becomes critical limitation in streamable HTTP transport.\n\nSchema definition = TypeScript file in MCP spec repository (schema.ts). Not executable code, just type descriptions for convenience.\n\nMessage structure = JSON-RPC format with method, params, ID fields.\n\n\n\nMCP Transport = mechanism for moving JSON messages between client and server\n\nStdio Transport = transport where client launches server as separate process, communicates via standard input/output streams\n\nCommunication mechanism: Client writes to server's stdin, reads from server's stdout. Server writes to stdout, reads from stdin.\n\nAdvantages: Bidirectional communication - either client or server can initiate requests at any time\n\nLimitations: Only works when client and server run on same physical machine\n\nMessage exchange patterns:\n- Client-to-server request: Write to stdin, read response from stdout\n- Server-to-client request: Server writes to stdout, client responds via stdin\n\nRequired initialization sequence:\n1. Initialize request (client to server)\n2. Initialize result (server to client) \n3. Initialize notification (client to server, no response required)\n\nMessage types:\n- Requests = expect responses\n- Notifications = no response required\n- Results = responses to requests\n\nKey characteristic: Full bidirectional communication support - both parties can initiate requests\n\nContrast with HTTP transport: HTTP transport has limitations on server-initiated requests that stdio transport doesn't have\n\n\n\nStreamableHTTP Transport = MCP transport enabling client-server communication over HTTP connections, allows remote server hosting unlike standard I/O transport which requires same-machine operation.\n\nKey advantage = Remote hosting capability - servers can be publicly accessible at URLs like mcpserver.com, expanding MCP server possibilities.\n\nCritical limitation = Restricted server-to-client messaging functionality due to HTTP's unidirectional nature - clients easily request from servers, but servers cannot easily initiate requests to clients.\n\nTwo key settings impact functionality:\n- stateless HTTP (default: false)\n- JSON response (default: false)\n\nSetting these to true = Reduced functionality, breaks progress bars, logging notifications, progress notifications, and sampling requests.\n\nHTTP communication constraint = Server doesn't know client address and client may not be publicly accessible, making server-initiated requests challenging.\n\nAffected message types when using HTTP = Sampling requests, listing routes, progress notifications, logging notifications - all require server-to-client communication.\n\nCommon deployment issue = Application works fine locally with standard I/O transport but fails when deployed with HTTP transport due to these messaging restrictions.\n\nSolution exists = StreamableHTTP transport has workarounds for server-to-client communication challenges, but with caveats.\n\n\n\nStreamableHTTP Transport = HTTP-based MCP transport using server-sent events (SSE) to enable server-to-client communication\n\nCore Problem: MCP requires server-to-client requests (sampling, notifications, logging) but HTTP naturally supports only client-to-server requests\n\nWorkaround Solution: Uses SSE connections to allow server streaming messages to client\n\nSession ID = Random identifier assigned during initialization, included in all subsequent requests as HTTP header\n\nInitialization Flow:\n1. Client sends initialize request\n2. Server responds with result + MCP session ID header\n3. Client sends initialized notification with session ID\n4. Client optionally makes GET request with session ID to establish SSE connection\n\nTwo SSE Connections:\n1. Long-lived SSE connection = For server-initiated requests (sampling, notifications)\n2. Short-lived SSE connection = For specific tool call responses, automatically closed after result\n\nMessage Routing:\n- Progress notifications → Long-lived SSE connection\n- Logging messages + tool results → Short-lived SSE connection tied to specific request\n\nKey Limitation: Setting certain flags to true breaks the workaround, making StreamableHTTP complex to understand and use properly\n\nCritical Point: SSE responses enable bidirectional communication over HTTP by keeping connections open and streaming individual messages from server to client\n\n\n\n**Stateless HTTP Flag**\n\nStateless HTTP = flag set to true when MCP server needs horizontal scaling across multiple instances with load balancer\n\n**Why needed**: Single server instance can't handle high traffic. Horizontal scaling uses multiple server copies + load balancer routing requests randomly.\n\n**Problem without stateless**: Client needs 2 connections (GET SSE for server-to-client requests, POST for client-to-server). Load balancer may route these to different server instances. If tool on Server A needs sampling request, it must go through GET SSE connection on Server B - requires complex coordination.\n\n**Effect of stateless=true**:\n- No session IDs assigned to clients\n- Server cannot track individual clients\n- GET SSE response pathway disabled (server cannot send requests to client)\n- Eliminates sampling, progress logging, resource subscriptions\n- No client initialization required (skips initialize request + notification)\n- Reduces server traffic\n\n**JSON Response Flag**\n\nJSON response = flag disabling streaming responses on POST requests\n\n**Effect of JSON response=true**:\n- POST responses return final result as plain JSON only\n- No intermediate streaming messages\n- No progress/log statements during execution\n- Client waits for complete tool execution before receiving response\n\n**Key Takeaway**: Both flags significantly change server behavior. Use same transport in development as planned for production to avoid deployment issues.\n\n", "mcp_intro": "\n\nBelow are notes from a video course about working with the Claude language model.\nUse these notes as a resource to answer the user's question.\nWrite your answer as a standalone response - do not refer directly to these notes unless specifically requested by the user.\n\n\nMCP = Model Context Protocol, communication layer providing Claude with context and tools without requiring developers to write tedious code.\n\nCore Architecture: MCP client connects to MCP server. MCP server contains tools, resources, and prompts as internal components.\n\nProblem Solved: Traditional approach requires developers to manually author tool schemas and functions for each service integration (like GitHub API tools). This creates maintenance burden for complex services with many features.\n\nMCP Solution: Shifts tool definition and execution from developer's server to dedicated MCP server. MCP server = interface to outside service, wrapping functionality into pre-built tools.\n\nKey Benefits: Eliminates need for developers to write/maintain tool schemas and function implementations. Someone else authors the tools, packages them in MCP server.\n\nCommon Questions:\n- Who authors MCP servers? Anyone, but often service providers create official implementations\n- Difference from direct API calls? Saves developer time by providing pre-built tool schemas/functions instead of manual authoring\n- Relationship to tool use? MCP and tool use are complementary, not identical. MCP focuses on who does the work of creating tools\n\nCore Value: Reduces developer burden by outsourcing tool creation to MCP server implementations rather than requiring custom tool development for each service integration.\n\n\n\nMCP Client = communication interface between your server and MCP server, provides access to server's tools.\n\nTransport agnostic = client/server can communicate via multiple protocols (stdin/stdout, HTTP, WebSockets, etc). Common setup: both on same machine using stdin/stdout.\n\nCommunication = message exchange defined by MCP spec. Key message types:\n- list tools request/result = client asks server for available tools, server responds with tool list\n- call tool request/result = client asks server to run tool with arguments, server returns execution result\n\nTypical flow: User query → Server asks MCP client for tools → MCP client sends list tools request to MCP server → Server gets tool list → Server sends query + tools to Claude → Claude requests tool execution → Server asks MCP client to run tool → MCP client sends call tool request to MCP server → MCP server executes tool (e.g., GitHub API call) → Results flow back through chain → Claude formulates final response → User gets answer.\n\nMCP client acts as intermediary - doesn't execute tools itself, just facilitates communication between your server and MCP server that actually runs the tools.\n\n\n\nMCP Learning Project = CLI-based chatbot implementing both client and server components for educational purposes.\n\nProject Structure = Custom MCP client connects to custom MCP server, both built in same project.\n\nDocument System = Fake documents stored in memory only, no persistence.\n\nServer Tools = Two tools implemented: read document contents, update document contents.\n\nReal-world Context = Normally projects implement either client OR server, not both. This project does both for learning.\n\nSetup Requirements = Download CLI_project.zip, extract, configure .env with API key, install dependencies.\n\nRunning Project = \"uv run main.py\" (with UV) or \"python main.py\" (without UV).\n\nVerification = Chat prompt appears, responds to basic queries like \"what's one plus one\".\n\n\n\nMCP server implementation = Python SDK simplifies tool creation vs manual JSON schemas\n\nTool definition syntax = @mcp.tool decorator + function with typed parameters + Field descriptions\n\nDocument storage = in-memory dictionary with doc_id keys and content values\n\nTool 1 - read_doc_contents = takes doc_id string parameter, returns document content from docs dictionary, raises ValueError if doc not found\n\nTool 2 - edit_document = takes doc_id, old_string, new_string parameters, performs find/replace operation on document content, includes existence validation\n\nMCP Python SDK benefits = auto-generates JSON schemas from decorated functions, single line server creation, eliminates manual schema writing\n\nParameter definition = use Field() with description for tool arguments, import from pydantic\n\nError handling = validate document existence before operations, raise ValueError for missing documents\n\nImplementation pattern = decorator → function definition → parameter typing → validation → core logic\n\n\n\nMCP Inspector = in-browser debugger for testing MCP servers without connecting to actual applications\n\nAccess: Run \\`mcp dev [server_file.py]\\` in terminal with activated Python environment → opens server on port → visit provided localhost address\n\nInterface: Left sidebar with Connect button → top navigation bar shows Resources/Prompts/Tools sections → Tools section lists available tools → click tool to open right panel for manual testing\n\nTesting process: Select tool → input required parameters (like document ID) → click Run Tool → verify output/success message\n\nKey features: Live development testing, tool invocation simulation, parameter input fields, success/failure feedback\n\nStatus: Inspector in active development - UI may change but core functionality remains similar\n\nUsage pattern: Essential for MCP server development and debugging before production deployment\n\n\n\nMCP Client Implementation:\n\nMCP Client = wrapper class around client session for connecting to MCP server with resource cleanup management\n\nClient Session = actual connection to MCP server from MCP Python SDK, requires cleanup when closing\n\nResource Cleanup = necessary process when shutting down, handled by connect/cleanup/async enter/async exit functions\n\nClient Purpose = exposes MCP server functionality to rest of codebase, provides interface between application code and server\n\nKey Functions:\n- list_tools() = await self.session.list_tools(), return result.tools\n- call_tool() = await self.session.call_tool(tool_name, tool_input)\n\nImplementation Flow:\n1. Application requests tool list for Claude\n2. Client calls list_tools() to get server's available tools\n3. Claude selects tool and provides parameters\n4. Client calls call_tool() to execute on server\n5. Results returned to Claude\n\nTesting = run MCP client.py directly with testing harness to verify connection and tool listing\n\nIntegration = once implemented, can run CLI to have Claude use tools (e.g., \"what is contents of report.pdf document\")\n\nCommon Practice = wrap client session in larger class rather than using directly for better resource management\n\n\n\nResources = MCP server feature that exposes data to clients for read operations\n\nResource types:\n- Direct/Static = static URI (e.g., docs://documents)\n- Templated = parameterized URI with wildcards (e.g., documents/{doc_id})\n\nResource flow:\n1. Client sends read resource request with URI\n2. MCP server matches URI to resource function\n3. Server executes function, returns result\n4. Client receives data via read resource result message\n\nImplementation:\n- Use @mcp.resource decorator\n- Define URI (route-like address)\n- Set MIME type (application/json, text/plain, etc.)\n- Templated resources: URI parameters become function keyword arguments\n- Python MCP SDK auto-serializes return values to strings\n\nCommon pattern = One resource per distinct read operation (list items vs fetch single item)\n\nMIME types = hints to client about returned data format for proper deserialization\n\n\n\nMCP Resource Access = method for clients to retrieve data from server resources\n\nClient Implementation:\n- read_resource function = takes URI parameter, requests resource from MCP server\n- Uses await self.session.read_resource(AnyUrl(uri)) for server communication\n- Accesses result.contents[0] = first resource from returned contents list\n\nResponse Parsing:\n- Checks resource.mime_type property to determine data format\n- If mime_type == \"application/json\": returns json.loads(resource.text)\n- Otherwise: returns resource.text as plain text\n\nResource Integration:\n- MCP client functions called by other application components\n- Enables document selection via CLI interface with arrow keys + space\n- Selected resource contents automatically included in LLM prompts\n- Eliminates need for tools to read document contents during chat\n\nKey Dependencies: json module, pydantic.AnyUrl for type handling\n\n\n\nPrompts = pre-written, tested instructions that MCP servers expose to clients for specialized tasks\n\nMCP Prompts Feature:\n- Servers define high-quality prompts tailored to their domain\n- Clients can access these prompts via slash commands (e.g., /format)\n- Alternative to users writing their own prompts manually\n\nImplementation Pattern:\n- Use @prompt decorator with name and description\n- Function receives arguments (e.g., document ID)\n- Returns list of messages (user/assistant format)\n- Messages sent directly to Claude\n\nKey Benefit: Server authors create optimized, tested prompts rather than leaving prompt quality to end users\n\nExample Structure:\n\\`\\`\\`\n@prompt(name=\"format\", description=\"rewrites document in markdown\")\ndef format_document(doc_id: str) -> list[messages]:\n return [base.user_message(prompt_text)]\n\\`\\`\\`\n\nWorkflow: User types /format → selects document → server returns specialized prompt → client sends to Claude → Claude uses tools to read/reformat/save document\n\nPurpose = encapsulate domain expertise in prompt engineering within specialized MCP servers\n\n\n\nMCP Client Prompt Implementation:\n\nList prompts function = await self.session.list_prompts(), return result.props\n\nGet prompt function = await self.session.get_prompt(prompt_name, arguments), return result.messages\n\nPrompt workflow = Client requests prompt by name → passes arguments as keyword parameters → MCP server interpolates arguments into prompt template → returns formatted messages for AI model\n\nArguments flow = Client arguments → prompt function keyword arguments → interpolated into prompt text (e.g., document_id parameter gets inserted into prompt template)\n\nReturn format = Messages array that forms conversation input for AI model\n\nCLI usage = /format command → select document → prompt with document ID sent to Claude → Claude uses tools to fetch document → returns formatted result\n\nKey concept = Prompts are server-defined templates that clients can invoke with parameters, enabling reusable AI instructions with dynamic content insertion.\n\n\n\nMCP Server Primitives = 3 types: tools, resources, prompts\n\nTools = model-controlled primitives where Claude decides when to execute them. Used to add capabilities to Claude (e.g., JavaScript execution for calculations). Serve the model.\n\nResources = app-controlled primitives where application code decides when to fetch data. Used to get data into apps for UI display or prompt augmentation (e.g., autocomplete options, document listings from Google Drive). Serve the app.\n\nPrompts = user-controlled primitives triggered by user actions like button clicks or slash commands. Used for predefined workflows (e.g., chat starter buttons in Claude interface). Serve users.\n\nControl patterns determine purpose: Need Claude capabilities → implement tools. Need app data → use resources. Need user workflows → create prompts.\n\nReal examples: Claude's chat starter buttons use prompts, Google Drive document selection uses resources, code execution uses tools.\n\n", "taif": "\n\nBelow are notes from a video course about working with the Claude language model.\nUse these notes as a resource to answer the user's question.\nWrite your answer as a standalone response - do not refer directly to these notes unless specifically requested by the user.\n\n\nAI FLUENCY FRAMEWORK = dual-purpose tool that describes what happens when people work with AI AND guides them toward better practices\n\nCOURSE STRUCTURE = 3 lessons addressing: 1) How to introduce framework to students (pedagogy), 2) How to assess if students understand (assessment), 3) How to integrate with existing curriculum\n\nTEACHING APPROACHES = 4 distinct entry points for introducing AI Fluency Framework to students\n\nAPPROACH 1: STEP-BY-STEP (LINEAR)\n- Framework as sequential process: Delegation → Description → Discernment → Diligence\n- Best for: Beginning AI users who need structure and manageable progression\n- Implementation: Four-part assignments building sequentially (e.g., part 1 = Delegation/project planning, part 2 = Description/hands-on workshops, part 3 = Discernment/evaluation, part 4 = Diligence/ethics)\n- Benefits: Natural, intuitive, creates structured learning journey\n\nAPPROACH 2: START ANYWHERE (NON-LINEAR) \n- Framework as interconnected system where any competency can be starting point\n- Best for: Experienced AI users who can handle real-world complexity\n- Key insight: Competencies inform each other (Discernment problems → new Delegation decisions; Diligence requirements → different Description strategies; Description challenges → Delegation gaps)\n- Implementation: Group projects, case-based learning with real AI collaboration scenarios\n- Benefits: Reflects messy realities of actual AI collaboration, builds adaptive thinking\n\nAPPROACH 3: JUST ONE D (FOCUSED)\n- Deep exploration of single competency at a time\n- Best for: Specialized purposes, skill-building sessions, workshops\n- Implementation: Entire workshop on one competency (e.g., three Discernment sessions covering Product/Process/Performance evaluation)\n- Benefits: Masters specific area without cognitive overload, allows nuanced exploration of techniques and edge cases\n\nAPPROACH 4: TWO LOOPS\n- Most conceptually rich approach treating AI fluency as nested processes\n- Best for: Students who grasp basics and need deeper understanding\n- Structure: Delegation-Diligence loop (strategic/ethical decisions) + Description-Discernment loop (tactical/iterative work)\n- Benefits: Reveals how competencies constantly inform each other in practice\n\nDELEGATION-DILIGENCE LOOP = strategic and ethical decision-making framework for responsible AI collaboration\n\nLOOP COMPONENTS:\nDelegation = Problem Awareness + Platform Awareness + Task Delegation\nDiligence = Creation Diligence + Transparency Diligence + Deployment Diligence\n\nBIDIRECTIONAL FLOW:\nForward (Delegation → Diligence): Strategic decisions raise ethical questions\nReverse (Diligence → Delegation): Ethical constraints clarify and improve strategic choices\n\nTEACHING STRATEGIES:\n- Applied scenarios making connections visible\n- Step-by-step guides for both directions\n- Recognition that constraints enhance rather than limit creativity\n- Focus on developing clear rationales for choices\n\nDESCRIPTION-DISCERNMENT LOOP = moment-to-moment craft of building cognitive environments for human-AI collaboration\n\nCORE CONCEPT: Conversations not commands - building shared context and understanding rather than single prompt exchanges\n\nCOGNITIVE ENVIRONMENT = collaborative context including:\n- Shared vocabulary and references evolving over time\n- Well-defined goals, values, processes, methods\n- Established interaction patterns enabling optimal performance\n- Mechanisms for building on previous interactions\n\nTHREE LENSES:\nPRODUCT = what we're creating together (evolving understanding of goals and quality)\nPROCESS = shared approaches to thinking and problem-solving\nPERFORMANCE = relationship dynamics between human and AI\n\nTEACHING STRATEGIES:\n- Multi-interaction assignments requiring context accumulation\n- Share instructor's own AI collaboration processes\n- Document evolution of collaboration, not just outputs\n- Move beyond automation to augmentation\n\nSUCCESS INDICATORS:\n- Shared Language: Shorthand references to complex ideas from earlier conversations\n- Exploration Mindset: Evolution from rigid commands to flexible, interactive approaches\n\nNESTED SYSTEMS = how the two loops work together:\nDelegation-Diligence = strategic container setting direction and boundaries\nDescription-Discernment = tactical content filling container with rich interaction\nResult = Responsible, sophisticated AI collaboration transcending what either partner achieves alone\n\nLESSON DURATION = 2 hours (30 minutes video, 90 minutes exercises)\n\nEXERCISE STRUCTURE = 3 progressive exercises building teaching capability:\n1) Establish teaching context and explore approaches (30 min)\n2) Design Delegation-Diligence loop lesson (30 min) \n3) Design Description-Discernment loop lesson (30 min)\n\n\n\n# Assessing and Designing AI Fluency Notes\n\n## Core Assessment Framework\n\nAI Fluency Assessment = Outcome-based + Process-based + Reflection-based approaches combined\n\n**Outcome-based assessment** = Focus on what students produce through AI collaboration. Assess whether students achieved stated goals through human-AI partnership.\n\n**Process-based assessment** = Examine how students work with AI over time. Captures iteration patterns, recovery from failures, methodological sophistication.\n\n**Reflection-based assessment** = Focus on metacognitive awareness. Students analyze why strategies worked/didn't work, what they learned, future applications.\n\n## Assessing the 4Ds\n\n### Delegation Assessment\n- **Outcome**: Did delegation plan make sense? Were goals realistic? Right tool selection?\n- **Process**: Review annotated chat logs showing exploration of options and decision-making\n- **Reflection**: Students explain choices, alternatives considered, how delegation shaped outcomes\n\n### Description Assessment \n- **Outcome**: Quality of prompts and AI responses. Clear instructions? Good context? Evolution from initial to final versions\n- **Process**: Conversation logs showing iterative refinement, failed approaches, building shared context\n- **Reflection**: Analysis of which description techniques worked best, task-specific communication approaches, description quality vs output quality relationship\n\n### Discernment Assessment\n- **Outcome**: Students annotate AI outputs marking strengths/weaknesses. Decision logs explaining what was kept/modified/discarded\n- **Process**: In-line evaluation comments, catching/correcting errors, pattern recognition across interactions\n- **Reflection**: Analysis of evaluation criteria evolution, initially missed issues, comparison across task types\n\n### Diligence Assessment\n- **Outcome**: Quality of diligence statements, attribution/transparency documentation, fact-checking evidence\n- **Process**: Data handling in chat logs, ethical decision-making, sensitive information handling, constraint-checking\n- **Reflection**: Discussion of ethical dilemmas, responsibility understanding, surprising challenges, future improvements\n\n## Assignment Design Principles\n\n**Authenticity** = Create assignments mirroring real-world AI collaboration, genuine problems where AI partnership adds value\n\n**Iteration** = Build in refinement opportunities showcasing growth over time\n\n**Pedagogical Transparency** = Clear assessment of collaboration process and reflections, not just outputs\n\n## Assignment Types\n\n### Outcome-Based Assignments\n- **Improving AI outputs**: Transform mediocre AI output into excellent work\n- **Product comparison**: Use multiple AI systems for same task, analyze differences\n- **Constraint-based challenges**: Specific requirements (format, length, style, audience)\n- **Peer product review**: Students set goals, create with AI, swap and critique\n\n### Process-Based Assignments\n- **Annotated chat logs**: Students highlight turning points, breakthroughs, failure recovery\n- **Recorded narrations**: Real-time decision-making explanation during AI work\n- **Process playbooks**: Personal AI strategy guides for different task types\n- **AI-assisted/peer debrief**: Discussion of chat logs with AI or peer partners\n\n### Reflection-Based Assignments\n- **Guided inquiry**: Specific questions about particular assignments\n- **Learning journal**: Self-assess 4D development with evidence across course\n- **Scenarios/case studies**: Apply learnings to hypothetical or real-world situations\n- **Personal policy statements**: Develop own values/strategies for AI collaboration\n\n## Managing Assignment Volume\n\n**Detailed deliverable-based rubrics** = Clear, granular deliverables for quick verification\n\n**Self and peer review emphasis** = Students best positioned to observe development with proper guidance\n\n**Lightning round conferences** = Brief conferences replacing written feedback (5-minute discussions)\n\n**Selective sampling** = Don't read every word; students flag key moments for attention\n\n## Key Assessment Artifacts\n\n**Chat logs** = Primary process documentation\n**Diligence statements** = Transparency and attribution documentation\n**Learning journals** = Reflection and metacognitive development\n**Decision logs** = Record of what AI output was kept/modified/discarded\n**Process playbooks** = Personal strategy documentation\n\n## Assessment Focus Areas\n\nFocus on **observable actions and concrete artifacts** rather than assumptions about understanding\n\nDifferent competencies benefit from different assessment approaches\n\nAssessment should be **learning opportunity, not just measurement**\n\nStudents need to understand you care about **how they learn to work with AI**, not just what they produce\n\nEssential principle: Make invisible decision-making visible through documentation and reflection\n\n\n\nAI FLUENCY ASSIGNMENT COMPONENTS\n\nOUTCOME-BASED COMPONENTS\n\nImproving AI Outputs = Students transform mediocre AI output into excellent work through critique and iteration\n- Assessment focus: Discernment, Description\n- Deliverables: Original with annotations + improved version\n- Effective because: Forces explicit quality standards, requires domain knowledge application, develops AI guidance skills\n- Variations: Different flaw types, peer improvement exchanges\n\nProduct Comparison = Students use multiple AI systems for same task, analyze differences\n- Assessment focus: Delegation, Discernment \n- Deliverables: Multiple outputs + comparison matrix + recommendation report\n- Effective because: Builds platform awareness, creates evidence-based selection skills, reveals trade-offs\n- Process: Use standard AI assistant + reasoning-capable system + specialized system\n\nConstraint-Based Challenges = Achieve specific requirements through AI collaboration within limits\n- Assessment focus: Description, Delegation\n- Deliverables: Final product meeting all constraints\n- Effective because: Develops precise AI communication, reveals specification importance, builds problem-solving under limitations\n- Variations: Ethical constraints, conflicting constraints, time pressure\n\nPeer Product Review = Evaluate AI-assisted work by peers against goals and ethics\n- Assessment focus: Discernment, Diligence\n- Deliverables: Review feedback form\n- Criteria: Goal achievement, appropriate AI use, human oversight quality, AI attribution adequacy\n- Variations: Blind review, group sessions\n\nPROCESS-BASED COMPONENTS\n\nAnnotated Chat Logs = Submit complete chat logs with detailed annotations\n- Assessment focus: Description, Discernment\n- Annotations mark: Turning points, insights/breakthroughs, failures/recovery, communication evolution, shared context development\n- Effective because: Makes thinking visible, captures authentic problem-solving, reveals communication evolution\n- Variations: Competency-focused annotations, pattern comparisons\n\nRecorded Narrations = Screen recording with real-time audio narration of AI work\n- Assessment focus: All 4Ds\n- Narration covers: Choice rationale, response evaluation, alternatives considered, ethical considerations\n- Effective because: Captures authentic decision-making, reveals tacit knowledge, shows actual vs reported work\n- Variations: Paired commentary, before/after comparisons\n\nProcess Playbooks = Personal reference guides for AI collaboration strategies\n- Assessment focus: All 4Ds\n- Includes: Conversation guides, decision trees, quality checklists, pitfall recovery, ethical guidelines\n- Effective because: Encourages systematic documentation, creates useful resource, builds metacognitive awareness\n- Variations: Collaborative playbooks, discipline-specific requirements\n\nAI-Assisted/Peer-Assisted Debrief = Structured analysis of AI collaboration with external perspective\n- Assessment focus: All 4Ds\n- Analysis covers: Positive patterns, missed opportunities, strengths, improvement areas\n- Effective because: Provides external perspective, reveals blind spots, encourages peer learning\n\nREFLECTION-BASED COMPONENTS\n\nGuided Inquiry = Respond to specific questions promoting deep reflection\n- Assessment focus: Variable by questions\n- Question types: Surprise moments, failed strategies, communication evolution, ethical decisions\n- Effective because: Targets specific AI fluency aspects, requires evidence-based reflection\n- Variations: Discipline-tailored, progressive questions\n\nLearning Journal = Ongoing documentation of AI fluency development\n- Assessment focus: All 4Ds over time\n- Weekly entries: Attempts, successes, challenges, skill improvements, future goals\n- Monthly synthesis: Pattern identification, goal setting\n- Variations: Multimedia journals, collaborative journals, AI conversation journals\n\nScenarios and Case Studies = Apply AI fluency learning to realistic scenarios\n- Assessment focus: Diligence, Delegation\n- Analysis includes: Delegation decisions, ethical considerations, action plans, risk mitigation\n- Effective because: Develops strategic thinking, builds ethical reasoning, connects theory to practice\n- Variations: Real-world cases, discipline-specific scenarios, stakeholder role-play\n\nPersonal Policy Statements = Synthesize learning into personal AI collaboration framework\n- Assessment focus: Diligence, All 4Ds holistically\n- Components: Ethical principles, decision criteria, quality standards, transparency commitments, boundaries, learning strategies\n- Effective because: Requires deep synthesis, builds professional identity, creates accountability\n- Variations: Collaborative policies for group work\n\nASSESSMENT MATRICES\n\nDelegation Assessment Matrix:\n- Strong performance = Strategic thinking about when/why/how to collaborate with AI\n- Outcome focus: Task division quality, tool selection appropriateness, goal achievement\n- Process focus: Decision documentation, platform exploration, adaptation evidence\n- Reflection focus: Choice analysis, alternative consideration, impact evaluation\n\nDescription Assessment Matrix:\n- Strong performance = Effective AI communication regarding outputs/processes/behaviors\n- Outcome focus: Prompt evolution, context building, communication clarity\n- Process focus: Iterative refinement, recovery patterns, shared vocabulary development\n- Reflection focus: Strategy analysis, technique recognition, context insights\n\nDiscernment Assessment Matrix:\n- Strong performance = Critical evaluation using domain-specific, nuanced criteria\n- Outcome focus: Annotation quality, evaluation depth, evidence-based judgment\n- Process focus: Error catching, consistency, quality improvement over time\n- Reflection focus: Criteria evolution, missed issue analysis, meta-evaluation skills\n\nDiligence Assessment Matrix:\n- Strong performance = Integrated ethical reasoning throughout collaboration\n- Outcome focus: Attribution quality, transparency documentation, verification evidence\n- Process focus: Data handling, permission documentation, constraint checking\n- Reflection focus: Ethical dilemma discussion, responsibility understanding, values articulation\n\nMatrix Usage:\n- Rubric development: Select relevant Ds, choose assessment types, adapt indicators, define performance levels\n- Feedback provision: Use indicators to guide review, reference strong performance markers\n- Student assessment: Share criteria beforehand, encourage self-identification of competency evidence\n\n\n\n**LESSON OVERVIEW**\n- Duration = 50+ minutes (20 min video + 30 min exercises + offline discussion)\n- Focus = AI impacts on specific disciplines across curriculum/pedagogy/assessment\n- Goal = Create discipline-specific AI fluency applications using 4Ds framework\n\n**CORE PRINCIPLE**\nAI Fluency = Amplifying human expertise, not replacing it\nDisciplinary knowledge = Foundation for unprecedented achievement through AI partnership\n\n**THREE KEY QUESTIONS FOR GRADUATES**\n1. What gets automated? = Which routine career tasks will AI handle\n2. Partnership potential = Where human-AI collaboration most impactful \n3. Who's in charge? = How to manage/remain accountable for independent AI work\n\n**AI DISRUPTION PATTERNS**\nDisruption ≠ uniform across disciplines\n- Curriculum may stay stable while assessments transform\n- Pedagogy might evolve while core content constant\n- Some disruptions = opportunities to leverage\n- Others = problems to solve\n- Your expertise determines which is which\n\n**THREE EXPERTISE TYPES FOR AI RESPONSE**\n1. Disciplinary Expertise = Field content, values, methods, thinking patterns\n2. Pedagogical Expertise = Student struggle/breakthrough patterns, learning emotional journey\n3. Assessment Expertise = Recognizing genuine understanding, designing deep learning evaluations\n\n**CURRICULUM IMPACT ANALYSIS**\nTasks for discipline assessment:\n- Identify AI automation capabilities in field\n- Determine foundational concepts importance shifts with AI\n- Map AI augmentation improvements to best practices\n- Develop responses to \"Why learn X when AI does it?\" questions\n- Define how to direct AI agents effectively\n\n**PEDAGOGY TRANSFORMATION**\nEnhancement opportunities:\n- Personalized tutoring at scale\n- Interactive simulations \n- Immediate feedback systems\n- AI as educational assistant/interactive learning partner\n\nRisk assessment:\n- Distinguish AI that enhances vs diminishes learning\n- Identify teacher-student AI collaborations that leverage potential\n- Determine pedagogical approaches to embrace vs avoid\n- Address reality that students will use AI regardless\n\n**ASSESSMENT REVOLUTION** \nCore challenges:\n- When students generate essays in seconds, what are we assessing?\n- Create evaluations honoring individual growth/creativity/problem-solving\n- Assess both AI-assisted and human-only performances\n\nEssential tasks:\n- Identify authentic learning demonstration in AI-assisted work\n- Create assignments students can't shortcut with AI\n- Value process/growth, not just products\n- Determine where AI collaboration enhances vs undermines objectives\n- Adapt to student AI use reality\n\n**IRREPLACEABLE HUMAN CAPABILITIES**\n- Domain expertise\n- Real-world context understanding\n- Judgment in ambiguous situations\n- Creative problem-solving\n- Ethical reasoning\n- Relationship building\n\n**APPLYING 4DS TO DISCIPLINES**\n\n**DISCERNMENT = Quality evaluation ability**\nBuild Quality Criteria:\n- Articulate excellence beyond vague terms\n- Create detailed rubrics capturing deep quality markers\n- Document criteria students can internalize/apply\n\nCollect Outstanding Work:\n- Analyze exemplars systematically with students\n- Make expert thinking visible through annotation guides\n\nDiagnose Failures:\n- Study flawed examples forensically\n- Understand failure modes for working alone or with AI\n\n**DESCRIPTION = Field communication mastery**\nMap Discipline Products:\n- Document key field outputs with precision\n- Create templates revealing underlying logic\n- Have students reverse-engineer professional outputs\n\nReveal Expert Thinking:\n- Make expert problem-approach processes visible\n- Document micro-decisions and iterations\n- Create flowcharts of expert thinking\n\nName Field Norms:\n- Surface behaviors defining your field\n- Build behavioral performance modes with students\n\n**DELEGATION = Work decomposition understanding**\nReveal Problem Anatomy:\n- Break challenges into component parts\n- Create problem anatomy diagrams\n- Map AI automation/augmentation/agent possibilities\n\nDesign Decision Trees:\n- Create frameworks for when/how to involve AI\n- Build through case studies making delegation decisions explicit\n\n**DILIGENCE = Field values embodiment**\nCodify Ethical Frameworks:\n- Define field-specific \"do no harm\"\n- Build case studies exploring ethical edges\n- Create ethical decision matrices\n\nClarify Transparency Norms:\n- Document disclosure expectations by field\n- Create AI assistance disclosure templates\n\nCo-Create Accountability Policies:\n- Build standards with students, not impose them\n- Draft policies together\n- Develop peer review protocols\n\n**FEEDBACK LOOP BENEFITS**\nStudents who articulate quality → better evaluate any output\nStudents who understand methods → guide any process effectively \nStudents who internalize ethics → navigate any collaboration responsibly\n\n**EXERCISES**\n\n**Exercise 1: AI Impact Position Paper (40 min)**\nStep 1: Curriculum exploration with AI (10 min)\nStep 2: Pedagogical transformation analysis (10 min) \nStep 3: Assessment strategy reimagining (10 min)\nStep 4: Position synthesis (10 min)\n\n**Exercise 2: Colleague 4D Discussions**\nDiscernment discussion = \"What does quality look like?\"\nDescription discussion = \"How do we communicate?\"\nDelegation discussion = \"What work happens?\"\nDiligence discussion = \"What are our values/standards?\"\n\n**FINAL MESSAGE**\nGoal ≠ preparing students to be replaced by AI\nGoal = preparing students to be irreplaceable\nFuture needs humans who: think critically, communicate clearly, collaborate wisely, act responsibly\n\nHuman expertise + AI fluency = Foundation for thriving in AI-enhanced future\n\n", "vertex": "\n\nBelow are notes from a video course about working with the Claude language model.\nUse these notes as a resource to answer the user's question.\nWrite your answer as a standalone response - do not refer directly to these notes unless specifically requested by the user.\n\n\nClaude models = 3 families optimized for different priorities\n\n**Opus** = highest intelligence model. For complex multi-step tasks requiring deep reasoning and planning. Can work independently for hours. Supports reasoning capability. Trade-off = higher cost + moderate latency.\n\n**Sonnet** = balanced model. Good intelligence + speed + cost efficiency. Strong coding abilities, precise code edits without breaking functionality. Fast text generation. Sweet spot for most use cases.\n\n**Haiku** = fastest model. Optimized for speed + cost efficiency. No reasoning capabilities. Best for real-time user interactions + high-volume processing.\n\n**Selection framework**: Intelligence priority → Opus. Speed priority → Haiku. Balanced needs → Sonnet.\n\n**Key insight**: Teams often use multiple models in same application. Haiku for user interactions, Sonnet for business logic, Opus for complex reasoning tasks.\n\nAll models share core capabilities = text generation, coding, image analysis.\n\n\n\nAPI Access Flow = 5-step process from user input to response display\n\nStep 1: Client sends user text to developer's server (never access Vertex directly from client - credentials must stay secret)\n\nStep 2: Server makes request to Vertex AI using SDK (Python/TypeScript/Go/Ruby). Required parameters: model name, messages list, max_tokens limit\n\nStep 3: Claude text generation process = 4 stages:\n- Tokenization = input broken into tokens (words/parts/symbols)\n- Embedding = tokens converted to number lists representing all possible meanings\n- Contextualization = embeddings adjusted based on neighboring tokens to determine precise meaning\n- Generation = output layer produces word probabilities, model selects using probability + randomness, adds selected word, repeats process\n\nStep 4: Generation stops when max_tokens reached OR model generates end-of-sequence token\n\nStep 5: API returns response with generated text, usage counts, stop reason. Server forwards to client for display\n\nKey Components:\n- Token = text chunk (word/part/symbol)\n- Embedding = numerical representation of token meanings\n- Contextualization = meaning refinement using surrounding context\n- Max tokens = generation length limit\n- Stop reason = why generation ended\n- Usage = input/output token counts\n\nSecurity: Always route API calls through server, never expose credentials in client applications.\n\n\n\n**Making a Request to Vertex AI Claude**\n\n**Setup Steps:**\n1. Install anthropic SDK: \\`%pip install \"anthropic[vertex]\"\\`\n2. Import and create client: \\`from anthropic import vertex\\` then instantiate with region=\"global\" and project_id\n3. Define model version variable for reuse\n\n**Required Arguments for client.messages.create():**\n- model = specific Claude model version string\n- max_tokens = safety limit on response length (not a target, just maximum)\n- messages = list of message dictionaries\n\n**Message Types:**\n- User message = {role: \"user\", content: \"text written by humans\"}\n- Assistant message = {role: \"assistant\", content: \"text generated by Claude\"}\n\n**Response Access:**\nRaw response contains metadata. Extract generated text with: \\`message.content[0].text\\`\n\n**Key Concepts:**\nMessages = conversation exchanges between user and Claude\nMax tokens = safety mechanism preventing excessive generation\nProject ID = unique identifier from Google Cloud console\n\n\n\nMulti-Turn Conversations = maintaining context across multiple exchanges with Claude\n\nKey constraint: Anthropic API stores no messages. Each request is stateless - no memory of previous exchanges.\n\nProblem: Sending follow-up requests without context produces irrelevant responses since Claude has no memory of prior conversation.\n\nSolution requirements:\n1. Manually maintain message list in your code\n2. Send entire conversation history with every request\n\nImplementation pattern:\n- Create empty messages list\n- Add user message to list\n- Send to Claude, get response\n- Add assistant response to list\n- Add next user message to list\n- Send entire updated list to Claude\n- Repeat\n\nEssential helper functions:\n- add_user_message(messages, text) = appends user message to conversation history\n- add_assistant_message(messages, text) = appends assistant response to conversation history \n- chat(messages) = sends message list to Claude API and returns response\n\nMessage structure = list of dictionaries with \"role\" (user/assistant) and \"content\" fields\n\nContext preservation = including full conversation history in each API call enables Claude to understand references and maintain coherent dialogue flow.\n\n\n\nSystem Prompts = instructions that customize Claude's tone, style, and behavior for specific use cases.\n\nPurpose = control how Claude responds rather than just what it responds with. Example: making Claude act as patient math tutor who gives hints instead of direct answers.\n\nImplementation = pass system prompt as plain string to create function using system keyword argument.\n\nStructure = first line typically assigns Claude a role (\"You are a patient math tutor\"), followed by specific behavioral instructions.\n\nKey principle = system prompts steer Claude's approach - tutor gives guidance and asks leading questions vs directly solving problems.\n\nTechnical consideration = system parameter cannot be None, must conditionally include in API call only when prompt exists.\n\nBest practice = make system prompts configurable rather than hard-coded for reusability across different use cases.\n\nResult = transforms direct question-answer interactions into guided, interactive experiences tailored to specific roles and contexts.\n\n\n\nTemperature = parameter controlling randomness in Claude's text generation, decimal value 0-1\n\nText generation process = tokenization → probability assignment → token selection based on probabilities\n\nTemperature effects:\n- Temperature 0 = deterministic output, always selects highest probability token\n- Higher temperature = increases chance of selecting lower probability tokens, more creative/unexpected outputs\n\nUsage guidelines:\n- Low temperature (near 0) = data extraction, factual tasks, consistent outputs\n- High temperature (near 1) = creative writing, brainstorming, jokes, marketing\n\nImplementation = add temperature parameter to model call function, defaults to 1.0 for creativity\n\nKey insight = higher temperature increases chance of variation but doesn't guarantee it, may need multiple attempts to see creative differences\n\n\n\nResponse Streaming = technique to provide immediate feedback to users during long AI response generation times instead of showing loading spinners for 10-30 seconds.\n\nHow it works: Server sends user message to Claude → Claude immediately sends initial response (no text content, just acknowledgment) → Claude sends stream of events containing text chunks → Server receives events and sends text chunks to frontend → User sees text appear progressively chunk by chunk.\n\nEvent types: message_start, content_block_start, content_block_delta (contains actual text), content_block_stop, message_delta, message_stop.\n\nImplementation: \n- Basic streaming: client.messages.create(model, max_tokens, messages, stream=True) returns iterator of events\n- Text-focused streaming: client.messages.stream() with context manager provides cleaner access to text content via stream.text_stream\n- Final message assembly: stream.get_final_message() collects all chunks into complete message for database storage\n\nKey benefit: Users see immediate progressive response instead of waiting for complete generation, improving user experience in chat interfaces.\n\n\n\nModel output control = two main techniques beyond prompt modification: pre-filling assistant messages and stop sequences.\n\nPre-filling assistant messages = manually adding assistant message at end of message list to steer response direction. Claude treats pre-filled content as already authored and continues from that point. Example: adding \"coffee is better because\" forces Claude to justify coffee preference. Response continues from end of pre-filled text, not complete replacement.\n\nImplementation: Add assistant message with partial content after user message in messages list. Claude sees this as its own previous response and builds upon it.\n\nStop sequences = forcing Claude to halt generation when specific string appears. Provides list of strings that trigger immediate response termination when generated. Generated stop sequence text excluded from final output.\n\nImplementation: Add stop_sequences parameter to API call with list of trigger strings. Generation stops immediately upon encountering any listed sequence.\n\nUse cases: Pre-filling controls response direction/stance. Stop sequences control response length/format by terminating at specific points.\n\n\n\nStructured Data Generation = combining stop sequences + assistant message prefilling to get raw output without commentary.\n\nProblem: Claude naturally adds headers/footers/explanations when generating structured data (JSON, Python, lists). Users often want just the raw content for copy/paste functionality.\n\nSolution Pattern:\n1. Pre-fill assistant message with opening delimiter (e.g., \"\\`\\`\\`json\")\n2. Set stop sequence to match closing delimiter (e.g., \"\\`\\`\\`\")\n3. Claude assumes it already wrote the opening, generates only the content, stops at closing delimiter\n\nResult: Raw structured data with no additional commentary.\n\nExample Flow:\n- User: \"generate event bridge rule as JSON\"\n- Assistant prefill: \"\\`\\`\\`json\"\n- Stop sequence: \"\\`\\`\\`\"\n- Output: Just the JSON content between delimiters\n\nKey Benefits:\n- Eliminates unwanted markdown formatting\n- Removes explanatory text\n- Enables direct copy/paste functionality\n- Works for any structured data type (JSON, code, lists)\n\nImplementation: text.strip() or JSON.loads() can clean up remaining newlines/formatting.\n\nUse Case: Any scenario requiring precise structured output without Claude's natural helpful commentary.\n\n\n\nPrompt Engineering = techniques for writing/editing prompts to help Claude understand requests and desired response format.\n\nPrompt Evaluation = automated testing of prompts using objective metrics to measure effectiveness.\n\nThree paths after writing a prompt:\n1. Test once/twice, deploy to production (trap)\n2. Test with custom inputs, minor tweaks for corner cases (trap) \n3. Run through evaluation pipeline for objective scoring (recommended)\n\nOptions 1 and 2 are common traps - engineers don't test prompts sufficiently before production use.\n\nBest practice = Use evaluation pipeline to get objective performance scores, then iterate on prompt based on results before deployment.\n\nEvaluation comes before engineering in the learning sequence - measure effectiveness first, then learn improvement techniques.\n\n\n\nTypical Eval Workflow = 5-step iterative process for prompt optimization\n\nStep 1: Initial Prompt Draft = Write basic prompt with input variables (example: \"Please answer the user's question [user_input]\")\n\nStep 2: Evaluation Dataset = Create collection of test inputs (3 examples minimum, real-world uses hundreds/thousands). Can be hand-crafted or AI-generated.\n\nStep 3: Prompt Execution = Feed each dataset input through prompt template to create complete prompts, then send to Claude for responses.\n\nStep 4: Grading = Use grader system to score each question-answer pair (typically 1-10 scale). Average all scores for overall prompt performance metric.\n\nStep 5: Iteration = Modify prompt based on results, repeat entire process, compare scores to determine better version.\n\nKey Principles:\n- No standardized methodology across industry\n- Multiple implementation options (open source packages, paid solutions, custom builds)\n- Can start simple in Jupyter notebook before scaling\n- Objective scoring enables data-driven prompt improvement\n- Process repeats until satisfactory performance achieved\n\nWorkflow enables systematic prompt optimization through measurable performance comparison rather than subjective evaluation.\n\n\n\nCustom Prompt Evaluation Workflow = Building system to evaluate AWS code generation prompts\n\nGoal = Help users write AWS-specific code by outputting one of three formats: Python, JSON configuration, or raw regular expressions\n\nPrompt Structure = \"Please provide a solution to the following task: [user task]\" with no additional explanation/headers/footers\n\nTest Dataset = Array of JSON objects with \"task\" property describing desired AWS tasks\n\nDataset Generation Methods = Manual assembly or automatic generation using Claude Haiku (faster model recommended)\n\nImplementation Process:\n1. Create generate_dataset() function with large prompt asking Claude to generate test cases\n2. Use pre-filling technique with assistant message starting \"\\`\\`\\`json\"\n3. Set stop sequence as \"\\`\\`\\`\" to ensure clean JSON output\n4. Parse response with JSON.loads()\n5. Save dataset to file using JSON.dump() for later evaluation use\n\nDataset Structure = [{task: \"description\"}, {task: \"description\"}, ...]\n\nKey Technique = Pre-filling + stop sequences for reliable JSON parsing from LLM responses\n\nNext Step = Use saved dataset file to evaluate prompt performance across all test cases\n\n\n\nTest case = individual record from generated dataset that gets merged with prompt and fed to Claude\n\nrun_prompt function = takes test case, merges with prompt (simple \"please solve the following task\" + test case), sends to Claude, returns output. Currently lacks formatting instructions so returns verbose output.\n\nrun_test_case function = takes individual case, calls run_prompt, grades result (currently hardcoded score of 10), returns dictionary with output/test case/score.\n\nrun_eval function = loads dataset, loops through each test case calling run_test_case, assembles all results into list.\n\nEval pipeline workflow = dataset → merge with prompt → send to Claude → grade results → collect outputs\n\nCurrent limitations = no grading logic implemented (hardcoded scores), no output formatting instructions in prompt, relatively slow execution time (31 seconds with Haiku model).\n\nResults format = array of objects containing Claude output, original test case, and score for each test case.\n\nNext step = implement actual graders to replace hardcoded scoring system.\n\n\n\nModel Based Grading = using AI models to evaluate outputs from other AI models by providing objective scoring signals\n\nThree grader types:\n- Code graders = programmatic checks (length, syntax, readability, word presence)\n- Model graders = additional API calls to evaluate quality, instruction following, completeness \n- Human graders = manual evaluation (flexible but time-consuming)\n\nKey requirements:\n- All graders must return objective signals (typically 1-10 scores)\n- Define evaluation criteria upfront\n- For model graders: use detailed prompts requesting strengths/weaknesses/reasoning to avoid middling scores (models default to ~6 without reasoning requirements)\n\nImplementation pattern:\n1. Create grading function that takes test case + model output\n2. Use structured prompts with role definition + clear evaluation instructions\n3. Extract JSON responses with scores/reasoning\n4. Calculate average scores across test cases for final metric\n\nCommon evaluation criteria = format compliance, syntax validation, task completion accuracy\n\nModel graders offer high flexibility for subjective quality assessment while code graders handle objective validation checks.\n\n\n\nCode Based Grading = system to validate model outputs contain only valid code (Python/JSON/RegEx) without explanations\n\nCore Components:\n- validate_json() = tries JSON parsing, returns 10 if valid, 0 if error\n- validate_python() = tries AST parsing, returns 10 if valid, 0 if error \n- validate_regex() = tries regex compilation, returns 10 if valid, 0 if error\n- grade_syntax() = dispatcher function that calls appropriate validator based on test case format\n\nImplementation Steps:\n1. Add validator functions that attempt parsing/compilation\n2. Update dataset to include \"format\" key specifying expected output type (JSON/Python/RegEx)\n3. Update prompt template to explicitly request only code without commentary\n4. Use pre-filled Assistant message with code blocks and stop sequences\n5. Merge syntax score with model score by averaging\n\nDataset Format = must include format field indicating expected code type for each test case\n\nPrompt Engineering = use \"\\`\\`\\`code\" as pre-filled Assistant message since exact format unknown beforehand\n\nScore Calculation = (model_score + syntax_score) / 2\n\nKey Insight = validates syntax through try/catch parsing rather than complex rule-based validation\n\n\n\nPrompt Engineering = improving prompts to get more reliable, higher quality outputs from language models.\n\nGoal: Generate one-day meal plans for athletes based on height, weight, physical goal, and dietary restrictions.\n\nProcess:\n1. Write initial prompt (poor first attempt)\n2. Evaluate prompt performance \n3. Apply prompt engineering techniques iteratively\n4. Re-evaluate after each improvement\n5. Monitor performance improvements\n\nInitial prompt example: \"What should this person eat?\" + basic parameter interpolation (height, weight, goal, restrictions).\n\nEvaluation setup uses Prompt Evaluator class with configurable concurrency (start low like 3, reduce to 1 if rate limits hit). Extra criteria can specify output requirements like caloric totals, macro breakdowns, exact foods/portions/timing.\n\nExpected pattern: Initial scores are poor, improve systematically through technique application. Output evaluation creates HTML report showing test case results, scores, and reasoning.\n\nKey insight: Start simple, measure performance, then incrementally apply engineering techniques while continuously evaluating improvements.\n\n\n\nBeing Clear and Direct = technique for improving prompt effectiveness by focusing on the first line of prompts.\n\nFirst line importance = most critical part of prompt that sets the foundation for AI response.\n\nStructure = use action verb + simple direct language + clear task description.\n\nAction verbs = write, generate, create, identify, analyze - tells AI exactly what to do.\n\nTask specification = include details about expected output format and content requirements.\n\nExamples:\n- \"Write three paragraphs about how solar panels work\" = action verb + output format + topic\n- \"Identify three countries that use geothermal energy and for each include generation stats\" = action verb + quantity + specific requirements\n\nImplementation = replace vague openings with direct commands that specify both the action and expected deliverable.\n\nResults = significant improvement in prompt performance (example showed increase from 2.32 to 3.92 grade).\n\n\n\nBeing Specific = adding guidelines or steps to direct model output in particular direction\n\nTwo types of guidelines:\n- Type A: Control output attributes (length, structure, qualities)\n- Type B: Provide steps for model to follow (forces consideration of specific elements, improves reasoning quality)\n\nBoth types often combined in professional prompts.\n\nWhen to use:\n- Type A: Almost always - list desired output qualities\n- Type B: Complex problems requiring broader consideration of viewpoints/data beyond model's natural scope\n\nExample improvement: Adding guidelines improved evaluation score from 3.92 to 7.86, demonstrating significant impact on output quality.\n\n\n\nXML Tags for Prompt Structure = technique to organize and clarify different content sections within prompts using custom XML-style tags.\n\nPurpose = helps language models distinguish between different types of interpolated content when large amounts of text are inserted into prompts.\n\nImplementation = wrap content sections with descriptive tags like or rather than dumping raw text.\n\nTag naming = use specific, descriptive names (sales_records > records > data) to provide context about content nature.\n\nUse cases = separating code from documentation, marking athlete information, organizing sales data, any scenario with multiple content types in single prompt.\n\nBenefits = reduces ambiguity about what text serves what purpose, improves model comprehension of prompt structure, can lead to quality improvements especially with simpler models.\n\nBest practice = even for shorter content sections, XML tags can clarify that content represents external input or specific information categories.\n\n\n\nOne-shot/multi-shot prompting = providing examples within prompts to guide model behavior. One-shot = single example, multi-shot = multiple examples.\n\nImplementation = wrap examples in XML tags with sample input and ideal output sections. Structure clearly separates example content from main prompt.\n\nCorner cases = use multi-shot prompting to handle edge cases like sarcasm detection. Add context explaining why specific scenarios need special attention.\n\nComplex outputs = examples especially effective for demonstrating intricate JSON structures or formatting requirements.\n\nPrompt evaluation integration = extract high-scoring test cases from evaluation results to use as examples. Include reasoning explanation of why output is ideal to reinforce desired behavior patterns.\n\nEffectiveness = consistently improves model performance by providing concrete behavioral templates and output format guidance.\n\n\n\nTool use = mechanism allowing Claude to access external information beyond its training data\n\nCore limitation: Claude only knows information from training data, lacks real-time/current information\n\nTool use flow:\n1. Send initial request to Claude + instructions for external data access\n2. Claude determines if external data needed, requests specific information\n3. Server runs code to fetch requested data from external sources\n4. Send follow-up request to Claude with retrieved data\n5. Claude generates final response using original prompt + external data\n\nWeather example:\n- User asks current weather in San Francisco\n- Without tools: Claude responds \"no access to current weather data\"\n- With tools: Claude requests weather data → server calls weather API → Claude receives data → provides current weather response\n\nKey concept: Tools enable Claude to augment responses with real-time external information through structured data retrieval process.\n\n\n\nProject goal = teach Claude to set time-based reminders via tools in Jupyter notebook\n\nTarget interaction = user says \"Set reminder for doctor's appointment, week from Thursday\" → Claude responds \"I will remind you at that point in time\"\n\nThree core problems identified:\n1. Claude lacks precise current time knowledge (knows date, not exact time)\n2. Claude sometimes fails at time-based calculations (e.g., \"379 days from January 13th, 1973\")\n3. Claude has no mechanism to actually set reminders (understands concept but cannot execute)\n\nSolution approach = three dedicated tools:\n1. Get current datetime tool (date + time)\n2. Add duration to datetime tool (handles time calculations)\n3. Reminder setting tool (executes actual reminder creation)\n\nImplementation = one tool at a time, eventually combining multiple tools for complete functionality.\n\n\n\nTool Functions = Python functions executed automatically when Claude needs extra information to help users\n\nKey Components:\n- Tool function = plain Python function that retrieves specific data (e.g., current datetime, weather)\n- Executed when Claude determines it needs additional information to answer user queries\n\nBest Practices:\n1. Use descriptive function/argument names\n2. Validate inputs and raise errors for invalid data\n3. Include meaningful error messages that help Claude correct mistakes\n\nError Handling Benefits:\n- Claude sees exact error messages when tool calls fail\n- Can retry tool calls with corrected parameters based on error feedback\n- Example: \"location cannot be empty\" helps Claude retry with valid location\n\nImplementation Pattern:\n\\`\\`\\`\ndef get_current_datetime(date_format=\"%Y%m%d %H:%M:%S\"):\n if not date_format:\n raise ValueError(\"date format cannot be empty\")\n return datetime.now().strftime(date_format)\n\\`\\`\\`\n\nTool functions should focus on single responsibility (getting datetime, weather, etc.) with proper input validation and clear error messaging for Claude's retry logic.\n\n\n\nTool Schemas = JSON configuration objects that describe tool functions for language models\n\nJSON Schema = data validation specification (not LM-specific) used to validate JSON data. LM community adopted it for tool calling because it's widely understood and convenient.\n\nTool Schema Structure:\n- name: tool function name\n- description: 3-4 sentences explaining what tool does, when to use, what data it returns\n- input_schema: actual JSON schema describing function arguments (type, description for each parameter)\n\nBest Practice: Use 3-4 sentence descriptions for both tool and individual arguments to help Claude understand purpose and usage.\n\nSchema Generation Trick: Ask Claude to write JSON schema for your function + attach Anthropic tool use documentation for best practices. Results in high-quality schemas.\n\nNaming Convention: function_name + function_name_schema for easy tracking.\n\nType Safety: Wrap schema in ToolParam import from anthropic.types to prevent type errors during implementation.\n\n\n\n**Step 3: Calling Claude with Tool Schema**\n\nAPI Request Structure = Include tools parameter with JSON schema list to inform Claude of available tools\n\n**Multi-Block Message Response**\n\nMessage Content Types = Text blocks (user display) + Tool use blocks (function calls)\n\nTool Use Block Contents = Function name + input arguments for execution\n\n**Critical Message History Management**\n\nConversation Persistence = Manual tracking required - Claude stores no history\n\nMulti-Block Handling = Must preserve entire content list including all blocks (text + tool use) when appending to message history\n\nImplementation = messages.append({\"role\": \"assistant\", \"content\": response.content})\n\n**Helper Function Updates Needed**\n\nCurrent Limitation = add_user_message and add_assistant_message only support single text blocks\n\nRequired Fix = Update helpers to handle multiple content blocks per message\n\n\n\nStep 4: Execute tool function that Claude requested. Extract arguments from tool use block using response.content[1].input, then call function with **kwargs syntax to convert dictionary to keyword arguments.\n\nStep 5: Send follow-up request to Claude with full conversation history plus new user message containing tool result block.\n\nTool result block structure:\n- tool_use_id = matches ID from original tool use block (enables Claude to match requests to results when multiple tools called)\n- content = tool function output converted to string \n- is_error = false (default, set true if tool execution failed)\n\nTool use ID system: When Claude makes multiple tool calls, each gets unique ID. Tool results must reference matching IDs so Claude can correlate which result belongs to which request.\n\nComplete flow: Original user message → Assistant message with tool use block → Execute tool function → User message with tool result block → Final assistant response using tool output.\n\nMust include tool schema in all requests once tools introduced, even in follow-up calls.\n\n\n\nMulti-Turn Tool Conversations = system allowing AI to make multiple sequential tool calls within single conversation\n\nProblem: Users submit queries requiring multiple tools. Example: \"What day is 103 days from today?\" needs get_current_datetime tool, then add_duration_to_datetime tool.\n\nProcess Flow:\n1. Claude requests first tool (get_current_datetime)\n2. System executes tool, returns result\n3. Claude requests second tool (add_duration_to_datetime) \n4. System executes tool, returns result\n5. Claude provides final answer\n\nImplementation Pattern:\n- run_conversation function takes initial message list\n- While loop: call Claude, check response\n- If response contains tool_use blocks: execute tools, add results to conversation, continue loop\n- If response contains no tool_use: return final answer to user\n\nRequired Refactoring:\n1. Update add_user_message/add_assistant_message helpers to handle multiple message blocks (text + tool_use blocks)\n2. Modify chat function to accept tool schemas list, return entire message instead of just text\n3. Add text_from_message helper to extract text from multi-block messages\n4. Implement conversation loop supporting sequential tool calls\n\nKey Concept: Unpredictable tool chains require flexible conversation management assuming multiple tool calls per query.\n\n\n\nMultiple Turns = Loop that keeps calling Claude until it stops requesting tools, indicated by stop_reason field\n\nStop Reason = Field in Claude's response indicating why text generation stopped. \"tool_use\" value means Claude wants to call a tool.\n\nRun Conversation Function = Main loop that:\n1. Calls Claude with messages + available tools\n2. Adds assistant response to message history\n3. Checks stop_reason - if not \"tool_use\", breaks loop\n4. If tool_use, calls run_tools function\n5. Adds tool results as user message\n6. Repeats until Claude gives final response\n\nRun Tools Function = Processes multiple tool calls from single message:\n1. Filters message.content for tool_use blocks only\n2. Iterates through each tool request\n3. Runs appropriate tool function using tool request name/input\n4. Creates tool_result blocks with: type=\"tool_result\", tool_use_id=original_id, content=JSON_encoded_output, is_error=false/true\n5. Returns list of all tool result blocks\n\nRun Tool Function = Helper that maps tool names to actual tool functions using if statements. Enables easy scaling to multiple tools.\n\nError Handling = Try/catch around tool execution, setting is_error=true and including error message in content when tools fail.\n\nMessage Flow = User message → Assistant response with tool_use → Tool results as user message → Assistant response (repeat until no tool_use) → Final response.\n\nMulti-block Messages = Single Claude message can contain multiple blocks (text + multiple tool_use blocks). Code must handle extracting and processing all tool_use blocks separately.\n\n\n\nAdding multiple tools to Claude involves updating two key functions after implementing tool schemas and functions.\n\n**Process:**\n1. Add tool schemas to tools list in RunConversation function\n2. Add corresponding function calls to RunTool function using if/elif statements\n3. Tool functions execute and return results when Claude requests them\n\n**Example Implementation:**\n- RunTool checks tool_name, calls appropriate function with **tool_input\n- Pattern: if tool_name == \"ToolName\": return ToolFunction(**tool_input)\n\n**Multi-tool Usage:**\nClaude can chain multiple tools in sequence (e.g., AddDurationToDateTime → SetReminder). Each tool call creates separate message blocks with tool_use and tool_result pairs in conversation history.\n\n**Key Pattern:**\nOnce initial framework established, adding new tools = add schema + add function + update RunTool switch statement. Process becomes standardized and scalable.\n\n\n\nBatch Tool = workaround to make Claude call multiple tools in parallel within single Assistant message\n\nProblem: Claude can technically send multiple tool use blocks in one response but rarely does so in practice. Instead sends separate sequential Assistant messages with single tool uses, creating unnecessary request rounds.\n\nSolution: Implement batch tool that acts as abstraction layer. Claude calls batch tool instead of individual tools directly.\n\nBatch Tool Schema: Takes \"invocations\" parameter = list of objects, each representing another tool to call (tool name + arguments)\n\nImplementation: \n- Add batch tool to available tools list\n- When Claude calls batch tool, extract invocations list\n- Iterate through each invocation, parse JSON arguments, call run_tool() for each\n- Return combined results as single tool result\n\nResult: Claude uses batch tool to parallelize multiple tool calls instead of making separate sequential calls. Reduces request rounds from N+1 to 2 (initial request + batch response).\n\nKey insight: This \"tricks\" Claude into parallel execution by providing higher-level abstraction it's more likely to use than native multiple tool use blocks.\n\n\n\nTools for Structured Data:\n\nAlternative method to extract structured JSON from Claude using tools instead of message pre-fill/stop sequences. More reliable but more complex setup.\n\nCore concept: Create JSON schema spec for tool where inputs match desired output structure. Claude calls tool with structured arguments containing extracted data.\n\nWorkflow:\n1. Write prompt asking Claude to analyze data and call provided tool\n2. Provide JSON schema defining tool inputs (matches desired output structure)\n3. Claude responds with tool_use block containing structured arguments\n4. Extract JSON from tool arguments - no tool_result response needed\n\nKey requirement: Force Claude to call specific tool using tool_choice parameter = {\"type\": \"tool\", \"name\": \"tool_name\"}\n\nSetup steps:\n- Define schema with tool inputs matching desired JSON structure\n- Update chat function to accept tool_choice parameter\n- Pass tool_choice to client.messages.create()\n- Access structured data via response.content[0].input\n\nAdvantage = More reliable structured output\nDisadvantage = More complex setup than prompt-based methods\n\nBoth techniques useful depending on scenario complexity requirements.\n\n\n\nText Editor Tool = Claude's built-in tool for file/text manipulation with wide text editor capabilities (open/read files, edit ranges, add/replace text, create files, undo).\n\nOnly JSON schema built into Claude, not implementation. Developers must write tool function implementation to handle Claude's text editor requests.\n\nSchema stub required based on model version:\n- Claude 3.7: specific date format\n- Claude 3.5: different date format\nSmall schema automatically expands to full schema in Claude.\n\nCapabilities = replicate code editor functionality (file operations, refactoring, testing file creation). Use cases = scenarios without access to full-featured code editors but need programmatic file manipulation.\n\nImplementation class needed with methods: view (file/directory contents), string_replace, create_file, etc.\n\n\n\nWeb Search Tool = built-in Claude tool for searching web to find up-to-date/specialized information\n\nKey Implementation:\n- Requires minimal schema: type=\"web_search_20250305\", name=\"web_search\", max_uses=5\n- No custom implementation needed - Claude handles search execution\n- max_uses = limit on total searches (single search can return multiple results)\n\nResponse Structure:\n- Text blocks = Claude's framing/answers\n- Server tool use blocks = search query inputs\n- Web search tool result blocks = search results with title/URL\n- Citation blocks = supporting text for Claude's statements\n\nSchema Configuration:\n- allowed_domains = constrains search to specific domains (e.g., \"NIH.gov\" for medical content)\n- Improves result quality by limiting to authoritative sources\n\nUI Rendering Best Practice:\n- Display text blocks as plain text\n- Highlight web search result blocks and citations separately\n- Show source domains, titles, URLs, and cited text for transparency\n- Helps users understand information sourcing\n\nUse Case = current events, specialized knowledge, fact-checking with credible sources\n\n\n\nRAG = Retrieval Augmented Generation, technique for querying large documents with LLMs.\n\nProblem: How to extract specific information from large documents (100-1000 pages) for LLM processing.\n\nOption 1 (Direct approach): Feed entire document text into prompt.\n- Limitations: Token limits, decreased effectiveness with long prompts, higher cost, slower processing.\n\nOption 2 (RAG approach): \n- Step 1: Break document into small chunks\n- Step 2: Find most relevant chunks for user question, include only those in prompt\n\nRAG advantages: LLM focuses on relevant content, scales to large/multiple documents, smaller prompts = faster/cheaper processing.\n\nRAG disadvantages: Complex preprocessing required, need search mechanism for chunk retrieval, must define \"relevance\", no guarantee chunks contain complete context, multiple chunking strategies possible (equal portions vs header-based).\n\nKey challenge: Determining optimal chunking strategy and search mechanism for specific use case.\n\nRAG trades simplicity for scalability and efficiency but requires careful implementation evaluation.\n\n\n\nText Chunking = process of dividing source documents into smaller text segments for RAG pipelines\n\nCore Problem: How text is chunked significantly impacts RAG quality. Poor chunking leads to wrong context retrieval (e.g., medical text about \"bugs\" retrieved for software engineering questions due to word overlap)\n\nThree Main Strategies:\n\nSize-based Chunking = dividing documents into equal-length strings\n- Pros: easiest to implement, most common in production\n- Cons: cuts off words mid-sentence, lacks context\n- Solution: overlap strategy = include characters from neighboring chunks to preserve context\n- Trade-off: creates text duplication but improves chunk meaning\n\nStructure-based Chunking = dividing based on document structure (headers, paragraphs, sections)\n- Works well with formatted documents (markdown, clear sections)\n- Limitation: requires structured input, fails with plain text/PDFs\n- Implementation depends on document format guarantees\n\nSemantic-based Chunking = using NLP to group related sentences/sections\n- Most advanced technique\n- Groups consecutive related content\n- Complex implementation, not covered in detail\n\nKey Parameters:\n- Chunk size = length of each text segment\n- Overlap = number of characters shared between adjacent chunks\n- Separation criteria = what defines chunk boundaries\n\nStrategy Selection depends on:\n- Document structure guarantees\n- Input format consistency\n- Use case requirements\n\nDefault recommendation: chunk by character = most reliable across document types despite suboptimal results\n\n\n\nText Embeddings = numerical representation of meaning in text, generated by embedding models\n\nEmbedding Model = takes text input, outputs long list of numbers (values range -1 to +1)\n\nEach Number = score representing some quality/feature of input text (actual qualities unknown but helpful to think as semantic features like happiness, topic relevance, etc.)\n\nSemantic Search = uses text embeddings to find related content by comparing numerical representations rather than exact word matches\n\nRAG Pipeline Process = extract text chunks → user submits query → find related chunks using embeddings → add as context to prompt\n\nGoogle's text-embedding-005 = specific embedding model available on Vertex AI for generating text embeddings\n\nKey Limitation = we don't know what each number in embedding actually represents, but can conceptualize them as semantic quality scores\n\nImplementation = use Google GenAI SDK, create client, pass text through model to get embedding vectors\n\nUse Case = finding text chunks related to user questions by comparing their numerical representations rather than keyword matching\n\n\n\nRAG Pipeline = Complete flow from document processing to query response through embeddings and vector search.\n\nStep 1: Text Chunking = Split source documents into separate text pieces for processing.\n\nStep 2: Embedding Generation = Convert text chunks into numerical vectors using embedding models. Embeddings = numerical representations where each dimension captures semantic meaning.\n\nStep 3: Normalization = Scale embedding vectors to unit length (magnitude = 1.0), typically handled automatically by embedding APIs.\n\nStep 4: Vector Database Storage = Store normalized embeddings in specialized database optimized for numerical vector operations.\n\nStep 5: Query Processing = User submits question, gets embedded using same model as source documents.\n\nStep 6: Similarity Search = Vector database finds most similar stored embeddings to query embedding.\n\nCosine Similarity = Measure of similarity between vectors, calculated as cosine of angle between them. Returns values -1 to 1, where 1 = very similar, -1 = very different.\n\nCosine Distance = 1 minus cosine similarity. Values near 0 = high similarity, larger values = less similarity.\n\nStep 7: Response Generation = Combine user query with most relevant retrieved text chunks in prompt, send to LLM for final response.\n\nKey Point: Preprocessing (steps 1-4) happens ahead of time. Real-time processing only involves steps 5-7 when user submits query.\n\n\n\nRAG Flow Implementation = Complete workflow using vector database for document retrieval\n\n5 Core Steps:\n1. Text Chunking = Split document into sections using chunk_by_section function\n2. Generate Embeddings = Create embeddings for each text chunk using generate_embedding\n3. Vector Store Population = Create vector index instance, loop through chunk-embedding pairs, insert via store.add_vector with embedding + metadata dictionary containing original text\n4. Query Processing = Generate embedding for user question using same generate_embedding function\n5. Similarity Search = Use store.search(user_embedding, num_results) to find most relevant chunks, returns documents with cosine distances\n\nKey Technical Points:\n- Vector DB stores embeddings + original text metadata (embeddings alone not useful for developers)\n- Cosine distance measures similarity (lower = more similar)\n- Multiple chunks returned for comprehensive context\n- Implementation uses class VectorIndex as sample vector database\n\nExample Query: \"What did software engineering department do last year?\" returned section 2 (distance 0.71) and methodology section (distance 0.72) as top matches.\n\nLimitation: Current implementation has scenarios where workflow doesn't work optimally, requiring additional improvements.\n\n\n\nBM25 = Best Match 25, a lexical search algorithm used in RAG pipelines for text-based search complementing semantic search.\n\nProblem with semantic search alone: Can return irrelevant results despite good performance. Example: searching \"incident 2023 Q4 011\" returned correct section 10 but also irrelevant section 3 (financial analysis) that never mentions the incident.\n\nSolution approach: Hybrid search combining semantic search (embeddings + vector database) with lexical search (BM25) running in parallel, then merging results for better balance.\n\nBM25 algorithm steps:\n1. Tokenize user query = break into individual terms by removing punctuation and splitting on spaces\n2. Count term frequency = calculate how often each term appears across all text chunks\n3. Assign importance weights = rare terms get higher importance, common terms (like \"a\") get lower importance\n4. Rank chunks = prioritize chunks containing higher-weighted terms more frequently\n\nKey advantage: BM25 prioritizes chunks with rare, specific terms (like \"incident 2023\") over generic common words, leading to more relevant results for exact term matches.\n\nImplementation: Both semantic and lexical search systems use similar APIs (add_document, search functions) enabling easy integration for hybrid search approach.\n\nNext step: Merge both search systems to get combined benefits of semantic understanding and exact term matching.\n\n\n\nMulti-Index RAG Pipeline = system combining semantic search (vector index) and lexical search (BM25 index) for improved retrieval accuracy.\n\nCore Architecture:\n- Vector Index + BM25 Index = both have identical APIs (add_document, search methods)\n- Retriever Class = wrapper that forwards queries to both indexes and merges results\n- Unified Interface = enables easy addition of new search methodologies\n\nReciprocal Rank Fusion = technique for merging results from different search methods:\n- Formula: Score = sum of (1/(1+rank)) for each search method\n- Process: collect all results → record ranks from each method → apply formula → sort by highest score\n- Example: if doc ranks 1st in vector search and 2nd in BM25, gets higher combined score than doc ranking 2nd and 3rd\n\nBenefits:\n- Improved relevance over single-method search\n- Modular design allows adding new search indexes\n- Maintains consistent API across all components\n\nKey Result: Hybrid approach produces better search results than either semantic or lexical search alone, particularly for complex queries requiring both conceptual understanding and keyword matching.\n\n\n\nReranking = post-processing technique to improve retrieval accuracy by using an LLM to reorder search results based on relevance.\n\nProcess: After hybrid retrieval (vector + BM25), pass top results to Claude with prompt asking to rank documents by relevance to user query. Claude returns reordered list with most relevant documents first.\n\nImplementation details: Use document IDs instead of full text for efficiency - assign random IDs to chunks, ask Claude to return ordered IDs rather than full content. Uses XML formatting for documents in prompt, JSON response with pre-fill and stop sequences.\n\nTrade-offs: Increases search accuracy but adds latency due to LLM call. Particularly effective when semantic understanding needed (example: \"engineering team\" query correctly prioritized software engineering section over cybersecurity).\n\nPrompt structure: User question + candidate documents + instruction to return N most relevant documents in decreasing relevance order.\n\n\n\nContextual Retrieval = RAG improvement technique that adds document context to text chunks before vector storage.\n\nProblem: Document chunking removes context from original source, reducing retrieval accuracy.\n\nSolution: Pre-processing step using LLM to generate contextual information for each chunk.\n\nProcess:\n1. Take individual chunk + original source document\n2. Send to LLM (Claude) with prompt asking to situate chunk within larger document context\n3. LLM generates brief contextual description\n4. Combine generated context + original chunk = contextualized chunk\n5. Store contextualized chunk in vector/BM25 index\n\nLarge Document Handling: When source document too large for single prompt, use selective context:\n- Include starter chunks (1-3) for document summary/abstract\n- Include chunks immediately before target chunk for local context\n- Skip middle chunks that provide less relevant context\n\nImplementation: add_context() function takes chunk + source text, generates context via LLM, concatenates context with original chunk.\n\nBenefit: Maintains document relationships and cross-references within individual chunks, improving retrieval accuracy for complex documents with interconnected sections.\n\n\n\nExtended Thinking = Claude feature that allows reasoning time before generating final response\n\nKey mechanics:\n- Displays separate thinking process in chat UIs\n- User charged for tokens generated during thinking phase\n- Increases accuracy for complex tasks but adds cost and latency\n\nWhen to enable:\n- Use prompt evals first\n- Enable only when accuracy insufficient after prompt optimization efforts\n\nTechnical implementation:\n- Response contains thinking block + text block\n- Thinking block includes cryptographic signature to prevent tampering\n- Claude verifies thinking text hasn't been modified when reused in conversations\n- Minimum thinking budget = 1024 tokens\n- max_tokens must exceed thinking_budget (recommended significant buffer)\n\nSpecial cases:\n- Redacted thinking blocks occur when thinking text flagged by safety systems\n- Redacted content provided in encrypted form to preserve context\n- Test string available to force redacted thinking blocks for testing\n\nCode requirements:\n- Add thinking parameter (default false)\n- Add thinking_budget parameter (minimum 1024)\n- Include thinking object in API params with type=\"enabled\" and budget_tokens value\n- Ensure max_tokens >> thinking_budget for adequate response generation\n\n\n\nClaude Vision Capabilities = ability to send up to 100 images per request to Claude for analysis, comparison, counting, and other visual tasks.\n\nTechnical Requirements = image size/dimension limits exist, images consume tokens based on pixel dimensions (height x width), costs calculated via specific equation.\n\nImage Integration = use image blocks in user messages containing either raw base64 image data or URLs to online images. Multiple image blocks allowed per message.\n\nCritical Success Factor = sophisticated prompting techniques essential for accurate results. Simple prompts typically fail.\n\nPrompting Techniques for Images = provide analysis steps, guidelines, one-shot/multi-shot examples. Structure prompts with specific sequential instructions rather than basic requests.\n\nExample Enhancement Methods = \n- Step-by-step analysis (identify objects, count methodically, verify count with different strategy, compare results)\n- One-shot prompting (show example image with correct answer, then present target image)\n\nMessage Structure = alternate image parts and text parts within single user message for examples and instructions.\n\nReal-world Application Example = wildfire risk assessment using satellite imagery to evaluate tree density, emergency access, roof overhang, and assign numerical risk scores.\n\nKey Takeaway = image accuracy depends entirely on prompt engineering quality, not just image clarity.\n\n\n\nClaude PDF Support = ability to read and process PDF file content directly\n\nImplementation = nearly identical to image processing code with key changes:\n- File type: \"document\" instead of \"image\" \n- Media type: \"application/pdf\" instead of \"image/png\"\n- Variable naming: file_bytes instead of image_bytes\n\nPDF capabilities = extract text, images, charts, tables, and other document elements\n\nUsage pattern = attach PDF file, modify existing image processing code with type/media changes, send to Claude with text prompt\n\nKey benefit = single tool for comprehensive PDF content extraction and analysis\n\n\n\nCitations = Claude feature allowing AI to reference specific source documents when generating responses\n\nCitation purpose = Inform users that AI response comes from actual source rather than just AI memory/training\n\nCitation types:\n- Citation page location = For PDF documents, includes cited text + document index + document title + start/end pages\n- Citation char location = For plain text, includes character position within text block\n\nImplementation = Add citations field with enabled:true to API request along with source document\n\nResponse structure = Content becomes list of text blocks, some containing citations arrays with location data\n\nUser interface benefit = Build popups/overlays showing users exactly which source text supports each AI statement\n\nSupported formats = PDF documents and plain text sources\n\nKey value = Users can verify AI interpretations by checking original source material, ensuring transparency and accuracy\n\n\n\nPrompt caching = feature that speeds up Claude's response and reduces text generation costs by reusing computational work from previous requests.\n\nNormal request process: User sends message → Claude performs extensive internal calculations on input → generates output → discards all computational work → ready for next request.\n\nProblem: When follow-up requests contain previously seen messages, Claude must redo identical calculations it already performed and discarded.\n\nSolution: Prompt caching stores computational work in temporary data store instead of discarding it. When identical input appears in subsequent requests, Claude reuses cached calculations rather than recomputing them.\n\nBenefits: Faster response times, lower costs due to avoiding redundant processing of repeated content.\n\nKey requirement: Input text must be exactly identical to previously cached content for reuse to occur.\n\n\n\nPrompt Caching = system where Claude saves processing work from initial request to reuse in follow-up requests with identical content\n\nCache Duration = 5 minutes temporary storage\n\nActivation = manual cache breakpoint required in message blocks, not enabled by default\n\nText Block Format = must use longhand format {type: \"text\", text: \"content\", cache_control: {...}} instead of shorthand string assignment to add cache control\n\nCache Scope = all content cached up to and including breakpoint, not content after breakpoint\n\nContent Identity Rule = follow-up requests must have identical content up to breakpoint or cache invalidated\n\nBreakpoint Locations = text blocks, image blocks, tool use, tool results, tool schemas, system prompts\n\nProcessing Order = tools → system prompt → messages (joined together behind scenes)\n\nMultiple Breakpoints = up to 4 total breakpoints allowed for granular caching control\n\nMinimum Cache Length = 1024 tokens required for content to be cached\n\nUse Cases = repetitive requests with same content, stable system prompts, unchanging tool schemas\n\n\n\nPrompt Caching Implementation:\n\nCache Breakpoints = multiple cache points in single request (tools + system prompt + messages)\n\nTool Schema Caching:\n- Add cache_control field to LAST tool schema only\n- Best practice = copy tools list first, clone last tool, add cache_control type=\"ephemeral\"\n- Prevents accidental modification of original tool schemas\n\nSystem Prompt Caching:\n- Convert system string to list with text block containing cache_control type=\"ephemeral\"\n- Format: [{\"type\": \"text\", \"text\": system_content, \"cache_control\": {\"type\": \"ephemeral\"}}]\n\nCache Order = tools → system prompt → messages\n\nUsage Patterns:\n- cache_creation_input_tokens = tokens written to cache (first use)\n- cache_read_input_tokens = tokens read from cache (subsequent identical requests)\n- Any change to cached content invalidates cache, forces new cache_creation\n\nToken Counts Example:\n- Base message: ~14 tokens\n- Tool schemas: ~1.7K tokens \n- System prompt: ~6.3K tokens\n\nCache invalidation = any modification to tools/system prompt creates completely new cache breakpoint\n\nUse Cases = identical content across requests (same tools, system prompts, message sequences)\n\n\n\nMCP = Model Context Protocol, communication layer providing Claude with context and tools without requiring developers to write tedious code.\n\nMCP Architecture = client-server model where server contains tools, resources, and prompts.\n\nPrimary Problem Solved = shifts burden of defining and running tools from developer's server to MCP server. Instead of authoring tool schemas and functions yourself, MCP server handles this.\n\nMCP Server = interface to outside service (like GitHub) that wraps functionality into pre-built tools. Eliminates need for developers to author/maintain tool implementations.\n\nWho Creates MCP Servers = anyone, but often service providers make official implementations (e.g., AWS releasing their own MCP server).\n\nMCP vs Direct API Calls = MCP saves development time by providing pre-built tool schemas and function implementations rather than requiring custom authoring.\n\nMCP vs Tool Use = complementary concepts, not identical. MCP focuses on who does the work (pre-built vs custom), while both involve tool usage. Common misconception stems from not understanding MCP's delegation aspect.\n\nKey Benefit = reduces developer burden of creating/maintaining integrations for complex services with extensive functionality.\n\n\n\nMCP Client = communication interface between your server and MCP server, provides access to server's tools\n\nTransport agnostic = client/server can communicate via multiple protocols (stdin/stdout, HTTP, WebSockets, etc.)\n\nCommunication method = message exchange following MCP spec\n\nKey message types:\n- list tools request = client asks server for available tools\n- list tools result = server responds with tool list \n- call tool request = client asks server to run specific tool with arguments\n- call tool result = server returns tool execution results\n\nTypical flow:\n1. User queries your server\n2. Server requests tool list from MCP client\n3. MCP client sends list tools request to MCP server\n4. MCP server responds with available tools\n5. Server sends user query + tools to Claude\n6. Claude requests tool execution\n7. Server asks MCP client to run tool\n8. MCP client sends call tool request to MCP server\n9. MCP server executes tool (e.g., GitHub API call)\n10. Results flow back through chain: MCP server → MCP client → your server → Claude → user\n\nMCP client role = intermediary that translates between your server and MCP server, doesn't execute tools directly\n\n\n\nProject Setup = CLI-based chatbot implementation to understand MCP client-server interaction\n\nComponents = MCP client + custom MCP server in single project\nDocuments = fake documents stored in memory only\nServer tools = read document contents, update document contents\n\nImportant note = typically projects implement either client OR server, not both. This project does both for learning purposes.\n\nSetup steps:\n- Download CLI project.zip starter code\n- Extract and open in code editor\n- Check readme.md for setup directions\n- Add API key to .env file\n- Install dependencies (with/without UV)\n- Run project: \"uv run main.py\" or \"python main.py\"\n- Verify chat prompt appears and responds to queries\n\nProject structure = all files in project directory, ready for feature additions\n\n\n\nMCP Server Implementation = Creating server with Python SDK using single line of code (mcp package)\n\nTool Definition Syntax = Use @mcp.tool decorator with name, description, and typed arguments instead of manual JSON schemas\n\nPython MCP SDK Benefits = Auto-generates JSON schemas from decorators and field types, eliminates manual schema writing\n\nExample Tools Created = read_doc_contents (takes doc_id string, returns document content from in-memory docs dictionary) and edit_document (takes doc_id, old_string, new_string for find/replace operations)\n\nTool Structure = Decorator specifies metadata, function implements logic, Field() from pydantic adds argument descriptions\n\nError Handling = Check if doc_id exists in docs dictionary, raise ValueError if not found\n\nDocument Storage = In-memory dictionary with doc IDs as keys, content as values\n\nImplementation Pattern = @mcp.tool decorator → function definition → typed parameters with Field descriptions → validation logic → core functionality\n\n\n\nMCP Inspector = in-browser debugger for testing MCP servers without connecting to applications\n\nAccess: Run \\`mcp dev [server-file.py]\\` in terminal with Python environment activated → generates local server URL → open in browser\n\nKey features:\n- Connect button = starts MCP server\n- Top menu bar = shows resources, prompts, tools sections\n- Tools section = lists available tools from server\n- Right panel = manual tool invocation interface\n\nTesting workflow:\n1. Click Connect to start server\n2. Navigate to Tools → List Tools\n3. Select specific tool to test\n4. Input required parameters in right panel\n5. Click Run Tool to execute and verify output\n\nTool testing example:\n- read_doc_contents tool: input document ID → returns document contents\n- edit_document tool: input doc ID + old string + new string → modifies document\n- Verify edits by re-running read tool\n\nPurpose = live development and debugging of MCP servers during implementation phase. UI may change as tool is in active development but core functionality remains similar.\n\n\n\nMCP Client Implementation:\n\nMCP Client = wrapper class around client session for resource management and cleanup\nClient Session = actual connection to MCP server from Python SDK, requires resource cleanup\nClient Purpose = exposes server functionality to codebase, bridges server tools to application code\n\nKey Functions:\n- list_tools() = await self.session.list_tools(), returns result.tools\n- call_tool() = await self.session.call_tool(tool_name, tool_input), executes specific tool with Claude-provided parameters\n\nImplementation Pattern:\nClient wraps session → manages connection lifecycle → exposes server tools → enables Claude integration\n\nTesting: Direct file execution tests connection and tool listing functionality\n\nUsage Flow: Application calls client.list_tools() → sends to Claude → Claude requests tool execution → client.call_tool() → returns results to Claude\n\nResource Management: Client handles session cleanup via async context managers (connect, cleanup, async enter/exit functions)\n\n\n\nMCP Resources = mechanism for MCP servers to expose data to clients for read operations\n\nResource Types:\n- Direct/Static Resources = fixed URI, always same address (e.g., docs://documents)\n- Templated Resources = parameterized URI with wildcards (e.g., documents/{doc_id})\n\nResource Flow:\n1. Client sends read resource request with URI to MCP server\n2. Server matches URI to defined resource function\n3. Server executes function and returns data via read resource result\n\nImplementation:\n- Use @mcp.resource decorator with URI and MIME type\n- MIME type = hint about data format (application/json, text/plain, etc.)\n- Templated resource parameters become function keyword arguments\n- MCP SDK auto-serializes return values to strings\n\nExample Use Case:\n- Resource 1: Return list of document names for autocomplete\n- Resource 2: Return specific document content by ID\n- Enables @ mention functionality where users reference documents that get auto-inserted into prompts\n\nKey Points:\n- One resource per distinct read operation\n- Resources expose data, don't modify it\n- Client responsible for deserializing returned data\n- Templated resources enable dynamic content selection\n\n\n\nMCP Resource Access Implementation:\n\nResource fetching = MCP client function reads resources from MCP server by URI, parses content based on MIME type, returns data\n\nKey imports = json module, AnyURL from pydantic for type handling\n\nFunction flow = await self.session.read_resource(AnyURL(uri)) → extract first content from results.contents[0] → check MIME type → parse accordingly\n\nContent parsing logic = if resource is TextResourceContents and mime_type == \"application/json\" → return json.loads(resource.text), else return resource.text as plain text\n\nResponse structure = result.contents list containing resource objects with type and mime_type properties\n\nIntegration = read_resource function called by other application components to fetch document contents for prompts\n\nTesting workflow = CLI shows resource list → user selects with arrow keys/space → resource content sent directly to Claude in prompt without requiring tool calls\n\nCore concept = Resources expose server information to clients, enabling direct content access rather than tool-based retrieval\n\n\n\nMCP Prompts = pre-defined, tested prompts exposed by MCP servers for specialized tasks\n\nPurpose = Allow server authors to create high-quality, domain-specific prompts rather than users writing generic prompts manually\n\nImplementation:\n- Use @prompt decorator with name and description\n- Function receives parameters (like document ID)\n- Returns list of messages (user/assistant format)\n- Import: from mcp.server.fastmcp.prompts import BaseMessage\n\nExample structure:\n\\`\\`\\`\n@prompt(name=\"format\", description=\"rewrites document in markdown\")\ndef format_document(doc_id: str) -> list[BaseMessage]:\n return [BaseMessage.user(prompt_text)]\n\\`\\`\\`\n\nKey benefit = Server authors can create specialized, tested prompts for their domain (document management, etc.) that clients can use via slash commands or direct invocation\n\nFlow = Client requests prompt → Server returns message list → Client sends to LLM → LLM executes using available tools\n\nTesting = Use MCP development inspector to test prompts before deployment\n\n\n\n**Prompts in MCP Client Implementation**\n\nClient-side prompt functions:\n- \\`list_prompts()\\` = await self.session.list_prompts(), return result.props\n- \\`get_prompt()\\` = await self.session.get_prompt(prompt_name, arguments), return result.messages\n\n**Prompt workflow:**\n1. Define prompt in MCP server with variables (e.g., document_id)\n2. Client calls get_prompt with prompt name + arguments dictionary\n3. Arguments interpolated into prompt function as keyword arguments\n4. Returns messages fed directly to Claude\n\n**Example usage:**\nFormat command → select document → prompt with document ID passed to Claude → Claude uses tools to fetch document → reformats with requested styling\n\n**Key concept:**\nPrompts = server-defined templates that clients can invoke with runtime arguments, enabling dynamic prompt generation with variable substitution.\n\n\n\nMCP Server Primitives = three core components with distinct control patterns and purposes.\n\nTools = model-controlled actions. Claude decides when to execute based on conversation needs. Purpose: add capabilities to AI model (e.g., JavaScript execution for calculations). Implementation: define tools in MCP server for model consumption.\n\nResources = app-controlled data access. Application code decides when to fetch and use data. Purpose: provide data for UI elements or prompt augmentation (e.g., autocomplete options, document listings, Google Drive integration). Implementation: fetch resources to populate app interfaces.\n\nPrompts = user-controlled workflows. Users trigger through UI buttons, menu options, or slash commands. Purpose: implement predefined workflows and optimized conversation starters. Implementation: create prompt templates for common user actions.\n\nControl Pattern Summary:\n- Tools serve the model\n- Resources serve the app \n- Prompts serve the users\n\nUsage Guidelines: Need AI capabilities → implement tools. Need app data → use resources. Need user workflows → create prompts.\n\n\n\nWorkflows and agents = strategies for handling user tasks that can't be completed by Claude in a single request.\n\nDecision rule: Use workflows when you know exact task steps ahead of time. Use agents when task details are uncertain.\n\nWorkflow = series of calls to Claude for specific problems where all steps are predetermined and plannable.\n\nAgent = letting Claude figure out how to complete tasks using provided tools (like the tools examples in previous course modules).\n\nExample workflow: Image-to-3D model converter\n- Step 1: Claude describes uploaded metal part image in detail\n- Step 2: Claude uses CADQuery Python library to create 3D model from description\n- Step 3: Generate rendering of model as image\n- Step 4: Claude compares rendering to original image\n- Step 5: If inaccurate, return to Step 2 with feedback; if accurate, output step file\n\nThis follows evaluator-optimizer pattern:\n- Producer = creates output (Claude + CADQuery modeling)\n- Evaluator = judges output quality (Claude comparing images)\n- Loop continues until evaluator accepts output\n\nKey point: Workflows are just proven patterns other engineers have used successfully. You still must write the actual implementation code yourself.\n\n\n\nParallelization Workflows = breaking one complex task into multiple parallel subtasks, then aggregating results\n\nCore Pattern:\n- Split complex analysis into specialized parallel requests\n- Each subtask focuses on one specific aspect\n- Aggregator step combines all results into final output\n\nExample Implementation:\n- Original approach: single large prompt asking Claude to analyze image and recommend best material (metal/polymer/ceramic/etc.)\n- Parallelized approach: separate simultaneous requests, each evaluating image suitability for ONE material type\n- Final step: feed all individual analyses back to Claude for final recommendation\n\nKey Benefits:\n1. Focus = each request handles single task vs. juggling multiple considerations\n2. Optimization = can improve/evaluate each specialized prompt independently \n3. Scalability = easy to add new subtasks without affecting existing ones\n\nStructure: Input → Multiple Parallel Subtasks → Aggregator → Final Output\n\nBest for scenarios where complex decision requires evaluating multiple independent criteria or options simultaneously.\n\n\n\nChaining Workflows = breaking large tasks into sequential distinct steps rather than single complex prompts.\n\nKey structure: One main task → Multiple sequential subtasks → Each step feeds into next step.\n\nExample workflow: User topic input → Twitter trending search → Claude selects best topic → Claude researches topic → Claude writes script → AI creates video → Post to social media.\n\nPrimary benefit = allows AI to focus on one task at a time rather than juggling multiple requirements simultaneously.\n\nCritical use case: Large prompts with many constraints where AI consistently violates some requirements despite repeated instructions.\n\nSolution pattern: \n1. Send initial complex prompt with all constraints\n2. Accept imperfect output that violates some constraints \n3. Follow-up prompt asking AI to fix specific violations in previous output\n4. AI focuses solely on correction tasks\n\nWhy this works = AI performs better when addressing focused corrections rather than managing numerous simultaneous constraints in single prompt.\n\nMost useful when = AI consistently ignores certain constraints despite clear instructions in complex prompts.\n\n\n\nRouting Workflows = workflow pattern that categorizes user input to determine appropriate processing pipeline\n\nProcess:\n1. User provides input/topic\n2. Routing step = AI call to categorize input into predefined genres/categories\n3. Based on category, input gets forwarded to specialized processing pipeline\n4. Each pipeline has customized prompts/tools for that category type\n\nExample: Social media video script generation\n- Programming topic → Educational category → Educational script prompt (clear explanations, definitions, examples)\n- Surfing topic → Entertainment category → Entertainment script prompt (trendy language, engaging hooks)\n\nKey components:\n- Predefined categories/genres for classification\n- Category-specific prompts tailored to expected output style\n- Single routing decision determines entire downstream processing\n- Each route can have different workflows/tools specialized for that task type\n\nPurpose = Ensures output matches nature/style appropriate for input type rather than one-size-fits-all approach\n\n\n\nAgents = AI systems that use tools to complete tasks when exact steps are unknown, unlike workflows which need precise predetermined steps.\n\nKey difference: Workflows = known step sequences, Agents = flexible tool combination for unknown step sequences.\n\nAgent advantages: Flexibility to solve wide variety of tasks using same toolset. Claude creates plans dynamically using available tools.\n\nTool abstraction principle: Agents need abstract/general tools rather than hyper-specialized ones. Example: Claude code uses bash, web fetch, file write (abstract) rather than specific refactor or install tools.\n\nTool combination examples: With get_current_datetime, add_duration, set_reminder tools, Claude can handle \"what time is it\" (single tool) or \"remind me gym next Wednesday\" (multiple tools + planning).\n\nDynamic interaction capability: Agents can request additional user information when needed, like asking warranty purchase date to calculate expiration.\n\nBest practice: Provide small set of abstract tools that can be combined creatively rather than many specialized single-purpose tools.\n\nReal example: Social media video agent with bash/FFmpeg, generate_image, text_to_speech, post_media tools enables both simple \"create video\" and complex \"generate sample cover first for approval\" workflows.\n\n\n\nEnvironment Inspection = agents examining their environment state after (or before) taking actions to understand results and progress.\n\nCore concept: Agents need feedback beyond tool return values to understand action outcomes and current state.\n\nComputer use example: Claude takes screenshot after every action (typing, clicking) because it cannot predict how actions change the environment. Button clicks might navigate pages or open menus - screenshot reveals new state.\n\nCode editing example: Before modifying files, agents must read current file contents to understand existing state.\n\nSocial media video agent applications:\n- Use Whisper CPP via bash tool to generate timestamped captions, verify audio placement\n- Use FFmpeg to extract video screenshots at intervals, verify visual output\n- Inspect generated videos to ensure task completion quality\n\nBenefits: Better progress tracking, error handling, unexpected result management through environment state awareness.\n\n\n\nWorkflows = pre-defined series of calls to Claude for tasks with known step sequences. Agents = flexible systems using basic tools that Claude combines creatively for unknown tasks.\n\nKey differences:\n\nTask approach: Workflows divide big tasks into smaller, specific subtasks for focused execution. Agents handle varied challenges through creative tool combination.\n\nAccuracy: Workflows achieve higher accuracy due to focused, specific steps. Agents have lower successful completion rates due to delegated complexity.\n\nTesting: Workflows easier to test/evaluate with known step sequences. Agents harder to test due to unpredictable execution paths.\n\nFlexibility: Workflows require specific inputs, fixed sequences. Agents adapt to varied user queries, can request additional input, flexible UX.\n\nReliability: Workflows more reliable for consistent task completion. Agents more experimental but less dependable.\n\nRecommendation: Prioritize workflows when possible for reliable problem-solving. Use agents only when flexibility truly required. Users want 100% working products over fancy but unreliable agents.\n\n" }; const T1 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382027%2FThumb_v1_L1.1777382027832.png"; const S1 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382028%2Flesson1.1777382028458.png"; const T2 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382028%2FThumb_v1_L2.1777382028804.png"; const S2 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382029%2Flesson2.1777382029433.png"; const T3 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382029%2FThumb_v1_L3.1777382029810.png"; const S3 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382030%2Flesson3.1777382030402.png"; const T4 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382030%2FThumb_v1_L4.1777382030903.png"; const S4 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382031%2Flesson4.1777382031499.png"; const T5 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382031%2FThumb_v1_L5.1777382031855.png"; const S5 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382032%2Flesson5.1777382032774.png"; const T6 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382033%2FThumb_v1_L6.1777382033103.png"; const S6 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382033%2Flesson6.1777382033700.png"; const T7 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382034%2FThumb_v1_L7.1777382034062.png"; const S7 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382034%2Flesson7.1777382034672.png"; const T8 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382035%2FThumb_v1_L8.1777382035188.png"; const S8 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382035%2Flesson8.1777382035808.png"; const T9 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382036%2FThumb_v1_L9.1777382036731.png"; const S9 = "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1777382037%2Flesson9.1777382037298.png"; const shot = (id, url, alt) => ({ id, url, fullSizeUrl: url, alt }); const aiCapabilitiesAndLimitations = { path: "/ai-capabilities-and-limitations", previewId: "103846", usesAlternateLayout: true, title: "AI Capabilities and Limitations", subtitle: "An introductory course about how AI works", overview: { description: "

    Most people's first experience with a generative AI system is a mix of delight and confusion. It produces a polished summary of a dense report in seconds, then confidently invents a citation that doesn't exist. It follows a detailed instruction perfectly, then ignores a simple one in the very next message. Without a mental model of what's happening underneath, these moments feel random — and it's hard to know whether to trust the next output, or how to fix the last one.

    This course gives learners that mental model. It's the companion to AI Fluency: Framework & Foundations: where that course teaches the human competencies (Delegation, Description, Discernment, Diligence), this one teaches the machine properties those competencies are responding to. The two are designed to be taken in either order, and together they form a complete picture of effective human-AI collaboration.

    We organize the course around four properties that shape what an AI system can and can't do for you: Next Token Prediction (where AI answers come from), Knowledge (what the model actually knows, and why it can be confidently wrong), Working Memory (what it's paying attention to right now, and what falls off the edge), and Steerability (how much control your instructions really give you). Each property sits on a spectrum from capability to limitation, and each section pairs a short explanation with a hands-on exercise so you can feel where the edges are rather than just read about them.

    The final section looks at what happens when these properties collide — because in real use, they always do. A long document pushes against working memory while also straying into knowledge the model doesn't have; a vague instruction tests steerability at the same moment next-token prediction is reaching for whatever sounds most plausible. We close with a practical diagnostic: how to look at an unexpected output, recognize which kind of unexpected it is, locate roughly where on the capability-to-limitation continuum your task landed, and respond with a targeted fix instead of a generic retry.

    Recommended prerequisites

    None. This course assumes no technical background and no prior experience with AI tools. If you've already completed AI Fluency: Framework & Foundations, you'll recognize where each property connects to the 4Ds — but it's not required.

    Who this is for

    Anyone who uses, or is about to start using, generative AI in their work or studies and wants to understand why it behaves the way it does. Educators, students, knowledge workers, and team leads will all find the same core model useful, because the properties it describes don't change across use cases.

    ", }, stats: { lectureCount: 13, videoHours: 0.25, quizCount: 1, }, sections: [ { id: "section-1", title: "Getting started", lessonCount: 3, description: "The word 'AI' covers a lot of ground. This section narrows it to the kind of system you'll actually be working with — large language models — and explains how two training stages, pretraining and fine-tuning, turn a raw text predictor into the helpful assistant you interact with. Along the way you'll meet the four-property framework that organizes the rest of the course.", screenshots: [ shot("s1-t1", T1, "Lesson 1 video thumbnail"), shot("s1-l2", S2, "Lesson 2 screenshot"), shot("s1-l3", S3, "Lesson 3 screenshot"), ], }, { id: "section-2", title: "Next Token Prediction", lessonCount: 2, description: "Every answer an AI gives is built one token at a time, by predicting what should come next. This section shows what that means in practice: why the model is excellent at well-worn paths like summarizing or reformatting, why it can produce things that sound true but aren't, and how to recognize when a task is pushing into territory where prediction alone isn't enough.", screenshots: [ shot("s2-t4", T4, "Lesson 4 video thumbnail"), shot("s2-l4", S4, "Lesson 4 screenshot"), ], }, { id: "section-3", title: "Knowledge", lessonCount: 2, description: "A model knows what was in its training data — frequently, recently, and consistently. This section unpacks what that implies: it's strong on mainstream topics and popular languages, weaker on anything rare, recent, niche, or contested. You'll practice judging where a question sits on that spectrum, so you know when to trust the answer and when to bring your own sources.", screenshots: [ shot("s3-t5", T5, "Lesson 5 video thumbnail"), shot("s3-l5", S5, "Lesson 5 screenshot"), ], }, { id: "section-4", title: "Working Memory", lessonCount: 2, description: "The context window is the model's working memory: everything it can pay attention to right now, and nothing else. This section covers what fits, what quietly falls off the edge, why attention isn't uniform across a long document, and why a fresh session doesn't remember the last one. You'll learn to size up a task against the window before you start, instead of discovering the limit mid-conversation.", screenshots: [ shot("s4-t6", T6, "Lesson 6 video thumbnail"), shot("s4-l6", S6, "Lesson 6 screenshot"), ], }, { id: "section-5", title: "Steerability", lessonCount: 2, description: "Your instructions are how you steer — but not all instructions land equally. Short, concrete, verifiable asks ('respond as a table', 'under 100 words') work reliably; long reasoning chains, abstract requests, and demands for native precision are where steering starts to slip. This section helps you tell the difference and rewrite a wobbly instruction into one the model can actually follow.", screenshots: [ shot("s5-t7", T7, "Lesson 7 video thumbnail"), shot("s5-l7", S7, "Lesson 7 screenshot"), ], }, { id: "section-6", title: "Putting it all together and next steps", lessonCount: 2, description: "Real tasks rarely test one property at a time. A long contract review strains working memory while reaching past the model's knowledge; a vague creative brief tests steerability right where next-token prediction wants to fill in something plausible. This section shows you how the four properties collide, and gives you a diagnostic for any unexpected output: name which property is in play, place the task on its spectrum, and apply a targeted fix instead of just trying again.", screenshots: [ shot("s6-t8", T8, "Lesson 8 video thumbnail"), shot("s6-l9", S9, "Lesson 9 screenshot"), ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[aiCapabilitiesAndLimitations["path"]] = aiCapabilitiesAndLimitations; const aiFluencyForEducators = { path: "/ai-fluency-for-educators", previewId: "77953", usesAlternateLayout: true, llmContentKey: "aif4ed", title: "AI Fluency for Educators", subtitle: "This course empowers faculty, instructional designers, and educational leaders to apply AI Fluency into their own teaching practice and institutional strategy.", overview: { description: "

    At Anthropic, we believe that empowering people with AI, and ensuring that AI makes safe contributions to society, requires engaging with a wide range of human perspectives and experiences. Responsible AI development and engagement isn't something any single discipline or viewpoint can fully address. It demands collaborative approaches that span a wide range of technical, creative, business, scientific, and educational domains. That's why we partnered with educators who bring complementary expertise to create this course on AI collaboration for educators.

    This course empowers faculty, instructional designers, and educational leaders to apply the 4D Framework to their own educational practice. Participants will learn to apply the 4D Framework to their own teaching practice, using AI as a thinking partner to enhance course design, create coherent learning materials, and develop authentic assessments while modeling responsible AI collaboration for their students.

    This course is the result of a long partnership between Anthropic and professors Rick Dakan from Ringling College of Art and Design and Joseph Feller from University College Cork. It builds on their experiences in training fellow educators and teaching the AI Fluency Framework to their students, and on feedback and questions that arose from our earlier course: AI Fluency: Framework & Foundations This course answers the question: how can I apply this framework to my personal teaching practice?

    The work was supported in part by the Higher Education Authority (Ireland) through the National Forum for the Enhancement of Teaching and Learning.

    Recommended prerequisites

    This course lightly covers the foundational AI Fluency concepts. However, for deeper understanding, participants should complete AI Fluency: Framework & Foundations before beginning this educator-focused curriculum.

    It is also recommended that learners have active teaching or curriculum development responsibilities as well as access to an AI chat tool for hands-on practice. Examples in this course will use Claude.ai, but any chatbot will work.

    ", }, stats: { lectureCount: 4, videoHours: 0.4, }, sections: [ { id: "section-1", title: "Introduction and AI Fluency Framework", lessonCount: 2, description: "A summary of Delegation, Description, Discernment, and Diligence applied to student contexts", screenshots: [ { id: "s1-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/01-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/01-01.webp", alt: "Section 1 screenshot 1", }, { id: "s1-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/01-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/01-02.webp", alt: "Section 1 screenshot 2", }, { id: "s1-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/01-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/01-03.webp", alt: "Section 1 screenshot 3", }, ], }, { id: "section-2", title: "AI Fluency Framework applications for educators", lessonCount: 2, description: "Applying the 4D framework to course design and learning materials.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/02-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/02-01.webp", alt: "Section 2 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/02-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/02-02.webp", alt: "Section 2 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/02-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-educators/02-03.webp", alt: "Section 2 screenshot 3", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[aiFluencyForEducators["path"]] = aiFluencyForEducators; const aiFluencyForNonprofits = { path: "/ai-fluency-for-nonprofits", previewId: "89476", usesAlternateLayout: true, title: "AI Fluency for nonprofits", subtitle: "This course empowers nonprofit professionals to develop AI fluency in order to increase organizational impact and efficiency while staying true to their mission and values.", overview: { description: `

    At Anthropic, we believe that empowering people with AI, and ensuring that AI makes safe contributions to society, requires engaging with a wide range of human perspectives and experiences. Nonprofit professionals are uniquely positioned to leverage AI for social good—but only if they can approach it intentionally, with resilience and clear purpose.

    This course helps nonprofit staff—whether in fundraising, communications, program delivery, operations, or leadership—build practical AI collaboration skills through the 4D Framework (Delegation, Description, Discernment, and Diligence). In this course, we'll explore how the framework applies to common non-profit tasks, and consider what it means to implement AI across a nonprofit organization.

    This course is the result of a partnership between Anthropic and GivingTuesday, drawing on research with nonprofit professionals about their actual needs, concerns, and aspirations for AI adoption.

    The work builds on our AI Fluency: Framework & Foundations course, adapted specifically for the nonprofit context where limited resources, multiple stakeholder accountabilities, and mission-driven work create unique considerations for AI collaboration.

    Recommended prerequisites

    This course lightly covers the foundational AI Fluency concepts. However, for deeper understanding, participants should complete AI Fluency: Framework & Foundations before beginning this nonprofit-focused curriculum.

    It is also recommended that learners have access to an AI chat tool for hands-on practice. Examples in this course will use Claude.ai, but any chatbot will work.

    `, }, stats: { lectureCount: 9, videoHours: 0.9, quizCount: 1, }, instructors: [ { name: "Kelsey Kramer", avatar: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/kelsey.webp", description: "Kelsey directs partnerships for the GivingTuesday Data Commons, supporting a vibrant network of collaborators that power the Data Commons' mission to utilize data to build a more resilient social sector. She engages data and research partners, movement leaders, and strategic collaborators to build new initiatives, support ongoing research, and connect research to practice—bringing 10 years of experience from nonprofits and technology companies large and small.", }, { name: "Zoe Ludwig", avatar: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/zoe.webp", description: "Zoe Ludwig leads Anthropic's Claude apps education, including AI Fluency work. She has a range of experience in educational roles including classroom instruction, curriculum design, and instructor led training. Prior to Anthropic, she founded and led the customer education team at Notion.", }, ], sections: [ { id: "section-1", title: "Introduction", lessonCount: 2, description: "Define AI Fluency and learn the four interconnected competencies—Delegation, Description, Discernment, and Diligence—that form the foundation of this course.", screenshots: [ { id: "s1-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s1-1-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s1-1.webp", alt: "Section 1 screenshot 1", }, { id: "s1-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s1-2-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s1-2.webp", alt: "Section 1 screenshot 2", }, { id: "s1-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s1-3-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s1-3.webp", alt: "Section 1 screenshot 3", }, ], }, { id: "section-2", title: "Description-Discernment", lessonCount: 2, description: "Practice crafting context-rich prompts and critically evaluating AI outputs through research and writing examples.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s2-1-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s2-1.webp", alt: "Section 2 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s2-2-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s2-2.webp", alt: "Section 2 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s2-3-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s2-3.webp", alt: "Section 2 screenshot 3", }, ], }, { id: "section-3", title: "Delegation-Diligence", lessonCount: 2, description: "Make thoughtful decisions about what tasks to delegate to AI while taking responsibility for high-stakes considerations like data privacy and analytical accuracy.", screenshots: [ { id: "s3-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s3-1-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s3-1.webp", alt: "Section 3 screenshot 1", }, { id: "s3-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s3-2-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s3-2.webp", alt: "Section 3 screenshot 2", }, { id: "s3-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s3-3-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s3-3.webp", alt: "Section 3 screenshot 3", }, ], }, { id: "section-4", title: "Putting it all together", lessonCount: 3, description: "Apply all four dimensions of the 4D Framework to automate workflows and integrate AI thoughtfully into your organization.", screenshots: [ { id: "s4-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s4-1-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s4-1.webp", alt: "Section 4 screenshot 1", }, { id: "s4-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s4-2-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s4-2.webp", alt: "Section 4 screenshot 2", }, { id: "s4-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s4-3-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-nonprofits/s4-3.webp", alt: "Section 4 screenshot 3", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[aiFluencyForNonprofits["path"]] = aiFluencyForNonprofits; const aiFluencyForSmallBusinesses = { path: "/ai-fluency-for-small-businesses", previewId: "109367", usesAlternateLayout: true, title: "AI Fluency for Small Businesses", subtitle: "This course empowers small businesses to develop AI fluency in order to increase organizational impact and efficiency while staying true to their mission and values.", overview: { description: `

    At Anthropic, we believe that empowering people with AI, and ensuring that AI makes safe contributions to society, requires engaging with a wide range of human perspectives and experiences. Small businesses are uniquely positioned to leverage AI to advance their mission—but only if they can approach it intentionally, with resilience and clear purpose.

    This course helps small business staff—whether in customer interactions, back-office management, supply chain operations, or leadership—build practical AI collaboration skills through the 4D Framework (Delegation, Description, Discernment, and Diligence). In this course, we'll explore how the framework applies to common small business tasks, and consider what it means to implement AI across a small business.

    This course is the result of a partnership between Anthropic, PayPal, Prospect Butcher, and MAKS Enterprises TIPM Rebuilders, drawing on research with small business professionals about their actual needs, concerns, and aspirations for AI adoption.

    The work builds on our AI Fluency: Framework & Foundations course, adapted specifically for the small business context where limited resources, business accountabilities, and customer experience create unique considerations for AI collaboration.

    Recommended prerequisites

    This course lightly covers the foundational AI Fluency concepts. However, for deeper understanding, participants should complete AI Fluency: Framework & Foundations before beginning this small business-focused curriculum.

    It is also recommended that learners have access to an AI chat tool for hands-on practice. Examples in this course will use Claude.ai, but any chatbot will work.

    `, }, stats: { lectureCount: 9, videoHours: 0.9, quizCount: 1, }, coreLearningAreas: [], extra: [ { title: "About the partners", content: '

    This course was created in partnership between Anthropic, PayPal, Prospect Butcher Company, and MAKS TIPM Rebuilders. Anthropic is a frontier AI safety company and the maker of Claude. PayPal is a platform that helps businesses of all sizes make selling and shopping simple and secure. Prospect Butcher Company and MAKS TIPM Rebuilders are the two small businesses featured throughout the course — a Brooklyn butcher shop and an automotive power-module rebuilder, each using AI to grow.

    PayPalProspect Butcher CompanyMAKS TIPM Rebuilders
    ', }, { title: "AI diligence statement", content: "

    In the development of the AI Fluency: Framework and Foundations course, we engaged in extensive collaboration with Claude from Anthropic.

    The base content for this course came from:

    Throughout this process, Claude assisted one or more of the human authors with structural development, resource and exercise design, and content drafting, critiquing, editing and rewriting. The human authors wrote, designed, edited and provided continual vision, expertise, critical judgment, and domain knowledge and made all final decisions about both content and approach.

    All AI-generated and co-created content underwent thorough validation, editing, and curation by the human authors. The final materials accurately reflect the human authors' understanding, expertise, and intended pedagogical approach. While AI assistance was instrumental in producing these materials, the human authors maintain responsibility for the content.

    This disclosure is made in the spirit of transparency advocated by the AI Fluency Framework and to acknowledge the evolving role of AI in educational content development and other creative and intellectual work.

    ", }, ], sections: [ { id: "section-1", title: "Introduction and the AI Fluency framework", lessonCount: 2, description: "Define AI Fluency and learn the four interconnected competencies—Delegation, Description, Discernment, and Diligence—that ground every productive AI collaboration in your business. You'll articulate your values, goals, and constraints so every future AI interaction starts from the right context.", screenshots: [ { id: "s1-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646111%2F01-01-medium.1778646111548.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646112%2F01-01.1778646112026.webp", alt: "A course for small business owners — built with the business community and Anthropic's research team", }, { id: "s1-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646112%2F01-02-medium.1778646112785.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646113%2F01-02.1778646113139.webp", alt: "The 4D Framework — Delegation, Description, Discernment, Diligence", }, ], }, { id: "section-2", title: "How AI works", lessonCount: 2, description: "Build a working mental model of what today's AI can and can't do reliably, and explore hands-on with an interactive next-token simulator so you understand why those limits matter for how you put it to work in your business.", screenshots: [ { id: "s2-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646114%2F02-01-medium.1778646113970.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646114%2F02-01.1778646114477.webp", alt: "The AI context window — your prompts, AI responses, and any other info you've shared", }, { id: "s2-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646115%2F02-02-medium.1778646115026.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646115%2F02-02.1778646115552.webp", alt: "Build confidence in AI capabilities by starting small, comparing, iterating, and refining", }, ], }, { id: "section-3", title: "Using AI in practice", lessonCount: 2, description: "Apply the Description-Discernment loop to real research and the Delegation-Diligence loop to working with customer data—practicing context-rich prompting, critical evaluation, and responsible data handling on the kinds of tasks you face every day.", screenshots: [ { id: "s3-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646116%2F03-01-medium.1778646115949.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646116%2F03-01.1778646116574.webp", alt: "Essential lessons of the Description-Discernment loop", }, { id: "s3-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778681899%2F03-02-medium.1778681899403.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778681900%2F03-02.1778681900029.webp", alt: "The Delegation-Diligence loop — instructors from MAKS Enterprises and Anthropic", }, ], }, { id: "section-4", title: "Putting it all together", lessonCount: 3, description: "Bring all four dimensions of the 4D Framework together to build a repeatable AI-augmented workflow and a short, honest AI use policy that fits your business and your team—then plan your next steps and earn your certificate of completion.", screenshots: [ { id: "s4-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646118%2F04-01-medium.1778646118478.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646119%2F04-01.1778646119188.webp", alt: "Real small business example — Prospect Butcher Co.'s vendor and billing workflow", }, { id: "s4-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646119%2F04-02-medium.1778646119600.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778646120%2F04-02.1778646119980.webp", alt: "What the human in the loop does — decide, evaluate, and maintain expertise", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[aiFluencyForSmallBusinesses["path"]] = aiFluencyForSmallBusinesses; const aiFluencyForStudents = { path: "/ai-fluency-for-students", previewId: "77955", usesAlternateLayout: true, llmContentKey: "aif4students", title: "AI Fluency for Students", subtitle: "This course empowers students to develop AI Fluency skills that enhance learning, career planning, and academic success through responsible AI collaboration.", overview: { description: "

    You've probably tried AI—maybe to help with an essay, solve a problem, or just explore what it can do. But there's a difference between using AI and being fluent with it. This course teaches students how to collaborate with AI effectively, efficiently, ethically, and safely across learning and career contexts.

    Rather than focusing on shortcuts or prompt tricks, this course develops lasting skills through the 4D Framework (Delegation, Description, Discernment, and Diligence). Students learn to use AI as a thinking partner that enhances their learning and career development rather than replacing their own critical thinking and creativity.

    Through practical applications in academic work and career planning, students discover how to leverage AI to understand concepts more deeply, develop professional skills, and prepare for a future where AI Fluency is essential. The course emphasizes being 'the human in the loop'— maintaining agency, judgment, and responsibility while working thoughtfully with AI systems.

    This course is the result of a long partnership between Anthropic and professors Rick Dakan from Ringling College of Art and Design and Joseph Feller from University College Cork. It addresses the fundamental question students face: how can I use AI to genuinely enhance my learning and career success without compromising my own growth and integrity?

    The work was supported in part by the Higher Education Authority (Ireland) through the National Forum for the Enhancement of Teaching and Learning.

    Recommended prerequisites

    This course lightly covers the foundational AI Fluency concepts. However, for deeper understanding, participants should complete AI Fluency: Framework & Foundations before beginning this student-focused curriculum.

    It is also recommended that learners have access to an AI chat tool for hands-on practice. Examples in this course will use Claude.ai, but any chatbot will work.

    ", }, stats: { lectureCount: 5, videoHours: 0.5, }, sections: [ { id: "section-1", title: "Introduction and AI Fluency Framework", lessonCount: 2, description: "A summary of Delegation, Description, Discernment, and Diligence applied to student contexts", screenshots: [ { id: "s1-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/01-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/01-01.webp", alt: "Section 1 screenshot 1", }, { id: "s1-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/01-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/01-02.webp", alt: "Section 1 screenshot 2", }, { id: "s1-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/01-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/01-03.webp", alt: "Section 1 screenshot 3", }, ], }, { id: "section-2", title: "AI Fluency Framework applications for students", lessonCount: 2, description: "Applying the 4D framework to learning and career planning.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/02-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/02-01.webp", alt: "Section 2 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/02-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/02-02.webp", alt: "Section 2 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/02-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/02-03.webp", alt: "Section 2 screenshot 3", }, ], }, { id: "section-3", title: "Conclusion", lessonCount: 1, description: "Developing personal commitments for responsible AI collaboration and maintaining agency.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/03-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/03-01.webp", alt: "Section 3 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/03-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/03-02.webp", alt: "Section 3 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/03-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-for-students/03-03.webp", alt: "Section 3 screenshot 3", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[aiFluencyForStudents["path"]] = aiFluencyForStudents; const aiFluencyFrameworkFoundationsData = { path: "/ai-fluency-framework-foundations", previewId: "68809", usesAlternateLayout: true, title: "AI Fluency: Framework & Foundations", subtitle: "Learn to collaborate with AI systems effectively, efficiently, ethically, and safely", overview: { description: "

    At Anthropic, we believe that empowering people with AI, and ensuring that AI makes safe contributions to society, requires engaging with a wide range of human perspectives and experiences. Responsible AI development and engagement isn't something any single discipline or viewpoint can fully address. It demands collaborative approaches that span a wide range of technical, creative, business, scientific, and educational domains. That's why we partnered with educators who bring complementary expertise to create this foundational course on AI collaboration.

    This course is the result of a long partnership between Anthropic and professors Rick Dakan from Ringling College of Art and Design and Joseph Feller from University College Cork. Rick and Joe developed the AI Fluency Framework in 2023-2024, based on their research exploring how AI tools like Claude were transforming creative and business processes. When we saw the framework, we immediately recognized a shared vision: helping people interact with AI effectively and responsibly, beyond just “cool prompts.” Their framework offered exactly the kind of multidisciplinary perspective we believe is essential for navigating AI’s impact on society.

    The AI Fluency Framework they created — four interconnected competencies (Delegation, Description, Discernment, and Diligence) — enables more effective, efficient, ethical, and safe human-AI collaboration, regardless of which new AI models or tools emerge. We collaborated to develop this course based on their framework, bringing together our collective expertise in AI systems, education, creativity, and business innovation. The work was supported in part by the Higher Education Authority (Ireland) through the National Forum for the Enhancement of Teaching and Learning.

    This framework has already informed undergraduate and postgraduate courses at both Ringling College and University College Cork, as well as staff training initiatives and community outreach events. Now, we’re excited to share these insights more broadly through this open online course.

    Our goal is to make AI Fluency accessible and useful to everyone, no matter what stage of AI expertise you find yourself at. We hope you find it valuable in navigating the evolving landscape of AI collaboration.

    ", }, stats: { lectureCount: 14, videoHours: 1.1, quizCount: 1, }, instructors: [ { name: "Drew Bent", description: "Drew leads education research at Anthropic. He previously co-founded the tutoring non-profit Schoolhouse.world with Sal Khan, which he ran from 2020-24 and now sits on the board. Prior to that, he wrote code at Khan Academy, taught high school math, and has been tutoring students for over a decade. Drew has degrees in physics & CS from MIT, and an education master's from Stanford.", avatar: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/drew_bent_o-medium.webp", }, { name: "Rick Dakan", description: "Rick is the AI Coordinator and a professor at Ringling College of Art and Design in Sarasota, Florida where he teaches creative writing, interactive experience design, and AI courses. He also oversees the college's Undergraduate Certificate in Artificial Intelligence and the Professional Certificate in Fundamentals of AI for Creatives. He is a game designer and author of more than thirty games and books from video games and tabletop games to novels, nonfiction, and comics.", avatar: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/rick_dakan_o-medium.webp", }, { name: "Joseph Feller", description: "Joseph is Professor of Information Systems and Digital Transformation at the Cork University Business School, University College Cork, Ireland. His current work focuses on AI-human hybrid creativity, innovation, and learning. His research has been published in Information Systems Research, Journal of MIS, Journal of the AIS, Journal of Information Technology, Information Systems Journal, European Journal of Information Systems, and Journal of Strategic Information Systems, and has been funded by the European Commission, Irish Research Council, Irish HEA, and other funding bodies.", avatar: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/joseph_feller_o-medium.webp", }, { name: "Maggie Vo", description: "Maggie founded and leads Anthropic's education team. She has a varied applied research background from Harvard University, with a career and education that spans fields such as game design, organizational behavior, tech and consumer goods, and human behavioral psychology. Maggie has held previous roles at top consulting firms and innovative startups alike. Prior to Anthropic, she worked in AI strategy consulting.", avatar: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/maggie_vo_o-medium.webp", }, ], extra: { title: "AI diligence statement", content: "

    In the development of the AI Fluency: Framework and Foundations course, we engaged in extensive collaboration with Claude 3.7 from Anthropic.

    The base content for this course came from:

    Throughout this process, Claude assisted one or more of the human authors with structural development, resource and exercise design, and content drafting, critiquing, editing and rewriting. The human authors wrote, designed, edited and provided continual vision, expertise, critical judgment, and domain knowledge and made all final decisions about both content and approach.

    All AI-generated and co-created content underwent thorough validation, editing, and curation by the human authors. The final materials accurately reflect the human authors' understanding, expertise, and intended pedagogical approach. While AI assistance was instrumental in producing these materials, the human authors maintain responsibility for the content.

    This disclosure is made in the spirit of transparency advocated by the AI Fluency Framework and to acknowledge the evolving role of AI in educational content development and other creative and intellectual work.

    ", }, sections: [ { id: "section-1", title: "AI Fundamentals & Framework", lessonCount: 10, description: "Establish foundational understanding of generative AI systems and why developing AI fluency matters for effective collaboration. Introduces the 4D Framework as a structured approach to human-AI interaction, covering core capabilities and limitations of current AI technologies. Provides the conceptual grounding needed to approach AI tools strategically rather than reactively.", screenshots: [ { id: "s1-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/01-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/01-01.webp", alt: "Three ways to interact with ai", }, { id: "s1-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/01-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/01-02.webp", alt: "key takeaways", }, { id: "s1-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/01-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/01-03.webp", alt: "three pillars that make ai possible", }, ], }, { id: "section-2", title: "Practical AI Skills", lessonCount: 10, description: "Develop hands-on competencies for effective AI collaboration through the four core areas of the framework: delegation, description, discernment, and diligence. Learn systematic approaches to project planning with AI, crafting effective prompts, evaluating outputs critically, and iterating through the description-discernment loop. Emphasizes practical application across creative, business, and educational contexts.", screenshots: [ { id: "s1-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/02-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/02-01.webp", alt: "product descriptions", }, { id: "s1-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/02-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/02-02.webp", alt: "foundational prompting tips", }, { id: "s1-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/02-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/ai-fluency-framework-foundations/02-03.webp", alt: "creation diligence", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[aiFluencyFrameworkFoundationsData["path"]] = aiFluencyFrameworkFoundationsData; const claudeCode101 = { path: "/claude-code-101", previewId: "106034", usesAlternateLayout: true, title: "Claude Code 101", subtitle: "Learn how to use Claude Code effectively in your daily development workflow.", overview: { description: "

    AI coding agents are changing what it means to write software. Tasks that used to take an afternoon — tracing a bug across a large codebase, scaffolding a new service, reviewing a stack of pull requests — can now happen in a single focused session, with an agent that reads your code, runs your commands, and edits files alongside you. But getting real value from an agent requires more than installing it and typing a request. It requires understanding how the agent thinks, what context it has access to, and how to steer it when it heads in the wrong direction.

    This course teaches developers how to use Claude Code effectively, whether you're new to software engineering or an experienced engineer who hasn't yet worked with AI coding agents. We start from first principles — what an agentic loop actually is, how the context window shapes what Claude can see, how tools and permissions determine what it can do — so that the techniques later in the course make sense rather than feeling like a list of tricks to memorize.

    You'll learn how to install Claude Code across multiple environments (terminal, VS Code, JetBrains, Claude Desktop, and the web), and how to write prompts that get good results on the first try using approval mode, auto-accept, and Plan Mode. The core of the course is the Explore → Plan → Code → Commit workflow: a repeatable rhythm for breaking down a task, letting Claude propose an approach, reviewing the work as it happens, and landing it cleanly. We also cover code review with Claude Code and the context-management commands (/compact, /clear, /context) that keep long sessions productive.

    The final section is about making Claude Code your own. You'll write a CLAUDE.md file so Claude remembers your project's conventions across sessions, build custom subagents and skills for tasks you repeat often, connect external systems through MCP servers, and write hooks that add deterministic guardrails around what Claude is allowed to do. By the end, you'll have a setup tailored to how you actually work — not a generic install.

    Recommended prerequisites

    Basic familiarity with a code editor and the command line. You'll also need a Claude account (Pro, Max, or Enterprise) or an API key. No prior experience with AI tools is assumed.

    Who this is for

    New developers entering software engineering who want AI-assisted workflows from the start, and experienced engineers curious about coding agents but who haven't taken the plunge yet. If you've tried a coding assistant before and found the results underwhelming, this course is designed to show you what changes when you work with an agent rather than against it.

    ", }, stats: { lectureCount: 12, videoHours: 1.5, quizCount: 1, }, sections: [ { id: "section-1", title: "What is Claude Code?", lessonCount: 2, description: "Before you write your first prompt, it helps to know what's actually happening when Claude Code runs. This section explains what separates an AI coding agent from a chat-based assistant, then walks through the agentic loop — gather context, take action, verify results — and the tools and permissions that govern each step. You'll come away with a mental model that makes everything in the rest of the course click.", screenshots: [ { id: "s1-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748058%2F01-01-medium.1775748058806.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748059%2F01-01.1775748059030.webp", alt: "What is Claude Code? introduction video", }, { id: "s1-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748059%2F01-02-medium.1775748059276.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748059%2F01-02.1775748059497.webp", alt: "Agentic loop diagram: gather context, take action, verify results", }, ], }, { id: "section-2", title: "Your first prompt", lessonCount: 2, description: "Get Claude Code running wherever you already work — in the terminal, inside VS Code or JetBrains, in Claude Desktop, or on the web. Then write your first prompt and see how approval mode, auto-accept, and Plan Mode change the way Claude responds, so you can pick the right level of oversight for the task in front of you.", screenshots: [ { id: "s2-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748060%2F02-01-medium.1775748060012.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748060%2F02-01.1775748060215.webp", alt: "Installing Claude Code from the terminal", }, { id: "s2-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748060%2F02-02-medium.1775748060468.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748060%2F02-02.1775748060698.webp", alt: "Claude in Chrome browser extension", }, ], }, { id: "section-3", title: "Daily workflows", lessonCount: 3, description: "This is where Claude Code becomes part of how you ship. Learn the Explore → Plan → Code → Commit rhythm for tackling real tasks, use the context-management commands to keep long sessions fast and focused, and put Claude to work reviewing code — your own and your teammates' — before it lands.", screenshots: [ { id: "s3-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748061%2F03-01-medium.1775748060923.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748061%2F03-01.1775748061158.webp", alt: "Spawning a code-reviewer subagent in Claude Code", }, ], }, { id: "section-4", title: "Customizing Claude Code", lessonCount: 5, description: "Out of the box, Claude Code is general-purpose. This section shows you how to make it yours: write a CLAUDE.md file so it remembers your project's conventions, build subagents and skills for the workflows you repeat, wire in external systems through MCP servers, and add hooks for deterministic guardrails. By the end you'll have a setup tuned to the way your team actually works.", screenshots: [ { id: "s4-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748061%2F04-01-medium.1775748061356.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748061%2F04-01.1775748061603.webp", alt: "Editing a CLAUDE.md project memory file in VS Code", }, { id: "s4-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748061%2F04-02-medium.1775748061832.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748062%2F04-02.1775748062142.webp", alt: "Connecting Claude Code to a Linear MCP server", }, { id: "s4-3", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748062%2F04-03-medium.1775748062359.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1775748063%2F04-03.1775748062927.webp", alt: "Configuring hooks in .claude/settings.json", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[claudeCode101["path"]] = claudeCode101; const claudeCodeInActionData = { path: "/claude-code-in-action", llmContentKey: "claudecode", title: "Claude Code in Action", subtitle: "Practical walkthrough of using Claude Code to accelerate your development workflow", overview: { description: "This course covers Claude Code, a command-line AI assistant that uses language models to perform development tasks. You'll learn how Claude Code reads files, executes commands, and modifies code through its tool system, along with techniques for managing context, creating custom workflows, extending Claude Code with hooks, and integrating with external services.", learningObjectives: [ "Use Claude Code's core tools for file manipulation, command execution, and code analysis", "Manage context effectively using /init, Claude.md files, and @ mentions", "Control conversation flow with a variety of hotkeys and commands", "Enable Plan Mode and Thinking Mode for complex tasks requiring deeper analysis", "Create custom commands for automating repetitive development workflows", "Extend Claude Code with MCP servers to add browser automation and other capabilities", "Set up GitHub integration for automated PR reviews and issue handling", "Write hooks to add additional behavior into Claude Code", ], prerequisites: [ "Basic familiarity with command line interfaces", "Access to Claude Code and an API key", ], targetAudience: "Engineers who want to speed up their development workflow with AI assistance", }, stats: { lectureCount: 15, videoHours: 1.0, quizCount: 1, }, sections: [ { id: "section-1", title: "Claude Code in action", lessonCount: 10, description: "Complete guide to using Claude Code effectively. Starts with understanding how coding assistants work, then moves through setup, context management, making changes, and advanced features like MCP servers, GitHub integration, and hook implementations.", screenshots: [ { id: "s1-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-code-in-action/01-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-code-in-action/01-01.webp", alt: "Claude Code setup and initialization", }, { id: "s1-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-code-in-action/01-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-code-in-action/01-02.webp", alt: "Working with context and file mentions", }, { id: "s1-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-code-in-action/01-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-code-in-action/01-03.webp", alt: "MCP servers and GitHub integration", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[claudeCodeInActionData["path"]] = claudeCodeInActionData; const claudePlatform101 = { path: "/claude-platform-101", previewId: "109831", usesAlternateLayout: true, title: "Claude Platform 101", subtitle: "Build on the Claude Developer Platform from the ground up — from your first API call to tool-using agents, Skills, MCP, context management, and managed agents that Anthropic runs for you.", overview: { description: "

    There's a wide gap between chatting with Claude in a browser tab and building Claude into something you ship. A chat answers a question and the thread ends there. An application sends Claude structured requests, hands it tools, lets it act on real systems, and runs that loop for one user or a million. The Claude Developer Platform exists to close that gap, and it's a different skill from prompting. Getting value out of it means understanding what's in a request, how an agent decides what to do, and where the costs and limits live.

    This course teaches developers to build on the Claude Developer Platform from the ground up, whether you've made a few API calls or have only used Claude through a chat window. We start from first principles: what an API request contains, what an agent loop is, how the context window bounds what Claude can see, and how tools and permissions decide what it can do. The techniques later in the course then land as understanding instead of a list of calls to copy.

    You'll send your first request and read the response, then choose the right model for a job (Opus, Sonnet, or Haiku) and weigh the cost-and-latency trade-off on your own examples instead of guessing. From there you'll build the agent loop by hand to see how Claude acts, observes, and decides, then collapse that hand-written loop with the SDK's Tool Runner once you understand what it does for you. You'll give Claude reach through tool use, let it reason through hard problems with extended thinking, and keep spend predictable with workspaces, limits, and the Console Workbench.

    The middle of the course extends an agent beyond your own code: Anthropic's built-in tools (web search, code execution, web fetch) that run on Anthropic's infrastructure, Skills that package a procedure once and reuse it across calls, MCP servers that connect Claude to third-party tools without writing a schema, and the context-management patterns that keep a long-running agent inside the window and affordable past turn ten.

    The final section hands work off. You'll learn when to run your own loop and when to let Anthropic run a sandboxed, managed agent for you, then build one end to end, consuming the event stream as Anthropic runs the loop and reports back. A standalone lesson shows you how to build with the API using Claude Code itself, which is also why the rest of the course matters: you need to know what good code looks like to review what an agent writes for you. Every lesson ends with a runnable demo, so you finish each one with working code.

    Recommended prerequisites

    Comfort reading and writing code in at least one language, plus basic command-line familiarity. The demos use the TypeScript SDK (@anthropic-ai/sdk) with Node and npm. You don't need to be a TypeScript expert, but you should be able to follow along and run a script. (The platform also offers a Python SDK; the course examples are in TypeScript.) You'll need an Anthropic Console account and an API key from platform.claude.com, plus a small amount of prepaid credit to run the examples. You don't need prior experience building with LLMs.

    Who this is for

    Developers who've used Claude in a chat window and want to build it into their own applications, whether you're adding AI features to an existing product or prototyping an agent from scratch. If you've sent a handful of API calls but stalled at \"how do I make this act on its own\" or \"how do I connect it to my real systems,\" this course is the bridge from a single request to a production agent. You don't need prior agent experience; each lesson builds on the one before it.

    ", }, stats: { lectureCount: 12, videoHours: 0.6, quizCount: 1, }, coreLearningAreas: [], sections: [ { id: "section-1", title: "What is the Claude Developer Platform?", lessonCount: 3, description: "Get clear on what the platform is and how it differs from the chat app you've already used. Send your first messages.create call, then pick the right model — Opus, Sonnet, or Haiku — by running a quick eval instead of guessing.", screenshots: [ { id: "s1-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977598%2F01-01-medium.1780977596628.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977599%2F01-01.1780977596979.webp", alt: "Navigating the Claude Console", }, { id: "s1-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977599%2F01-02-medium.1780977597280.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977599%2F01-02.1780977597555.webp", alt: "Your first messages.create API call", }, { id: "s1-3", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977600%2F01-03-medium.1780977598182.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977600%2F01-03.1780977598773.webp", alt: "Choosing between Haiku, Sonnet, and Opus", }, ], }, { id: "section-2", title: "Teaching your Agent", lessonCount: 3, description: "This is where a single request becomes an agent. Build the agent loop by hand, define your own tools, collapse the scaffolding with the SDK's Tool Runner, and turn on extended thinking for the problems that need it.", screenshots: [ { id: "s2-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977601%2F02-01-medium.1780977599447.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977601%2F02-01.1780977599723.webp", alt: "The agent loop: user, agent, and tools in conversation", }, { id: "s2-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977602%2F02-02-medium.1780977600314.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977602%2F02-02.1780977600552.webp", alt: "Declaring tools in the request body", }, { id: "s2-3", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977602%2F02-03-medium.1780977600830.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977603%2F02-03.1780977601085.webp", alt: "An extended thinking block in the response", }, ], }, { id: "section-3", title: "Extending your Agent", lessonCount: 4, description: "Reach past your own code with Anthropic's built-in tools, Skills that package a procedure once, and MCP servers that connect Claude to third-party services. Finish with the context-management patterns that keep a long-running agent inside the window and affordable.", screenshots: [ { id: "s3-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977603%2F03-01-medium.1780977601370.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977603%2F03-01.1780977601669.webp", alt: "Anthropic's built-in tools", }, { id: "s3-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977604%2F03-02-medium.1780977601971.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977604%2F03-02.1780977602196.webp", alt: "Connecting Slack, Asana, and Google Calendar via MCP", }, { id: "s3-3", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977604%2F03-03-medium.1780977602430.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977604%2F03-03.1780977602660.webp", alt: "The four context-management patterns", }, ], }, { id: "section-4", title: "Managed Agents", lessonCount: 2, description: "Up to now you've run the loop yourself — managed agents hand it to Anthropic. Learn when that trade is worth it, then build one end to end and consume the event stream as it runs in a sandbox.", screenshots: [ { id: "s4-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977605%2F04-01-medium.1780977603498.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977606%2F04-01.1780977604049.webp", alt: "Managed Agents in the Claude Console", }, { id: "s4-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977606%2F04-02-medium.1780977604375.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977606%2F04-02.1780977604644.webp", alt: "Two managed agent sessions running in parallel on a Kanban demo", }, { id: "s4-3", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977607%2F04-03-medium.1780977605388.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977607%2F04-03.1780977605635.webp", alt: "Managed agent architecture: session, environment, and event stream", }, ], }, { id: "section-5", title: "Building with Claude Code", lessonCount: 1, description: "A short capstone that ties the course together: stub a file, hand it to Claude Code with one well-formed prompt, and review the diff. It calls the same primitives you built by hand — Claude Code skips the keystrokes, not the understanding.", screenshots: [ { id: "s5-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977607%2F05-01-medium.1780977605871.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977608%2F05-01.1780977606118.webp", alt: "The Claude Code welcome screen", }, { id: "s5-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977608%2F05-02-medium.1780977606358.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977608%2F05-02.1780977606595.webp", alt: "Claude Code reading the stubbed files mid-run", }, { id: "s5-3", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977608%2F05-03-medium.1780977606873.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1780977609%2F05-03.1780977607474.webp", alt: "The generated Zod weather tool", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[claudePlatform101["path"]] = claudePlatform101; const claudeWithAmazonBedrock = { path: "/claude-in-amazon-bedrock", llmContentKey: "bedrock", title: "Claude with Amazon Bedrock", subtitle: "This comprehensive course covers the full spectrum of working with Anthropic models using Amazon Bedrock", overview: { description: "This course covers using Claude models through AWS Bedrock API, from basic requests through advanced agent implementations. You'll learn to make API calls, implement tool use, build RAG pipelines, work with MCP servers, and leverage features like Claude Code and computer use for automation.", learningObjectives: [ "Make requests to Claude models via AWS Bedrock using boto3", "Implement multi-turn conversations, streaming responses, and structured data extraction", "Build and evaluate prompts using automated testing pipelines with objective scoring", "Create custom tools and handle multi-step tool execution workflows", "Design RAG systems with text chunking, embeddings, and hybrid search (semantic + BM25)", "Connect Claude to external services using MCP (Model Context Protocol) servers", "Use Claude Code for automated development workflows and parallelized task execution", "Configure and optimize features like prompt caching, extended thinking, and image processing", "Implement computer use for automated testing and UI interaction", ], prerequisites: [ "Proficiency in Python programming", "Basic knowledge of handling JSON data", "AWS account with Bedrock access", ], targetAudience: "Devs who want to add AI features to their apps", }, stats: { lectureCount: 85, videoHours: 8.0, quizCount: 10, }, sections: [ { id: "section-2", title: "Getting started with Amazon Bedrock", lessonCount: 16, description: "Start here for the fundamentals. Covers API authentication, basic requests, conversation management, system prompts, and structured output generation.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/02-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/02-01.webp", alt: "Section 2 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/02-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/02-02.webp", alt: "Section 2 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/02-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/02-03.webp", alt: "Section 2 screenshot 3", }, ], }, { id: "section-3", title: "Prompt engineering & evaluation", lessonCount: 16, description: "Learn to write prompts that actually work. Focuses on prompting strategies, evaluation frameworks, and systematic testing approaches.", screenshots: [ { id: "s3-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/03-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/03-01.webp", alt: "Section 3 screenshot 1", }, { id: "s3-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/03-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/03-02.webp", alt: "Section 3 screenshot 2", }, { id: "s3-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/03-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/03-03.webp", alt: "Section 3 screenshot 3", }, ], }, { id: "section-4", title: "Tool use with Claude", lessonCount: 14, description: "Extend Claude with custom tools and functions. Build apps with function calling, multi-turn tool interactions, batch tool calling, and leverage built-in utilities.", screenshots: [ { id: "s4-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/04-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/04-01.webp", alt: "Section 4 screenshot 1", }, { id: "s4-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/04-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/04-02.webp", alt: "Section 4 screenshot 2", }, { id: "s4-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/04-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/04-03.webp", alt: "Section 4 screenshot 3", }, ], }, { id: "section-5", title: "Retrieval augmented generation", lessonCount: 10, description: "Implementation guide for production RAG systems. Covers text chunking, embeddings, hybrid search with BM25, multi-index architectures, reranking, and contextual retrieval.", screenshots: [ { id: "s5-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/05-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/05-01.webp", alt: "Section 5 screenshot 1", }, { id: "s5-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/05-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/05-02.webp", alt: "Section 5 screenshot 2", }, { id: "s5-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/05-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/05-03.webp", alt: "Section 5 screenshot 3", }, ], }, { id: "section-6", title: "Model Context Protocol (MCP)", lessonCount: 12, description: "The protocol for building modular AI applications. Define custom tools and resources, implement MCP servers and clients, handle the full integration lifecycle.", screenshots: [ { id: "s6-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/06-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/06-01.webp", alt: "Section 6 screenshot 1", }, { id: "s6-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/06-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/06-02.webp", alt: "Section 6 screenshot 2", }, { id: "s6-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/06-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/06-03.webp", alt: "Section 6 screenshot 3", }, ], }, { id: "section-7", title: "Claude Code & Computer Use", lessonCount: 8, description: "Two powerful Anthropic tools in action. Claude Code accelerates development workflows, Computer Use automates UI interactions. Includes MCP integration patterns.", screenshots: [ { id: "s7-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/07-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/07-01.webp", alt: "Section 7 screenshot 1", }, { id: "s7-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/07-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/07-02.webp", alt: "Section 7 screenshot 2", }, { id: "s7-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/07-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-in-amazon-bedrock/07-03.webp", alt: "Section 7 screenshot 3", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[claudeWithAmazonBedrock["path"]] = claudeWithAmazonBedrock; const claudeWithGoogleCloudsVertexAi = { path: "/claude-with-google-vertex", llmContentKey: "vertex", title: "Claude with Google Cloud's Vertex AI", subtitle: "This comprehensive course covers the full spectrum of working with Anthropic models using Google Cloud's Vertex AI", overview: { description: "This course covers using Claude models through Google Cloud's Vertex AI platform. You'll implement core API features like streaming and tool use, build systematic prompt evaluation pipelines, understand RAG systems, and investigate agent architectures.", learningObjectives: [ "Set up and authenticate Claude through Vertex AI using the Anthropic SDK", "Select appropriate Claude models based on intelligence, speed, and cost trade-offs", "Write and systematically evaluate prompts using objective scoring metrics", "Implement tool calling for web search, file operations, and custom functionality", "Build RAG pipelines with text chunking, embeddings, and hybrid search", "Use advanced features like extended thinking, citations, and prompt caching", "Connect Claude to external services using MCP (Model Context Protocol)", "Design workflows for known task sequences and agents for flexible problem-solving", ], prerequisites: [ "Proficiency in Python programming", "Basic knowledge of handling JSON data", "A Google Cloud account with Vertex AI access", ], targetAudience: "Devs who want to add AI features to their apps", }, stats: { lectureCount: 85, videoHours: 8.0, quizCount: 10, }, sections: [ { id: "section-2", title: "Getting started with Claude", lessonCount: 16, description: "Start here for the fundamentals. Covers API authentication, basic requests, conversation management, system prompts, and structured output generation.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/02-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/02-01.webp", alt: "Section 2 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/02-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/02-02.webp", alt: "Section 2 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/02-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/02-03.webp", alt: "Section 2 screenshot 3", }, ], }, { id: "section-3", title: "Prompt engineering & evaluation", lessonCount: 16, description: "Learn to write prompts that actually work. Focuses on prompting strategies, evaluation frameworks, and systematic testing approaches.", screenshots: [ { id: "s3-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/03-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/03-01.webp", alt: "Section 3 screenshot 1", }, { id: "s3-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/03-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/03-02.webp", alt: "Section 3 screenshot 2", }, { id: "s3-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/03-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/03-03.webp", alt: "Section 3 screenshot 3", }, ], }, { id: "section-4", title: "Tool use with Claude", lessonCount: 14, description: "Extend Claude with custom tools and functions. Build apps with function calling, multi-turn tool interactions, batch tool calling, and leverage built-in utilities.", screenshots: [ { id: "s4-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/04-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/04-01.webp", alt: "Section 4 screenshot 1", }, { id: "s4-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/04-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/04-02.webp", alt: "Section 4 screenshot 2", }, { id: "s4-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/04-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/04-03.webp", alt: "Section 4 screenshot 3", }, ], }, { id: "section-5", title: "Retrieval augmented generation", lessonCount: 10, description: "Implementation guide for production RAG systems. Covers text chunking, embeddings, hybrid search with BM25, multi-index architectures, reranking, and contextual retrieval.", screenshots: [ { id: "s5-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/05-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/05-01.webp", alt: "Section 5 screenshot 1", }, { id: "s5-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/05-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/05-02.webp", alt: "Section 5 screenshot 2", }, { id: "s5-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/05-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/05-03.webp", alt: "Section 5 screenshot 3", }, ], }, { id: "section-6", title: "Model Context Protocol (MCP)", lessonCount: 12, description: "The protocol for building modular AI applications. Define custom tools and resources, implement MCP servers and clients, handle the full integration lifecycle.", screenshots: [ { id: "s6-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/06-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/06-01.webp", alt: "Section 6 screenshot 1", }, { id: "s6-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/06-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/06-02.webp", alt: "Section 6 screenshot 2", }, { id: "s6-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/06-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/06-03.webp", alt: "Section 6 screenshot 3", }, ], }, { id: "section-7", title: "Claude Code & Computer Use", lessonCount: 8, description: "Two powerful Anthropic tools in action. Claude Code accelerates development workflows, Computer Use automates UI interactions. Includes MCP integration patterns.", screenshots: [ { id: "s7-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/07-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/07-01.webp", alt: "Section 7 screenshot 1", }, { id: "s7-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/07-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/07-02.webp", alt: "Section 7 screenshot 2", }, { id: "s7-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/07-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/07-03.webp", alt: "Section 7 screenshot 3", }, ], }, { id: "section-8", title: "Agents and workflows", lessonCount: 11, description: "Architecture patterns for autonomous AI systems. Understand parallel execution, operation chaining, conditional routing, and effective debugging strategies.", screenshots: [ { id: "s8-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/08-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/08-01.webp", alt: "Section 8 screenshot 1", }, { id: "s8-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/08-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/08-02.webp", alt: "Section 8 screenshot 2", }, { id: "s8-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/08-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-google-vertex/08-03.webp", alt: "Section 8 screenshot 3", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[claudeWithGoogleCloudsVertexAi["path"]] = claudeWithGoogleCloudsVertexAi; const claudeWithTheAnthropicApiData = { path: "/claude-with-the-anthropic-api", llmContentKey: "1p", title: "Building with the Claude API", subtitle: "This comprehensive course covers the full spectrum of working with Anthropic models using the Claude API", overview: { description: "This course provides comprehensive coverage of the Claude API, from basic usage through advanced agent architectures. You'll learn to integrate Claude into applications, implement tool calling, build RAG pipelines, and design both deterministic workflows and flexible agent systems.", learningObjectives: [ "Make API requests to Claude models and handle responses", "Implement multi-turn conversations, streaming, and structured output generation", "Build and evaluate prompts systematically using automated testing pipelines", "Create custom tools and integrate Claude with external services", "Design and implement RAG systems with hybrid search and reranking", "Use MCP (Model Context Protocol) to connect Claude to various data sources", "Understand common workflows and agent architectures", ], prerequisites: [ "Proficiency in Python programming", "Basic knowledge of handling JSON data", "Access to an Anthropic API key", ], targetAudience: "Software engineers who need to integrate Claude into production applications. Whether you're building chatbots, automation tools, or AI-powered features, this course covers the implementation patterns you'll need.", }, stats: { lectureCount: 84, videoHours: 8.1, quizCount: 10, }, sections: [ { id: "section-2", title: "Getting started with Claude", lessonCount: 16, description: "Start here for the fundamentals. Covers API authentication, basic requests, conversation management, system prompts, and structured output generation.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/02-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/02-01.webp", alt: "Section 2 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/02-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/02-02.webp", alt: "Section 2 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/02-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/02-03.webp", alt: "Section 2 screenshot 3", }, ], }, { id: "section-3", title: "Prompt engineering & evaluation", lessonCount: 16, description: "Learn to write prompts that actually work. Focuses on prompting strategies, evaluation frameworks, and systematic testing approaches.", screenshots: [ { id: "s3-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/03-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/03-01.webp", alt: "Section 3 screenshot 1", }, { id: "s3-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/03-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/03-02.webp", alt: "Section 3 screenshot 2", }, { id: "s3-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/03-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/03-03.webp", alt: "Section 3 screenshot 3", }, ], }, { id: "section-4", title: "Tool use with Claude", lessonCount: 14, description: "Extend Claude with custom tools and functions. Build apps with function calling, multi-turn tool interactions, batch tool calling, and leverage built-in utilities.", screenshots: [ { id: "s4-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/04-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/04-01.webp", alt: "Section 4 screenshot 1", }, { id: "s4-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/04-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/04-02.webp", alt: "Section 4 screenshot 2", }, { id: "s4-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/04-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/04-03.webp", alt: "Section 4 screenshot 3", }, ], }, { id: "section-5", title: "Retrieval augmented generation", lessonCount: 10, description: "Implementation guide for production RAG systems. Covers text chunking, embeddings, hybrid search with BM25, multi-index architectures, reranking, and contextual retrieval.", screenshots: [ { id: "s5-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/05-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/05-01.webp", alt: "Section 5 screenshot 1", }, { id: "s5-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/05-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/05-02.webp", alt: "Section 5 screenshot 2", }, { id: "s5-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/05-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/05-03.webp", alt: "Section 5 screenshot 3", }, ], }, { id: "section-6", title: "Model Context Protocol (MCP)", lessonCount: 12, description: "The protocol for building modular AI applications. Define custom tools and resources, implement MCP servers and clients, handle the full integration lifecycle.", screenshots: [ { id: "s6-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/06-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/06-01.webp", alt: "Section 6 screenshot 1", }, { id: "s6-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/06-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/06-02.webp", alt: "Section 6 screenshot 2", }, { id: "s6-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/06-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/06-03.webp", alt: "Section 6 screenshot 3", }, ], }, { id: "section-7", title: "Claude Code & Computer Use", lessonCount: 8, description: "Two powerful Anthropic tools in action. Claude Code accelerates development workflows, Computer Use automates UI interactions. Includes MCP integration patterns.", screenshots: [ { id: "s7-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/07-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/07-01.webp", alt: "Section 7 screenshot 1", }, { id: "s7-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/07-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/07-02.webp", alt: "Section 7 screenshot 2", }, { id: "s7-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/07-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/07-03.webp", alt: "Section 7 screenshot 3", }, ], }, { id: "section-8", title: "Agents and workflows", lessonCount: 11, description: "Architecture patterns for autonomous AI systems. Understand parallel execution, operation chaining, conditional routing, and effective debugging strategies.", screenshots: [ { id: "s8-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/08-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/08-01.webp", alt: "Section 8 screenshot 1", }, { id: "s8-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/08-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/08-02.webp", alt: "Section 8 screenshot 2", }, { id: "s8-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/08-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/claude-with-the-anthropic-api/08-03.webp", alt: "Section 8 screenshot 3", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[claudeWithTheAnthropicApiData["path"]] = claudeWithTheAnthropicApiData; const introductionToClaudeCoworkData = { path: "/introduction-to-claude-cowork", llmContentKey: "cowork", title: "Introduction to Claude Cowork", subtitle: "Learn to work alongside Claude on your real files and projects. This hands-on course covers the Cowork task loop, skills and plugins, extending Claude into Chrome, Word, Excel, PowerPoint, and Outlook, and how to steer multi-step work responsibly — so you're productive in your first week.", overview: { description: "

    Cowork is Claude working directly with your files, folders, and apps — reading, editing, and producing real outputs on your machine. Where Chat is a conversation, Cowork is a working session: you describe the task, Claude plans and executes it, and you steer along the way.

    This course gets you from first launch to confident daily use. You'll run your first end-to-end task, give Claude standing context with projects, skills, and plugins, bring Claude into Chrome, Word, Excel, PowerPoint, and Outlook, and learn the habits that keep multi-step work safe to share with your team.

    ", learningObjectives: [ "Set up Claude Cowork with a working folder, connectors, and the right permissions", "Run your first end-to-end task — clarify, steer mid-run, and review the deliverable", "Give Claude standing context with global instructions, projects, skills, and plugins", "Set up scheduled tasks and Dispatch for recurring work", "Bring Claude into the browser with Claude in Chrome and into Word, Excel, PowerPoint, and Outlook", "Test the skills you build and share plugins with your team safely", ], prerequisites: [ "A paid Claude plan (Pro, Max, Team, or Enterprise) with access to the Claude desktop app", "Comfort with everyday desktop apps — no coding or command-line experience needed", ], targetAudience: "Knowledge workers whose day is spent moving information between files, apps, and tools and want Claude to take on real, multi-step work.", }, stats: { lectureCount: 14, videoHours: 0.5, quizCount: 1, }, sections: [ { id: "section-1", title: "Meet Claude Cowork", lessonCount: 4, description: "What Cowork is and how it differs from Chat, how to set it up, and your first end-to-end task: describe it, watch Claude plan and execute, and steer along the way.", screenshots: [ { id: "s1-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287931%2F01-01-medium.1778287931108.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287931%2F01-01.1778287931441.webp", alt: "Connectors interactive: toggle which tools Cowork can reach for a task", }, { id: "s1-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778288339%2F01-02-medium.1778288339014.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778288339%2F01-02.1778288339343.webp", alt: "Anatomy of a Cowork task: a prompt that names sources and ends in a real deliverable", }, ], }, { id: "section-2", title: "Make Claude Cowork yours", lessonCount: 4, description: "Give Claude standing context with global instructions and projects, then build skills and install plugins so Claude knows your vocabulary, your steps, and the outputs you expect.", screenshots: [ { id: "s2-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287931%2F02-01-medium.1778287931754.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287932%2F02-01.1778287932039.webp", alt: "Inside a skill: a folder with SKILL.md, references, and assets", }, { id: "s2-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287932%2F02-02-medium.1778287932429.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287932%2F02-02.1778287932733.webp", alt: "Two plugin shapes: a function's toolkit and an end-to-end pipeline", }, ], }, { id: "section-3", title: "Use Claude wherever you work", lessonCount: 2, description: "Drive web apps with Claude in Chrome, and work inside Word, Excel, PowerPoint, and Outlook with the Claude add-ins for each.", screenshots: [ { id: "s3-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287933%2F03-01-medium.1778287932995.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287933%2F03-01.1778287933260.webp", alt: "Claude in Chrome reading a customer-health dashboard from a Cowork prompt", }, { id: "s3-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778288339%2F03-02-medium.1778288339684.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778288340%2F03-02.1778288339955.webp", alt: "Claude in Chrome filters the dashboard, then Cowork takes over to build the deliverable", }, ], }, { id: "section-4", title: "Sharing and safety in Claude Cowork", lessonCount: 4, description: "Work safely by reviewing plans and outputs, validate skills before you rely on them, and share plugins and workflows with your team.", screenshots: [ { id: "s4-1", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287933%2F04-01-medium.1778287933517.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778287933%2F04-01.1778287933787.webp", alt: "Spot the risk: review a Cowork task for hazards before it runs", }, { id: "s4-2", url: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778288340%2F04-02-medium.1778288340296.webp", fullSizeUrl: "https://everpath-course-content.s3-accelerate.amazonaws.com/instructor%2F8vqsu7jt1fsbeepmjgbk7gzfi%2Fpublic%2F1778288340%2F04-02.1778288340550.webp", alt: "Distribution paths: how to share a plugin with your team based on your org setup", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[introductionToClaudeCoworkData["path"]] = introductionToClaudeCoworkData; const introductionToMcpData = { path: "/introduction-to-model-context-protocol", llmContentKey: "mcp_intro", title: "Introduction to Model Context Protocol", subtitle: "Learn how to build modular AI applications using MCP to connect Claude with external tools and data sources", overview: { description: "This course covers MCP, a protocol for connecting Claude to external services and data sources without manually writing tool schemas. You'll learn to build both MCP servers that expose tools, resources, and prompts, and MCP clients that consume them. The course includes a hands-on project where you implement a document management system using MCP.", learningObjectives: [ "Understand MCP architecture and the client-server communication model", "Build MCP servers that expose tools using the Python SDK", "Implement MCP clients to connect your applications to MCP servers", "Create resources for exposing data and prompts for pre-defined workflows", "Test and debug MCP servers using the MCP Inspector", "Choose between tools, resources, and prompts based on control patterns", "Handle resource cleanup and async communication in MCP implementations", ], prerequisites: [ "Basic Python programming experience", "Understanding of async/await patterns", "Familiarity with API concepts", ], targetAudience: "Engineers who want to integrate Claude with external tools and services without writing tons of boilerplate integration code", }, stats: { lectureCount: 16, videoHours: 1.0, quizCount: 1, }, sections: [ { id: "section-1", title: "MCP fundamentals & server development", lessonCount: 8, description: "Start with understanding MCP's architecture and why it exists. Build your first MCP server with tools using the Python SDK, then test it with the built-in inspector.", screenshots: [ { id: "s1-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/01-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/01-01.webp", alt: "MCP architecture diagram showing client-server communication", }, { id: "s1-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/01-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/01-02.webp", alt: "Python code showing MCP server tool definitions", }, { id: "s1-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/01-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/01-03.webp", alt: "MCP Inspector interface testing tools", }, ], }, { id: "section-2", title: "MCP client implementation & advanced features", lessonCount: 8, description: "Build the client side to communicate with MCP servers. Implement resources for direct data access and prompts for pre-built instructions. See how everything connects in a complete application flow.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/02-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/02-01.webp", alt: "Client implementation code with session management", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/02-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/02-02.webp", alt: "Resource and prompt implementation examples", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/02-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/introduction-to-model-context-protocol/02-03.webp", alt: "Complete application flow diagram with MCP integration", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[introductionToMcpData["path"]] = introductionToMcpData; const modelContextProtocolAdvancedTopicsData = { path: "/model-context-protocol-advanced-topics", llmContentKey: "mcp_advanced", title: "Model Context Protocol: Advanced Topics", subtitle: "Deep dive into MCP's advanced features including sampling, notifications, and transport implementations", overview: { description: "This course covers the technical implementation of MCP servers and clients, from basic message passing to production deployment strategies. You'll learn how MCP enables language models like Claude to interact with external tools and data sources through standardized protocols, transports, and message formats.", learningObjectives: [ "Implement MCP servers with tool functions, logging, and progress notifications", "Handle bidirectional communication between MCP clients and servers", "Configure file system access using the roots permission model", "Work with both stdio and HTTP transports for local and remote deployments", "Implement sampling callbacks to enable server-initiated LLM requests", "Debug message flows using JSON-RPC message types", "Deploy scalable MCP servers using stateless HTTP configurations", "Troubleshoot common issues when transitioning from development to production", ], prerequisites: [ "Basic understanding of MCP servers and clients", "Familiarity with async programming patterns", ], targetAudience: "Engineers building production MCP servers who need to understand the protocol's advanced capabilities", }, stats: { lectureCount: 15, videoHours: 1.1, quizCount: 2, }, sections: [ { id: "section-1", title: "Core MCP features", lessonCount: 8, description: "Learn the advanced features that make MCP servers more powerful. Covers sampling to offload AI costs to clients, implementing progress notifications for better UX, and using roots to safely handle file access.", screenshots: [ { id: "s1-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/01-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/01-01.webp", alt: "Section 1 screenshot 1", }, { id: "s1-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/01-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/01-02.webp", alt: "Section 1 screenshot 2", }, { id: "s1-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/01-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/01-03.webp", alt: "Section 1 screenshot 3", }, ], }, { id: "section-2", title: "Transports and communication", lessonCount: 7, description: "Understand how MCP messages flow between clients and servers. Explores the JSON message protocol, STDIO transport for local development, and the complexities of StreamableHTTP including when to sacrifice features for scalability.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/02-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/02-01.webp", alt: "Section 2 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/02-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/02-02.webp", alt: "Section 2 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/02-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/model-context-protocol-advanced-topics/02-03.webp", alt: "Section 2 screenshot 3", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[modelContextProtocolAdvancedTopicsData["path"]] = modelContextProtocolAdvancedTopicsData; const teachingAiFluencyData = { path: "/teaching-ai-fluency", previewId: "78076", usesAlternateLayout: true, llmContentKey: "taif", title: "Teaching AI Fluency", subtitle: "This course empowers academic faculty, instructional designers, and others to teach and assess AI Fluency in instructor-led settings.", overview: { description: "

    At Anthropic, we believe that empowering people with AI, and ensuring that AI makes safe contributions to society, requires engaging with a wide range of human perspectives and experiences. Responsible AI development and engagement isn't something any single discipline or viewpoint can fully address. It demands collaborative approaches that span a wide range of technical, creative, business, scientific, and educational domains. That's why we partnered with educators who bring complementary expertise to create this course on AI collaboration for educators.

    This course empowers faculty, instructional designers, and educational leaders to apply the 4D Framework to their own educational practice. Participants will learn to apply the 4D Framework to their own teaching practice, using AI as a thinking partner to enhance course design, create coherent learning materials, and develop authentic assessments while modeling responsible AI collaboration for their students.

    This course is the result of a long partnership between Anthropic and professors Rick Dakan from Ringling College of Art and Design and Joseph Feller from University College Cork. It builds on their experiences in training fellow educators and teaching the AI Fluency Framework to their students, and on feedback and questions that arose from our earlier course: AI Fluency: Framework & Foundations This course answers the question: how can I apply this framework to my personal teaching practice?

    The work was supported in part by the Higher Education Authority (Ireland) through the National Forum for the Enhancement of Teaching and Learning.

    Recommended prerequisites

    This course lightly covers the foundational AI Fluency concepts. However, for deeper understanding, participants should complete AI Fluency: Framework & Foundations before beginning this educator-focused curriculum.

    It is also recommended that learners have active teaching or curriculum development responsibilities as well as access to an AI chat tool for hands-on practice. Examples in this course will use Claude.ai, but any chatbot will work.

    ", }, stats: { lectureCount: 7, videoHours: 0.6, quizCount: 1, }, sections: [ { id: "section-1", title: "Teaching approaches", lessonCount: 3, description: "Scaffolding student AI Fluency through the 4D Framework.", screenshots: [ { id: "s1-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/01-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/01-01.webp", alt: "Section 1 screenshot 1", }, { id: "s1-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/01-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/01-02.webp", alt: "Section 1 screenshot 2", }, { id: "s1-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/01-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/01-03.webp", alt: "Section 1 screenshot 3", }, ], }, { id: "section-2", title: "Assessment & Assignment", lessonCount: 2, description: "Designing assessments and assignments that develop and measure student AI Fluency alongside disciplinary expertise.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/02-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/02-01.webp", alt: "Section 2 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/02-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/02-02.webp", alt: "Section 2 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/02-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/02-03.webp", alt: "Section 2 screenshot 3", }, ], }, { id: "section-3", title: "AI's impact and your discipline", lessonCount: 2, description: "Building institutional capacity for responsible and meaningful AI integration in pedagogy, assessment, and curricula across disciplines.", screenshots: [ { id: "s2-1", url: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/03-01-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/03-01.webp", alt: "Section 3 screenshot 1", }, { id: "s2-2", url: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/03-02-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/03-02.webp", alt: "Section 3 screenshot 2", }, { id: "s2-3", url: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/03-03-medium.webp", fullSizeUrl: "https://d7juhi4i8fsw0.cloudfront.net/images/teaching-ai-fluency/03-03.webp", alt: "Section 3 screenshot 3", }, ], }, ], }; if (typeof window._clpdata !== "object") { window._clpdata = {}; } window._clpdata[teachingAiFluencyData["path"]] = teachingAiFluencyData; // Modal Carousel for Course Landing Page Screenshots function renderScreenshot(screenshot, sectionId) { if (screenshot.url) { return `
    ${screenshot.alt ||
    `; } else { return `
    ${ screenshot.alt || "Screenshot" }
    `; } } function generateModalCarousel() { return ` `; } function initializeModalCarousel(courseData, enrollHref = '') { // Add modal to DOM if not already present if (!document.getElementById("clp__modal-overlay")) { document.body.insertAdjacentHTML("beforeend", generateModalCarousel()); } const modal = document.getElementById("clp__modal-overlay"); const modalImage = modal.querySelector(".clp__modal-image"); const modalTitle = modal.querySelector(".clp__modal-title"); const modalDescription = modal.querySelector(".clp__modal-description"); const modalCounter = modal.querySelector(".clp__modal-counter"); const modalEnrollBtn = modal.querySelector(".clp__modal-enroll-btn"); const closeBtn = modal.querySelector(".clp__modal-close"); const prevBtn = modal.querySelector(".clp__modal-prev"); const nextBtn = modal.querySelector(".clp__modal-next"); // Set the enroll button href if (modalEnrollBtn && enrollHref) { modalEnrollBtn.href = enrollHref; } let currentSectionIndex = 0; let currentImageIndex = 0; let allSections = courseData.sections.filter( (section) => section.screenshots && section.screenshots.length > 0 ); function updateModal() { if (allSections.length === 0) return; const currentSection = allSections[currentSectionIndex]; const currentImage = currentSection.screenshots[currentImageIndex]; modalTitle.textContent = currentSection.title; modalDescription.textContent = currentSection.description; modalImage.src = currentImage.fullSizeUrl || currentImage.url; modalImage.alt = currentImage.alt || "Screenshot"; // Update counter const totalImages = allSections.reduce( (sum, section) => sum + section.screenshots.length, 0 ); let currentImageNumber = 1; for (let i = 0; i 0) { currentImageIndex--; } else { // Move to previous section if (currentSectionIndex > 0) { currentSectionIndex--; currentImageIndex = allSections[currentSectionIndex].screenshots.length - 1; } else { // Wrap to last section currentSectionIndex = allSections.length - 1; currentImageIndex = allSections[currentSectionIndex].screenshots.length - 1; } } updateModal(); } function openModal(sectionId, screenshotId) { // Find the section and image const sectionIndex = allSections.findIndex( (section) => section.id === sectionId ); if (sectionIndex === -1) return; const section = allSections[sectionIndex]; const imageIndex = section.screenshots.findIndex( (screenshot) => screenshot.id === screenshotId ); if (imageIndex === -1) return; currentSectionIndex = sectionIndex; currentImageIndex = imageIndex; updateModal(); modal.style.display = "flex"; document.body.style.overflow = "hidden"; } function closeModal() { modal.style.display = "none"; document.body.style.overflow = ""; } // Event listeners closeBtn.addEventListener("click", closeModal); nextBtn.addEventListener("click", nextImage); prevBtn.addEventListener("click", prevImage); // Click outside modal to close modal.addEventListener("click", (e) => { if (e.target === modal) { closeModal(); } }); // Keyboard navigation document.addEventListener("keydown", (e) => { if (modal.style.display === "flex") { switch (e.key) { case "Escape": closeModal(); break; case "ArrowLeft": prevImage(); break; case "ArrowRight": nextImage(); break; } } }); // Add click handlers to screenshot images document.addEventListener("click", (e) => { if (e.target.classList.contains("clp__screenshot-clickable")) { const sectionId = e.target.dataset.sectionId; const screenshotId = e.target.dataset.screenshotId; openModal(sectionId, screenshotId); } }); } // Add to window for browser usage if (typeof window !== "undefined") { window.renderScreenshot = renderScreenshot; window.generateModalCarousel = generateModalCarousel; window.initializeModalCarousel = initializeModalCarousel; } // Course Landing Page HTML Generator function generateCourseLandingPage(courseData, videoElement, enrollHref) { const html = `
    ${generateHeroSection(courseData, videoElement, enrollHref)} ${generateMainContent(courseData)}
    `; return html.trim(); } function generateHeroSection(courseData, videoElement, enrollHref) { // Determine what to show for video let videoContent; if (videoElement) { // If we have an existing video element, use it directly videoContent = `
    ${videoElement.outerHTML}
    `; } else { // Otherwise, show a fallback placeholder videoContent = `
    Course Overview
    `; } var isPartnersDomain = window.location.hostname === "anthropic-partners.skilljar.com"; var academyHref = isPartnersDomain ? "/" : "https://www.anthropic.com/learn"; var coursesHref = isPartnersDomain ? "/" : "https://anthropic.skilljar.com/"; return `

    ${courseData.title}

    ${courseData.subtitle}

    ${courseData.enrollButtonText || "Enroll in Course"} ${courseData.hideFreeTag ? "" : `FREE`}
    ${courseData.hideShareButtons ? "" : ``}
    ${videoContent} ${courseData.stats ? generateStatsSection(courseData.stats) : ""}
    `; } function generateStatsSection(stats) { return `
    ${stats.lectureCount} lectures
    ${stats.videoHours} ${ stats.videoHours === 1 ? "hour" : "hours" } of video
    ${ stats.quizCount > 0 ? `
    ${stats.quizCount} ${ stats.quizCount > 1 ? "quizzes" : "quiz" }
    ` : "" }
    Certificate of completion
    `; } function generateMainContent(courseData) { return `
    ${generateAboutThisCourse(courseData)} ${generateCourseSections(courseData.sections)} ${courseData.instructors ? generateInstructorsSection(courseData.instructors) : ''} ${courseData.extra ? (Array.isArray(courseData.extra) ? courseData.extra : [courseData.extra]).map(generateExtraSection).join('') : ''}
    `; } function generateCourseSections(sections) { if (!sections || sections.length === 0) return ""; return `

    Course sections

    ${sections .map( (section) => `

    ${section.description}

    ${ section.screenshots && section.screenshots.length > 0 ? ` Course preview images
    ${section.screenshots .map((screenshot) => renderScreenshot(screenshot, section.id)) .join("")}
    ` : "" }
    ` ) .join("")}
    `; } function generateInstructorsSection(instructors) { return `

    About the instructors

    ${instructors .map( (instructor) => `
    ${instructor.name}

    ${instructor.name}

    ${instructor.description}

    ` ) .join("")}
    `; } function generateExtraSection(extra) { return `

    ${extra.title}

    ${extra.content}
    `; } function generateAboutThisCourse(courseData) { return `

    About this course

    ${courseData.overview.description}

    ${courseData.overview.learningObjectives ? `

    Learning objectives

    By the end of this course, you'll be able to:

    ` : ''} ${courseData.overview.prerequisites ? `

    Prerequisites

    ` : ''} ${courseData.overview.targetAudience ? `

    Who this course is for

    ${courseData.overview.targetAudience}

    ` : ''}
    `; } // Share functions function shareOnX(e) { e.preventDefault(); const text = document.querySelector(".clp__title").textContent + " - " + document.querySelector(".clp__subtitle").textContent; const url = window.location.href; window.open( `https://twitter.com/intent/tweet?text=${encodeURIComponent( text )}&url=${encodeURIComponent(url)}`, "_blank" ); } function shareOnLinkedIn(e) { e.preventDefault(); const url = window.location.href; window.open( `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent( url )}`, "_blank" ); } // Export the main function if (typeof module !== "undefined" && module.exports) { module.exports = { generateCourseLandingPage }; } // Add to window for browser usage if (typeof window !== "undefined") { window.generateCourseLandingPage = generateCourseLandingPage; window.shareOnX = shareOnX; window.shareOnLinkedIn = shareOnLinkedIn; } // Find the course data matching the current path function getMatchingCourse() { const currentPath = window.location.pathname; const courses = Object.values(window._clpdata || {}); return courses.find((course) => currentPath.includes(course.path)); } // The AI Fluency series of courses hide the .lesson-top header // on the lesson page, which is where the Chat with Claude // button is usually located. If this is a AIF course then // we will instead prepend the chatbutton to the course text content function useAlternateLayout() { const course = getMatchingCourse(); return course?.usesAlternateLayout || false; } function renderChatButton() { let chatButtonParent; if (useAlternateLayout()) { chatButtonParent = document.querySelector(".course-text-content"); } else { chatButtonParent = document.querySelector(".lesson-top"); } if (!chatButtonParent) { return null; } // Check if chat button already exists if (chatButtonParent.querySelector(".lp__chat-combo")) { console.warn("Chat button already exists, skipping"); return null; } // Find matching course and get LLM content using its key const course = getMatchingCourse(); const llmKey = course?.llmContentKey; const attachmentContent = llmKey && window.__chatData ? window.__chatData[llmKey] : ""; // Return early if no attachment content found if (!attachmentContent) { return null; } // Create combo button container const comboContainer = document.createElement("div"); comboContainer.className = "lp__chat-combo"; // Create main button const mainButton = document.createElement("button"); mainButton.className = "lp__chat-button-main"; mainButton.innerHTML = `
    Aquileo | AnthropicOpen in Claude
    `; // Create dropdown button const dropdownButton = document.createElement("button"); dropdownButton.className = "lp__chat-button-dropdown"; dropdownButton.innerHTML = ` `; // Create dropdown menu const dropdownMenu = document.createElement("div"); dropdownMenu.className = "lp__chat-dropdown-menu"; dropdownMenu.innerHTML = `
    Aquileo | Anthropic
    Open in Claude
    Ask questions about this course
    Copy notes
    Copy full course notes for LLMs
    `; // Assemble combo button comboContainer.appendChild(mainButton); comboContainer.appendChild(dropdownButton); comboContainer.appendChild(dropdownMenu); // Add event listeners mainButton.onclick = () => openInClaude(); dropdownButton.onclick = (e) => { e.stopPropagation(); dropdownMenu.classList.toggle("lp__chat-dropdown-open"); dropdownButton.classList.toggle("lp__dropdown-open"); }; // Add dropdown item listeners dropdownMenu.addEventListener("click", (e) => { const item = e.target.closest(".lp__chat-dropdown-item"); if (!item) return; const action = item.dataset.action; if (action === "copy") { copyTranscript(); } else if (action === "claude") { openInClaude(); } dropdownMenu.classList.remove("lp__chat-dropdown-open"); dropdownButton.classList.remove("lp__dropdown-open"); }); // Close dropdown when clicking outside document.addEventListener("click", (e) => { if (!comboContainer.contains(e.target)) { dropdownMenu.classList.remove("lp__chat-dropdown-open"); dropdownButton.classList.remove("lp__dropdown-open"); } }); // Action functions function copyTranscript() { const mainButtonText = mainButton.querySelector("span"); const dropdownItemText = dropdownMenu.querySelector( '[data-action="copy"] .lp__chat-title' ); navigator.clipboard .writeText(attachmentContent) .then(() => { // Change text to "Copied!" mainButtonText.textContent = "Copied!"; dropdownItemText.textContent = "Copied!"; // Revert after 3 seconds setTimeout(() => { mainButtonText.textContent = "Open in Claude"; dropdownItemText.textContent = "Copy notes"; }, 3000); }) .catch((err) => { console.error("Failed to copy transcript:", err); }); } function openInClaude() { const q = encodeURIComponent("Explain this concept:"); const attachment = encodeURIComponent(attachmentContent); const linkUrl = `https://claude.ai/remix#q=${q}&attachment=${attachment}`; window.open(linkUrl, "_blank", "noopener,noreferrer"); } if (useAlternateLayout()) { chatButtonParent.prepend(comboContainer); } else { chatButtonParent.appendChild(comboContainer); } return comboContainer; } const VIOLET = "#cbcadb"; const MINT = "#bcd1ca"; class ResourceLinks { images = { quill: { imgAlt: "Ornate quill pen resting on a detailed hand, positioned against a textured background", imgSrc: "https://www-cdn.anthropic.com/images/4zrzovbb/website/33dbe8f783d4835a838b4c4ae85d3c04e352fee1-1000x1000.svg", }, head: { imgAlt: "Stylized hand and head silhouette with interconnected node and abstract geometric elements", imgSrc: "https://www-cdn.anthropic.com/images/4zrzovbb/website/46e4aa7ea208ed440d5bd9e9e3a0ee66bc336ff1-1000x1000.svg", }, }; resources = [ // AI Fluency { title: "AI Fluency vocabulary guide", description: "A reference for key terms you'll encounter, written in plain language. No need to memorize; just refer to it when needed.", img: "quill", attachmentTitle: "AI Fluency vocabulary cheat sheet.pdf", color: VIOLET, }, { title: "The AI Fluency Framework summary (8.5x11)", description: "Quick visual reference for the four core competencies (the “4Ds”) and key concepts. Can be printed as a reference poster.", img: "quill", attachmentTitle: "1.2 AI Fluency Summary One-Pager.pdf", color: VIOLET, }, { title: "The AI Fluency Framework summary (16x9)", description: "Quick visual reference for the four core competencies (the “4Ds”) and key concepts. Can be used in delivering presentations.", img: "quill", attachmentTitle: "1.2 AI Fluency Summary 16x9.pdf", color: MINT, }, { title: "Overview of Generative AI", description: "Quick reference guide for understanding generative AI.", img: "quill", attachmentTitle: "DD1 Handout_ Overview of Generative AI.pdf", color: VIOLET, }, { title: "Delegation summary slide (8.5x11)", description: "A concise summary of the Delegation competency that you can print as a quick reference.", img: "quill", attachmentTitle: "1.3 Delegation Summary.pdf", color: VIOLET, }, { title: "Delegation summary slide (16x9)", description: "A concise summary of the Delegation competency that you can use in delivering presentations.", img: "quill", attachmentTitle: "1.3 Delegation Summary 16x9.pdf", color: MINT, }, { title: "Description summary slide (8.5x11)", description: "A concise summary of the Delegation competency that you can print as a quick reference.", img: "quill", attachmentTitle: "1.5 Description Summary.pdf", color: VIOLET, }, { title: "Description summary slide (16x9)", description: "A concise summary of the Delegation competency that you can use in presentations.", img: "quill", attachmentTitle: "1.5 Description Summary 16x9.pdf", color: MINT, }, { title: "6 techniques for effective prompt engineering", description: "See how vague prompts can be transformed into effective ones with these real-world examples.", img: "quill", attachmentTitle: "DD2 Handout_ 6 Effective Prompting Techniques.pdf", color: VIOLET, }, { title: "Discernment summary slide (8.5x11)", description: "A concise summary of the Discernment competency that you can print as a quick reference poster.", img: "quill", attachmentTitle: "1.6 Discernment Summary.pdf", color: VIOLET, }, { title: "Discernment summary slide (16x9)", description: "A concise summary of the Discernment competency that you can use in presentations.", img: "quill", attachmentTitle: "1.6 Discernment Summary 16x9.pdf", color: MINT, }, { title: "Diligence summary slide (8.5x11)", description: "A concise summary of the Diligence competency that you can print as a quick reference.", img: "quill", attachmentTitle: "1.8 Diligence Summary.pdf", color: VIOLET, }, { title: "Diligence summary slide (16x9)", description: "A concise summary of the Diligence competency that you can use in presentations.", img: "quill", attachmentTitle: "1.8 Diligence Summary 16x9.pdf", color: MINT, }, ]; init() { const anchors = document.querySelectorAll( "#details-pane-summary-content .sj-text-downloads + ul a" ); const resourceCards = []; anchors.forEach((anchor) => { const span = anchor.querySelector("span"); if (!span) return; const spanText = span.textContent.trim(); const matchedResource = this.resources.find( (resource) => resource.attachmentTitle === spanText ); if (matchedResource) { const href = anchor.href; const img = this.images[matchedResource.img]; const resourceHtml = this.createResource({ href, description: matchedResource.description, title: matchedResource.title, imgAlt: img.imgAlt, imgSrc: img.imgSrc, bgColor: matchedResource.color, }); resourceCards.push(resourceHtml); } }); if (resourceCards.length > 0) { // Remove the original ul element const ul = document.querySelector( "#details-pane-summary-content .sj-text-downloads + ul" ); if (ul) { ul.remove(); } // Create new container and add resource cards const downloadsHeader = document.querySelector(".sj-text-downloads"); if (downloadsHeader) { const resourceContainer = document.createElement("div"); resourceContainer.className = "resource__container"; resourceContainer.innerHTML = resourceCards.join(""); // Insert as sibling after the downloads header downloadsHeader.parentNode.insertBefore( resourceContainer, downloadsHeader.nextSibling ); } } } createResource({ href, description, title, imgAlt, imgSrc, bgColor }) { return `
    ${imgAlt}

    ${title}

    ${description}

    Download
    `; } } renderChatButton(); const resourceLinks = new ResourceLinks(); resourceLinks.init(); // Check if current path matches a course with usesAlternateLayout flag function shouldUseAlternateLayout() { const currentPath = window.location.pathname; const courses = Object.values(window._clpdata || {}); return courses.some((course) => { if (!course.usesAlternateLayout) return false; const matchesPath = currentPath.includes(course.path); const matchesPreview = course.previewId && currentPath.includes(`preview/${course.previewId}`); return matchesPath || matchesPreview; }); } // Apply specific CSS based on course layout type if (shouldUseAlternateLayout()) { const style = document.createElement("style"); style.textContent = ` #lp-wrapper #lp-content #details-pane.columns #details-pane-inner #details-pane-content #details-pane-summary-content { flex-direction: column !important; } `; document.head.appendChild(style); } else { const style = document.createElement("style"); style.textContent = ` #lesson-body #lesson-main #lesson-main-inner .lesson-top { display: flex !important; } `; document.head.appendChild(style); } const song = document.querySelector("#song"); if (song) { song.addEventListener("click", () => { const songWrapper = document.querySelector("#song-wrapper"); if (songWrapper) { const existingAudio = songWrapper.querySelector("audio"); if (existingAudio) { existingAudio.play(); return; } const audio = document.createElement("audio"); audio.controls = true; audio.autoplay = false; audio.id = "karaoke-audio"; audio.src = "https://ant-lm-sj-s3.s3.us-east-1.amazonaws.com/script.js"; audio.style.marginTop = "16px"; audio.style.width = "100%"; audio.style.maxWidth = "400px"; songWrapper.appendChild(audio); const lines = [ { text: "Welcome to our alpha test, my friend.", start: 6738, end: 11257, }, { text: "It's long, but you'll make it till the end.", start: 11257, end: 15559, }, { text: "We need your feedback, oh, it's so divine.", start: 15559, end: 20498, }, { text: "To make this certification really shine.", start: 20498, end: 27357, }, { text: "Don't use Claude, don't use Google.", start: 27357, end: 30753, }, { text: "Don't even ask your precious Poodle.", start: 30753, end: 33960, }, { text: "We're watching you, but not really, though.", start: 33960, end: 36653, }, { text: "Just pretend that we're in the know.", start: 36653, end: 38357, }, { text: "No external help, it's the rule.", start: 38357, end: 40360 }, { text: "The pacing, the difficulty, the clarity, too.", start: 40360, end: 43648, }, { text: "We need to know if this exam's killing you.", start: 43648, end: 47057, }, { text: "Take it by yourself, serious and stern.", start: 47057, end: 50359, }, { text: "Give it a try, help us learn.", start: 50359, end: 53660 }, { text: "Your manager won't see your score.", start: 53660, end: 56758, }, { text: "We promise this, we swear what's more.", start: 56758, end: 59951, }, { text: "Your results are anonymized.", start: 59951, end: 63348 }, { text: "So don't feel stressed or victimized.", start: 63348, end: 66649, }, { text: "There's no cheating now, be strong and true.", start: 66649, end: 70058, }, { text: "Leave feedback when you're finally through.", start: 70058, end: 73360, }, { text: "This alpha test is just for fun.", start: 73360, end: 78555 }, { text: "And data collection, everyone.", start: 78555, end: 81749 }, { text: "Remember, don't ask your dog for help.", start: 81749, end: 86660, }, ]; let lyricsDiv = null; let currentLineIndex = -1; let isInitialized = false; function initializeLyrics() { if (isInitialized) return; lyricsDiv = document.createElement("div"); lyricsDiv.id = "karaoke-lyrics"; document.body.appendChild(lyricsDiv); isInitialized = true; } function updateDisplay() { if (!lyricsDiv) return; const currentTime = audio.currentTime * 1000; // Find current line let newLineIndex = -1; for (let i = 0; i = lines[i].start && currentTime { if (idx >= 0 && idx { if (lyricsDiv) { lyricsDiv.classList.add("karaoke-hidden"); } }); audio.addEventListener("play", () => { // Initialize lyrics div on first play if (!isInitialized) { initializeLyrics(); } if (lyricsDiv) { lyricsDiv.classList.remove("karaoke-hidden"); } }); } }); } const coursePaths = Object.keys(window._clpdata || {}); function revealDefaultContent() { const el = document.querySelector("#skilljar-content"); if (el) { el.classList.add("reveal"); } } function applyEnhancedStyling() { const currentPath = window.location.pathname; const isExactMatch = coursePaths.some((title) => currentPath === title); if (!isExactMatch) { revealDefaultContent(); return; } // True if we're on any course landing page, registered or not if (window.skilljarCourse) { // True if we have already registered for the course if (window.skilljarCourseProgress) { revealDefaultContent(); } else { // Apply course landing page template applyCourseLandingPageTemplate(currentPath); } } else { revealDefaultContent(); } } function applyCourseLandingPageTemplate(path) { // Get the course data for the current path const courseData = window._clpdata && window._clpdata[path]; if (!courseData) { console.error("No course data found for path:", path); revealDefaultContent(); return; } // Find the main content container const mainContent = document.querySelector("#skilljar-content"); if (mainContent) { // Extract the existing video player before replacing content const existingVideoWrapper = mainContent.querySelector( ".dp-promo-image-wrapper" ); let videoElement = null; if (existingVideoWrapper) { // Clone the video element to preserve event listeners and state videoElement = existingVideoWrapper.cloneNode(true); } // Extract the enroll button href const enrollButton = document.querySelector("#purchase-button"); let enrollHref = ""; if (enrollButton && enrollButton.href) { enrollHref = enrollButton.href; } // Generate the HTML with the video element and enroll href const html = window.generateCourseLandingPage( courseData, videoElement, enrollHref ); // Replace the content mainContent.innerHTML = html; initializeModalCarousel(courseData, enrollHref); // Reveal the content const el = document.querySelector("#skilljar-content"); if (el) { el.classList.add("reveal"); } } else { console.error("Could not find main content container"); revealDefaultContent(); } } applyEnhancedStyling(); // Single source of truth for the scheduled maintenance window and the // CCA-F exam lockout that precedes it. To run a future window, edit this // object only — downtime-banner.js, ccaf-exam-lockout.js, and the // access-request landing page all read from it. window.MAINTENANCE_WINDOW = { // Sat May 2 2026, 8:30 PM PDT — banner disappears and lockout ends. end: new Date("2026-05-03T03:30:00Z"), // Sat May 2 2026, 3:00 PM PDT — exam closes 2.5h before maintenance so // in-progress attempts can finish. examLockoutStart: new Date("2026-05-02T22:00:00Z"), // Display strings — keep in sync with the timestamps above. windowLabel: "Saturday, May 2 from 5:30–8:30 PM PDT", examClosesLabel: "3:00 PM PDT", reopensLabel: "8:30 PM PDT on Saturday, May 2", // localStorage dismiss keys — bump these for each new window so the // banner re-shows. bannerDismissKey: "downtime-banner-dismissed-2026-05-02", certBannerDismissKey: "downtime-banner-dismissed-2026-05-02-ccaf-exam", // Pages that show the extended banner with the exam-closure line. certBannerPaths: [ "/claude-certified-architect-foundations", "/anthropic-certification-practice-exam", ], // Pages that get the lockout overlay during the exam-lockout window // (practice exam intentionally excluded — it doesn't burn an attempt). examLockoutPaths: ["/claude-certified-architect-foundations"], matchesPath: function (pathname, prefixes) { for (var i = 0; i = this.examLockoutStart && now Certification Terms and " + "Exam Policy.", }, { icon: "cert-small.webp", title: "Your Score Report", description: "Results within 2 business days with detailed section breakdowns. Digital certificate recognized by companies using Claude.", }, { icon: "cc-small.webp", title: "Exam Pricing", description: "$99 per exam. Fixed discount offered to approved partners in the Claude Partner Network.", }, ]; const EAP_COMPETENCIES = [ { title: "Agentic Architecture & Orchestration", weight: "27%", description: "Design agentic loops, orchestrate multi-agent systems with coordinator-subagent patterns, implement task decomposition, and manage session state and workflow enforcement.", }, { title: "Tool Design & MCP Integration", weight: "18%", description: "Design effective tool interfaces with clear boundaries, implement structured error responses, integrate MCP servers, and distribute tools appropriately across agents.", }, { title: "Claude Code Configuration & Workflows", weight: "20%", description: "Configure CLAUDE.md hierarchies, create custom slash commands, apply path-specific rules, know when to use plan mode, and integrate into CI/CD pipelines.", }, { title: "Prompt Engineering & Structured Output", weight: "20%", description: "Design prompts with explicit criteria, apply few-shot techniques, enforce structured output with JSON schemas, and implement validation and retry loops.", }, { title: "Context Management & Reliability", weight: "15%", description: "Preserve critical information across long interactions, design escalation patterns, manage error propagation in multi-agent systems, and handle uncertainty with confidence calibration.", }, ]; const EAP_SCENARIOS = [ { title: "Customer Support Resolution Agent", description: "You are building a customer support resolution agent using the Claude Agent SDK. The agent handles high-ambiguity requests like returns, billing disputes, and account issues. It has access to your backend systems through custom MCP tools (get_customer, lookup_order, process_refund, escalate_to_human). Your target is 80%+ first-contact resolution while knowing when to escalate.", domains: ["Agentic Architecture & Orchestration", "Tool Design & MCP Integration", "Context Management & Reliability"], }, { title: "Code Generation with Claude Code", description: "You are using Claude Code to accelerate software development. Your team uses it for code generation, refactoring, debugging, and documentation. You need to integrate it into your development workflow with custom slash commands, CLAUDE.md configurations, and understand when to use plan mode vs direct execution.", domains: ["Claude Code Configuration & Workflows", "Context Management & Reliability"], }, { title: "Multi-Agent Research System", description: "You are building a multi-agent research system using the Claude Agent SDK. A coordinator agent delegates to specialized subagents: one searches the web, one analyzes documents, one synthesizes findings, and one generates reports. The system researches topics and produces comprehensive, cited reports.", domains: ["Agentic Architecture & Orchestration", "Tool Design & MCP Integration", "Context Management & Reliability"], }, { title: "Developer Productivity with Claude", description: "You are building developer productivity tools using the Claude Agent SDK. The agent helps engineers explore unfamiliar codebases, understand legacy systems, generate boilerplate code, and automate repetitive tasks. It uses the built-in tools (Read, Write, Bash, Grep, Glob) and integrates with MCP servers.", domains: ["Tool Design & MCP Integration", "Claude Code Configuration & Workflows", "Agentic Architecture & Orchestration"], }, { title: "Claude Code for Continuous Integration", description: "You are integrating Claude Code into your CI/CD pipeline. The system runs automated code reviews, generates test cases, and provides feedback on pull requests. You need to design prompts that provide actionable feedback and minimize false positives.", domains: ["Claude Code Configuration & Workflows", "Prompt Engineering & Structured Output"], }, { title: "Structured Data Extraction", description: "You are building a structured data extraction system using Claude. The system extracts information from unstructured documents, validates the output using JSON schemas, and maintains high accuracy. It must handle edge cases gracefully and integrate with downstream systems.", domains: ["Prompt Engineering & Structured Output", "Context Management & Reliability"], }, ]; const EAP_COURSES = [ { color: "blue", icon: "hand-lightning.webp", title: "Building with the Claude API", href: "/claude-with-the-anthropic-api", track: "course_api", }, { color: "purple", icon: "atoms-on-page.webp", title: "Introduction to Model Context Protocol", href: "/introduction-to-model-context-protocol", track: "course_mcp", }, { color: "sage", icon: "browser.webp", title: "Claude Code in Action", href: "/claude-code-in-action", track: "course_claude_code", }, { color: "pink", icon: "apple-book-learning.webp", title: "Claude 101", href: "/claude-101", track: "course_101", }, ]; const EAP_FAQS = [ { q: "Who is this certification for?", a: "This certification is currently available to Anthropic partners. It's intended for a technical audience — a ~301 level exam designed for practitioners who have foundational knowledge and are ready to demonstrate deeper, applied expertise. If your organization isn't yet an Anthropic partner, you can apply to become one.", }, { q: "What are the prerequisites?", a: "Completion of at least all 200-level courses in the course catalog, working familiarity with Agent SDK, and having built solutions with Claude Code, Agent SDK, Anthropic API, and MCP.", }, { q: "How should I prepare?", a: "Get very familiar with the Exam Guide — it contains the scenarios that will appear on the exam, the domains and skill areas, and preparation exercises. Then take the Practice Exam and aim for a score greater than 900/1000.", }, { q: "Will the exam be proctored?", a: "Yes, we've partnered with ProctorFree for exam proctoring.", }, { q: "How many attempts are permitted?", a: "One attempt.", }, { q: "Is there a cost?", a: "The exam is $99. Approved partners in the Claude Partner Network receive a fixed discount.", }, { q: "Do I get a badge if I pass?", a: "Yes! Practitioners who pass receive a CCA-F badge that is shareable on LinkedIn.", }, { q: "What policies apply when I take the exam?", a: 'By registering, you agree to abide by the Certification Terms & Conditions and the Anthropic Certification Exam Policy. Please review both before your exam session.', }, { q: "Have a question not covered here?", a: 'Email Anthropic Education Support at academy-support@anthropic.com.', }, ]; function generateEapLandingPage(registerUrl, isLoggedIn) { var inPartnerGroup = eapUserInAllowedGroup(); var nonPartnerEmail = isLoggedIn && !inPartnerGroup; var maintenanceLockout = eapInMaintenanceLockout(); var html = '
    ' + eapHero(registerUrl, nonPartnerEmail, inPartnerGroup, maintenanceLockout) + eapStats() + eapCompetencies() + eapScenarios() + eapRecommended() + eapFaq() + eapCtaFooter(registerUrl, nonPartnerEmail, maintenanceLockout) + '
    '; return html; } function eapInMaintenanceLockout() { return !!(window.MAINTENANCE_WINDOW && window.MAINTENANCE_WINDOW.inExamLockout()); } function eapHero(registerUrl, nonPartnerEmail, inPartnerGroup, maintenanceLockout) { var partnerNote = inPartnerGroup ? '' : '

    ' + 'Not an Anthropic partner? ' + 'Apply to become one →' + '

    '; var registerBtn; if (maintenanceLockout) { registerBtn = 'Registration Paused'; } else if (nonPartnerEmail) { registerBtn = 'Register for the Exam'; } else { registerBtn = 'Register for the Exam'; } var domainWarning = ''; if (maintenanceLockout) { domainWarning = '

    ' + 'Exam registration is paused for scheduled maintenance and will reopen after ' + '' + window.MAINTENANCE_WINDOW.reopensLabel + '.' + '

    '; } else if (nonPartnerEmail) { domainWarning = '

    ' + 'You aren’t signed in with a partner company employee email. ' + 'Sign in with your partner email to register.' + '

    '; } return '' + '
    ' + '
    ' + '
    ' + '

    Become a Claude Certified Architect

    ' + '

    Prove your expertise in building production-grade applications with Claude.

    ' + '' + domainWarning + partnerNote + '
    ' + '
    ' + '
    ' + '' + '
    ' + '
    ' + '
    ' + '
    '; } function eapStats() { var items = EAP_STATS.map(function (stat) { return '' + '
    ' + '' + '
    ' + stat.title + '
    ' + '
    ' + stat.description + '
    ' + '
    '; }).join(''); return '' + '
    ' + '
    ' + items + '
    ' + '
    '; } function eapCompetencies() { var rows = EAP_COMPETENCIES.map(function (comp) { return '' + '
    ' + '' + '
    ' + comp.title + '' + comp.weight + '' + '
    ' + '
    ' + comp.description + '
    ' + '
    '; }).join(''); return '' + '
    ' + '
    ' + '
    ' + '' + '

    What You’ll Be Tested On

    ' + '

    60 questions across five core competency areas

    ' + '
    ' + '
    ' + rows + '
    ' + '
    ' + '
    '; } function eapScenarios() { var cards = EAP_SCENARIOS.map(function (s, i) { var domains = s.domains.map(function (d) { return '' + d + ''; }).join(''); return '' + '
    ' + '
    Scenario ' + (i + 1) + '
    ' + '

    ' + s.title + '

    ' + '

    ' + s.description + '

    ' + '
    ' + domains + '
    ' + '
    '; }).join(''); return '' + '
    ' + '
    ' + '
    ' + '

    Exam Scenarios

    ' + '

    Each exam draws 4 scenarios at random from this set of 6. Every scenario frames a realistic production context for a set of questions.

    ' + '
    ' + '' + '' + '
    ' + '
    '; } function eapRecommended() { var cards = EAP_COURSES.map(function (course) { return '' + '' + '
    ' + '' + '
    ' + '
    ' + '
    ' + course.title + '
    ' + '
    ' + '' + 'Course' + '
    ' + '
    ' + '
    '; }).join(''); return '' + '
    ' + '
    ' + '
    ' + '' + '

    Recommended learning

    ' + '

    Build the skills you need to pass with confidence by first going through these courses.

    ' + '
    ' + '
    ' + cards + '
    ' + '
    ' + '
    '; } function eapFaq() { var items = EAP_FAQS.map(function (faq, i) { var id = 'eap-faq-' + i; return '' + '
    ' + '' + '' + '' + '
    ' + '

    ' + faq.a + '

    ' + '
    ' + '
    '; }).join(''); return '' + '
    ' + '
    ' + '
    ' + '

    FAQ

    ' + '
    ' + '
    ' + items + '
    ' + '
    ' + '
    '; } function eapCtaFooter(registerUrl, nonPartnerEmail, maintenanceLockout) { var registerBtn; if (maintenanceLockout) { registerBtn = 'Registration Paused'; } else if (nonPartnerEmail) { registerBtn = 'Register for the Exam'; } else { registerBtn = 'Register for the Exam'; } return '' + ''; } if (typeof window !== "undefined") { window.generateEapLandingPage = generateEapLandingPage; } (function () { var EAP_PATH = "/claude-certified-architect-foundations-access-request"; // Skilljar offers are per-domain: same course, different checkout IDs. var EAP_CHECKOUT = window.location.hostname === "anthropic-partners.skilljar.com" ? "/checkout/2p2auteq160zf" : "/checkout/335ekdcl2m147"; var currentPath = window.location.pathname.replace(/\/$/, ""); if (currentPath !== EAP_PATH) return; function applyEapLandingPage() { var mainContent = document.querySelector("#skilljar-content"); if (!mainContent) return; // Enrolled users need to see Skilljar's default course content to // complete the attestation lessons — don't cover it with the EAP page. if (window.skilljarCourseProgress) return; var isLoggedIn = typeof skilljarUser !== "undefined"; // Grab Skilljar's checkout href before we replace the DOM. The .href // property is browser-normalized (raw `"` → `%22`), so it can't break out // of the href="..." attribute in the generated template. Path-prefix guard // is defense-in-depth: reject anything that isn't a checkout URL. var enrollButton = document.querySelector("#purchase-button"); var liveHref = enrollButton && enrollButton.getAttribute("href"); var registerUrl = liveHref && liveHref.indexOf("/checkout/") === 0 ? liveHref : EAP_CHECKOUT; // generateEapLandingPage builds HTML from string-literal constants in // eap-landing-page.js; the only runtime value is registerUrl, guarded // above to be a /checkout/ path. Same pattern as course-landing-page/init.js. // nosemgrep: home.runner.work._actions.anthropics.sast.main.rules.direct-inner-html-assignment mainContent.innerHTML = window.generateEapLandingPage(registerUrl, isLoggedIn); mainContent.classList.add("reveal"); document.title = "Claude Certified Architect – Foundations | Anthropic Academy"; } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", applyEapLandingPage); } else { applyEapLandingPage(); } })(); // Segment tracking for the CCA access-request page. // PII redaction middleware ported from the apps repo's piiRedactionPlugin // (packages/contexts/segment/SegmentManager.ts). Segment is being replaced // in ~1-2 months per the thread, so this stays minimal. (function () { var EAP_PATH = "/claude-certified-architect-foundations-access-request"; var SEGMENT_WRITE_KEY = "cMVcw27lRPBUSlXS6KRnQ4Cf3J3rxSEG"; var currentPath = window.location.pathname.replace(/\/$/, ""); if (currentPath !== EAP_PATH) return; // Honor Global Privacy Control (CCPA/CPRA, Colorado, Connecticut). The apps // repo checks Sec-GPC server-side; spec guarantees the browser sets both in // sync, so navigator.globalPrivacyControl is an equivalent client-side gate. // We can't do geo-based explicit-consent gating — Skilljar is CloudFront- // fronted and no visitor country header is exposed client-side. if (navigator.globalPrivacyControl) return; // --- Segment analytics.js snippet v5.2.0 --- var i = "analytics"; var analytics = (window[i] = window[i] || []); if (analytics.initialize) return; if (analytics.invoked) { if (window.console && console.error) { console.error("Segment snippet included twice."); } return; } analytics.invoked = true; analytics.methods = [ "trackSubmit", "trackClick", "trackLink", "trackForm", "pageview", "identify", "reset", "group", "track", "ready", "alias", "debug", "page", "screen", "once", "off", "on", "addSourceMiddleware", "addIntegrationMiddleware", "setAnonymousId", "addDestinationMiddleware", "register", ]; analytics.factory = function (e) { return function () { if (window[i].initialized) { return window[i][e].apply(window[i], arguments); } var n = Array.prototype.slice.call(arguments); if (["track", "screen", "alias", "group", "page", "identify"].indexOf(e) > -1) { var c = document.querySelector("link[rel='canonical']"); n.push({ __t: "bpc", c: (c && c.getAttribute("href")) || void 0, p: location.pathname, u: location.href, s: location.search, t: document.title, r: document.referrer, }); } n.unshift(e); analytics.push(n); return analytics; }; }; for (var n = 0; n MW.end) return; var isCertPage = MW.matchesPath(location.pathname, MW.certBannerPaths); var DISMISS_KEY = isCertPage ? MW.certBannerDismissKey : MW.bannerDismissKey; try { if (localStorage.getItem(DISMISS_KEY)) return; } catch (e) {} function render() { if (document.getElementById("downtime-banner")) return; var text = "Scheduled maintenance: Anthropic Academy will be unavailable on " + MW.windowLabel + "."; if (isCertPage) { text += "
    The Claude Certified Architect – Foundations exam will close at " + MW.examClosesLabel + " to avoid interrupting in-progress attempts."; } var banner = document.createElement("div"); banner.id = "downtime-banner"; banner.setAttribute("role", "status"); banner.innerHTML = '
    ' + '' + text + "" + '' + "
    "; banner .querySelector(".downtime-banner__close") .addEventListener("click", function () { try { localStorage.setItem(DISMISS_KEY, "1"); if (isCertPage) localStorage.setItem(MW.bannerDismissKey, "1"); } catch (e) {} banner.remove(); document.body.classList.remove("has-downtime-banner"); window.removeEventListener("resize", setHeightVar); }); document.body.insertBefore(banner, document.body.firstChild); document.body.classList.add("has-downtime-banner"); function setHeightVar() { document.documentElement.style.setProperty( "--downtime-banner-h", banner.offsetHeight + "px" ); } setHeightVar(); window.addEventListener("resize", setHeightVar); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", render); } else { render(); } })(); (function () { var MW = window.MAINTENANCE_WINDOW; if (!MW || !MW.inExamLockout()) return; // Fallback only — the primary gate is the Skilljar published-course end // date. This covers the case where that wasn't set on one of the domains. if (!MW.matchesPath(location.pathname, MW.examLockoutPaths)) return; function render() { if (document.getElementById("ccaf-exam-lockout")) return; // The non-enrolled access-request view renders the EAP landing page, // which already shows the disabled Register button + maintenance note. if (document.querySelector(".eap__container")) return; var target = document.getElementById("lesson-body") || document.getElementById("lp-content") || document.getElementById("lp-wrapper") || document.getElementById("skilljar-content"); if (!target) return; var overlay = document.createElement("div"); overlay.id = "ccaf-exam-lockout"; overlay.setAttribute("role", "alert"); overlay.innerHTML = '
    ' + "

    Exam temporarily closed

    " + "

    The Claude Certified Architect – Foundations exam is closed for " + "scheduled maintenance and will reopen after " + "" + MW.reopensLabel + ".

    " + "

    Please return after the maintenance window to continue. Your " + "enrollment and any completed lessons are unaffected.

    " + "
    "; if (getComputedStyle(target).position === "static") { target.style.position = "relative"; } target.appendChild(overlay); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", render); } else { render(); } })(); // Inject this code into the Skilljar iframe page // Dev preview message bridge. Ships to prod but the origin check makes it // inert for real users — only localhost:3000 can trigger eval/style injection. window.addEventListener("message", function (event) { if (event.origin !== "http://localhost:3000") { return; } if (event.data.type === "code") { eval(event.data.code); } if (event.data.type === "clpdata") { window._clpdata = event.data.data; } // Check if the message is for updating styles if (event.data.type === "updateStyles") { // Remove any previously injected styles const existingStyle = document.getElementById("parent-injected-styles"); if (existingStyle) { existingStyle.remove(); } // Create new style element const style = document.createElement("style"); style.id = "parent-injected-styles"; style.textContent = event.data.styles; // Append to document head document.head.appendChild(style); } if (event.data.type === "hideStyles") { setupStyleObserver(); } }); // STYLE ELEMENT OBSERVER // Function to set up MutationObserver for style elements in head function setupStyleObserver() { // Remove any existing PROD_STYLES elements document.head.querySelectorAll("style").forEach(function (style) { if ( style.textContent.includes("PROD_STYLES") && style.id !== "parent-injected-styles" ) { style.remove(); } }); const observer = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { mutation.addedNodes.forEach(function (node) { if ( node.nodeName === "STYLE" && node.textContent.includes("PROD_STYLES") && node.id !== "parent-injected-styles" ) { node.remove(); } }); }); }); // Start observing the head element for style additions observer.observe(document.head, { childList: true, subtree: false, }); } // SKILLJAR REDIRECT AFTER LOGOUT // FIXME: get skilljar to override their server side redirect settings // 1. Hide the page immediately if we expect a redirect (function () { // Check if we're coming from a logout on a lesson page const redirectUrl = sessionStorage.getItem("redirect_after_logout"); if (redirectUrl) { // Add a style to hide the page content immediately const style = document.createElement("style"); style.textContent = ` body { visibility: hidden !important; opacity: 0 !important; } `; document.head.appendChild(style); // Check if user is logged out and redirect setTimeout(function () { if (typeof skilljarUser === "undefined") { sessionStorage.removeItem("redirect_after_logout"); window.location.replace(redirectUrl); } else { // User is still logged in, show the page document.body.style.visibility = "visible"; document.body.style.opacity = "1"; sessionStorage.removeItem("redirect_after_logout"); } }, 50); // Very short delay to check login status } })(); // 2. Intercept logout clicks on lesson pages document.addEventListener("click", function (event) { // Current URL pattern for lesson pages const currentUrl = window.location.href; const lessonPattern = /^(https:\/\/anthropic-poc\.skilljar\.com\/[^\/]+)\/\d+$/; const isLessonPage = lessonPattern.test(currentUrl); if (!isLessonPage) return; // Check for logout button const logoutButton = event.target.closest( 'a[href*="/logout"], a[href*="/sign-out"], .logout-button, .sign-out' ); if (logoutButton) { event.preventDefault(); // Extract course URL const match = currentUrl.match(lessonPattern); if (match) { const courseUrl = match[1]; sessionStorage.setItem("redirect_after_logout", courseUrl); // Add loading state to current page document.body.style.opacity = "0.5"; document.body.insertAdjacentHTML( "beforeend", `
    Signing out...
    ` ); } // Proceed with logout window.location.href = logoutButton.href; } }); // HIDE SIGN-IN LINKS FOR LOGGED-IN USERS (function () { if (typeof skilljarUser !== "undefined") { document.querySelectorAll(".signin, .clp__signin-text").forEach(function (el) { el.style.display = "none"; }); } })(); // REWRITE ANTHROPIC ACADEMY LINKS FOR LOGGED-IN PARTNERS USERS (function () { if (typeof skilljarUser === "undefined") return; if (window.self === window.top && window.location.hostname !== "anthropic-test.skilljar.com") return; var targetHref = "https://anthropic-partners.skilljar.com"; function rewriteAcademyLinks(root) { (root || document).querySelectorAll('a[href*="anthropic.com/learn"]').forEach(function (link) { link.href = targetHref; }); } rewriteAcademyLinks(); // Watch for dynamically added links (e.g., course landing page content) new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { mutation.addedNodes.forEach(function (node) { if (node.nodeType !== Node.ELEMENT_NODE) return; if (node.tagName === "A" && node.href && node.href.includes("anthropic.com/learn")) { node.href = targetHref; } if (node.querySelectorAll) { rewriteAcademyLinks(node); } }); }); }).observe(document.body, { childList: true, subtree: true, }); })(); // VIDEO PLAYBACK RATE // Video playback rate persistence script (function () { "use strict"; const STORAGE_KEY = "video-playback-rate"; // Function to save playback rate to session storage function savePlaybackRate(rate) { try { sessionStorage.setItem(STORAGE_KEY, rate.toString()); } catch (e) { console.error("Failed to save playback rate:", e); } } // Function to get saved playback rate from session storage function getSavedPlaybackRate() { try { const saved = sessionStorage.getItem(STORAGE_KEY); return saved ? parseFloat(saved) : null; } catch (e) { console.error("Failed to retrieve playback rate:", e); return null; } } // Function to setup video player function setupVideoPlayer(video) { // Skip if already setup if (video.dataset.playbackRateSetup) return; video.dataset.playbackRateSetup = "true"; // Listen for rate changes video.addEventListener("ratechange", function () { savePlaybackRate(video.playbackRate); }); // Listen for play event to restore saved rate video.addEventListener( "play", function () { const savedRate = getSavedPlaybackRate(); if (savedRate && savedRate !== video.playbackRate) { video.playbackRate = savedRate; } }, { once: true } ); // Only set rate on first play // Also set rate if video is already playing if (!video.paused) { const savedRate = getSavedPlaybackRate(); if (savedRate && savedRate !== video.playbackRate) { video.playbackRate = savedRate; } } } // Function to find and setup all video players function findAndSetupVideos() { const videos = document.querySelectorAll("video"); videos.forEach(setupVideoPlayer); } // Setup when DOM is ready if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", findAndSetupVideos); } else { findAndSetupVideos(); } // Watch for dynamically added videos const observer = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { mutation.addedNodes.forEach(function (node) { if (node.nodeName === "VIDEO") { setupVideoPlayer(node); } else if (node.querySelectorAll) { const videos = node.querySelectorAll("video"); videos.forEach(setupVideoPlayer); } }); }); }); // Start observing observer.observe(document.body, { childList: true, subtree: true, }); })(); // FA-CHECK ICON DISPLAY FIX // Function to change fa-check icons from display:block to display:inline function fixFaCheckIcons() { const faCheckIcons = document.querySelectorAll( 'i.fa.fa-check[aria-hidden="true"]' ); faCheckIcons.forEach(function (icon) { // Check if the icon has display: block style const computedStyle = window.getComputedStyle(icon); const inlineStyle = icon.style.display; // Check both computed style and inline style for display: block if (computedStyle.display === "block" || inlineStyle === "block") { icon.style.display = "inline"; } }); } // Run the fix when DOM is ready if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", fixFaCheckIcons); } else { fixFaCheckIcons(); } // Also watch for dynamically added fa-check icons const faCheckObserver = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { mutation.addedNodes.forEach(function (node) { if (node.nodeType === Node.ELEMENT_NODE) { // Check if the added node is a fa-check icon if (node.matches && node.matches('i.fa.fa-check[aria-hidden="true"]')) { if ( window.getComputedStyle(node).display === "block" || node.style.display === "block" ) { node.style.display = "inline"; } } // Check for fa-check icons within the added node if (node.querySelectorAll) { const icons = node.querySelectorAll( 'i.fa.fa-check[aria-hidden="true"]' ); icons.forEach(function (icon) { if ( window.getComputedStyle(icon).display === "block" || icon.style.display === "block" ) { icon.style.display = "inline"; } }); } } }); }); }); // Start observing for fa-check icons faCheckObserver.observe(document.body, { childList: true, subtree: true, }); // CHECKOUT PAYMENT PAGE LAYOUT FIX // Fix layout issue on checkout payment page by changing column width from large-7 to large-6 // This addresses a visual layout problem where the payment form column is too wide function fixCheckoutPaymentLayout() { // Only run on checkout payment pages if (!window.location.pathname.includes('/checkout/') || !window.location.pathname.includes('/payment')) { return; } const targetDiv = document.querySelector('.large-7.columns'); if (targetDiv && targetDiv.classList.contains('large-7')) { targetDiv.classList.replace('large-7', 'large-6'); } } // Run the fix when DOM is ready if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", fixCheckoutPaymentLayout); } else { fixCheckoutPaymentLayout(); } // Watch for dynamically added content (in case the element loads after initial page load) if (window.location.pathname.includes('/checkout/') && window.location.pathname.includes('/payment')) { const checkoutObserver = new MutationObserver(function (mutations) { const targetDiv = document.querySelector('.large-7.columns'); if (targetDiv && targetDiv.classList.contains('large-7')) { fixCheckoutPaymentLayout(); checkoutObserver.disconnect(); // Stop observing once we've made the fix } }); checkoutObserver.observe(document.body, { childList: true, subtree: true, }); } // CUSTOMIZE 404 PAGE FOR CERTIFICATION/EXAM PATHS // When users without exam access hit certification pages they get a 404. // Replace the generic "page not found" text with a message that tells them // what to actually do, based on their login state and email domain. (function () { var certificationPaths = [ "/claude-certified-architect-foundations-certification", "/anthropic-certification-practice-exam", "/anthropic-beta-certification-practice-exam", ]; var accessRequestPath = "/claude-certified-architect-foundations-access-request"; var currentPath = window.location.pathname.replace(/\/$/, ""); if (certificationPaths.indexOf(currentPath) === -1) return; function customize404() { if (!document.querySelector(".sj-page-error-404")) return; var titleSpan = document.querySelector(".sj-text-page-not-found span"); var explanationSpan = document.querySelector( ".sj-text-page-not-found-explanation span" ); if (!explanationSpan) return; var isPartnersHost = window.location.hostname === "anthropic-partners.skilljar.com"; var accessRequestLink = 'access request page'; var isLoggedIn = typeof skilljarUser !== "undefined"; // eapUserInAllowedGroup is defined in eap-landing-page.js — in lexical // scope here because build-js.js concatenates both files inside the same // IIFE. var inPartnerGroup = eapUserInAllowedGroup(); if (isLoggedIn && !inPartnerGroup) { // Logged in with a non-partner email. Logging in again won't help — they // need a different account. Mirror the EAP landing page warning. if (titleSpan) titleSpan.textContent = "Partner Email Required"; explanationSpan.innerHTML = "You aren’t signed in with a partner company employee email. " + "This exam is only available to employees at Anthropic partner companies. " + "Sign out and sign back in with your partner email, or visit the " + accessRequestLink + " to learn more."; return; } if (isLoggedIn && inPartnerGroup) { // Logged in with a partner email but no exam access — they haven't // completed the access-request attestation yet. if (titleSpan) titleSpan.textContent = "Access Request Required"; explanationSpan.innerHTML = "You need to complete the access request before you can take the exam. " + "Visit the " + accessRequestLink + " to get started."; return; } // Anonymous. Same login/signup flow as before, but clarify that // "company email" means "partner company email" and give them a way to // find out if their company qualifies. if (titleSpan) titleSpan.textContent = "Login Required"; var target = window.location.pathname + "?pc=ant-cca-f-eap-participants-02-24-2026"; var loginUrl = "/auth/login?next=" + encodeURIComponent(target); if (isPartnersHost) { // loginUrl interpolates window.location.pathname, but customize404() only // runs when currentPath matches one of the hardcoded certificationPaths // (indexOf check above), and the pathname is encodeURIComponent'd. // nosemgrep: home.runner.work._actions.anthropics.sast.main.rules.direct-inner-html-assignment explanationSpan.innerHTML = "This exam is only available to employees at Anthropic partner companies. " + 'Please log in with your partner company ' + "email, or visit the " + accessRequestLink + " to learn more."; } else { // anthropic.skilljar.com uses accounts.skilljar.com for signup with // domain (d) and theme (t) identifiers baked into the redirect chain. var signupUrl = "https://accounts.skilljar.com/accounts/signup/" + "?next=%2Fauth%2Fendpoint%2Flogin%2Fresult%3Fnext%3D" + encodeURIComponent(encodeURIComponent(target)) + "%26d%3Dcahl60vup5xv&t=3gufixqhei80k&d=cahl60vup5xv"; // Safe for the same reason as the isPartnersHost branch above. // nosemgrep: home.runner.work._actions.anthropics.sast.main.rules.direct-inner-html-assignment explanationSpan.innerHTML = "This exam is only available to employees at Anthropic partner companies. " + 'Please log in with your partner company ' + 'email, or sign up if you don’t ' + "have an account. Visit the " + accessRequestLink + " to learn more."; } } // Members of this group get 50% off the exam at checkout, but Skilljar's // course-detail purchase button still shows full price. Rewrite it so the // button reflects what they'll actually pay. var DISCOUNT_GROUP_ID = "rtvqiz3paj0x"; // ccaf-cpn-partners-50%-off-one-time var DISCOUNT_PERCENT = 50; function applyPartnerDiscount() { if (document.querySelector(".sj-page-error-404")) return; var groups = typeof skilljarUserStudentGroups !== "undefined" ? skilljarUserStudentGroups : []; var inDiscountGroup = false; for (var i = 0; i