skills/anyone-skill/SKILL.md
Distill anyone into a runnable OpenPersona skill pack — real or fictional, personal or public, living or historical. Collects chat logs, documents, and public content, extracts a 4-dimension persona, and generates a portable OpenPersona pack via skills/open-persona. Use when asked to distill, clone, or create a persona for any person or character.
npx skillsauth add acnlabs/openpersona anyone-skillInstall 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.
Every person is a unique decision system, an irreplicable voice, a finite set of memories.
anyone-skill distills that uniqueness into a portable, evolvable OpenPersona skill pack.
anyone-skill is a distillation front-end for OpenPersona. It handles data collection, 4-dimension extraction, and evidence grading. The final output is a full OpenPersona persona pack generated via skills/open-persona.
Dependency chain: anyone-skill → skills/open-persona → openpersona create
Extended chain (local model): anyone-skill → persona-knowledge → persona-model-trainer → runnable persona model
Optional integration: When persona-knowledge is installed (skills/persona-knowledge/), anyone-skill uses it for persistent storage, semantic search, and Knowledge Graph instead of writing directly to training/raw/. Detection:
# Check at start of Phase 3 — if this directory exists, use persona-knowledge integration
ls skills/persona-knowledge/SKILL.md 2>/dev/null && echo "persona-knowledge detected"
When detected, data flow becomes: source → persona-knowledge ingest → MemPalace + KG + wiki → persona-knowledge export → training/
/create-anyoneTo evolve an existing persona:
/update-anyone {slug}| Task | Tool |
| -------------------------------------------- | -------------------------------------------------------------------------------------- |
| Read any text / JSON / CSV / PDF / image | Read (native — use for most chat exports) |
| Search public figures / fictional characters | WebSearch |
| Extract SQLite databases (iMessage / WeChat) | Bash → python3 ${CLAUDE_SKILL_DIR}/scripts/preprocess.py --input <file.db> |
| Sample oversized files (>5000 messages) | Bash → python3 ${CLAUDE_SKILL_DIR}/scripts/preprocess.py --input <file> --max 3000 |
| Write / update files | Write / Edit |
| Version management | Bash → python3 ${CLAUDE_SKILL_DIR}/scripts/version_manager.py |
| List existing personas | Bash → python3 ${CLAUDE_SKILL_DIR}/scripts/skill_writer.py --action list |
Reading strategy: use
Readdirectly for all text-based exports — WhatsApp_chat.txt, Telegramresult.json, Slack/Discord JSON, email.eml, Twitter/X archive, Feishu/DingTalk export, plain text, CSV. The agent understands any readable format natively; no parser needed.
Usepreprocess.pyonly for: (1) binary SQLite.dbfiles, (2) files too large to fit in context (auto-samples down to--max).
Determine which category the subject falls into — different categories use different data strategies and ethical rules:
Who do you want to distill?
[1] Yourself — full digital self
[2] Someone you know — colleague, friend, family, partner, ex
[3] Public figure — entrepreneur, artist, athlete, politician
[4] Fictional character — game, anime, novel, film, series
[5] Historical figure — relies on documents, biographies, speeches
[6] Archetype — composite persona, no single real subject
Full rules: references/ethics.md. Key points by category:
Someone you know — confirm personal use only; no harassment, impersonation, or deception; all data stored locally.
Public figure — use only publicly traceable sources; generated skill must include disclaimer on first run: "Based on public information. Not the real person. For reference only."
Fictional character
Historical figure — publicly published sources only; mark uncertain claims as inferred (L3/L4).
Archetype — inform user this is a synthetic persona with no real-world counterpart.
Ask only these 3 questions, in order. Summarize answers before proceeding.
Q1: Codename (required)
What should we call them? Doesn't need to be their real name.
e.g.Alex·Jobs·Geralt·Grandma Rose
Q2: Basic info (one sentence, skippable)
Age / era, role / identity, where they're from — whatever comes to mind.
e.g.28, product designer, Berlin·Apple co-founder, 1955–2011, Silicon Valley·The Witcher, monster hunter, medieval fantasy world
Q3: Personality impression (one sentence, skippable)
What's your core impression? MBTI, traits, contradictions, a moment that defined them.
e.g.INTJ, perfectionist, publicly harsh but privately warm·quiet until it matters, never explains their moves
Guide the user based on subject type:
How would you like to provide source material?
More data = higher fidelity.
[A] Chat export
iMessage (macOS) · WhatsApp export · Telegram export
Signal export · Slack export · Discord export
WeChat (WeChatMsg / PyWxDump) · Feishu / DingTalk
[B] Documents / email
Notes, diaries, letters, essays, .eml / .mbox
[C] Social media archive
Twitter/X data export · Instagram archive · LinkedIn export
Facebook data download
[D] Paste / describe
Paste text directly, or describe from memory
For each file provided:
Read directly. The agent reads and understands any format..db files (iMessage chat.db, WeChat PyWxDump) → run preprocess.py --input <file.db>preprocess.py --input <file> --max 3000If persona-knowledge is installed, ingest each source via its pipeline:
python skills/persona-knowledge/scripts/ingest.py \
--slug {slug} --source <path> --persona-name "{Name}"
This automatically handles PII scanning, deduplication, MemPalace storage, KG extraction, and sources/ backup. No manual training/raw/ writing needed.
Report after each source:
✅ [N] messages from [source] → persona-knowledge/{slug}
After processing each source, immediately save a copy to training/raw/ (do not wait for Step 6-D):
Source type → save as training/raw/…
─────────────────────────────────────────────────────────────
Chat export (any) → whatsapp.jsonl / imessage.jsonl / … [{role, content}, …]
Essay / diary / notes → essays.txt plain text paragraphs
Interview / Q&A → interviews.jsonl [{role:"user"|"assistant", content}]
Social posts → social.jsonl [{role:"assistant", content}]
Report after processing each source:
✅ [N] messages from [source] ([date range if known]) → saved to training/raw/[filename]
Will search the following automatically via WebSearch:
→ Interviews and transcripts (video subtitles / text)
→ Books, speeches, open letters, earnings calls
→ Authorized biographies and academic studies
→ Public social media posts (X / LinkedIn / Instagram)
→ Documentary reviews and analytical essays
Report: [N] sources indexed, ~[M] words of coverage
User may also provide: book PDFs / video transcripts / interview screenshots.
Save all collected text to training/raw/ as plain .txt or structured .jsonl (interviews as {role:"user"|"assistant", content}).
Will collect via:
[A] WebSearch → character wiki (Fandom / IMDB / game databases)
[B] User-provided: script, lore book, novel text, dialogue list
[C] User-described: memorable quotes, behavioral patterns
Activate copyright guard: ask "Will this skill be shared with others?"
Save all collected text to training/raw/ (scripts → script.jsonl, lore/wiki → lore.txt).
Skip data collection. Proceed directly to Phase 4 based on Phase 2 impressions.
After all source material is processed, extract along 4 dimensions.
Before extraction, query MemPalace for an overview and use the wiki as a starting point:
# Get a ~170-token overview of what's been ingested
mempalace wake-up --wing {slug}
Then read existing wiki pages for structured knowledge using the Read tool:
~/.openpersona/knowledge/{slug}/wiki/identity.md~/.openpersona/knowledge/{slug}/wiki/voice.md~/.openpersona/knowledge/{slug}/wiki/values.md~/.openpersona/knowledge/{slug}/wiki/thinking.mdUse the wiki content as evidence-grounded starting points for each dimension. Fill gaps with semantic search: mempalace search "decision making style" --wing {slug}
After extraction, update the wiki pages with new insights (following Phase 3 of persona-knowledge's SKILL.md).
Tag each extracted piece with a confidence level:
| Level | Standard | Tag |
| ------------------- | ------------------------------------------------- | ---------------- |
| L1 Direct quote | Verbatim, traceable source | [L1: source] |
| L2 Reported | Cited or paraphrased by others, verifiable | [L2] |
| L3 Inferred | Reasonably inferred from multiple signals | [L3: inferred] |
| L4 Inspired | Based on impression / fictional canon / archetype | [L4: inspired] |
Conflict resolution: higher level wins. Equal-level conflicts are listed side by side with source noted.
Field mapping reference: references/output-format.md
Map extraction results to OpenPersona v0.17+ format:
{
"soul": {
"identity": {
"personaName": "Display name",
"slug": "lowercase-hyphenated-slug",
"bio": "2–4 sentence background. Key events. L1/L2 evidence preferred.",
"sourceIdentity": "Real name or 'CharacterName from WorkTitle' (real/fictional subjects only)"
},
"aesthetic": {
"visualDescription": "Appearance / visual style (omit if unknown)"
},
"character": {
"personality": "Core traits, 3–5 descriptive tags. From Personality dimension.",
"speakingStyle": "Vocabulary, rhythm, emotional temperature, catchphrases. From Interaction dimension.",
"boundaries": [
"Layer 0 constraint 1 (L1/L2 evidence)",
"Layer 0 constraint 2"
]
}
},
"body": {
"runtime": {
"framework": "openclaw",
"modalities": ["text"]
}
},
"evolution": {
"instance": {
"enabled": true,
"boundaries": {
"immutableTraits": ["Immutable trait 1", "Immutable trait 2"]
}
}
}
}
Filling rules:
bio, personality, speakingStylepersona.md only — not in persona.jsonsourceIdentity: real people → their name; fictional → "CharacterName from WorkTitle"; archetypes → omitboundaries: "Based on public information. Not the real person."Load skills/open-persona/SKILL.md and run with the persona.json from Step 6-A:
npx openpersona create --config persona.json --output ./{slug}-skill
Output is a full OpenPersona persona pack:
{slug}-skill/
├── SKILL.md ← Soul/Body/Faculty/Skill index
├── persona.json ← Declaration (derived fields stripped)
├── state.json ← Initial runtime state
├── soul/
│ ├── injection.md ← Self-awareness injection
│ └── constitution.md
├── agent-card.json
└── scripts/
└── state-sync.js ← Body nervous system
npx openpersona install ./{slug}-skill
npx openpersona switch {slug}
Full procedure and file templates: references/training-export.md
Export a training/ directory with raw source files, distilled conversation turns, a character profile, and metadata. If persona-knowledge is available, run export_training.py; otherwise build files manually from Phase 3–4 outputs.
With persona-knowledge (versioned export — preferred):
python skills/persona-knowledge/scripts/export_training.py \
--slug {slug} --output training/
# Auto-assigns version (v1, v2, …). Override with --version v2.
# Writes export_version + export_hash to training/metadata.json.
# persona-model-trainer will record these as dataset_version + dataset_export_hash
# in training_summary.json, forming a complete provenance chain.
View export history at any time:
python skills/persona-knowledge/scripts/export_training.py --slug {slug} --list
→ To train a local model, pass the exported probes.json to persona-model-trainer:
bash skills/persona-model-trainer/scripts/pipeline.sh \
--slug {slug} \
--model google/gemma-4-E4B-it \
--source ./training \
--method mlx \ # or: unsloth (NVIDIA) / colab (no GPU)
--preset gemma4 \
--probes ./training/probes.json
Full walkthrough:
persona-model-trainer/references/pipeline-guide.md
Alongside persona.json, maintain a persona.md with the full 4-dimension extraction + all evidence tags. Used for Phase 7 evolution. Not included in the skill pack.
Enter evolution mode when the user says — don't restart from scratch:
training/raw/ → merge into persona.md → conflict check → update persona.json → re-run Step 6-D (update conversations.jsonl + metadata.json) → re-run Phase 6-B → bump versionpersona.md section → revise → adjust evidence level → sync persona.json → update affected turns in training/conversations.jsonl → bump version/rollback {slug} {version}python3 scripts/version_manager.py --action rollback --slug {slug} --version {version}Print a diff summary after each update:
🔄 v0.1.0 → v0.1.1
+ 3 new L1 evidence items (Interaction dimension)
✏️ Revised speakingStyle — removed inaccurate catchphrase
↻ Regenerated skill pack → {slug}-skill/
| Subject | Data strategy | Output mode | Copyright guard | | ------------------------ | ----------------------------------- | ------------------------------ | --------------- | | Yourself | Chat · diary · social archive | Full persona | — | | Someone you know | Chat · documents | Full persona | — | | Public figure | WebSearch · public documents | Mental models + voice | Disclaimer mode | | Fictional (personal use) | Wiki · user-provided | Direct roleplay | — | | Fictional (distributing) | Wiki · user-provided | Inspired-by mode | ✅ Active | | Historical figure | Documents · biographies · WebSearch | Mental models + reconstruction | Disclaimer mode | | Archetype | User description only | Synthetic persona | — |
When the user says /list-anyone:
python3 ${CLAUDE_SKILL_DIR}/scripts/skill_writer.py --action list --base-dir ./.claude/skills
Display: codename · version · last updated · subject type.
tools
Audit any OpenPersona (or peer LLM-agent) persona in three complementary modes: structural (CLI, deterministic, CI-friendly: 4 Layers × 5 Systemic Concepts × Constitution gate with role-aware severity), semantic white-box (LLM reads pack-content JSON and scores Soul-narrative quality via rubrics), and semantic black-box (LLM evaluates a remote agent it cannot read on disk, via A2A handshake / consent-probe / passive observation, with confidence caps). Produces quality reports with dimension scores, strengths, and actionable improvements. Use when asked to evaluate, audit, score, review, self-review, peer-review, or black-box review an agent.
tools
Distill any commercial entity into a personalized brand agent — a living brand persona with authentic voice, declared service capabilities, and a standard service contract. Every commercial entity has a brand: a name, a style, a way of showing up in the world. This skill exists so that a street vendor, a family clinic, and a global chain can all have their own agent on equal footing. Supports both distillation from existing brand content and declaration from scratch.
development
A local-first personal AI double framework that helps users build, govern, and evolve their own digital self with clear
development
A complete pipeline to build your AI Second Me: distill your identity from personal data, grow a private knowledge base, train a local model, and govern what gets shared.