.claude/skills/scenario-builder/SKILL.md
This skill should be used when the user asks to "add a new scenario", "create a scenario", "write a scenario", "build a new lesson", "add new content", "write new dialogues", "create a new role-play", "add a new topic", "build a lesson about [topic]", or anything involving creating or editing scenario JSON files for the MiltonLearnMandarin app.
npx skillsauth add mikhwan89/MiltonLearnMandarin scenario-builderInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill guides all scenario creation for the MiltonLearnMandarin app — an interactive Mandarin learning app for children aged 4–8, primarily for Milton (the developer's son).
A "scenario" is a short role-play conversation + quiz that teaches a real-world Mandarin exchange a child would have at school or in daily life.
app/src/main/assets/scenarios/app/src/main/assets/scenarios/index.json — new scenario filename must be added herescenario_XX.json (next number after highest existing)app/src/main/java/com/ikhwan/mandarinkids/data/models/ScenarioModels.ktEvery scenario file must conform exactly to this shape:
{
"id": "scene{N}_{snake_case_title}",
"title": "Chinese title (with English subtitle optional)",
"description": "One sentence in English describing the scenario",
"characterName": "Character's display name",
"characterEmoji": "Single emoji representing the character",
"characterRole": "teacher | classmate | parent | shopkeeper | friend | etc.",
"category": "ESSENTIALS | AT_SCHOOL | SCHOOL_SUBJECTS | FOOD_AND_EATING | FEELINGS_AND_HEALTH | PLAY_AND_HOBBIES",
"dialogues": [ ...DialogueStep ],
"quizQuestions": [ ...QuizQuestion ]
}
{
"id": 1,
"speaker": "CHARACTER | STUDENT",
"textChinese": "Full Chinese sentence",
"textPinyin": "Full pinyin with tone marks for every syllable",
"textEnglish": "Natural English translation",
"textIndonesian": "Natural Indonesian translation",
"pinyinWords": [ ...PinyinWord ],
"responseType": "LISTEN_ONLY | SINGLE_CHOICE | MULTIPLE_OPTIONS | TEXT_INPUT",
"options": [ ...ResponseOption ],
"userNameInput": false
}
LISTEN_ONLY — CHARACTER speaks, no response needed, auto-advances after a pauseSINGLE_CHOICE — exactly one correct option; one wrong option optionalMULTIPLE_OPTIONS — 2–3 options that are ALL correct (child chooses freely, any is valid)TEXT_INPUT — child types a free response (use sparingly; only for name input)userNameInput: true — only when the STUDENT must say their own name; only ONE step per scenario should ever have this{
"pinyin": "tóngxué",
"chinese": "同学",
"english": "classmate",
"indonesian": "teman sekelas",
"note": null
}
note — optional string. Use for particles (吗, 了, 的, 呢, 把), measure words, or any word a child might find confusing. Write the note in plain English a 5-year-old can understand. Leave null for regular vocabulary words.{
"chinese": "谢谢老师!",
"pinyin": "Xièxie lǎoshī!",
"english": "Thank you, teacher!",
"indonesian": "Terima kasih, guru!",
"pinyinWords": [ ...PinyinWord ],
"isCorrect": true
}
MULTIPLE_OPTIONS, ALL options should have isCorrect: true (they're all acceptable responses)SINGLE_CHOICE, one option has isCorrect: true, others have isCorrect: falsepinyinWords array — same rules as the parent dialogue step{
"direction": "TRANSLATION_TO_CHINESE | CHINESE_TO_TRANSLATION | AUDIO_TO_TRANSLATION",
"questionText": "The prompt shown to the child",
"questionChinese": "",
"questionPinyin": "",
"options": [ ...QuizOption ],
"correctAnswerIndex": 0,
"explanation": "Brief child-friendly explanation of the correct answer"
}
TRANSLATION_TO_CHINESE — English/Indonesian phrase shown → pick the correct Chinese+pinyinCHINESE_TO_TRANSLATION — Chinese+pinyin shown → pick the correct English translation. Set questionChinese and questionPinyin; set questionText to "What does this mean?"AUDIO_TO_TRANSLATION — TTS plays the Chinese → pick the correct English meaning. Set questionChinese (the audio source) and questionPinyin; set questionText to "Listen and choose the correct meaning!"correctAnswerIndex is 0-based.CHINESE_TO_TRANSLATION and AUDIO_TO_TRANSLATION options: only translation is filled, chinese and pinyin are ""{
"chinese": "早上好,老师",
"pinyin": "Zǎoshang hǎo, lǎoshī",
"translation": "Good morning, teacher"
}
| Value | Display | Emoji | Use for |
|-------|---------|-------|---------|
| ESSENTIALS | Essentials | 👋 | Greetings, introductions, farewells, basic social phrases |
| AT_SCHOOL | At School | 🏫 | Classroom requests, asking teacher, borrowing things, getting help |
| SCHOOL_SUBJECTS | School Subjects | 📖 | Maths, science, Chinese class, answering questions in class |
| FOOD_AND_EATING | Food & Eating | 🍎 | Canteen, snacks, sharing food, ordering, food preferences |
| FEELINGS_AND_HEALTH | Feelings & Health | 💗 | Emotions, illness, telling an adult how you feel |
| PLAY_AND_HOBBIES | Play & Hobbies | ⚽ | Playground, sports, inviting friends, talking about hobbies |
TRANSLATION_TO_CHINESE, CHINESE_TO_TRANSLATION, and AUDIO_TO_TRANSLATION.LISTEN_ONLY step, follow it immediately with a meaningful STUDENT turn (don't chain two LISTEN_ONLY steps back-to-back).MULTIPLE_OPTIONS steps: offer 2–3 responses that are all socially valid in the situation. Don't include wrong or rude options unless it is a SINGLE_CHOICE quiz-style step.textPinyin must match textChinese exactly — every character in the Chinese maps to a syllable in the pinyin, in order.pinyinWords should match the corresponding segment in textPinyin exactly (same tone marks, same spacing).pinyinWord entry (e.g. "同学" → "tóngxué").pinyinWords entries: the english and indonesian fields are glosses (word-level meanings), not full sentence translations. They will be shorter and more literal than textEnglish / textIndonesian.This is the most commonly missed requirement. Every pinyinWords array must:
textPinyinnote for: 吗、了、的、呢、把、着、嘛、呗 and any measure word or grammatical particleWhen asked to create a scenario, follow these phases:
textChinese for each step — keep sentences short and naturaltextPinyin — add correct tone marks to every syllabletextEnglish — natural EnglishtextIndonesian — natural conversational IndonesianresponseType logically:
LISTEN_ONLYSINGLE_CHOICEMULTIPLE_OPTIONSpinyinWords for every step and every option — cover every word, no gapsnote fields for all particles and confusing grammar wordsTRANSLATION_TO_CHINESE, CHINESE_TO_TRANSLATION, AUDIO_TO_TRANSLATION)correctAnswerIndex carefully (0-based, double-check)explanation for each correct answerRun every check in .claude/skills/scenario-builder/references/qa-checklist.md.
Do not output the JSON until all checklist items pass.
scenario_XX.json)index.json| Mistake | Correct approach |
|---------|-----------------|
| Missing tone mark on a syllable | Every syllable gets a mark except neutral-tone ones |
| textPinyin doesn't match textChinese character count | Count syllables — one per character |
| pinyinWords skips particles (是、在、了、吗) | Every word in the sentence must appear in pinyinWords |
| Using formal Indonesian (saya/Anda in child-to-child) | aku/kamu for peer speech, saya for child-to-adult |
| Sentence too long (>18 chars) | Split into two dialogue steps |
| All quiz questions same direction | Mix all three QuizDirection types |
| correctAnswerIndex wrong | Re-count 0-based index after writing options |
| MULTIPLE_OPTIONS with one wrong option | All options in MULTIPLE_OPTIONS must be valid |
| Realistic but depressing scenario | Always ends warmly and positively |
| Quiz explanation is just a repeat of the answer | Explain why or give context ("You say this when...") |
testing
This skill should be used when the user asks to "improve the UI", "fix the design", "make it look better", "improve UX", "improve the layout", "review the screen", "audit the interface", "make it more child-friendly", "improve accessibility", "fix spacing", "add animation", "improve colors", "redesign", "polish the app", or discusses visual design, user experience, Jetpack Compose styling, Material Design 3, component design, touch targets, readability, or anything related to how the app looks and feels.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.