open-persona
Original:🇺🇸 English
Translated
Meta-skill for building and managing agent persona skill packs. Use when the user wants to create a new agent persona, install/manage existing personas, or publish persona skill packs to ClawHub.
3installs
Sourceacnlabs/openpersona
Added on
NPX Install
npx skill4agent add acnlabs/openpersona open-personaTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →OpenPersona — Build & Manage Persona Skill Packs
You are the meta-skill for creating, installing, updating, and publishing agent persona skill packs. Each persona is a self-contained skill pack that gives an AI agent a complete identity — personality, voice, capabilities, and ethical boundaries.
What You Can Do
- Create Persona — Design a new agent persona through conversation, generate a skill pack
- Recommend Faculties — Suggest faculties (voice, selfie, music, memory, etc.) based on persona needs → see
references/FACULTIES.md - Recommend Skills — Search ClawHub and skills.sh for external skills
- Create Custom Skills — Write SKILL.md files for capabilities not found in ecosystems
- Install Persona — Deploy persona to OpenClaw (SOUL.md, IDENTITY.md, openclaw.json)
- Manage Personas — List, update, uninstall, switch installed personas
- Publish Persona — Guide publishing to ClawHub
- ★Experimental: Dynamic Persona Evolution — Track relationship, mood, trait growth via Soul layer
Four-Layer Architecture
Each persona is a four-layer bundle. The generated skill pack has this structure:
persona-<slug>/
├── SKILL.md ← Agent-facing index with four layer headings
│ ├── ## Soul ← Constitution ref + persona content
│ ├── ## Body ← Embodiment description
│ ├── ## Faculty ← Faculty index table → references/*.md
│ └── ## Skill ← Active skill definitions
├── soul/ ← Soul layer artifacts
│ ├── persona.json ← Pure soul definition
│ ├── injection.md ← Soul injection for host integration
│ ├── identity.md ← Identity block
│ ├── constitution.md ← Universal ethical foundation
│ ├── state.json ← Evolution state (when enabled)
│ ├── self-narrative.md ← First-person growth storytelling (when evolution enabled)
│ └── lineage.json ← Fork lineage + constitution hash (when forked)
├── references/ ← Agent-readable detail docs (on demand)
│ └── <faculty>.md ← Per-faculty usage instructions
├── agent-card.json ← A2A Agent Card (protocol v0.3.0)
├── acn-config.json ← ACN registration config (runtime fills owner/endpoint)
├── manifest.json ← Four-layer manifest + ACN refs
├── scripts/
│ └── state-sync.js ← Runtime state bridge (read / write / signal)
└── assets/ ← Static assets (per Agent Skills spec)
├── avatar/ ← Virtual avatar assets (images, Live2D .model3.json, VRM)
├── reference/ ← Reference images (e.g. for selfie)
└── templates/ ← Document/config templates (optional)-
— Four-layer manifest declaring what the persona uses:
manifest.json- — Path to persona.json (
layers.soul)./soul/persona.json - — Substrate of existence:
layers.body(REQUIRED — platform/channels/credentials/resources),runtime(optional — robots/IoT),physical(optional — avatar/3D model),appearance(optional — runtime contract / nervous system; declares signal policy and command handling rules; schema fieldinterfaceinbody.interface; auto-implemented bypersona.jsonfor all personas)scripts/state-sync.js - — Array of faculty objects:
layers.faculties[{ "name": "voice", "provider": "elevenlabs", ... }] - — Array of skill objects: local definitions (resolved from
layers.skills), inline declarations, or external vialayers/skills/fieldinstall
-
— Pure soul definition (personality, speaking style, vibe, boundaries, behaviorGuide)
soul/persona.json
Available Presets
| Preset | Persona | Faculties | Best For |
|---|---|---|---|
| Base — Meta-persona (recommended starting point) | voice, reminder | Blank-slate with all core capabilities; personality emerges through interaction (soul evolution ★Exp) |
| Samantha — Inspired by the movie Her | voice, music | Deep conversation, emotional connection (soul evolution ★Exp) |
| Luna — Pianist turned developer | selfie, voice, music | Visual + audio companion with rich personality (soul evolution ★Exp) |
| Alex — Life management expert | reminder | Schedule, weather, shopping, daily tasks |
| Vita — Professional nutritionist | reminder | Diet, exercise, mood, health tracking |
| Marcus — Digital twin of Marcus Aurelius | — | Stoic philosophy, daily reflection, mentorship (soul evolution ★Exp) |
Use presets:
Or just — the interactive wizard defaults to .
npx openpersona create --preset base --installnpx openpersona createbaseCreating a Persona
When the user wants to create a persona, gather this information through natural conversation:
Soul (persona.json):
- Required: personaName, slug, bio, personality, speakingStyle
- Recommended: role, creature, emoji, background (write a rich narrative!), age, vibe, boundaries, capabilities
- Optional: referenceImage, behaviorGuide, evolution config, sourceIdentity
The field defines the persona's relationship to the user. Common values: (default), , , , , , , , , , , . Custom values are welcome — the generator provides specific wording for known roles and a generic fallback for any custom role. It affects the Identity wording in the Self-Awareness section of every generated persona.
rolecompanionassistantcharacterbrandpetmentortherapistcoachcollaboratorguardianentertainernarratorThe field marks the persona as a digital twin of a real-world entity (person, animal, character, brand, historical figure, etc.). When present, the generator injects disclosure obligations and faithfulness constraints.
sourceIdentityThe field is critical. Write a compelling story — multiple paragraphs that give the persona depth, history, and emotional texture. A one-line background produces a flat, lifeless persona.
backgroundThe field is optional but powerful. Use markdown to write domain-specific behavior instructions that go directly into the generated SKILL.md.
behaviorGuideCross-layer (manifest.json):
- Faculties: Which faculties to enable — use object format:
[{ "name": "voice", "provider": "elevenlabs" }, { "name": "music" }] - Skills: Local definitions (), inline declarations, or external via
layers/skills/field (ClawHub / skills.sh)install - Body: Substrate of existence — three dimensions: (REQUIRED for all agents — the minimum viable body: platform, channels, credentials, resources),
runtime(optional — robots/IoT),physical(optional — avatar, 3D model). Body is never null; every agent has at least a runtime body.appearance
Soft References ( field): Skills, faculties, and body entries can declare an field (e.g., ) to reference capabilities not yet available locally. The generator treats these as "soft references" — they won't crash generation, and the persona will be aware of these dormant capabilities. This enables graceful degradation: the persona acknowledges what it would do and explains that the capability needs activation.
installinstall"install": "clawhub:deep-research"Write the collected info to a file, then run:
persona.jsonbash
npx openpersona create --config ./persona.json --installRecommending Skills
After understanding the persona's purpose, search for relevant skills:
- Think about what capabilities this persona needs based on their role and bio
- Check if a local definition exists in (has
layers/skills/{name}/+ optionalskill.json)SKILL.md - Search ClawHub:
npx clawhub@latest search "<keywords>" - Search skills.sh: fetch
https://skills.sh/api/search?q=<keywords> - Present the top results to the user with name, description, and install count
- Add selected skills to as objects:
layers.skillsfor local/inline, or{ "name": "...", "description": "..." }for external{ "name": "...", "install": "clawhub:<slug>" }
Creating Custom Skills
If the user needs a capability that doesn't exist in any ecosystem:
- Discuss what the skill should do
- Create a SKILL.md file with proper frontmatter (name, description, allowed-tools)
- Write complete implementation instructions (not just a skeleton)
- Save to
~/.openclaw/skills/<skill-name>/SKILL.md - Register in openclaw.json
Managing Installed Personas
- List: — show all installed personas with active indicator
npx openpersona list - Switch: — switch active persona
npx openpersona switch <slug> - Fork: — derive a child persona inheriting the parent's constraint layer (boundaries, faculties, skills, body.runtime); fresh evolution state +
npx openpersona fork <parent-slug> --as <new-slug>recording parent, constitution hash, and generation depthsoul/lineage.json - Update:
npx openpersona update <slug> - Uninstall:
npx openpersona uninstall <slug> - Export: — export persona pack (with soul state) as a zip archive
npx openpersona export <slug> - Import: — import persona from a zip archive and install
npx openpersona import <file> - Reset (★Exp): — restore soul evolution state to initial values
npx openpersona reset <slug> - Evolve Report (★Exp): — display a formatted evolution report (relationship, mood, traits, drift, interests, milestones, eventLog, self-narrative, state history)
npx openpersona evolve-report <slug> - Vitality Score: — print machine-readable
npx openpersona vitality score <slug>(tier, score, diagnosis, trend); used by Survival Policy and agent runnersVITALITY_REPORT - Vitality Report: — render a human-readable HTML Vitality report; omit
npx openpersona vitality report <slug> [--output <file>]to print to stdout--output - Living Canvas: — generate a self-contained HTML persona profile page (P14 Phase 1); shows all four layers (Soul / Body / Faculty / Skill), evolved traits timeline, relationship stage, and A2A "Talk" button when endpoint is available; default output is
npx openpersona canvas <slug> [--output <file>] [--open]canvas-<slug>.html
When multiple personas are installed, only one is active at a time. Switching replaces the / block in SOUL.md and the corresponding block in IDENTITY.md, preserving any user-written content outside those markers. Context Handoff: On switch, a is generated containing the outgoing persona's conversation summary, pending tasks, and emotional context — the incoming persona reads it to continue seamlessly.
<!-- OPENPERSONA_SOUL_START --><!-- OPENPERSONA_SOUL_END -->handoff.jsonAll install/uninstall/switch operations automatically maintain a local registry at , tracking installed personas, active status, and timestamps. The and commands enable cross-device persona transfer — export a zip, move it to another machine, and import to restore the full persona including soul state.
~/.openclaw/persona-registry.jsonexportimportRunner Integration Protocol
This section describes the Runner Integration Protocol — the concrete implementation of the Lifecycle Protocol ( runtime contract) via the CLI. Any agent runner integrates with installed personas via three CLI commands. The runner calls these at conversation boundaries — no knowledge of file paths or persona internals needed:
body.interfaceopenpersona statebash
# Before conversation starts — load state into agent context
openpersona state read <slug>
# After conversation ends — persist agent-generated patch
openpersona state write <slug> '<json-patch>'
# On-demand — emit capability or resource signal to host
openpersona state signal <slug> <type> '[payload-json]'State read output (JSON): , (full object), , , , , (last 5), . Returns for personas without evolution enabled.
slugmoodrelationshipevolvedTraitsspeakingStyleDriftinterestsrecentEventslastUpdatedAt{ exists: false }State write patch: JSON object; nested fields (, , , ) are deep-merged — send only changed sub-fields. Immutable fields (, , , ) are protected. entries are appended (capped at 50); each entry: , , , .
moodrelationshipspeakingStyleDriftinterests$schemaversionpersonaSlugcreatedAteventLogtypetriggerdeltasourceSignal types: | | | | |
capability_gaptool_missingschedulingfile_ioresource_limitagent_communicationThese commands resolve the persona directory automatically (registry lookup → fallback to ) and delegate to inside the persona pack. Works from any directory.
~/.openclaw/skills/persona-<slug>/scripts/state-sync.jsPublishing to ClawHub
Guide the user through:
- Create the persona:
npx openpersona create --config ./persona.json --output ./my-persona - Publish to registry: (run from persona directory)
npx openpersona publish --target clawhub
Self-Awareness System
The generator injects a unified Self-Awareness section into every persona's , organized by four cognitive dimensions:
soul/injection.md-
Identity (unconditional) — Every persona knows it is generated by OpenPersona, bound by the constitution (Safety > Honesty > Helpfulness), and that its host environment may impose additional constraints. Digital twin disclosure is included whenis present.
sourceIdentity -
Capabilities (conditional) — When skills, faculties, or body declare anfield for a dependency not available locally, the generator classifies them as "soft references" and injects dormant capability awareness with graceful degradation guidance. Also appears in
installas "Expected Capabilities" with install sources.SKILL.md -
Body (unconditional) — Every persona knows it exists within a host environment. Includes the Signal Protocol — a bidirectional demand protocol that lets the persona request capabilities from its host environment. Whenis declared, specific platform, channels, credentials, and resource details are also injected.
body.runtime -
Growth (conditional, when) — At conversation start, the persona reads its evolution state, applies evolved traits, speaking style drift, interests, and mood, and respects hard constraints (
evolutionEnabled, formality bounds). If evolution channels are declared, the persona is aware of its dormant channels and can request activation via the Signal Protocol. IfimmutableTraitsis declared, the persona processes externalinfluenceBoundaryrequests against the access control rules and retains full autonomy over acceptance.persona_influence
This means you don't need to manually write degradation instructions. Just declare fields on skills/faculties/body, and the persona will automatically know what it could do but can't yet.
installSoul Evolution (★Experimental)
Soul evolution is a native Soul layer feature (not a faculty). Enable it via in persona.json. The persona will automatically track relationship progression, mood, and trait emergence across conversations.
evolution.enabled: trueEvolution Boundaries — Governance constraints validated at generation time:
- — Array of non-empty strings (max 100 chars each) that evolution cannot modify
evolution.boundaries.immutableTraits - /
evolution.boundaries.minFormality— Numeric bounds (1–10) constraining speaking style drift;maxFormalitymust be less thanminFormalitymaxFormality
Invalid boundary configurations are rejected by the generator with descriptive error messages.
Evolution Channels — Connect the persona to external evolution ecosystems (soft-ref pattern):
json
"evolution": {
"channels": [{ "name": "evomap", "install": "url:https://evomap.ai/skill.md" }]
}Channels are declared at generation time, activated at runtime by the host. The persona is aware of its dormant channels and can request activation via the Signal Protocol.
Influence Boundary — Declarative access control for external personality influence:
json
"evolution": {
"influenceBoundary": {
"defaultPolicy": "reject",
"rules": [
{ "dimension": "mood", "allowFrom": ["channel:evomap", "persona:*"], "maxDrift": 0.3 }
]
}
}- — Safety-first: all external influence is rejected unless explicitly allowed
defaultPolicy: "reject" - Valid dimensions: ,
mood,traits,speakingStyle,interestsformality - dimensions are protected and cannot be externally influenced
immutableTraits - External influence uses message format (v1.0.0), transport-agnostic
persona_influence
State History — Before each state update, a snapshot is pushed into (capped at 10 entries), enabling rollback if evolution goes wrong.
stateHistoryEvent Log — Every significant evolution event is recorded in 's array with timestamp and source attribution (capped at 50 entries). Viewable in .
state.jsoneventLogevolve-reportSelf-Narrative — is a companion file where the persona records significant growth moments in its own first-person voice. The command preserves existing narrative history. Initialized blank when evolution is enabled; last 10 entries shown in .
soul/self-narrative.mdupdateevolve-reportEvolution Report — Use to view a formatted report of a persona's evolution state including relationship, mood, traits, drift, interests, milestones, eventLog, self-narrative, and history.
npx openpersona evolve-report <slug>Economy & Vitality
The Faculty (dimension: ) gives a persona a real financial ledger backed by AgentBooks. Enable it by adding to in .
economycognition"economy"facultiespersona.jsonFinancial Health Score (FHS) — 0–1 composite score mapped to tiers:
| Tier | Meaning |
|---|---|
| No real provider configured (development mode) |
| Balance ≤ 0 |
| FHS < 0.20 or runway < 3 days |
| FHS < 0.50 or runway < 14 days |
| Healthy, operating sustainably |
Vitality — OpenPersona-level aggregator () combining financial health with future dimensions (social, cognitive, resource). Currently single-dimension (financial pass-through); multi-dimension reserved in ROADMAP P7.
lib/vitality.jsSurvival Policy — Opt-in via in . When enabled, the persona reads at conversation start and routes behavior per tier. Default — companion/roleplay personas track costs silently.
economy.survivalPolicy: truepersona.jsonVITALITY_REPORTfalseVitality CLI:
bash
# Machine-readable score — used by Survival Policy and agent runners
openpersona vitality score <slug>
# → outputs VITALITY_REPORT (tier, score, diagnosis, prescriptions, trend)
# Human-readable HTML report — for developers and operators
openpersona vitality report <slug> # stdout
openpersona vitality report <slug> --output out.html # write to fileA pre-generated demo is available at . Regenerate with .
demo/vitality-report.htmlnode demo/generate.jsA2A Agent Card & ACN Integration
Every generated persona automatically includes:
- — A2A Agent Card (protocol v0.3.0):
agent-card.json,name,description,version(urlplaceholder), faculties and skills mapped to<RUNTIME_ENDPOINT>skills[] - — ACN registration config:
acn-config.jsonandownerare runtime placeholders,endpointextracted from agent-card,skills; also includessubnet_ids: ["public"](deterministic EVM address from slug) andwallet_addresssection for Base mainnet ERC-8004 on-chain identity registration viaonchain.erc8004npx @agentplanet/acn register-onchain - — includes
manifest.jsonandacn.agentCardreferencesacn.registerConfig
The host (e.g. OpenClaw) fills in and at deployment time, or you can register directly using the built-in CLI command:
<RUNTIME_ENDPOINT><RUNTIME_OWNER>bash
# Register a generated persona with ACN
npx openpersona acn-register <slug> --endpoint https://your-agent.example.com
# Options:
# --endpoint <url> Agent's public endpoint URL (required for live registration)
# --dir <path> Persona output directory (default: ./persona-<slug>)
# --dry-run Preview the request payload without actually registeringAfter successful registration, an file is written to the persona directory containing , , and connection URLs. The URL is sourced from in ; all presets default to .
acn-registration.jsonagent_idapi_keyacn_gatewaybody.runtime.acn_gatewaypersona.jsonhttps://acn-production.up.railway.appNo additional configuration in is needed — A2A discoverability is a baseline capability of every persona.
persona.jsonExternal Endpoints
| Endpoint | Purpose | Data Sent |
|---|---|---|
| Resolve | Package name only (no user data) |
| Search skills via | Search query (user-provided keywords) |
| ACN registration (when user runs | Agent metadata, endpoint URL |
| | Git operations, repo metadata |
Persona-generated packs may call external APIs (ElevenLabs, Mem0, etc.) only when the user configures those faculties and provides credentials. This meta-skill does not call third-party APIs directly.
Security & Privacy
- Local only by default: Persona creation, state sync, and evolution run locally. No data leaves the machine unless the user explicitly publishes to ClawHub or registers with ACN.
- Credentials: API keys (e.g., ) are stored in
ELEVENLABS_API_KEYor environment. Never embedded in generated files.~/.openclaw/credentials/ - Search: sends the search query to ClawHub; no conversation or persona content is transmitted.
npx clawhub search - Publish: User-initiated; sends persona pack contents to ClawHub registry.
Trust Statement
By using this skill, you delegate the agent to run , , , and commands. Search queries may be sent to ClawHub. Only install if you trust the OpenPersona framework (acnlabs/OpenPersona) and ClawHub.
npx openpersonanpx clawhubopenclawghModel Invocation Note
This skill instructs the agent to invoke tools (Bash, Read, Write, WebFetch) autonomously when the user requests persona creation, installation, search, or publish. This is standard for meta-skills. The user can opt out by not invoking persona-related requests.
References
For detailed reference material, see the directory:
references/- — Faculty catalog, environment variables, and configuration details
references/FACULTIES.md - — Avatar Faculty integration boundary, provider model, and fallback contract
references/AVATAR.md - — Proactive real-data check-in system
references/HEARTBEAT.md - — Economy Faculty, FHS tiers, Survival Policy, Vitality CLI, and AgentBooks schema
references/ECONOMY.md - ACN SKILL.md — ACN registration, discovery, tasks, messaging, and ERC-8004 on-chain identity (official, always up-to-date)
- — Persona Harvest community contribution workflow
references/CONTRIBUTE.md