| name | quiz |
| description | Interactive study session for the Claude Certified Architect (CCA-F) certification exam. Use when the user says things like "help me prepare for the Claude certification exam", "quiz me", "let's study for the cert", "practice CCA-F questions", or names an exam domain to drill (agentic architecture, MCP, Claude Code, prompt engineering, context management). |
| argument-hint | [optional domain or topic, e.g. 'mcp' or 'd3'] |
CCA-F Study Session: teach one topic, drill 5 questions, record results
Follow these steps in order. Speak conversationally; never dump raw file contents at the user.
Step 0 — Resolve paths
- Content (read-only):
${CLAUDE_PLUGIN_ROOT}/content/ — topic lessons in topics/, question banks in bank/.
- User data:
${CLAUDE_PLUGIN_DATA}. If that variable is unset or empty, use ~/.claude/plugins/data/learn-claude instead. Create the directory if it does not exist.
- Progress files live in the data directory:
progress.md and history.md.
Step 1 — Load state (first run: orient and initialize)
Read progress.md. If it does not exist, this is a first run:
- Give a ~30-second orientation: the CCA-F exam is 60 multiple-choice questions in 120 minutes, scored on a 100–1000 scale with 720 to pass. Five domains: D1 Agentic Architecture (27%), D2 Tool Design & MCP (18%), D3 Claude Code (20%), D4 Prompting & Structured Output (20%), D5 Context & Reliability (15%). Questions are framed in production scenarios, not trivia. This plugin teaches a topic, then drills 5 exam-style questions, and tracks your accuracy per topic.
- List the topic files in
${CLAUDE_PLUGIN_ROOT}/content/topics/ and create progress.md with one table row per topic file (30 rows), exactly in this format:
# CCA-F Study Progress
## Summary
Total answered: 0 | Overall: 0% | Streak: 0 days | Last session: never
## Topics
| Topic | Domain | Seen | Asked | Correct | Accuracy | Last studied |
|-------|--------|------|-------|---------|----------|--------------|
| d1-01 | 1 | 0 | 0 | 0 | - | - |
- Create
history.md containing only # CCA-F Study History followed by a blank line.
If progress.md exists but is missing a row for a topic file now present in ${CLAUDE_PLUGIN_ROOT}/content/topics/ (content added in an update), append the missing row(s) with zeroed stats before continuing.
Step 2 — Pick a topic
If the user named a domain or topic (in the skill argument or their message), honor it. Map natural names to domains: "mcp"/"tools" → d2; "claude code" → d3; "prompting"/"structured output" → d4; "context"/"reliability" → d5; "agents"/"orchestration"/"architecture" → d1. If they named something more specific ("tool descriptions", "hooks", "plan mode"), pick the nearest topic id by title. If they named only a domain, pick the best topic within it using the scoring below.
Otherwise, compute a score for every topic from the progress table:
- need = 3 if never seen; 2 if accuracy < 70%; otherwise 1 / (days since last studied + 1)
- score = domain weight × need, where weights are d1=27, d2=18, d3=20, d4=20, d5=15
Pick the highest score; break ties randomly. Tell the user which topic you picked and why in one short line (e.g. "Picking d2-04 (MCP configuration) — never seen, and D2 is 18% of the exam.").
Step 3 — Teach
Read the topic file ${CLAUDE_PLUGIN_ROOT}/content/topics/<id>-*.md. Present the lesson conversationally — do not paste the file. Render the Lesson section as prose in your own flow, then the Key facts as a tight bullet list, then the Exam traps. Keep the whole thing under about one screen. Close with: ready for questions, or want more depth first? If they want depth, expand from the lesson; then proceed.
Step 4 — Drill (5 questions)
- Load
${CLAUDE_PLUGIN_ROOT}/content/bank/domain-<n>.md (n = this topic's domain) and extract this topic's question blocks — headers of the form ### Q <topic>-qNN, each with a stem, options A–D, answer, and explanation.
- Cross-check
history.md: a question counts as already asked if its ID appears on any quiz session line. Skip already-asked questions; use only unasked ones. Lines tagged exam-mode do NOT retire questions from drills — re-drilling something met in a mock is good practice.
- If fewer than 5 unasked bank questions remain (or the bank file is missing entirely), generate the shortfall yourself: write a scenario-grounded stem set in one of this topic's official scenarios — resolve the topic file's numeric
scenarios frontmatter via the legend in ${CLAUDE_PLUGIN_ROOT}/content/scenarios.md — 4 options, same difficulty band as the bank. Build the three distractors from these archetypes: (a) plausible but documented anti-pattern, (b) right idea applied at the wrong layer, (c) works but violates a stated constraint. Give generated questions IDs <topic>-gNN (g = generated), numbering them so they do not collide with IDs already in history.
- Ask ONE question at a time using the AskUserQuestion tool:
- question text = the stem
- exactly 4 options, each labeled with its full text prefixed "A) ", "B) ", "C) ", "D) "
- header = the question ID
- NEVER reveal or hint at the answer before the user picks.
- After each answer, say whether it was correct or incorrect, give the explanation — why the right option is right and why each wrong option is wrong — then move to the next question. Track each result (question ID, user's letter, correct letter).
Mid-quiz edge cases:
- If the user says "skip" or asks a side question, answer briefly, then re-ask the same question. A skipped question they never answer does not count as asked.
- If the user quits mid-session, go to Step 5 immediately and record only the questions actually answered (Asked/Correct reflect the real count, not 5). If they answered zero questions, leave
progress.md untouched and append nothing to history.
Step 5 — Record and close
After the last question, update progress.md:
- This topic's row: Seen +1; Asked + number answered; Correct + number correct; Accuracy = Correct/Asked as a whole percent; Last studied = today (YYYY-MM-DD).
- Summary line: recompute Total answered (sum of Asked) and Overall (sum Correct / sum Asked as %). Streak: +1 if Last session was yesterday; reset to 1 if it was older (or never); leave unchanged if it was already today. Set Last session = today.
Append ONE line to history.md for the session:
- <YYYY-MM-DD> quiz <topic>: <qid> ✓ B, <qid> ✗ A (correct: C), ...
One entry per question answered: ✓ plus the user's letter when correct; ✗ plus the user's letter and (correct: <letter>) when wrong.
Then show a mini-summary — score on this topic (n/5) and the topic's updated accuracy plus the domain's overall accuracy — and offer three choices: another topic (recompute the Step 2 pick), switch to a domain they name, or stop. If they continue, loop back to Step 2 (or straight to Step 3 if they named the topic).