Use when the user wants consumer or user research with AI personas — virtual customer interviews, focus groups, concept tests, persona building from uploaded materials, a reusable persona panel, or follow-up questions to a specific persona in an existing study.
89%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Turn one business question into a study: clarify, plan, desk research, AI personas, interviews and focus groups, an evidence-backed report, and a questionnaire for retesting with real people. Each study lives in its own directory and drives the research workspace UI through study.json.
update_study, save_personas, check_interviews, save_study_synthesis, save_validation_questionnaire) -> reference/tools.md. Read it before the first call in a conversation.validation-results.json -> reference/file-contracts.md. The tools write every other structured file.outcome_terms, sample quota, persona writing rules, interview guide and its self-check, the probing protocol, focus-group rules, real-voice sampling, and all synthesis rules (theme coding, prompted answers, homogeneity, saturation, verdict and confidence rules, quote checks, decision-relevant recommendations) -> reference/methods.mdreport.html (edit a private draft copied from the chosen template file, then publish it in one step; never rewrite its structure or show unfinished content), choosing its template, and creating or changing report templates (such a request alone starts no study) -> reference/report-templates.mdsynthesis.json -> reference/report-charts.mdask_user interaction rules -> the "Interaction Rules (New Research, Deepening, and Follow-ups)" section of the deep-research skill (deep-research/SKILL.md). Read that skill before your first ask_user call in a conversation and apply only that section as written; its research workflow, depth modes, and report template do not apply to persona research.ask_user. A timeout, a skip, a tool failure, or returned preference defaults are not approval.persona_chat; never invent or fill in an answer. Keep transcript answers and quoted wording exact. Summarize findings in your own voice with citations, and never present a summary as the persona's own utterance.mixed ("pending real-person validation") and its themes are to_validate.study.json, panel.json, persona files, transcripts, synthesis.json, or the questionnaire CSV with file tools or Python.| Item | Default | Maximum |
|---|---|---|
| Personas per study | 8 | 12 |
| Automatic interview ceiling per persona (one question + one answer = one round; not a quota) | 20 | 20 |
| Focus-group rounds per discussion | 7 | 7 |
| Interviewer sub-agents running in parallel | up to 4 | 4 (each handles 2-3 personas) |
| Focus groups you plan yourself | 0 (only if the plan includes one) | 2, with 3-6 participants each |
| Focus groups the user asks for later | as requested | no planning cap; persona_chat stops at 10 per study as a safety limit |
persona_chat max_tokens per answer | 400 | 800 |
personas/<persona_id>.json persona library, shared across studies in this project
panels/<panel_id>.json saved persona groups
templates/<name>.html report templates (visual style only), shared across studies
studies/<slug>/study.json study state (drives the UI stepper)
studies/<slug>/plan.md
studies/<slug>/desk-research.md
studies/<slug>/panel.json personas used in this study and why
studies/<slug>/interviews/<persona_id>.json
studies/<slug>/discussions/<discussion_id>.json
studies/<slug>/synthesis.json themes, stances, and saturation behind the report
studies/<slug>/report.html
studies/<slug>/validation-questionnaire.md
studies/<slug>/validation-questionnaire.csv
studies/<slug>/validation-results.json AI vs. real-person comparisonupdate_study creates the study directory and save_personas creates persona ids; use the paths they return./).study.json drives the UI stepper. Move it only with update_study, at these moments: created (study starts), clarified, plan_confirmed, desk_research_done or desk_research_skipped, interviews_finished, report_written, questionnaire_written, and validation_compared. The tool sets every phase status and refuses an event that does not fit the current phase.
When a step stops (unanswered question, user interruption, failure), send no event: the current phase stays running, and every file already written is kept.
clarify)web_search with 2-3 differentiated queries to understand the topic's shape. No deep reading yet.update_study event created (it links the study to the current topic).select questions in one direct ask_user call: the decision the study should inform, target audience, and study type (see methods.md). Skip questions the user already answered, including settings in a 【研究设置】 line at the end of the message (访谈人数 = persona count, 访谈深度 = adaptive interview depth (quick, standard, or deep); legacy 访谈轮数 is an explicitly requested ceiling, 研究方式 = study type); never ask those again. When 研究方式 reads 自定义:<text>, pick the closest study type, use the user's text to shape the framework and plan, and do not ask about study type. When 指定人设 lists persona files, use exactly those personas as the interview panel without rewriting them, and recruit extra personas only if 访谈人数 is larger than the list. Write questions and options in plain business language a shop owner understands, not research jargon, in the user's language and customized from the pre-search. Put the recommended option first, mark it as recommended, and set it as the default.phase=clarify, and stop.plan)studies/<slug>/plan.md: the decision, study type, framework, target audience, 3-5 hypotheses with support and refute criteria and outcome_terms, the sample quota table (segment, criteria, count; at least 25% non-users, skeptics, or churned users; counts add up to 访谈人数 when set), interview depth (quick: prioritize essential coverage, usually 3-5 rounds; standard or automatic: usually 8-12 rounds; deep: probe unresolved decision-relevant details further), a safety ceiling of 20 rounds per persona (never a target; honor a lower ceiling explicitly requested by the user), whether to run a focus group, the interview guide (3-5 shared core questions plus adaptive probes; reduce core questions for a quick interview, one question each), a "Guide self-check" section, deliverables with the report template (report-templates.md), and the AI-simulation limitation. See methods.md for hypotheses, quota, and the guide self-check.ask_user directly with one final select question and no default, with options to start the study as planned, adjust the hypotheses, or adjust the sample. Only the start option is approval.update_study event plan_confirmed with the plan fields and interview_rounds: 20 unless the user explicitly requested a lower ceiling. The depth preference belongs in plan.md; never translate an expected range into a hard round limit. Adjustment requested: revise plan.md and confirm again. Timeout, skip, or refusal: stop at the plan phase and say the study has not started. If clarification was answered or skipped as unnecessary, send clarified before showing the plan.desk_research)web_search rounds from the plan's open questions; read the most relevant pages in full with read_webpages_as_markdown. Search results are snippets, not evidence.studies/<slug>/desk-research.md: findings grouped by plan question, each with a numbered source [S1] (title, URL, publish date when known), a "Real Voices" section, and a "Limitations" section.[S#] once; hypotheses and synthesis.json reuse these numbers.update_study event desk_research_done with social_sampling (what was sampled, or why nothing was).interview)Hard rules for every persona in the study, new or reused:
save_personas rejects stance fields containing a hypothesis's outcome_terms; rewrite them, or do not select that reused persona. Reuse only personas built for this study's category.layers.cognition.decision_weights is a qualitative ranking: [{ "factor", "level": "high" | "medium" | "low" }], never numbers.field_sources for all 7 dimensions (evidence ids, or "inferred") and record cross-layer contradictions in consistency_notes instead of smoothing them out.save_personas sets tier by rule: at least 3 web, social, or upload evidence items cited by both needs_pains and behavior make a persona evidence_based. Cite evidence honestly; do not pad it to reach the tier.Steps:
list_dir personas/, read candidate files, and keep those that match a quota segment and pass the rules above.field_sources, and evidence linking to desk-research sources. Within a segment, make personas differ in behavior and circumstances, not just demographics.save_personas call, in interview order, each with its quota segment and selection reason. Set library_panel_name only if the user asked to save the group.assign_persona_portraits for the whole panel. It binds images from the official library at no generation cost. Never call generate_images for avatars before its result is printed; generate only for personas it leaves unresolved.interview)persona-interviewer sub-agent per group in the background with the subagents skill (call_subagent via run_sdk_snippet), then wait_for_subagents until all are finished.plan.md, the depth preference and stopping criteria from plan.md, the round ceiling (not a quota), max_tokens for persona_chat, the exact output paths, the quality requirements, the parallel-context line, what is out of scope (other personas, persona files, study.json, report), and the final report it must return. Do not pass the hypotheses to interviewers; they must not steer answers toward them.discussions/<discussion_id>.json path, a one-line topic in the user's language (passed as topic on round 1), and 3-6 participants already interviewed or selected. Each focus group of a study gets its own file and topic.from sdk.tool import tool
result = tool.call("call_subagent", {
"agent_name": "persona-interviewer",
"task_label": "<short label in the user's language>",
"prompt": """Objective: run one-on-one interviews with 2 personas for this study.
Study directory: studies/<slug>
Personas: personas/<persona_id_a>.json, personas/<persona_id_b>.json
Interview guide:
1. <question>
2. <question>
Depth: standard (usually 8-12 rounds, never a required count). Safety ceiling: 20 automatic rounds per persona; stop earlier when sufficient. persona_chat max_tokens: 400.
Adaptive interviewing: cover the shared core questions for comparison, then choose probes from this persona's actual answers, not demographics. Resolve decision-relevant gaps, unclear reasons, contradictions, constraints and counterexamples. Stop after core coverage and two consecutive probes add no useful information; do not repeat answered questions. Report the stopping reason and remaining gaps.
Quality: one question per round. Follow the probing protocol: start each topic from the most recent real occasion, go one layer deeper on key answers, run one pressure round with the strongest counter-argument, and ask at least one "when would you not use this, or give up on it" question. Do not quote profile details the persona has not said. In a focus group, rotate the speaking order every round.
Transcripts: studies/<slug>/interviews/<persona_id_a>.json and studies/<slug>/interviews/<persona_id_b>.json. persona_chat records every round (pass transcript_path and round_number); close each transcript with finish_persona_transcript.
Parallel context: 4 interviewer sub-agents run at the same time. You own only the two personas above. Do not touch other transcripts, persona files, study.json, or the report. The research lead merges the results.
Report: each file path, status, completed rounds, and the 2-3 most important findings.""",
"background": True,
"resume": False,
})
print(result.content)
session_id = result.data["session_id"]check_interviews. For unfinished transcripts (interrupted or not started), dispatch interviewer sub-agents again with a continuation brief: the same personas and transcript paths, depth preference and stopping criteria, the round to continue from, and "the transcript already holds the earlier rounds". A failed interview stays failed with its error; redo it only after its cause is fixed, and say so.check_interviews shows no unfinished transcript, call update_study event interviews_finished, then read the completed transcripts.report, validation)Follow the Synthesis section of methods.md for every rule named below.
save_study_synthesis call: segments, themes with stances and exact-word quotes, dimensions when useful, and hypothesis verdicts with their quotes and sources.synthesis.json and the sources, and place them in findings (or hypotheses).studies/<slug>/report.html from it, synthesis.json and the hypotheses, and run the delivery check before publishing. Never turn what AI personas said into established causes or statistical results.studies/<slug>/validation-questionnaire.md for real respondents: screening questions matching the quota, then the guide questions rewritten for real people with ids Q1, Q2, ... and each tagged with its hypothesis id, for example Q3 [H2]; a recommended sample of 8-15 real people; recruiting channels (existing customers, staff and their networks, industry communities); a short invitation script; and how to send the answers back (upload the file in this conversation and ask to compare).save_validation_questionnaire; it writes validation-questionnaire.csv for survey tools.update_study with report_written after report.html (step 4) and with questionnaire_written after step 6. Reply with links to the report and the questionnaire, the hypothesis verdicts, and any remaining validation priorities (at most 3, without filling a quota). Write the reply in the user's language, including the verdict words (never the raw values supported, mixed, refuted, insufficient; use the user's-language equivalents the report uses).When the user uploads real respondents' answers (spreadsheet, CSV, survey export, interview notes, or screenshots) and asks to compare them with the study:
study.json, validation-questionnaire.md, and the uploaded files. Convert documents with the document-converter skill; read screenshots with visual_understanding.studies/<slug>/validation-results.json: respondent count, source files, the AI vs. human verdict and agreement per hypothesis with short de-identified quotes, per-question comparison, and a summary.update_study event validation_compared with validated_count and each compared hypothesis's result. The AI verdict stays unchanged.save_study_synthesis and those themes at high.ask_user whether to turn the de-identified real answers into imported personas in the library; create them only on a yes.persona_chat directly once, preserving the exact question, with the next round_number and follow_up_request_id copied from the context id. This is outside the automatic interview round budget. Reuse the ID on retries; when already recorded, read the answer and do not call again. The tool saves the question and answer and completes the turn. Do not call an interviewer sub-agent, ask another question, finish the transcript, change the study state, or regenerate synthesis/report for this request. Keep the final acknowledgement short in the user's language; tool failures must be reported honestly.study.json, plan.md, transcripts, report) instead of relying on memory.persona_chat (directly with the transcript's transcript_path and next round_number, or through one interviewer sub-agent for several rounds) within the remaining round limit (when none remain, tell the user instead of calling persona_chat), close the transcript again with finish_persona_transcript, and update the report section the new answers affect. Say which answers are new.personas/<id>.json) or that persona's transcript (interviews/<id>.json) and asks what the persona would think, say, or do, treat it as the follow-up above and get the answer from persona_chat. Never answer in the persona's voice yourself; questions about the file itself (summarize, compare, quote) are answered from the file.save_personas append: true) when a finding rests on few people, all supporters share one segment, or the user wants to know whether it holds for others. A finding confirmed by new people is stronger evidence than the same people repeating it.
Synthesis counts each persona once per theme (stance_by_persona), however many discussions they joined, so repeating the same people never adds votes; say in the report which conclusions were confirmed by newly added personas.Some deployments add social-platform data skills (searching posts or videos, reading comments and creator profiles) to your available skills. Check your skills list; never assume one exists.
evidence[].type = "social" with platform set to the platform key (for example xiaohongshu, douyin), put the post URL in url, and start title with the platform name, for example Xiaohongshu: <post title>. Social posts found through web search are also social.When the user asks only to build personas (for example "只构建人设,不做研究", or uploads interviews, surveys, or customer data to turn into personas) and asks for no study, run this short flow instead of Phases 1-6. Rule 1 does not apply; the draft approval below replaces plan approval.
update_study created with study_type: "persona_build".web_search rounds for evidence. If the input only has demographics, say the personas would be mostly inferred and ask with ask_user whether to continue or add material.imported for uploaded material about real people, otherwise by the evidence rule). List the kinds and counts of identifiers removed. Then call ask_user with one select question and no default: save to the library, or adjust first. Only the save option is approval; on adjust, revise and ask again.save_personas (from_uploaded_people: true and upload evidence citing evidence[].file for uploaded people). Reply with the saved names; do not interview them or write a report.manual personas are written by the user in the persona library. Reuse them like any other persona, but never change their content or tier.
dtyq/magic
0f1432c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.