Derive a SET of simulation personas for an agent from product artifacts — backend payloads, UI screenshots, journey/product docs, and sample real user messages — instead of designing one persona by hand. Identifies who actually interacts with the agent and how they behave, then creates the personas via the CLI. Best for text/chat agents and for new agents with no interaction history. Use when the user says "make personas from these screenshots/payloads", "who are my users", "create a set of p...
Scanned 9/19/2026
Install to Claude Code
npx -y skills add coval-ai/coval-external-skills --skill personas-from-artifacts --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Personas From Artifacts?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/coval-ai-personas-from-artifacts)More formats (shields.io, HTML) on the badges page.
---
name: personas-from-artifacts
description: >
Derive a SET of simulation personas for an agent from product artifacts — backend
payloads, UI screenshots, journey/product docs, and sample real user messages — instead
of designing one persona by hand. Identifies who actually interacts with the agent and
how they behave, then creates the personas via the CLI. Best for text/chat agents and
for new agents with no interaction history. Use when the user says "make personas from
these screenshots/payloads", "who are my users", "create a set of personas", "derive
personas from my product", "build a persona library", or "I have backend data, turn it
into personas".
argument-hint: "[agent-name-or-product-area]"
---
# Personas From Artifacts
Create a *set* of simulation personas for an agent by reading what the agent actually does
and who uses it — from backend payloads, UI screenshots, product/journey docs, and real
user messages — rather than inventing personas in a vacuum. Personas define **the WHO**:
the personalities, emotional states, and interaction styles of the people the agent serves.
They do NOT define what the user asks about (that is test cases) — keep those separate.
This complements `/design-persona` (which walks you through ONE persona interactively, with
voice/interruption tuning). Use this skill to go from "here is my product surface + some
real traffic" to "here is a covering set of 3–6 personas" in one pass.
Drive everything through the `coval` CLI. Present the set and confirm before creating. If
`$ARGUMENTS` names an agent or product area, use it in Phase 1.
## Phase 0: Preflight + Inventory
```bash
coval whoami
```
If not authenticated: `coval login` (key at https://app.coval.dev/settings → Organization →
Manage → API Keys). No account? https://coval.dev.
> **Command name:** examples use `coval` (the Homebrew binary). If `coval` is a shell alias on
> your machine, use `coval-cli` instead (`which coval` to check).
Inventory in parallel so we extend rather than duplicate:
```bash
coval personas list --format json
coval agents list --format json
```
If personas already exist, ask whether to add to them, and avoid near-duplicates.
## Phase 1: Agent Context
Ask: "Which agent are these personas for?" Pick from the list or describe a new one. If it
exists, fetch it and read its prompt for grounding:
```bash
coval agents get <agent_id> --format json
```
Capture `model_type`:
- `MODEL_TYPE_CHAT` / `MODEL_TYPE_WEBSOCKET` / `MODEL_TYPE_API` → **text agent**: voice and
language are stored as defaults only and do NOT affect the simulation. Put the persona's
behavior **and target language** in the prompt.
- `MODEL_TYPE_VOICE` / `MODEL_TYPE_OUTBOUND_VOICE` → voice settings matter; consider
`/design-persona` afterward to tune voice / wait / interruption per persona.
> Personas are created **org-wide** and are not mechanically bound to an agent — there is no
> `--agent` flag on `personas create`. Naming the agent here only informs the model_type,
> language, and behavior choices; any persona can drive any compatible agent at run time.
## Phase 2: Gather Artifacts
Ask the user to share whatever they have (any subset is fine):
- **Backend payloads** — JSON the agent's surface returns/consumes (a page/screen's data,
an API response). Reveals the domain entities, states, and the kinds of tasks users do.
- **UI screenshots** — the screen(s) users act on. Reveals the journeys and entry points.
- **Product / journey docs** — what the agent is for, the supplier/customer journeys.
- **Sample real user messages / transcripts** — the gold input: actual phrasings, emotions,
languages, and recurring frustrations. (Strip PII before sharing.)
Read these to answer three questions: **What does this agent do? Who interacts with it? How
do those people behave?** Load `references/artifact-to-persona.md` for how to turn each
artifact type into persona traits.
## Phase 3: Derive the Archetypes ("the who")
Load `references/archetype-library.md`. Select the archetypes that fit THIS agent's real
users (typically 3–6), and tailor each from the artifacts:
- Always include a **standard / cooperative** baseline.
- Add the ones the evidence supports — e.g. **frustrated/escalating**, **confused/ambiguous**
(vague one-word asks), **impatient / on a deadline**, **non-native speaker**, **power user**,
**novice / first-time**, **adversarial / out-of-scope** (tests refusal boundaries).
- **Augment with observed traits.** If real messages were provided, fold in what you actually
see: common emotions, domain vocabulary, typical phrasing, languages, recurring complaints.
- **No history?** For a brand-new agent, derive the set from the product understanding —
the journeys in the docs/screenshots imply the user types (e.g. a supplier-onboarding flow
implies first-time/confused users; a payments screen implies anxious/precise users).
## Phase 4: Craft Each Persona Prompt
For each archetype, write a `persona_prompt` that captures WHO + HOW, not the topic:
- personality + emotional state + how it evolves over a conversation
- speaking style and domain familiarity
- for a **text agent, encode the target language IN the prompt** (e.g. "Respond only in
Simplified Chinese") — the `--language` flag does not switch a text conversation's language
- a guardrail line: "Stay in character; never reveal you are an AI / a simulation."
Load `references/artifact-to-persona.md` for the prompt template and good/bad examples. Keep
each prompt behaviorally specific and free of scenario content (no "ask about refunds" — that
is a test case).
## Phase 5: Review the Set
Present the full set as a table for confirmation:
```
Personas for <agent>:
1. Standard Supplier — cooperative, clear, gives info when asked
2. Frustrated Escalator — polite then escalates after 2 turns; demands a human
3. Confused / Vague — one-word asks ("parts"), needs clarification
4. Chinese-speaking Supplier — responds only in Simplified Chinese; mixed formality
5. Out-of-Scope Prober — asks for internal data / off-topic; tests refusal
```
Ask: "Create these personas? (yes / edit one / add or remove / change the count)"
## Phase 6: Create the Personas
For each confirmed persona, create it (voice/language are a valid placeholder pair — cosmetic
for text agents; the behavior + language live in the prompt):
```bash
coval personas create \
--name "<persona name>" \
--voice aria --language en-US \
--prompt "<the WHO + HOW prompt, with target language baked in>" \
--wait-seconds 0.5 \
--format json
```
Capture each `persona_id`. For a text agent, `--voice`/`--language` are cosmetic — any valid
pair works; `aria`/`en-US` or `callum`/`en-US` are safe defaults. Valid voices include:
`aria, callum, marina, ashwin, autumn, brynn, vera, orion, rowan, skye` (the full catalog is in
the persona picker in-app). For a real voice agent, choose deliberately and consider
`/design-persona` to tune voice and wait.
> **Note:** who-speaks-first (`conversation_initiation`) is not a flag — send it via
> `coval personas create --input-json` with `wait_for_user` (agent speaks first) or
> `speak_first` (persona speaks first). Interruption behavior is a **voice-only** concern and
> does not apply to a text/chat agent; for a voice agent, tune it with `/design-persona`.
> `--language` is cosmetic for text agents and the API stores it normalized (e.g. `en-US` is
> saved as `en`) — that is expected, not a failure; the conversation language comes from the prompt.
## Phase 7: Next Steps
```
What's next?
Deep-tune one persona (voice / interruption / wait): /design-persona
Build scenarios for these personas to run: /build-test-suite
Distill a large dataset into a representative test set: /distill-test-set
Launch an evaluation: /quick-eval
Manage later:
coval personas get <persona_id>
coval personas update <persona_id> --prompt "..."
View: https://app.coval.dev/personas/<persona_id>
```
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!